babylonjs-addons 8.8.5 → 8.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@
7
7
  exports["babylonjs-addons"] = factory(require("babylonjs"));
8
8
  else
9
9
  root["ADDONS"] = factory(root["BABYLON"]);
10
- })((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), (__WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__) => {
10
+ })((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), (__WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math__) => {
11
11
  return /******/ (() => { // webpackBootstrap
12
12
  /******/ "use strict";
13
13
  /******/ var __webpack_modules__ = ({
@@ -567,7 +567,7 @@ __webpack_require__.r(__webpack_exports__);
567
567
  /* harmony export */ HtmlMesh: () => (/* binding */ HtmlMesh)
568
568
  /* harmony export */ });
569
569
  /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
570
- /* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math.vector");
570
+ /* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
571
571
  /* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__);
572
572
  /* harmony import */ var _pointerEventsCaptureBehavior__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointerEventsCaptureBehavior */ "../../../dev/addons/src/htmlMesh/pointerEventsCaptureBehavior.ts");
573
573
  /* harmony import */ var _fitStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fitStrategy */ "../../../dev/addons/src/htmlMesh/fitStrategy.ts");
@@ -926,7 +926,7 @@ __webpack_require__.r(__webpack_exports__);
926
926
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
927
927
  /* harmony export */ HtmlMeshRenderer: () => (/* binding */ HtmlMeshRenderer)
928
928
  /* harmony export */ });
929
- /* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math.vector");
929
+ /* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
930
930
  /* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__);
931
931
 
932
932
 
@@ -1456,7 +1456,7 @@ __webpack_require__.r(__webpack_exports__);
1456
1456
  /* harmony export */ requestCapture: () => (/* binding */ requestCapture),
1457
1457
  /* harmony export */ requestRelease: () => (/* binding */ requestRelease)
1458
1458
  /* harmony export */ });
1459
- /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math.vector");
1459
+ /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math");
1460
1460
  /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__);
1461
1461
 
1462
1462
  var CaptureRequestQueue = [];
@@ -1629,7 +1629,7 @@ __webpack_require__.r(__webpack_exports__);
1629
1629
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1630
1630
  /* harmony export */ PointerEventsCaptureBehavior: () => (/* binding */ PointerEventsCaptureBehavior)
1631
1631
  /* harmony export */ });
1632
- /* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math.vector");
1632
+ /* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
1633
1633
  /* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__);
1634
1634
  /* harmony import */ var _pointerEventsCapture__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointerEventsCapture */ "../../../dev/addons/src/htmlMesh/pointerEventsCapture.ts");
1635
1635
 
@@ -1845,16 +1845,22 @@ var PointerEventsCaptureBehavior = /** @class */ (function () {
1845
1845
 
1846
1846
  __webpack_require__.r(__webpack_exports__);
1847
1847
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1848
- /* harmony export */ DefaultParagraphOptions: () => (/* reexport safe */ _msdfText__WEBPACK_IMPORTED_MODULE_1__.DefaultParagraphOptions),
1849
- /* harmony export */ FitStrategy: () => (/* reexport safe */ _htmlMesh__WEBPACK_IMPORTED_MODULE_0__.FitStrategy),
1850
- /* harmony export */ FontAsset: () => (/* reexport safe */ _msdfText__WEBPACK_IMPORTED_MODULE_1__.FontAsset),
1851
- /* harmony export */ HtmlMesh: () => (/* reexport safe */ _htmlMesh__WEBPACK_IMPORTED_MODULE_0__.HtmlMesh),
1852
- /* harmony export */ HtmlMeshRenderer: () => (/* reexport safe */ _htmlMesh__WEBPACK_IMPORTED_MODULE_0__.HtmlMeshRenderer),
1853
- /* harmony export */ PointerEventsCaptureBehavior: () => (/* reexport safe */ _htmlMesh__WEBPACK_IMPORTED_MODULE_0__.PointerEventsCaptureBehavior),
1854
- /* harmony export */ TextRenderer: () => (/* reexport safe */ _msdfText__WEBPACK_IMPORTED_MODULE_1__.TextRenderer)
1848
+ /* harmony export */ DefaultParagraphOptions: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.DefaultParagraphOptions),
1849
+ /* harmony export */ FitStrategy: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.FitStrategy),
1850
+ /* harmony export */ FontAsset: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.FontAsset),
1851
+ /* harmony export */ HtmlMesh: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.HtmlMesh),
1852
+ /* harmony export */ HtmlMeshRenderer: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.HtmlMeshRenderer),
1853
+ /* harmony export */ PointerEventsCaptureBehavior: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.PointerEventsCaptureBehavior),
1854
+ /* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.SdfTextParagraph),
1855
+ /* harmony export */ TextRenderer: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.TextRenderer),
1856
+ /* harmony export */ msdfPixelShader: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfPixelShader),
1857
+ /* harmony export */ msdfPixelShaderWGSL: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfPixelShaderWGSL),
1858
+ /* harmony export */ msdfVertexShader: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfVertexShader),
1859
+ /* harmony export */ msdfVertexShaderWGSL: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfVertexShaderWGSL)
1855
1860
  /* harmony export */ });
1856
- /* harmony import */ var _htmlMesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./htmlMesh */ "../../../dev/addons/src/htmlMesh/index.ts");
1857
- /* harmony import */ var _msdfText__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./msdfText */ "../../../dev/addons/src/msdfText/index.ts");
1861
+ /* harmony import */ var _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./htmlMesh/index */ "../../../dev/addons/src/htmlMesh/index.ts");
1862
+ /* harmony import */ var _msdfText_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./msdfText/index */ "../../../dev/addons/src/msdfText/index.ts");
1863
+ /* eslint-disable import/no-internal-modules */
1858
1864
 
1859
1865
 
1860
1866
 
@@ -1871,7 +1877,7 @@ __webpack_require__.r(__webpack_exports__);
1871
1877
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1872
1878
  /* harmony export */ FontAsset: () => (/* binding */ FontAsset)
1873
1879
  /* harmony export */ });
1874
- /* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Textures/texture */ "babylonjs/Maths/math.vector");
1880
+ /* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Textures/texture */ "babylonjs/Maths/math");
1875
1881
  /* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__);
1876
1882
 
1877
1883
  var CharCode;
@@ -1887,8 +1893,9 @@ var FontAsset = /** @class */ (function () {
1887
1893
  * Creates a new FontAsset instance.
1888
1894
  * @param definitionData defines the font data in JSON format.
1889
1895
  * @param textureUrl defines the url of the texture to use for the font.
1896
+ * @param scene defines the hosting scene.
1890
1897
  */
1891
- function FontAsset(definitionData, textureUrl) {
1898
+ function FontAsset(definitionData, textureUrl, scene) {
1892
1899
  var _this = this;
1893
1900
  this._chars = new Map();
1894
1901
  this._kernings = new Map();
@@ -1907,8 +1914,19 @@ var FontAsset = /** @class */ (function () {
1907
1914
  this._charsRegex = new RegExp("[".concat(this._font.chars.map(function (c) { return c.char.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); }).join(""), "]"), "g");
1908
1915
  this._updateFallbacks();
1909
1916
  this.scale = 1 / this._font.info.size;
1910
- this.textures = this._font.pages.map(function (page) { return new babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__.Texture(page, undefined, { noMipmap: true, invertY: false }); });
1917
+ this.textures = this._font.pages.map(function (page) {
1918
+ var texture = new babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__.Texture(page, scene, { noMipmap: false, invertY: false });
1919
+ texture.anisotropicFilteringLevel = 16;
1920
+ return texture;
1921
+ });
1911
1922
  }
1923
+ FontAsset.prototype.dispose = function () {
1924
+ for (var _i = 0, _a = this.textures; _i < _a.length; _i++) {
1925
+ var texture = _a[_i];
1926
+ texture.dispose();
1927
+ }
1928
+ this.textures.length = 0;
1929
+ };
1912
1930
  FontAsset.prototype._updateFallbacks = function () {
1913
1931
  if (!this._chars.has(CharCode.SPACE)) {
1914
1932
  this._chars.set(CharCode.SPACE, {
@@ -1973,11 +1991,27 @@ __webpack_require__.r(__webpack_exports__);
1973
1991
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1974
1992
  /* harmony export */ DefaultParagraphOptions: () => (/* reexport safe */ _paragraphOptions__WEBPACK_IMPORTED_MODULE_1__.DefaultParagraphOptions),
1975
1993
  /* harmony export */ FontAsset: () => (/* reexport safe */ _fontAsset__WEBPACK_IMPORTED_MODULE_0__.FontAsset),
1976
- /* harmony export */ TextRenderer: () => (/* reexport safe */ _textRenderer__WEBPACK_IMPORTED_MODULE_2__.TextRenderer)
1994
+ /* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _sdf_index__WEBPACK_IMPORTED_MODULE_3__.SdfTextParagraph),
1995
+ /* harmony export */ TextRenderer: () => (/* reexport safe */ _textRenderer__WEBPACK_IMPORTED_MODULE_2__.TextRenderer),
1996
+ /* harmony export */ msdfPixelShader: () => (/* reexport safe */ _shaders_msdf_fragment__WEBPACK_IMPORTED_MODULE_5__.msdfPixelShader),
1997
+ /* harmony export */ msdfPixelShaderWGSL: () => (/* reexport safe */ _shadersWGSL_msdf_fragment__WEBPACK_IMPORTED_MODULE_7__.msdfPixelShaderWGSL),
1998
+ /* harmony export */ msdfVertexShader: () => (/* reexport safe */ _shaders_msdf_vertex__WEBPACK_IMPORTED_MODULE_4__.msdfVertexShader),
1999
+ /* harmony export */ msdfVertexShaderWGSL: () => (/* reexport safe */ _shadersWGSL_msdf_vertex__WEBPACK_IMPORTED_MODULE_6__.msdfVertexShaderWGSL)
1977
2000
  /* harmony export */ });
1978
2001
  /* harmony import */ var _fontAsset__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fontAsset */ "../../../dev/addons/src/msdfText/fontAsset.ts");
1979
2002
  /* harmony import */ var _paragraphOptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./paragraphOptions */ "../../../dev/addons/src/msdfText/paragraphOptions.ts");
1980
2003
  /* harmony import */ var _textRenderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textRenderer */ "../../../dev/addons/src/msdfText/textRenderer.ts");
2004
+ /* harmony import */ var _sdf_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdf/index */ "../../../dev/addons/src/msdfText/sdf/index.ts");
2005
+ /* harmony import */ var _shaders_msdf_vertex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./shaders/msdf.vertex */ "../../../dev/addons/src/msdfText/shaders/msdf.vertex.ts");
2006
+ /* harmony import */ var _shaders_msdf_fragment__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./shaders/msdf.fragment */ "../../../dev/addons/src/msdfText/shaders/msdf.fragment.ts");
2007
+ /* harmony import */ var _shadersWGSL_msdf_vertex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./shadersWGSL/msdf.vertex */ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.vertex.ts");
2008
+ /* harmony import */ var _shadersWGSL_msdf_fragment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./shadersWGSL/msdf.fragment */ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.fragment.ts");
2009
+ /* eslint-disable import/no-internal-modules */
2010
+
2011
+
2012
+
2013
+
2014
+
1981
2015
 
1982
2016
 
1983
2017
 
@@ -1995,10 +2029,7 @@ __webpack_require__.r(__webpack_exports__);
1995
2029
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1996
2030
  /* harmony export */ DefaultParagraphOptions: () => (/* binding */ DefaultParagraphOptions)
1997
2031
  /* harmony export */ });
1998
- /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
1999
- /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__);
2000
2032
  /* eslint-disable jsdoc/require-jsdoc */
2001
-
2002
2033
  /** @internal */
2003
2034
  var DefaultParagraphOptions = {
2004
2035
  maxWidth: Infinity,
@@ -2007,10 +2038,82 @@ var DefaultParagraphOptions = {
2007
2038
  tabSize: 4,
2008
2039
  whiteSpace: "pre-line",
2009
2040
  textAlign: "center",
2010
- translate: new babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__.Vector2(-0.5, -0.5),
2041
+ translate: { x: -0.5, y: -0.5 },
2011
2042
  };
2012
2043
 
2013
2044
 
2045
+ /***/ }),
2046
+
2047
+ /***/ "../../../dev/addons/src/msdfText/sdf/bmFont.ts":
2048
+ /*!******************************************************!*\
2049
+ !*** ../../../dev/addons/src/msdfText/sdf/bmFont.ts ***!
2050
+ \******************************************************/
2051
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2052
+
2053
+ __webpack_require__.r(__webpack_exports__);
2054
+
2055
+
2056
+
2057
+ /***/ }),
2058
+
2059
+ /***/ "../../../dev/addons/src/msdfText/sdf/font.ts":
2060
+ /*!****************************************************!*\
2061
+ !*** ../../../dev/addons/src/msdfText/sdf/font.ts ***!
2062
+ \****************************************************/
2063
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2064
+
2065
+ __webpack_require__.r(__webpack_exports__);
2066
+
2067
+
2068
+
2069
+ /***/ }),
2070
+
2071
+ /***/ "../../../dev/addons/src/msdfText/sdf/glyph.ts":
2072
+ /*!*****************************************************!*\
2073
+ !*** ../../../dev/addons/src/msdfText/sdf/glyph.ts ***!
2074
+ \*****************************************************/
2075
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2076
+
2077
+ __webpack_require__.r(__webpack_exports__);
2078
+
2079
+
2080
+
2081
+ /***/ }),
2082
+
2083
+ /***/ "../../../dev/addons/src/msdfText/sdf/index.ts":
2084
+ /*!*****************************************************!*\
2085
+ !*** ../../../dev/addons/src/msdfText/sdf/index.ts ***!
2086
+ \*****************************************************/
2087
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2088
+
2089
+ __webpack_require__.r(__webpack_exports__);
2090
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2091
+ /* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _paragraph__WEBPACK_IMPORTED_MODULE_4__.SdfTextParagraph)
2092
+ /* harmony export */ });
2093
+ /* harmony import */ var _bmFont__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bmFont */ "../../../dev/addons/src/msdfText/sdf/bmFont.ts");
2094
+ /* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "../../../dev/addons/src/msdfText/sdf/font.ts");
2095
+ /* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "../../../dev/addons/src/msdfText/sdf/glyph.ts");
2096
+ /* harmony import */ var _line__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line */ "../../../dev/addons/src/msdfText/sdf/line.ts");
2097
+ /* harmony import */ var _paragraph__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./paragraph */ "../../../dev/addons/src/msdfText/sdf/paragraph.ts");
2098
+
2099
+
2100
+
2101
+
2102
+
2103
+
2104
+
2105
+ /***/ }),
2106
+
2107
+ /***/ "../../../dev/addons/src/msdfText/sdf/line.ts":
2108
+ /*!****************************************************!*\
2109
+ !*** ../../../dev/addons/src/msdfText/sdf/line.ts ***!
2110
+ \****************************************************/
2111
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2112
+
2113
+ __webpack_require__.r(__webpack_exports__);
2114
+
2115
+
2116
+
2014
2117
  /***/ }),
2015
2118
 
2016
2119
  /***/ "../../../dev/addons/src/msdfText/sdf/paragraph.ts":
@@ -2061,7 +2164,6 @@ var SdfTextParagraph = /** @class */ (function () {
2061
2164
  var height = this.lineHeight * lines.length;
2062
2165
  if (this.options.textAlign !== "left" || this.options.translate) {
2063
2166
  lines.forEach(function (line) {
2064
- var _a;
2065
2167
  var anchor = (function () {
2066
2168
  switch (_this.options.textAlign) {
2067
2169
  case "right":
@@ -2073,14 +2175,14 @@ var SdfTextParagraph = /** @class */ (function () {
2073
2175
  return 0;
2074
2176
  }
2075
2177
  })();
2076
- var translate = (_a = _this.options.translate) === null || _a === void 0 ? void 0 : _a.multiplyByFloats(width, height);
2077
- line.glyphs.forEach(function (glyph) {
2178
+ var x = _this.options.translate ? _this.options.translate.x * width : 0;
2179
+ var y = _this.options.translate ? _this.options.translate.y * height : 0;
2180
+ for (var _i = 0, _a = line.glyphs; _i < _a.length; _i++) {
2181
+ var glyph = _a[_i];
2078
2182
  glyph.x += anchor;
2079
- if (translate) {
2080
- glyph.x += translate.x;
2081
- glyph.y += translate.y;
2082
- }
2083
- });
2183
+ glyph.x += x;
2184
+ glyph.y += y;
2185
+ }
2084
2186
  });
2085
2187
  }
2086
2188
  var glyphs = lines.flatMap(function (line) { return line.glyphs; });
@@ -2123,7 +2225,7 @@ var SdfTextParagraph = /** @class */ (function () {
2123
2225
  var char = this.fontAsset._getChar(charCode);
2124
2226
  var charWidth = char.width;
2125
2227
  var kerning = lastChar ? this.fontAsset._getKerning(lastChar.id, char.id) : 0;
2126
- currentCursor += kerning + char.xoffset;
2228
+ currentCursor += kerning;
2127
2229
  var newWidth = currentCursor + charWidth;
2128
2230
  var cursorProgress = char.xadvance + this.options.letterSpacing;
2129
2231
  var nextPosition = currentCursor + cursorProgress;
@@ -2139,7 +2241,7 @@ var SdfTextParagraph = /** @class */ (function () {
2139
2241
  currentGlyphs = [];
2140
2242
  }
2141
2243
  var x = currentCursor;
2142
- var y = currentLine * this.lineHeight + char.yoffset;
2244
+ var y = currentLine * this.lineHeight;
2143
2245
  currentGlyphs.push({
2144
2246
  char: char,
2145
2247
  line: currentLine,
@@ -2158,6 +2260,9 @@ var SdfTextParagraph = /** @class */ (function () {
2158
2260
  }
2159
2261
  }
2160
2262
  if (currentGlyphs.length > 0) {
2263
+ if (lastChar) {
2264
+ // currentWidth += lastChar.xadvance;
2265
+ }
2161
2266
  pushCurrentLine();
2162
2267
  }
2163
2268
  return lines;
@@ -2167,6 +2272,110 @@ var SdfTextParagraph = /** @class */ (function () {
2167
2272
 
2168
2273
 
2169
2274
 
2275
+ /***/ }),
2276
+
2277
+ /***/ "../../../dev/addons/src/msdfText/shaders/msdf.fragment.ts":
2278
+ /*!*****************************************************************!*\
2279
+ !*** ../../../dev/addons/src/msdfText/shaders/msdf.fragment.ts ***!
2280
+ \*****************************************************************/
2281
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2282
+
2283
+ __webpack_require__.r(__webpack_exports__);
2284
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2285
+ /* harmony export */ msdfPixelShader: () => (/* binding */ msdfPixelShader)
2286
+ /* harmony export */ });
2287
+ /* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Maths/math");
2288
+ /* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
2289
+ // Do not edit.
2290
+
2291
+ var name = "msdfPixelShader";
2292
+ var shader = "#extension GL_OES_standard_derivatives : enable\nprecision highp float;uniform sampler2D fontAtlas;uniform vec4 uColor;uniform vec4 uStrokeColor;uniform float uStrokeInsetWidth;uniform float uStrokeOutsetWidth;uniform float thickness;varying vec2 atlasUV;float median(vec3 msdf) {return max(min(msdf.r,msdf.g),min(max(msdf.r,msdf.g),msdf.b));}\nvoid main(void)\n{vec3 s=texture2D(fontAtlas,atlasUV).rgb;float sigDist=median(s)-0.5+thickness;float alpha=clamp(sigDist/fwidth(sigDist)+0.5,0.0,1.0);float sigDistOutset=sigDist+uStrokeOutsetWidth*0.5;float sigDistInset=sigDist-uStrokeInsetWidth*0.5;float outset=clamp(sigDistOutset/fwidth(sigDistOutset)+0.5,0.0,1.0);float inset=1.0-clamp(sigDistInset/fwidth(sigDistInset)+0.5,0.0,1.0);float border=outset*inset;vec4 filledFragColor=vec4(uColor.rgb,alpha*uColor.a);vec4 strokedFragColor=vec4(uStrokeColor.rgb,border*uStrokeColor.a);gl_FragColor=mix(filledFragColor,strokedFragColor,border);}";
2293
+ // Sideeffect
2294
+ if (!babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name]) {
2295
+ babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
2296
+ }
2297
+ /** @internal */
2298
+ var msdfPixelShader = { name: name, shader: shader };
2299
+
2300
+
2301
+ /***/ }),
2302
+
2303
+ /***/ "../../../dev/addons/src/msdfText/shaders/msdf.vertex.ts":
2304
+ /*!***************************************************************!*\
2305
+ !*** ../../../dev/addons/src/msdfText/shaders/msdf.vertex.ts ***!
2306
+ \***************************************************************/
2307
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2308
+
2309
+ __webpack_require__.r(__webpack_exports__);
2310
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2311
+ /* harmony export */ msdfVertexShader: () => (/* binding */ msdfVertexShader)
2312
+ /* harmony export */ });
2313
+ /* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Maths/math");
2314
+ /* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
2315
+ // Do not edit.
2316
+
2317
+ var name = "msdfVertexShader";
2318
+ var shader = "#define BILLBOARD 1\n#define BILLBOARDSCREENPROJECTED 2\nattribute vec2 offsets;attribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;attribute vec4 uvs;uniform mat4 transform;uniform mat4 parentWorld;uniform mat4 view;uniform mat4 projection;uniform vec3 center;uniform int mode;varying vec2 atlasUV;void main(void) {mat4 world=mat4(world0,world1,world2,world3);vec4 worldPos=transform*(world*vec4(offsets.xy-vec2(0.5,0.5),0.,1.0));if (mode>=BILLBOARD) {vec3 viewPos=(view*parentWorld*vec4(0.,0.,0.,1.0)).xyz; \nif (mode==BILLBOARDSCREENPROJECTED) {viewPos.x/=viewPos.z;viewPos.y/=viewPos.z;viewPos.z=1.0;}\ngl_Position=projection*vec4(viewPos+worldPos.xyz,1.0); } else {vec3 viewPos=(view*parentWorld*worldPos).xyz; \ngl_Position=projection*vec4(viewPos,1.0); }\natlasUV=vec2(uvs.x+offsets.x*uvs.z,uvs.y+(1.0-offsets.y)*uvs.w);}";
2319
+ // Sideeffect
2320
+ if (!babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name]) {
2321
+ babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
2322
+ }
2323
+ /** @internal */
2324
+ var msdfVertexShader = { name: name, shader: shader };
2325
+
2326
+
2327
+ /***/ }),
2328
+
2329
+ /***/ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.fragment.ts":
2330
+ /*!*********************************************************************!*\
2331
+ !*** ../../../dev/addons/src/msdfText/shadersWGSL/msdf.fragment.ts ***!
2332
+ \*********************************************************************/
2333
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2334
+
2335
+ __webpack_require__.r(__webpack_exports__);
2336
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2337
+ /* harmony export */ msdfPixelShaderWGSL: () => (/* binding */ msdfPixelShaderWGSL)
2338
+ /* harmony export */ });
2339
+ /* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Maths/math");
2340
+ /* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
2341
+ // Do not edit.
2342
+
2343
+ var name = "msdfPixelShader";
2344
+ var shader = "var fontAtlas: texture_2d<f32>;var fontAtlasSampler: sampler;uniform uColor: vec4f;uniform thickness: f32;uniform uStrokeColor: vec4f;uniform uStrokeInsetWidth: f32;uniform uStrokeOutsetWidth: f32;varying atlasUV: vec2f;fn median(msdf: vec3<f32>)->f32 {let a=min(msdf.r,msdf.g);let b=max(msdf.r,msdf.g);return max(a,min(b,msdf.b));}\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {let s=textureSample(fontAtlas,fontAtlasSampler,input.atlasUV).rgb;let sigDist=median(s)-0.5+uniforms.thickness;let afwidth=length(vec2<f32>(dpdx(sigDist),dpdy(sigDist)));let alpha=clamp(sigDist/afwidth+0.5,0.0,1.0);let sigDistOutset=sigDist+uniforms.uStrokeOutsetWidth*0.5;let sigDistInset=sigDist-uniforms.uStrokeInsetWidth*0.5;let afwidthOutset=length(vec2<f32>(dpdx(sigDistOutset),dpdy(sigDistOutset)));let afwidthInset=length(vec2<f32>(dpdx(sigDistInset),dpdy(sigDistInset)));let outset=clamp(sigDistOutset/afwidthOutset+0.5,0.0,1.0);let inset=1.0-clamp(sigDistInset/afwidthInset+0.5,0.0,1.0);let border=outset*inset;let filledFragColor=vec4<f32>(uniforms.uColor.rgb,alpha*uniforms.uColor.a);let strokedFragColor=vec4<f32>(uniforms.uStrokeColor.rgb,border*uniforms.uStrokeColor.a);fragmentOutputs.color=mix(filledFragColor,strokedFragColor,border);}";
2345
+ // Sideeffect
2346
+ if (!babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStoreWGSL[name]) {
2347
+ babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStoreWGSL[name] = shader;
2348
+ }
2349
+ /** @internal */
2350
+ var msdfPixelShaderWGSL = { name: name, shader: shader };
2351
+
2352
+
2353
+ /***/ }),
2354
+
2355
+ /***/ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.vertex.ts":
2356
+ /*!*******************************************************************!*\
2357
+ !*** ../../../dev/addons/src/msdfText/shadersWGSL/msdf.vertex.ts ***!
2358
+ \*******************************************************************/
2359
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2360
+
2361
+ __webpack_require__.r(__webpack_exports__);
2362
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2363
+ /* harmony export */ msdfVertexShaderWGSL: () => (/* binding */ msdfVertexShaderWGSL)
2364
+ /* harmony export */ });
2365
+ /* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Maths/math");
2366
+ /* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
2367
+ // Do not edit.
2368
+
2369
+ var name = "msdfVertexShader";
2370
+ var shader = "#define BILLBOARD 1\n#define BILLBOARDSCREENPROJECTED 2\nattribute offsets: vec2f;attribute world0: vec4f;attribute world1: vec4f;attribute world2: vec4f;attribute world3: vec4f;attribute uvs: vec4f;uniform transform: mat4x4f;uniform parentWorld: mat4x4f;uniform view: mat4x4f;uniform projection: mat4x4f;uniform mode: u32;varying atlasUV: vec2f;@vertex\nfn main(input: VertexInputs)->FragmentInputs {let world=mat4x4<f32>(input.world0,input.world1,input.world2,input.world3);let localOffset=vec4<f32>(input.offsets-vec2<f32>(0.5,0.5),0.0,1.0);let worldPos=uniforms.transform*world*localOffset;if (uniforms.mode>=BILLBOARD) { \nvar viewPos=(uniforms.view*uniforms.parentWorld*vec4f(0.,0.,0.,1.0)).xyz;if (uniforms.mode==BILLBOARDSCREENPROJECTED) {viewPos=vec3f(viewPos.x/viewPos.z,viewPos.y/viewPos.z,1.0);} \nvertexOutputs.position=uniforms.projection*vec4<f32>(viewPos+worldPos.xyz,1.0);} else { \nlet viewPos=(uniforms.view*uniforms.parentWorld*worldPos).xyz;vertexOutputs.position=uniforms.projection*vec4<f32>(viewPos,1.0);}\nvertexOutputs.atlasUV=vec2<f32>(\ninput.uvs.x+input.offsets.x*input.uvs.z,\ninput.uvs.y+(1.0-input.offsets.y)*input.uvs.w\n);}";
2371
+ // Sideeffect
2372
+ if (!babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStoreWGSL[name]) {
2373
+ babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStoreWGSL[name] = shader;
2374
+ }
2375
+ /** @internal */
2376
+ var msdfVertexShaderWGSL = { name: name, shader: shader };
2377
+
2378
+
2170
2379
  /***/ }),
2171
2380
 
2172
2381
  /***/ "../../../dev/addons/src/msdfText/textRenderer.ts":
@@ -2180,7 +2389,7 @@ __webpack_require__.r(__webpack_exports__);
2180
2389
  /* harmony export */ TextRenderer: () => (/* binding */ TextRenderer)
2181
2390
  /* harmony export */ });
2182
2391
  /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
2183
- /* harmony import */ var babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/ThinMaths/thinMath.matrix.functions */ "babylonjs/Maths/math.vector");
2392
+ /* harmony import */ var babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/ThinMaths/thinMath.matrix.functions */ "babylonjs/Maths/math");
2184
2393
  /* harmony import */ var babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__);
2185
2394
  /* harmony import */ var _sdf_paragraph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdf/paragraph */ "../../../dev/addons/src/msdfText/sdf/paragraph.ts");
2186
2395
 
@@ -2198,6 +2407,7 @@ __webpack_require__.r(__webpack_exports__);
2198
2407
  * With metrics: #6RLCWP#35
2199
2408
  * Thickness: #IABMEZ#3
2200
2409
  * Solar system: #9YCDYC#9
2410
+ * Stroke: #6RLCWP#37
2201
2411
  */
2202
2412
  var TextRenderer = /** @class */ (function () {
2203
2413
  function TextRenderer(engine, shaderLanguage, font) {
@@ -2219,21 +2429,43 @@ var TextRenderer = /** @class */ (function () {
2219
2429
  this._finalMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
2220
2430
  this._lineMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
2221
2431
  this._parentWorldMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
2222
- this._storedTranslation = { x: 0, y: 0, z: 0 };
2223
2432
  /**
2224
2433
  * Gets or sets the color of the text
2225
2434
  */
2226
2435
  this.color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
2436
+ /**
2437
+ * Gets or sets the color of the stroke around the text
2438
+ */
2439
+ this.strokeColor = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
2440
+ /**
2441
+ * Gets or sets the width of the stroke around the text (inset)
2442
+ */
2443
+ this.strokeInsetWidth = 0;
2444
+ /**
2445
+ * Gets or sets the width of the stroke around the text (outset)
2446
+ */
2447
+ this.strokeOutsetWidth = 0;
2227
2448
  /**
2228
2449
  * Gets or sets the thickness of the text (0 means as defined in the font)
2229
2450
  * Value must be between -0.5 and 0.5
2230
2451
  */
2231
2452
  this.thicknessControl = 0;
2232
2453
  this._parent = null;
2454
+ this._transformMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
2233
2455
  /**
2234
2456
  * Gets or sets if the text is billboarded
2235
2457
  */
2236
2458
  this.isBillboard = false;
2459
+ /**
2460
+ * Gets or sets if the text is screen projected
2461
+ * This will work only if the text is billboarded
2462
+ */
2463
+ this.isBillboardScreenProjected = false;
2464
+ /**
2465
+ * Gets or sets if the text renderer should ignore the depth buffer
2466
+ * Default is false
2467
+ */
2468
+ this.ignoreDepthBuffer = false;
2237
2469
  this._engine = engine;
2238
2470
  this._shaderLanguage = shaderLanguage;
2239
2471
  this._font = font;
@@ -2259,6 +2491,21 @@ var TextRenderer = /** @class */ (function () {
2259
2491
  enumerable: false,
2260
2492
  configurable: true
2261
2493
  });
2494
+ Object.defineProperty(TextRenderer.prototype, "transformMatrix", {
2495
+ /**
2496
+ * Gets or sets the transform matrix of the text renderer
2497
+ * It will be applied in that order:
2498
+ * parent x transform x paragraph world
2499
+ */
2500
+ get: function () {
2501
+ return this._transformMatrix;
2502
+ },
2503
+ set: function (value) {
2504
+ this._transformMatrix = value;
2505
+ },
2506
+ enumerable: false,
2507
+ configurable: true
2508
+ });
2262
2509
  Object.defineProperty(TextRenderer.prototype, "characterCount", {
2263
2510
  /**
2264
2511
  * Gets the number of characters in the text renderer
@@ -2297,7 +2544,7 @@ var TextRenderer = /** @class */ (function () {
2297
2544
  this._drawWrapperBase.effect = this._engine.createEffect({
2298
2545
  vertexSource: vertex,
2299
2546
  fragmentSource: fragment,
2300
- }, ["offsets", "world0", "world1", "world2", "world3", "uvs"], ["parentWorld", "view", "projection", "uColor", "unitRange", "texelSize", "thickness"], ["fontAtlas"], defines, undefined, undefined, undefined, undefined, this._shaderLanguage);
2547
+ }, ["offsets", "world0", "world1", "world2", "world3", "uvs"], ["parentWorld", "view", "projection", "uColor", "thickness", "uStrokeColor", "uStrokeInsetWidth", "uStrokeOutsetWidth", "mode", "transform"], ["fontAtlas"], defines, undefined, undefined, undefined, undefined, this._shaderLanguage);
2301
2548
  this._drawWrapperBase.effect._refCount++;
2302
2549
  };
2303
2550
  /**
@@ -2329,8 +2576,8 @@ var TextRenderer = /** @class */ (function () {
2329
2576
  _this._charUvs[charsUvsBase + i * 4 + 1] = g.char.y / texHeight;
2330
2577
  _this._charUvs[charsUvsBase + i * 4 + 2] = g.char.width / texWidth;
2331
2578
  _this._charUvs[charsUvsBase + i * 4 + 3] = g.char.height / texHeight;
2332
- var x = g.x;
2333
- var y = -g.y;
2579
+ var x = g.x + g.char.xoffset;
2580
+ var y = 1.0 - (g.y + g.char.yoffset);
2334
2581
  (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ScalingMatrixToRef)(g.char.width, g.char.height, 1.0, _this._scalingMatrix);
2335
2582
  (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.MultiplyMatricesToRef)(_this._offsetMatrix, _this._scalingMatrix, _this._baseMatrix);
2336
2583
  (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.TranslationMatrixToRef)(x * fontScale, y * fontScale, 0.0, _this._translationMatrix);
@@ -2357,53 +2604,27 @@ var TextRenderer = /** @class */ (function () {
2357
2604
  var engine = this._engine;
2358
2605
  engine.setState(false);
2359
2606
  engine.enableEffect(drawWrapper);
2360
- if (this.isBillboard) {
2361
- // We will only consider translation for parent to simplify computation
2362
- // Save parent translation
2363
- if (this._parent) {
2364
- var pwm_1 = this._parent.getWorldMatrix().asArray();
2365
- this._storedTranslation.x = pwm_1[12];
2366
- this._storedTranslation.y = pwm_1[13];
2367
- this._storedTranslation.z = pwm_1[14];
2368
- }
2369
- else {
2370
- this._storedTranslation.x = 0;
2371
- this._storedTranslation.y = 0;
2372
- this._storedTranslation.z = 0;
2373
- }
2374
- // Cancel camera rotation
2375
- var baseM = this._baseMatrix.asArray();
2376
- (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.CopyMatrixToArray)(viewMatrix, baseM);
2377
- baseM[12] = 0;
2378
- baseM[13] = 0;
2379
- baseM[14] = 0;
2380
- (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.InvertMatrixToRef)(this._baseMatrix, this._parentWorldMatrix);
2381
- // Restore translation
2382
- var pwm = this._parentWorldMatrix.asArray();
2383
- pwm[12] = this._storedTranslation.x;
2384
- pwm[13] = this._storedTranslation.y;
2385
- pwm[14] = this._storedTranslation.z;
2607
+ if (this.ignoreDepthBuffer) {
2608
+ engine.setDepthBuffer(false);
2609
+ }
2610
+ if (this._parent) {
2611
+ (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.CopyMatrixToRef)(this._parent.getWorldMatrix(), this._parentWorldMatrix);
2386
2612
  }
2387
2613
  else {
2388
- if (this._parent) {
2389
- (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.CopyMatrixToRef)(this._parent.getWorldMatrix(), this._parentWorldMatrix);
2390
- }
2391
- else {
2392
- (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.IdentityMatrixToRef)(this._parentWorldMatrix);
2393
- }
2614
+ (0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.IdentityMatrixToRef)(this._parentWorldMatrix);
2394
2615
  }
2616
+ effect.setInt("mode", this.isBillboard ? (this.isBillboardScreenProjected ? 2 : 1) : 0);
2395
2617
  effect.setMatrix("parentWorld", this._parentWorldMatrix);
2396
2618
  effect.setMatrix("view", viewMatrix);
2397
2619
  effect.setMatrix("projection", projectionMatrix);
2620
+ effect.setMatrix("transform", this.transformMatrix);
2398
2621
  // Texture
2399
- var textureWidth = this._font._font.common.scaleW;
2400
- var textureHeight = this._font._font.common.scaleW;
2401
- var distanceRange = this._font._font.distanceField.distanceRange;
2402
2622
  effect.setTexture("fontAtlas", this._font.textures[0]);
2403
- effect.setFloat2("unitRange", distanceRange / textureWidth, distanceRange / textureHeight);
2404
- effect.setFloat2("texelSize", 1.0 / textureWidth, 1.0 / textureHeight);
2405
2623
  effect.setDirectColor4("uColor", this.color);
2624
+ effect.setDirectColor4("uStrokeColor", this.strokeColor);
2406
2625
  effect.setFloat("thickness", this.thicknessControl * 0.9);
2626
+ effect.setFloat("uStrokeInsetWidth", this.strokeInsetWidth);
2627
+ effect.setFloat("uStrokeOutsetWidth", this.strokeOutsetWidth);
2407
2628
  var instanceCount = this._charMatrices.length / 16;
2408
2629
  // Need update?
2409
2630
  if (this._isDirty) {
@@ -2427,6 +2648,10 @@ var TextRenderer = /** @class */ (function () {
2427
2648
  engine.setAlphaMode(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.ALPHA_COMBINE);
2428
2649
  engine.drawArraysType(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.MATERIAL_TriangleStripDrawMode, 0, 4, instanceCount);
2429
2650
  engine.unbindInstanceAttributes();
2651
+ engine.setAlphaMode(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.ALPHA_DISABLE);
2652
+ if (this.ignoreDepthBuffer) {
2653
+ engine.setDepthBuffer(true);
2654
+ }
2430
2655
  };
2431
2656
  /**
2432
2657
  * Release associated resources
@@ -2469,19 +2694,19 @@ var TextRenderer = /** @class */ (function () {
2469
2694
  fragment = "";
2470
2695
  if (!engine.isWebGPU) return [3 /*break*/, 3];
2471
2696
  shaderLanguage = 1 /* ShaderLanguage.WGSL */;
2472
- return [4 /*yield*/, __webpack_require__.e(/*! import() */ "dev_addons_src_msdfText_webgpu_vertex_ts").then(__webpack_require__.bind(__webpack_require__, /*! ./webgpu/vertex */ "../../../dev/addons/src/msdfText/webgpu/vertex.ts"))];
2697
+ return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./shadersWGSL/msdf.vertex */ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.vertex.ts"))];
2473
2698
  case 1:
2474
- vertex = (_a.sent()).msdfVertexShader.shader;
2475
- return [4 /*yield*/, __webpack_require__.e(/*! import() */ "dev_addons_src_msdfText_webgpu_fragment_ts").then(__webpack_require__.bind(__webpack_require__, /*! ./webgpu/fragment */ "../../../dev/addons/src/msdfText/webgpu/fragment.ts"))];
2699
+ vertex = (_a.sent()).msdfVertexShaderWGSL.shader;
2700
+ return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./shadersWGSL/msdf.fragment */ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.fragment.ts"))];
2476
2701
  case 2:
2477
- fragment = (_a.sent()).msdfFragmentShader.shader;
2702
+ fragment = (_a.sent()).msdfPixelShaderWGSL.shader;
2478
2703
  return [3 /*break*/, 6];
2479
- case 3: return [4 /*yield*/, __webpack_require__.e(/*! import() */ "dev_addons_src_msdfText_webgl_vertex_ts").then(__webpack_require__.bind(__webpack_require__, /*! ./webgl/vertex */ "../../../dev/addons/src/msdfText/webgl/vertex.ts"))];
2704
+ case 3: return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./shaders/msdf.vertex */ "../../../dev/addons/src/msdfText/shaders/msdf.vertex.ts"))];
2480
2705
  case 4:
2481
2706
  vertex = (_a.sent()).msdfVertexShader.shader;
2482
- return [4 /*yield*/, __webpack_require__.e(/*! import() */ "dev_addons_src_msdfText_webgl_fragment_ts").then(__webpack_require__.bind(__webpack_require__, /*! ./webgl/fragment */ "../../../dev/addons/src/msdfText/webgl/fragment.ts"))];
2707
+ return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./shaders/msdf.fragment */ "../../../dev/addons/src/msdfText/shaders/msdf.fragment.ts"))];
2483
2708
  case 5:
2484
- fragment = (_a.sent()).msdfFragmentShader.shader;
2709
+ fragment = (_a.sent()).msdfPixelShader.shader;
2485
2710
  _a.label = 6;
2486
2711
  case 6:
2487
2712
  textRenderer = new TextRenderer(engine, shaderLanguage, font);
@@ -2498,13 +2723,13 @@ var TextRenderer = /** @class */ (function () {
2498
2723
 
2499
2724
  /***/ }),
2500
2725
 
2501
- /***/ "babylonjs/Maths/math.vector":
2726
+ /***/ "babylonjs/Maths/math":
2502
2727
  /*!****************************************************************************************************!*\
2503
2728
  !*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
2504
2729
  \****************************************************************************************************/
2505
2730
  /***/ ((module) => {
2506
2731
 
2507
- module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__;
2732
+ module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math__;
2508
2733
 
2509
2734
  /***/ })
2510
2735
 
@@ -2534,9 +2759,6 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__;
2534
2759
  /******/ return module.exports;
2535
2760
  /******/ }
2536
2761
  /******/
2537
- /******/ // expose the modules object (__webpack_modules__)
2538
- /******/ __webpack_require__.m = __webpack_modules__;
2539
- /******/
2540
2762
  /************************************************************************/
2541
2763
  /******/ /* webpack/runtime/compat get default export */
2542
2764
  /******/ (() => {
@@ -2562,91 +2784,11 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__;
2562
2784
  /******/ };
2563
2785
  /******/ })();
2564
2786
  /******/
2565
- /******/ /* webpack/runtime/ensure chunk */
2566
- /******/ (() => {
2567
- /******/ __webpack_require__.f = {};
2568
- /******/ // This file contains only the entry chunk.
2569
- /******/ // The chunk loading function for additional chunks
2570
- /******/ __webpack_require__.e = (chunkId) => {
2571
- /******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
2572
- /******/ __webpack_require__.f[key](chunkId, promises);
2573
- /******/ return promises;
2574
- /******/ }, []));
2575
- /******/ };
2576
- /******/ })();
2577
- /******/
2578
- /******/ /* webpack/runtime/get javascript chunk filename */
2579
- /******/ (() => {
2580
- /******/ // This function allow to reference async chunks
2581
- /******/ __webpack_require__.u = (chunkId) => {
2582
- /******/ // return url for filenames based on template
2583
- /******/ return "" + chunkId + ".js";
2584
- /******/ };
2585
- /******/ })();
2586
- /******/
2587
- /******/ /* webpack/runtime/global */
2588
- /******/ (() => {
2589
- /******/ __webpack_require__.g = (function() {
2590
- /******/ if (typeof globalThis === 'object') return globalThis;
2591
- /******/ try {
2592
- /******/ return this || new Function('return this')();
2593
- /******/ } catch (e) {
2594
- /******/ if (typeof window === 'object') return window;
2595
- /******/ }
2596
- /******/ })();
2597
- /******/ })();
2598
- /******/
2599
2787
  /******/ /* webpack/runtime/hasOwnProperty shorthand */
2600
2788
  /******/ (() => {
2601
2789
  /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2602
2790
  /******/ })();
2603
2791
  /******/
2604
- /******/ /* webpack/runtime/load script */
2605
- /******/ (() => {
2606
- /******/ var inProgress = {};
2607
- /******/ var dataWebpackPrefix = "ADDONS:";
2608
- /******/ // loadScript function to load a script via script tag
2609
- /******/ __webpack_require__.l = (url, done, key, chunkId) => {
2610
- /******/ if(inProgress[url]) { inProgress[url].push(done); return; }
2611
- /******/ var script, needAttach;
2612
- /******/ if(key !== undefined) {
2613
- /******/ var scripts = document.getElementsByTagName("script");
2614
- /******/ for(var i = 0; i < scripts.length; i++) {
2615
- /******/ var s = scripts[i];
2616
- /******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; }
2617
- /******/ }
2618
- /******/ }
2619
- /******/ if(!script) {
2620
- /******/ needAttach = true;
2621
- /******/ script = document.createElement('script');
2622
- /******/
2623
- /******/ script.charset = 'utf-8';
2624
- /******/ script.timeout = 120;
2625
- /******/ if (__webpack_require__.nc) {
2626
- /******/ script.setAttribute("nonce", __webpack_require__.nc);
2627
- /******/ }
2628
- /******/ script.setAttribute("data-webpack", dataWebpackPrefix + key);
2629
- /******/
2630
- /******/ script.src = url;
2631
- /******/ }
2632
- /******/ inProgress[url] = [done];
2633
- /******/ var onScriptComplete = (prev, event) => {
2634
- /******/ // avoid mem leaks in IE.
2635
- /******/ script.onerror = script.onload = null;
2636
- /******/ clearTimeout(timeout);
2637
- /******/ var doneFns = inProgress[url];
2638
- /******/ delete inProgress[url];
2639
- /******/ script.parentNode && script.parentNode.removeChild(script);
2640
- /******/ doneFns && doneFns.forEach((fn) => (fn(event)));
2641
- /******/ if(prev) return prev(event);
2642
- /******/ }
2643
- /******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);
2644
- /******/ script.onerror = onScriptComplete.bind(null, script.onerror);
2645
- /******/ script.onload = onScriptComplete.bind(null, script.onload);
2646
- /******/ needAttach && document.head.appendChild(script);
2647
- /******/ };
2648
- /******/ })();
2649
- /******/
2650
2792
  /******/ /* webpack/runtime/make namespace object */
2651
2793
  /******/ (() => {
2652
2794
  /******/ // define __esModule on exports
@@ -2658,119 +2800,6 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__;
2658
2800
  /******/ };
2659
2801
  /******/ })();
2660
2802
  /******/
2661
- /******/ /* webpack/runtime/publicPath */
2662
- /******/ (() => {
2663
- /******/ var scriptUrl;
2664
- /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
2665
- /******/ var document = __webpack_require__.g.document;
2666
- /******/ if (!scriptUrl && document) {
2667
- /******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')
2668
- /******/ scriptUrl = document.currentScript.src;
2669
- /******/ if (!scriptUrl) {
2670
- /******/ var scripts = document.getElementsByTagName("script");
2671
- /******/ if(scripts.length) {
2672
- /******/ var i = scripts.length - 1;
2673
- /******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;
2674
- /******/ }
2675
- /******/ }
2676
- /******/ }
2677
- /******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
2678
- /******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
2679
- /******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
2680
- /******/ scriptUrl = scriptUrl.replace(/^blob:/, "").replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
2681
- /******/ __webpack_require__.p = scriptUrl;
2682
- /******/ })();
2683
- /******/
2684
- /******/ /* webpack/runtime/jsonp chunk loading */
2685
- /******/ (() => {
2686
- /******/ // no baseURI
2687
- /******/
2688
- /******/ // object to store loaded and loading chunks
2689
- /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
2690
- /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
2691
- /******/ var installedChunks = {
2692
- /******/ "addons": 0
2693
- /******/ };
2694
- /******/
2695
- /******/ __webpack_require__.f.j = (chunkId, promises) => {
2696
- /******/ // JSONP chunk loading for javascript
2697
- /******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;
2698
- /******/ if(installedChunkData !== 0) { // 0 means "already installed".
2699
- /******/
2700
- /******/ // a Promise means "currently loading".
2701
- /******/ if(installedChunkData) {
2702
- /******/ promises.push(installedChunkData[2]);
2703
- /******/ } else {
2704
- /******/ if(true) { // all chunks have JS
2705
- /******/ // setup Promise in chunk cache
2706
- /******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));
2707
- /******/ promises.push(installedChunkData[2] = promise);
2708
- /******/
2709
- /******/ // start chunk loading
2710
- /******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId);
2711
- /******/ // create error before stack unwound to get useful stacktrace later
2712
- /******/ var error = new Error();
2713
- /******/ var loadingEnded = (event) => {
2714
- /******/ if(__webpack_require__.o(installedChunks, chunkId)) {
2715
- /******/ installedChunkData = installedChunks[chunkId];
2716
- /******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined;
2717
- /******/ if(installedChunkData) {
2718
- /******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
2719
- /******/ var realSrc = event && event.target && event.target.src;
2720
- /******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
2721
- /******/ error.name = 'ChunkLoadError';
2722
- /******/ error.type = errorType;
2723
- /******/ error.request = realSrc;
2724
- /******/ installedChunkData[1](error);
2725
- /******/ }
2726
- /******/ }
2727
- /******/ };
2728
- /******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId);
2729
- /******/ }
2730
- /******/ }
2731
- /******/ }
2732
- /******/ };
2733
- /******/
2734
- /******/ // no prefetching
2735
- /******/
2736
- /******/ // no preloaded
2737
- /******/
2738
- /******/ // no HMR
2739
- /******/
2740
- /******/ // no HMR manifest
2741
- /******/
2742
- /******/ // no on chunks loaded
2743
- /******/
2744
- /******/ // install a JSONP callback for chunk loading
2745
- /******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
2746
- /******/ var [chunkIds, moreModules, runtime] = data;
2747
- /******/ // add "moreModules" to the modules object,
2748
- /******/ // then flag all "chunkIds" as loaded and fire callback
2749
- /******/ var moduleId, chunkId, i = 0;
2750
- /******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
2751
- /******/ for(moduleId in moreModules) {
2752
- /******/ if(__webpack_require__.o(moreModules, moduleId)) {
2753
- /******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
2754
- /******/ }
2755
- /******/ }
2756
- /******/ if(runtime) var result = runtime(__webpack_require__);
2757
- /******/ }
2758
- /******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
2759
- /******/ for(;i < chunkIds.length; i++) {
2760
- /******/ chunkId = chunkIds[i];
2761
- /******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
2762
- /******/ installedChunks[chunkId][0]();
2763
- /******/ }
2764
- /******/ installedChunks[chunkId] = 0;
2765
- /******/ }
2766
- /******/
2767
- /******/ }
2768
- /******/
2769
- /******/ var chunkLoadingGlobal = (typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this)["webpackChunkADDONS"] = (typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this)["webpackChunkADDONS"] || [];
2770
- /******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
2771
- /******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
2772
- /******/ })();
2773
- /******/
2774
2803
  /************************************************************************/
2775
2804
  var __webpack_exports__ = {};
2776
2805
  // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
@@ -2796,4 +2825,4 @@ __webpack_exports__ = __webpack_exports__["default"];
2796
2825
  /******/ })()
2797
2826
  ;
2798
2827
  });
2799
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLmFkZG9ucy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFxREE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFwREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQVdBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQS9FQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQWdDQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBeUNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBS0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFLQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQU1BO0FBSkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNVdBO0FBR0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQTRDQTs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFGQTtBQTVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUF1aUJBO0FBQ0E7QUFDQTtBQUNBO0FBaGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0cUJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQWVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdMQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUlBO0FBQ0E7QUFtQkE7QUFHQTtBQUZBO0FBQ0E7QUFwQkE7QUFDQTtBQXNCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQXVCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsT0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBa0JBOzs7O0FBSUE7QUFDQTtBQUFBO0FBdEJBO0FBRUE7QUFxQkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRkE7QUFFQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQkE7QUFLQTtBQUNBO0FBYUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhCQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUF3QkE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZLQTtBQUVBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFrQkE7Ozs7Ozs7O0FBUUE7QUFDQTtBQWlFQTtBQUFBO0FBaEVBO0FBR0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUVBO0FBYUE7O0FBRUE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQW5DQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQWNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQVlBO0FBQ0E7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFBQTtBQUNBOztBQUFBOztBQUVBOztBQUFBO0FBQ0E7O0FBQUE7OztBQUdBO0FBQ0E7QUFFQTs7OztBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7O0FDM1hBOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3JGQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9maXRTdHJhdGVneS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvaHRtbE1lc2gudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2h0bWxNZXNoUmVuZGVyZXIudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9wb2ludGVyRXZlbnRzQ2FwdHVyZS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvci50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L2ZvbnRBc3NldC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3BhcmFncmFwaE9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9wYXJhZ3JhcGgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3RleHRSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9BRERPTlMvZXh0ZXJuYWwgdW1kIHtcInJvb3RcIjpcIkJBQllMT05cIixcImNvbW1vbmpzXCI6XCJiYWJ5bG9uanNcIixcImNvbW1vbmpzMlwiOlwiYmFieWxvbmpzXCIsXCJhbWRcIjpcImJhYnlsb25qc1wifSIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9lbnN1cmUgY2h1bmsiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2xvYWQgc2NyaXB0Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvcHVibGljUGF0aCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vQURET05TLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcImJhYnlsb25qcy1hZGRvbnNcIiwgW1wiYmFieWxvbmpzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImJhYnlsb25qcy1hZGRvbnNcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkFERE9OU1wiXSA9IGZhY3Rvcnkocm9vdFtcIkJBQllMT05cIl0pO1xufSkoKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKSwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01hdGhzX21hdGhfdmVjdG9yX18pID0+IHtcbnJldHVybiAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XG4gIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xuICAgIHZhciBhciA9IFtdO1xuICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XG4gICAgcmV0dXJuIGFyO1xuICB9O1xuICByZXR1cm4gb3duS2V5cyhvKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcbiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xuICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xuICAgIGlmIChhc3luYykge1xuICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgfVxuICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgdmFyIHIsIHMgPSAwO1xuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcbiAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcbiAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgcyB8PSAxO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICB9XG4gIHJldHVybiBuZXh0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xuICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fZXNEZWNvcmF0ZSxcbiAgX19ydW5Jbml0aWFsaXplcnMsXG4gIF9fcHJvcEtleSxcbiAgX19zZXRGdW5jdGlvbk5hbWUsXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxuICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcbn07XG4iLCJleHBvcnQgdHlwZSBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50O1xyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkO1xyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lDb250YWluOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzaXppbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LmFwcGVuZENoaWxkKHNjYWxpbmdFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gc2l6aW5nRWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gc2l6aW5nRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcblxyXG4gICAgICAgIGNvbnN0IFtjaGlsZFdpZHRoLCBjaGlsZEhlaWdodF0gPSBbc2NhbGluZ0VsZW1lbnQub2Zmc2V0V2lkdGgsIHNjYWxpbmdFbGVtZW50Lm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbih3aWR0aCAvIGNoaWxkV2lkdGgsIGhlaWdodCAvIGNoaWxkSGVpZ2h0KTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtzY2FsZX0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lDb3ZlcjogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50Lm9mZnNldFdpZHRoLCBzY2FsaW5nRWxlbWVudC5vZmZzZXRIZWlnaHRdO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5tYXgod2lkdGggLyBjaGlsZFdpZHRoLCBoZWlnaHQgLyBjaGlsZEhlaWdodCk7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7c2NhbGV9KWA7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfSxcclxufTtcclxuXHJcbmNvbnN0IEZpdFN0cmF0ZWd5U3RyZXRjaDogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50Lm9mZnNldFdpZHRoLCBzY2FsaW5nRWxlbWVudC5vZmZzZXRIZWlnaHRdO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgke3dpZHRoIC8gY2hpbGRXaWR0aH0sICR7aGVpZ2h0IC8gY2hpbGRIZWlnaHR9KWA7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfSxcclxufTtcclxuXHJcbmNvbnN0IEZpdFN0cmF0ZWd5Tm9uZTogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoc2l6aW5nRWxlbWVudCkge1xyXG4gICAgICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBGaXRTdHJhdGVneSA9IHtcclxuICAgIENPTlRBSU46IEZpdFN0cmF0ZWd5Q29udGFpbixcclxuICAgIENPVkVSOiBGaXRTdHJhdGVneUNvdmVyLFxyXG4gICAgU1RSRVRDSDogRml0U3RyYXRlZ3lTdHJldGNoLFxyXG4gICAgTk9ORTogRml0U3RyYXRlZ3lOb25lLFxyXG59O1xyXG4iLCJpbXBvcnQgeyBNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL21lc2hcIjtcclxuaW1wb3J0IHsgQ3JlYXRlUGxhbmVWZXJ0ZXhEYXRhIH0gZnJvbSBcImNvcmUvTWVzaGVzL0J1aWxkZXJzL3BsYW5lQnVpbGRlclwiO1xyXG5pbXBvcnQgeyBTdGFuZGFyZE1hdGVyaWFsIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL3N0YW5kYXJkTWF0ZXJpYWxcIjtcclxuaW1wb3J0IHsgTWF0cml4IH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aFwiO1xyXG5pbXBvcnQgeyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIH0gZnJvbSBcIi4vcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcImNvcmUvTWlzYy9sb2dnZXJcIjtcclxuaW1wb3J0IHR5cGUgeyBGaXRTdHJhdGVneVR5cGUgfSBmcm9tIFwiLi9maXRTdHJhdGVneVwiO1xyXG5pbXBvcnQgeyBGaXRTdHJhdGVneSB9IGZyb20gXCIuL2ZpdFN0cmF0ZWd5XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIEhUTUwgY29udGVudCB0aGF0IHdlIHdhbnQgdG8gcmVuZGVyIGFzIHRob3VnaCBpdCBpcyBwYXJ0IG9mIHRoZSBzY2VuZS4gIFRoZSBIVE1MIGNvbnRlbnQgaXMgYWN0dWFsbHlcclxuICogcmVuZGVyZWQgYmVsb3cgdGhlIGNhbnZhcywgYnV0IGEgZGVwdGggbWFzayBpcyBjcmVhdGVkIGJ5IHRoaXMgY2xhc3MgdGhhdCB3cml0ZXMgdG8gdGhlIGRlcHRoIGJ1ZmZlciBidXQgZG9lcyBub3RcclxuICogd3JpdGUgdG8gdGhlIGNvbG9yIGJ1ZmZlciwgZWZmZWN0aXZlbHkgcHVuY2hpbmcgYSBob2xlIGluIHRoZSBjYW52YXMuICBDU1MgdHJhbnNmb3JtcyBhcmUgdXNlZCB0byBzY2FsZSwgdHJhbnNsYXRlLCBhbmQgcm90YXRlXHJcbiAqIHRoZSBIVE1MIGNvbnRlbnQgc28gdGhhdCBpdCBtYXRjaGVzIHRoZSBjYW1lcmEgYW5kIG1lc2ggb3JpZW50YXRpb24uICBUaGUgY2xhc3Mgc3VwcG9ydHMgaW50ZXJhY3Rpb25zIGluIGVkaXRhYmxlIGFuZCBub24tZWRpdGFibGUgbW9kZS5cclxuICogSW4gbm9uLWVkaXRhYmxlIG1vZGUgKHRoZSBkZWZhdWx0KSwgZXZlbnRzIGFyZSBwYXNzZWQgdG8gdGhlIEhUTUwgY29udGVudCB3aGVuIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhlIG1hc2sgKGFuZCBub3Qgb2NjbHVkZWQgYnkgb3RoZXIgbWVzaGVzXHJcbiAqIGluIHRoZSBzY2VuZSkuXHJcbiAqIEBzZWUgaHR0cHM6Ly9wbGF5Z3JvdW5kLmJhYnlsb25qcy5jb20vI0hWSFlKQyM1XHJcbiAqIEBzZWUgaHR0cHM6Ly9wbGF5Z3JvdW5kLmJhYnlsb25qcy5jb20vI0IxN1RDNyMxMTJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBIdG1sTWVzaCBleHRlbmRzIE1lc2gge1xyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwcyBpZGVudGlmeWluZyBhIGh0bWwgbWVzaCBmcm9tIGEgcmVndWxhciBtZXNoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNIdG1sTWVzaCgpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPdmVycmlkZSB0aGUgc3VwZXIgY2xhc3MncyBfaXNFbmFibGVkIHByb3BlcnR5IHNvIHdlIGNhbiBjb250cm9sIHdoZW4gdGhlIG1lc2hcclxuICAgIC8vIGlzIGVuYWJsZWQuICBJLmUuLCB3ZSBkb24ndCB3YW50IHRvIHJlbmRlciB0aGUgbWVzaCB1bnRpbCB0aGVyZSBpcyBjb250ZW50IHRvIHNob3cuXHJcbiAgICBwcml2YXRlIF9lbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gVGhlIG1lc2ggaXMgcmVhZHkgd2hlbiBjb250ZW50IGhhcyBiZWVuIHNldCBhbmQgdGhlIGNvbnRlbnQgc2l6ZSBoYXMgYmVlbiBzZXRcclxuICAgIC8vIFRoZSBmb3JtZXIgaXMgZG9uZSBieSB0aGUgdXNlciwgdGhlIGxhdHRlciBpcyBkb25lIGJ5IHRoZSByZW5kZXJlci5cclxuICAgIHByaXZhdGUgX3JlYWR5ID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIF9pc0NhbnZhc092ZXJsYXkgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIF9yZXF1aXJlc1VwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBfZWxlbWVudD86IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfd2lkdGg/OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9oZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBfaW52ZXJzZVNjYWxlTWF0cml4OiBNYXRyaXggfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9jYXB0dXJlT25Qb2ludGVyRW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yOiBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBfc291cmNlV2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfc291cmNlSGVpZ2h0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgc291cmNlIHdpZHRoIG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNvdXJjZVdpZHRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgc291cmNlIGhlaWdodCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzb3VyY2VIZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZUhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyOiBhbnk7XHJcblxyXG4gICAgcHJpdmF0ZSBfZml0U3RyYXRlZ3k6IEZpdFN0cmF0ZWd5VHlwZSA9IEZpdFN0cmF0ZWd5Lk5PTkU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cnVjdCBhbiBpbnN0YW5jZSBvZiBIdG1sTWVzaFxyXG4gICAgICogQHBhcmFtIHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBtZXNoLiAgV2lsbCBiZSB1c2VkIGFzIHRoZSBpZCBvZiB0aGUgSFRNTCBlbGVtZW50IGFzIHdlbGwuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3Qgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHNjZW5lOiBTY2VuZSwgaWQ6IHN0cmluZywgeyBjYXB0dXJlT25Qb2ludGVyRW50ZXIgPSB0cnVlLCBpc0NhbnZhc092ZXJsYXkgPSBmYWxzZSwgZml0U3RyYXRlZ3kgPSBGaXRTdHJhdGVneS5OT05FIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKGlkLCBzY2VuZSk7XHJcblxyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgQmFpbCBpZiB3ZSBhcmVuJ3QgcnVubmluZyBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5XYXJuKGBDcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBhbiBIdG1sTWVzaCB3aXRoIGlkICR7aWR9IG91dHNpZGUgb2YgYSBicm93c2VyLiAgVGhlIG1lc2ggd2lsbCBub3QgYmUgdmlzaWJsZS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZml0U3RyYXRlZ3kgPSBmaXRTdHJhdGVneTtcclxuICAgICAgICB0aGlzLl9pc0NhbnZhc092ZXJsYXkgPSBpc0NhbnZhc092ZXJsYXk7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTWFzaygpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLl9jcmVhdGVFbGVtZW50KCk7XHJcblxyXG4gICAgICAgIC8vIFNldCBlbmFibGVkIGJ5IGRlZmF1bHQsIHNvIHRoaXMgd2lsbCBzaG93IGFzIHNvb24gYXMgaXQncyByZWFkeVxyXG4gICAgICAgIHRoaXMuc2V0RW5hYmxlZCh0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBiZWhhdmlvciB0byBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yID0gbmV3IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IodGhpcy5jYXB0dXJlUG9pbnRlckV2ZW50cy5iaW5kKHRoaXMpLCB0aGlzLnJlbGVhc2VQb2ludGVyRXZlbnRzLmJpbmQodGhpcyksIHtcclxuICAgICAgICAgICAgY2FwdHVyZU9uUG9pbnRlckVudGVyOiB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hZGRCZWhhdmlvcih0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHdpZHRoIG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgSFRNTCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVuZGVyZWQgYXMgYSBtZXNoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgdGhlIG1lc2ggaGFzIGJlZW4gbW92ZWQsIHJvdGF0ZWQsIG9yIHNjYWxlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXNcclxuICAgICAqIHByb3BlcnR5IHdhcyByZWFkLiAgVGhpcyBwcm9wZXJ0eSBpcyByZXNldCB0byBmYWxzZSBhZnRlciByZWFkaW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVzVXBkYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlc1VwZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZSBjYXB0dXJlIGZvciB0aGUgcG9pbnRlciB3aGVuIGVudGVyaW5nIHRoZSBtZXNoIGFyZWFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBjYXB0dXJlT25Qb2ludGVyRW50ZXIoY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yLmNhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlcyBvZiB0aGUgbWVzaCBhbmQgdGhlIEhUTUwgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudD8ucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfbWFya0FzVXBkYXRlZCgpIHtcclxuICAgICAgICB0aGlzLl9yZXF1aXJlc1VwZGF0ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgYWRqdXN0aW5nIHRoZSBtZXNoIHNjYWxlIHRvIG1hdGNoIGFuZCBtYWtpbmcgaXQgdmlzaWJsZS5cclxuICAgICAqIElmIHRoZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgaXMgdW5kZWZpbmVkLCB0aGVuIGl0IHdpbGwgbWFrZSB0aGUgbWVzaCBpbnZpc2libGUuICBJbiBlaXRoZXIgY2FzZSBpdCB3aWxsIGNsZWFyIHRoZVxyXG4gICAgICogZWxlbWVudCBjb250ZW50IGZpcnN0LlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGFzIGEgbWVzaFxyXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbWVzaCBpbiBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG1lc2ggaW4gQmFieWxvbiB1bml0c1xyXG4gICAgICovXHJcbiAgICBzZXRDb250ZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIC8vIElmIGNvbnRlbnQgaXMgY2hhbmdlZCwgd2UgYXJlIG5vIGxvbmdlciByZWFkeVxyXG4gICAgICAgIHRoaXMuX3NldEFzUmVhZHkoZmFsc2UpO1xyXG5cclxuICAgICAgICAvLyBBbHNvIGludmFsaWRhdGUgdGhlIHNvdXJjZSB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgICAgdGhpcy5fc291cmNlV2lkdGggPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZUhlaWdodCA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB0aGlzLl9yZXF1aXJlc1VwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuc2NhbGluZy5zZXRBbGwoMSk7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZml0U3RyYXRlZ3kud3JhcEVsZW1lbnQoZWxlbWVudCkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2NhbGVJZk5lY2Vzc2FyeSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlV2lkdGggJiYgdGhpcy5zb3VyY2VIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0QXNSZWFkeSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3ZlcmlkZXMgQkFCWUxPTi5NZXNoLnNldEVuYWJsZWRcclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXRFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLyBDYXB0dXJlIHJlcXVlc3RlZCBlbmFibGVkIHN0YXRlXHJcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgIC8vIElmIGRpc2FibGluZyBvciBlbmFibGluZyBhbmQgd2UgYXJlIHJlYWR5XHJcbiAgICAgICAgaWYgKCFlbmFibGVkIHx8IHRoaXMuX3JlYWR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvU2V0RW5hYmxlZChlbmFibGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb250ZW50IHNpemUgaW4gcGl4ZWxzXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHNvdXJjZVxyXG4gICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgdGhlIHNvdXJjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Q29udGVudFNpemVQeCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZVdpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5fc291cmNlSGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQgfHwgIXRoaXMuX2VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZml0U3RyYXRlZ3kudXBkYXRlU2l6ZSh0aGlzLl9lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXBkYXRlU2NhbGVJZk5lY2Vzc2FyeSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldEFzUmVhZHkocmVhZHk6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9yZWFkeSA9IHJlYWR5O1xyXG4gICAgICAgIGlmIChyZWFkeSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kb1NldEVuYWJsZWQodGhpcy5fZW5hYmxlZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kb1NldEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIGVuYWJsZWQsIHRoZW4gc3RhcnQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIHRoZVxyXG4gICAgICAgIC8vIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQgcG9zaXRpb24uICBvdGhlcndpc2Ugc3RvcCBsaXN0ZW5pbmdcclxuICAgICAgICBpZiAoZW5hYmxlZCAmJiAhdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyID0gdGhpcy5vbkFmdGVyV29ybGRNYXRyaXhVcGRhdGVPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1aXJlc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgZW5hYmxlZCwgdGhlbiByZXZlcnQgdGhlIGNvbnRlbnQgZWxlbWVudCBkaXNwbGF5XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGhpZGUgaXRcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBlbmFibGVkID8gXCJcIiA6IFwibm9uZVwiO1xyXG4gICAgICAgIC8vIENhcHR1cmUgdGhlIGNvbnRlbnQgeiBpbmRleFxyXG4gICAgICAgIHRoaXMuX3NldEVsZW1lbnR6SW5kZXgodGhpcy5wb3NpdGlvbi56ICogLTEwMDAwKTtcclxuICAgICAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBkYXRlU2NhbGVJZk5lY2Vzc2FyeSgpIHtcclxuICAgICAgICAvLyBJZiB3ZSBoYXZlIHNldENvbnRlbnQgYmVmb3JlLCB0aGUgY29udGVudCBzY2FsZSBpcyBiYWtlZCBpbnRvIHRoZSBtZXNoLiAgSWYgd2UgZG9uJ3QgcmVzZXQgdGhlIHZlcnRpY2VzIHRvXHJcbiAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHNpemUsIHRoZW4gd2Ugd2lsbCBtdWx0aXBseSB0aGUgc2NhbGUgd2hlbiB3ZSBiYWtlIHRoZSBzY2FsZSBiZWxvdy4gIEJ5IGFwcGx5aW5nIHRoZSBpbnZlcnNlLCB3ZSBiYWNrIG91dFxyXG4gICAgICAgIC8vIHRoZSBzY2FsaW5nIHRoYXQgaGFzIGJlZW4gZG9uZSBzbyB3ZSBhcmUgc3RhcnRpbmcgZnJvbSB0aGUgc2FtZSBwb2ludC5cclxuICAgICAgICAvLyBGaXJzdCByZXNldCB0aGUgc2NhbGUgdG8gMVxyXG4gICAgICAgIHRoaXMuc2NhbGluZy5zZXRBbGwoMSk7XHJcbiAgICAgICAgLy8gVGhlbiBiYWNrIG91dCB0aGUgb3JpZ2luYWwgdmVydGljZXMgY2hhbmdlcyB0byBtYXRjaCB0aGUgY29udGVudCBzY2FsZVxyXG4gICAgICAgIGlmICh0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXgpIHtcclxuICAgICAgICAgICAgdGhpcy5iYWtlVHJhbnNmb3JtSW50b1ZlcnRpY2VzKHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCk7XHJcbiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgbWF0cml4IHNvIGl0IGRvZXNuJ3QgZ2V0IGFwcGxpZWQgYWdhaW4gdW5sZXNzIHdlIHNjYWxlXHJcbiAgICAgICAgICAgIHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgc2NhbGUgdG8gbWF0Y2ggY29udGVudC4gIE5vdGUgd2UgY2FuJ3QganVzdCBzY2FsZSB0aGUgbWVzaCwgYmVjYXVzZSB0aGF0IHdpbGwgc2NhbGUgdGhlIGNvbnRlbnQgYXMgd2VsbFxyXG4gICAgICAgIC8vIFdoYXQgd2UgbmVlZCB0byBkbyBpcyBjb21wdXRlIGEgc2NhbGUgbWF0cml4IGFuZCB0aGVuIGJha2UgdGhhdCBpbnRvIHRoZSBtZXNoIHZlcnRpY2VzLiAgVGhpcyB3aWxsIGxlYXZlIHRoZVxyXG4gICAgICAgIC8vIG1lc2ggc2NhbGUgYXQgMSwgc28gb3VyIGNvbnRlbnQgd2lsbCBzdGF5IGl0J3Mgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCB1bnRpbCB3ZSBzY2FsZSB0aGUgbWVzaC5cclxuICAgICAgICBjb25zdCBzY2FsZVggPSB0aGlzLl93aWR0aCB8fCAxO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlWSA9IHRoaXMuX2hlaWdodCB8fCAxO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlTWF0cml4ID0gTWF0cml4LlNjYWxpbmcoc2NhbGVYLCBzY2FsZVksIDEpO1xyXG4gICAgICAgIHRoaXMuYmFrZVRyYW5zZm9ybUludG9WZXJ0aWNlcyhzY2FsZU1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIEdldCBhbiBpbnZlcnNlIG9mIHRoZSBzY2FsZSBtYXRyaXggdGhhdCB3ZSBjYW4gdXNlIHRvIGJhY2sgb3V0IHRoZSBzY2FsZSBjaGFuZ2VzIHdlIGhhdmUgbWFkZSBzb1xyXG4gICAgICAgIC8vIHdlIGRvbid0IG11bHRpcGx5IHRoZSBzY2FsZS5cclxuICAgICAgICB0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXggPSBuZXcgTWF0cml4KCk7XHJcbiAgICAgICAgc2NhbGVNYXRyaXguaW52ZXJ0VG9SZWYodGhpcy5faW52ZXJzZVNjYWxlTWF0cml4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZU1hc2soKSB7XHJcbiAgICAgICAgY29uc3QgdmVydGV4RGF0YSA9IENyZWF0ZVBsYW5lVmVydGV4RGF0YSh7IHdpZHRoOiAxLCBoZWlnaHQ6IDEgfSk7XHJcbiAgICAgICAgdmVydGV4RGF0YS5hcHBseVRvTWVzaCh0aGlzKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2NlbmUgPSB0aGlzLmdldFNjZW5lKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja0NvbGxpc2lvbnMgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBkZXB0aE1hc2sgPSBuZXcgU3RhbmRhcmRNYXRlcmlhbChgJHt0aGlzLmlkfS1tYXRgLCBzY2VuZSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbnZhc092ZXJsYXkpIHtcclxuICAgICAgICAgICAgZGVwdGhNYXNrLmJhY2tGYWNlQ3VsbGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBkZXB0aE1hc2suZGlzYWJsZUNvbG9yV3JpdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBkZXB0aE1hc2suZGlzYWJsZUxpZ2h0aW5nID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBkZXB0aE1hc2s7XHJcblxyXG4gICAgICAgIC8vIE9wdGltaXphdGlvbiAtIEZyZWV6ZSBtYXRlcmlhbCBzaW5jZSBpdCBuZXZlciBuZWVkcyB0byBjaGFuZ2VcclxuICAgICAgICB0aGlzLm1hdGVyaWFsLmZyZWV6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0RWxlbWVudHpJbmRleCh6SW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuekluZGV4ID0gYCR7ekluZGV4fWA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgdXNlZCBieSB0aGUgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB0byBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgKi9cclxuICAgIGNhcHR1cmVQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFbmFibGUgZG9tIGNvbnRlbnQgdG8gY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwiYXV0b1wiO1xyXG5cclxuICAgICAgICAvLyBTdXByZXNzIGV2ZW50cyBvdXRzaWRlIG9mIHRoZSBkb20gY29udGVudFxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB1c2VkIGJ5IHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHRvIHJlbGVhc2UgcG9pbnRlciBldmVudHNcclxuICAgICAqL1xyXG4gICAgcmVsZWFzZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSBwb2ludGVyIGV2ZW50cyBvbiBjYW52YXNcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0uc3R5bGUucG9pbnRlckV2ZW50cyA9IFwiYXV0b1wiO1xyXG5cclxuICAgICAgICAvLyBEaXNhYmxlIHBvaW50ZXIgZXZlbnRzIG9uIGRvbSBjb250ZW50XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVFbGVtZW50KCkge1xyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgQmFpbCBpZiB3ZSBhcmVuJ3QgcnVubmluZyBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkaXYuaWQgPSB0aGlzLmlkO1xyXG4gICAgICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLl9pc0NhbnZhc092ZXJsYXkgPyBcInRyYW5zcGFyZW50XCIgOiBcIiMwMDBcIjtcclxuICAgICAgICBkaXYuc3R5bGUuekluZGV4ID0gXCIxXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgIGRpdi5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLmJhY2tmYWNlVmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IE1hdHJpeCwgUXVhdGVybmlvbiwgVmVjdG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGhcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgSHRtbE1lc2ggfSBmcm9tIFwiLi9odG1sTWVzaFwiO1xyXG5pbXBvcnQgeyBDYW1lcmEgfSBmcm9tIFwiY29yZS9DYW1lcmFzL2NhbWVyYVwiO1xyXG5pbXBvcnQgdHlwZSB7IFN1Yk1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvc3ViTWVzaFwiO1xyXG5pbXBvcnQgeyBSZW5kZXJpbmdHcm91cCB9IGZyb20gXCJjb3JlL1JlbmRlcmluZy9yZW5kZXJpbmdHcm91cFwiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBPYnNlcnZlciB9IGZyb20gXCJjb3JlL01pc2Mvb2JzZXJ2YWJsZVwiO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiY29yZS9NaXNjL2xvZ2dlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0RW5naW5lIH0gZnJvbSBcImNvcmUvRW5naW5lc1wiO1xyXG5cclxuY29uc3QgUG9zaXRpb25VcGRhdGVGYWlsTWVzc2FnZSA9IFwiRmFpbGVkIHRvIHVwZGF0ZSBodG1sIG1lc2ggcmVuZGVyZXIgcG9zaXRpb24gZHVlIHRvIGZhaWx1cmUgdG8gZ2V0IGNhbnZhcyByZWN0LiAgSHRtbE1lc2ggaW5zdGFuY2VzIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseVwiO1xyXG5jb25zdCBCYWJ5bG9uVW5pdHNUb1BpeGVscyA9IDEwMDtcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdHdvIHN1Ym1lc2hlcyBhbmQgcmV0dXJucyBhIG51bWJlciBpbmRpY2F0aW5nIHdoaWNoXHJcbiAqIHNob3VsZCBiZSByZW5kZXJlZCBmaXJzdC5cclxuICovXHJcbnR5cGUgUmVuZGVyT3JkZXJGdW5jdGlvbiA9IChzdWJNZXNoQTogU3ViTWVzaCwgc3ViTWVzaEI6IFN1Yk1lc2gpID0+IG51bWJlcjtcclxuXHJcbnR5cGUgUmVuZGVyTGF5ZXJFbGVtZW50cyA9IHtcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICBkb21FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIGNhbWVyYUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG59O1xyXG5cclxuLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZW5zdXJlcyB0aGF0IEh0bWxNZXNoZXMgYXJlIHJlbmRlcmVkIGJlZm9yZSBhbGwgb3RoZXIgbWVzaGVzLlxyXG4vLyBOb3RlIHRoaXMgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gZ3JvdXAgMC5cclxuLy8gSWYgbmVpdGhlciBtZXNoIGlzIGFuIEh0bWxNZXNoLCB0aGVuIHRoZSBkZWZhdWx0IHJlbmRlciBvcmRlciBpcyB1c2VkXHJcbi8vIFRoaXMgcHJldmVudHMgSHRtbE1lc2hlcyBmcm9tIGFwcGVhcmluZyBpbiBmcm9udCBvZiBvdGhlciBtZXNoZXMgd2hlbiB0aGV5IGFyZSBiZWhpbmQgdGhlbVxyXG5jb25zdCBSZW5kZXJPcmRlckZ1bmMgPSAoZGVmYXVsdFJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uKTogUmVuZGVyT3JkZXJGdW5jdGlvbiA9PiB7XHJcbiAgICByZXR1cm4gKHN1Yk1lc2hBOiBTdWJNZXNoLCBzdWJNZXNoQjogU3ViTWVzaCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1lc2hBID0gc3ViTWVzaEEuZ2V0TWVzaCgpO1xyXG4gICAgICAgIGNvbnN0IG1lc2hCID0gc3ViTWVzaEIuZ2V0TWVzaCgpO1xyXG5cclxuICAgICAgICAvLyBVc2UgcHJvcGVydHkgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHNpbmNlIGl0IGlzIGxlc3MgZXhwZW5zaXZlIGFuZFxyXG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBjYWxsZWQgbWFueSB0aW1lcyBwZXIgZnJhbWVcclxuICAgICAgICBjb25zdCBtZXNoSXNIdG1sTWVzaEEgPSAobWVzaEEgYXMgYW55KVtcImlzSHRtbE1lc2hcIl07XHJcbiAgICAgICAgY29uc3QgbWVzaElzSHRtbE1lc2hCID0gKG1lc2hCIGFzIGFueSlbXCJpc0h0bWxNZXNoXCJdO1xyXG4gICAgICAgIGlmIChtZXNoSXNIdG1sTWVzaEEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lc2hJc0h0bWxNZXNoQiA/IChtZXNoQS5hYnNvbHV0ZVBvc2l0aW9uLnogPD0gbWVzaEIuYWJzb2x1dGVQb3NpdGlvbi56ID8gMSA6IC0xKSA6IC0xO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZXNoSXNIdG1sTWVzaEIgPyAxIDogZGVmYXVsdFJlbmRlck9yZGVyKHN1Yk1lc2hBLCBzdWJNZXNoQik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGlzIHJlcXVpcmVkIHRvIHJlbmRlciBIdG1sTWVzaGVzIGluIHRoZSBzY2VuZS5cclxuICogaWYgdXNpbmcgSHRtbE1lc2hlcywgeW91IG11c3Qgbm90IHNldCByZW5kZXIgb3JkZXIgZm9yIGdyb3VwIDAgdXNpbmdcclxuICogc2NlbmUuc2V0UmVuZGVyaW5nT3JkZXIuICBZb3UgbXVzdCBpbnN0ZWFkIHBhc3MgdGhlIGNvbXBhcmUgZnVuY3Rpb25zXHJcbiAqIHRvIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGNvbnN0cnVjdG9yLiAgSWYgeW91IGRvIG5vdCwgdGhlbiB5b3VyIHJlbmRlclxyXG4gKiBvcmRlciB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGlzIGNyZWF0ZWQgYWZ0ZXIgYW5kXHJcbiAqIHRoZSBIdG1sTWVzaGVzIHdpbGwgbm90IHJlbmRlciBjb3JyZWN0bHkgKHRoZXkgd2lsbCBhcHBlYXIgaW4gZnJvbnQgb2ZcclxuICogbWVzaGVzIHRoYXQgYXJlIGFjdHVhbGx5IGluIGZyb250IG9mIHRoZW0pIGlmIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGlzXHJcbiAqIGNyZWF0ZWQgYmVmb3JlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEh0bWxNZXNoUmVuZGVyZXIge1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVySWQ/OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pblNjZW5lRWxlbWVudHM/OiBSZW5kZXJMYXllckVsZW1lbnRzIHwgbnVsbDtcclxuICAgIHByaXZhdGUgX292ZXJsYXlFbGVtZW50cz86IFJlbmRlckxheWVyRWxlbWVudHMgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZW5naW5lOiBBYnN0cmFjdEVuZ2luZTtcclxuXHJcbiAgICBwcml2YXRlIF9jYWNoZSA9IHtcclxuICAgICAgICBjYW1lcmFEYXRhOiB7IGZvdjogMCwgcG9zaXRpb246IG5ldyBWZWN0b3IzKCksIHN0eWxlOiBcIlwiIH0sXHJcbiAgICAgICAgaHRtbE1lc2hEYXRhOiBuZXcgV2Vha01hcDxvYmplY3QsIHsgc3R5bGU6IHN0cmluZyB9PigpLFxyXG4gICAgfTtcclxuICAgIHByaXZhdGUgX3dpZHRoID0gMDtcclxuICAgIHByaXZhdGUgX2hlaWdodCA9IDA7XHJcbiAgICBwcml2YXRlIF9oZWlnaHRIYWxmID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9jYW1lcmFXb3JsZE1hdHJpeD86IE1hdHJpeDtcclxuXHJcbiAgICAvLyBDcmVhdGUgc29tZSByZWZzIHRvIGF2b2lkIGNyZWF0aW5nIG5ldyBvYmplY3RzIGV2ZXJ5IGZyYW1lXHJcbiAgICBwcml2YXRlIF90ZW1wID0ge1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtOiBuZXcgVmVjdG9yMygpLFxyXG4gICAgICAgIHJvdGF0aW9uVHJhbnNmb3JtOiBuZXcgUXVhdGVybmlvbigpLFxyXG4gICAgICAgIHBvc2l0aW9uVHJhbnNmb3JtOiBuZXcgVmVjdG9yMygpLFxyXG4gICAgICAgIG9iamVjdE1hdHJpeDogTWF0cml4LklkZW50aXR5KCksXHJcbiAgICAgICAgY2FtZXJhV29ybGRNYXRyaXg6IE1hdHJpeC5JZGVudGl0eSgpLFxyXG4gICAgICAgIGNhbWVyYVJvdGF0aW9uTWF0cml4OiBNYXRyaXguSWRlbnRpdHkoKSxcclxuICAgICAgICBjYW1lcmFXb3JsZE1hdHJpeEFzQXJyYXk6IG5ldyBBcnJheSgxNiksXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgRFBSIHNvIHdlIGNhbiByZXNpemUgaWYgRFBSIGNoYW5nZXNcclxuICAgIC8vIE90aGVyd2lzZSB0aGUgRE9NIGNvbnRlbnQgd2lsbCBzY2FsZSwgYnV0IHRoZSBtZXNoIHdvbid0XHJcbiAgICBwcml2YXRlIF9sYXN0RGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgY2FtZXJhIG1hdHJpeCBjaGFuZ2VzIHNvIHdlIG9ubHkgdXBkYXRlIHRoZVxyXG4gICAgLy8gRE9NIGVsZW1lbnQgc3R5bGVzIHdoZW4gbmVjZXNzYXJ5XHJcbiAgICBwcml2YXRlIF9jYW1lcmFNYXRyaXhVcGRhdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBLZWVwIHRyYWNrIG9mIHBvc2l0aW9uIGNoYW5nZXMgc28gd2Ugb25seSB1cGRhdGUgdGhlIERPTSBlbGVtZW50XHJcbiAgICAvLyBzdHlsZXMgd2hlbiBuZWNlc3NhcnlcclxuICAgIHByaXZhdGUgX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbiA9IHtcclxuICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgbGVmdDogMCxcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVuZGVyT2JzZXJ2ZXI6IE9ic2VydmVyPFNjZW5lPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgSHRtbE1lc2hSZW5kZXJlclxyXG4gICAgICogQHBhcmFtIHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHByb3BlcnRpZXM6XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBzY2VuZTogU2NlbmUsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXJJZCA9IG51bGwsXHJcbiAgICAgICAgICAgIF9jb250YWluZXJJZCA9IFwiY3NzLWNvbnRhaW5lclwiLFxyXG4gICAgICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyID0gdHJ1ZSxcclxuICAgICAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuUGFpbnRlclNvcnRDb21wYXJlLFxyXG4gICAgICAgICAgICBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXIgPSBSZW5kZXJpbmdHcm91cC5QYWludGVyU29ydENvbXBhcmUsXHJcbiAgICAgICAgICAgIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuZGVmYXVsdFRyYW5zcGFyZW50U29ydENvbXBhcmUsXHJcbiAgICAgICAgfToge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXJJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICAgICAgICAgIF9jb250YWluZXJJZD86IHN0cmluZztcclxuICAgICAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXI/OiBSZW5kZXJPcmRlckZ1bmN0aW9uO1xyXG4gICAgICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyPzogYm9vbGVhbjtcclxuICAgICAgICB9ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgT25seSBpbml0IGlmIHdlIGFyZSBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVySWQgPSBfY29udGFpbmVySWQ7XHJcbiAgICAgICAgdGhpcy5faW5pdChzY2VuZSwgcGFyZW50Q29udGFpbmVySWQsIGVuYWJsZU92ZXJsYXlSZW5kZXIsIGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlciwgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyLCBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlIG9mIHRoZSBIdG1sTWVzaFJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJPYnNlcnZlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXQoXHJcbiAgICAgICAgc2NlbmU6IFNjZW5lLFxyXG4gICAgICAgIHBhcmVudENvbnRhaW5lcklkOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgICAgIGVuYWJsZU92ZXJsYXlSZW5kZXI6IGJvb2xlYW4sXHJcbiAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uLFxyXG4gICAgICAgIGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvbixcclxuICAgICAgICBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvblxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBPbmx5IGluaXQgaWYgd2UgYXJlIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBET00gY29udGFpbmVyc1xyXG4gICAgICAgIGxldCBwYXJlbnRDb250YWluZXIgPSBwYXJlbnRDb250YWluZXJJZCA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudENvbnRhaW5lcklkKSA6IGRvY3VtZW50LmJvZHk7XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lciA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzLCB0aGVuIHJlbW92ZSBpdFxyXG4gICAgICAgIGNvbnN0IGluU2NlbmVDb250YWluZXJJZCA9IGAke3RoaXMuX2NvbnRhaW5lcklkfV9pbl9zY2VuZWA7XHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzID0gdGhpcy5fY3JlYXRlUmVuZGVyTGF5ZXJFbGVtZW50cyhpblNjZW5lQ29udGFpbmVySWQpO1xyXG5cclxuICAgICAgICBwYXJlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuX2luU2NlbmVFbGVtZW50cy5jb250YWluZXIsIHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZU92ZXJsYXlSZW5kZXIpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUNvbnRhaW5lcklkID0gYCR7dGhpcy5fY29udGFpbmVySWR9X292ZXJsYXlgO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMgPSB0aGlzLl9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKG92ZXJsYXlDb250YWluZXJJZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHpJbmRleCA9ICsoc2NlbmUuZ2V0RW5naW5lKCkuZ2V0UmVuZGVyaW5nQ2FudmFzKCkhLnN0eWxlLnpJbmRleCA/PyBcIjBcIikgKyAxO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IGAke3pJbmRleH1gO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLCBwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VuZ2luZSA9IHNjZW5lLmdldEVuZ2luZSgpO1xyXG4gICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLl9lbmdpbmUuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGlmICghY2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IGNsaWVudCByZWN0IGZvciByZW5kZXJpbmcgY2FudmFzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBzaXplIGFuZCByZXNpemUgYmVoYXZpb3JcclxuICAgICAgICB0aGlzLl9zZXRTaXplKGNsaWVudFJlY3Qud2lkdGgsIGNsaWVudFJlY3QuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZW5naW5lLm9uUmVzaXplT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gdGhpcy5fZW5naW5lLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgaWYgKGNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFNpemUoY2xpZW50UmVjdC53aWR0aCwgY2xpZW50UmVjdC5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBwcm9qZWN0aW9uT2JzOiBPYnNlcnZlcjxDYW1lcmE+O1xyXG4gICAgICAgIGxldCBtYXRyaXhPYnM6IE9ic2VydmVyPENhbWVyYT47XHJcblxyXG4gICAgICAgIGNvbnN0IG9ic2VydmVDYW1lcmEgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYSA9IHNjZW5lLmFjdGl2ZUNhbWVyYTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYSkge1xyXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvbk9icyA9IGNhbWVyYS5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2FtZXJhTWF0cml4Q2hhbmdlZChjYW1lcmEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBtYXRyaXhPYnMgPSBjYW1lcmEub25WaWV3TWF0cml4Q2hhbmdlZE9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNhbWVyYU1hdHJpeENoYW5nZWQoY2FtZXJhKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZUNhbWVyYSgpO1xyXG5cclxuICAgICAgICBzY2VuZS5vbkFjdGl2ZUNhbWVyYUNoYW5nZWQuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHByb2plY3Rpb25PYnMpIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmFjdGl2ZUNhbWVyYT8ub25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZE9ic2VydmFibGUucmVtb3ZlKHByb2plY3Rpb25PYnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChtYXRyaXhPYnMpIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmFjdGl2ZUNhbWVyYT8ub25WaWV3TWF0cml4Q2hhbmdlZE9ic2VydmFibGUucmVtb3ZlKG1hdHJpeE9icyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb2JzZXJ2ZUNhbWVyYSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IEh0bWxNZXNoZXMgYXJlIHJlbmRlcmVkIGJlZm9yZSBhbGwgb3RoZXIgbWVzaGVzXHJcbiAgICAgICAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGFwcGVhciBpbiBmcm9udCBvZiBtZXNoZXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gZnJvbnQgb2YgdGhlbVxyXG4gICAgICAgIC8vIFVwZGF0aW5nIHRoZSByZW5kZXIgb3JkZXIgaXNuJ3QgaWRlYWwsIGJ1dCBpdCBpcyB0aGUgb25seSB3YXkgdG8gYWNoZWl2ZSB0aGlzXHJcbiAgICAgICAgLy8gVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgYW4gYXBwIHVzaW5nIHRoZSBIdG1sTWVzaFJlbmRlcmVkIG11c3Qgc2V0IHRoZSBzY2VuZSByZW5kZXIgb3JkZXJcclxuICAgICAgICAvLyB2aWEgdGhlIEh0bWxNZXNoUmVuZGVyZWQgY29uc3RydWN0b3JcclxuICAgICAgICBjb25zdCBvcGFxdWVSZW5kZXJPcmRlciA9IFJlbmRlck9yZGVyRnVuYyhkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXIpO1xyXG4gICAgICAgIGNvbnN0IGFscGhhVGVzdFJlbmRlck9yZGVyID0gUmVuZGVyT3JkZXJGdW5jKGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgY29uc3QgdHJhbnNwYXJlbnRSZW5kZXJPcmRlciA9IFJlbmRlck9yZGVyRnVuYyhkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgc2NlbmUuc2V0UmVuZGVyaW5nT3JkZXIoMCwgb3BhcXVlUmVuZGVyT3JkZXIsIGFscGhhVGVzdFJlbmRlck9yZGVyLCB0cmFuc3BhcmVudFJlbmRlck9yZGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIgPSBzY2VuZS5vbkJlZm9yZVJlbmRlck9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyKHNjZW5lLCBzY2VuZS5hY3RpdmVDYW1lcmEgYXMgQ2FtZXJhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKGNvbnRhaW5lcklkOiBzdHJpbmcpOiBSZW5kZXJMYXllckVsZW1lbnRzIHtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcklkKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdDb250YWluZXIpIHtcclxuICAgICAgICAgICAgZXhpc3RpbmdDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgY29udGFpbmVyLmlkID0gY29udGFpbmVySWQ7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUuekluZGV4ID0gXCItMVwiO1xyXG5cclxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkb21FbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGNhbWVyYUVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtU3R5bGUgPSBcInByZXNlcnZlLTNkXCI7XHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS50cmFuc2Zvcm1TdHlsZSA9IFwicHJlc2VydmUtM2RcIjtcclxuXHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcblxyXG4gICAgICAgIGRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FtZXJhRWxlbWVudCk7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRvbUVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcixcclxuICAgICAgICAgICAgZG9tRWxlbWVudCxcclxuICAgICAgICAgICAgY2FtZXJhRWxlbWVudCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0U2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB0aGlzLl9oZWlnaHRIYWxmID0gdGhpcy5faGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pblNjZW5lRWxlbWVudHMgfHwgIXRoaXMuX292ZXJsYXlFbGVtZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkb21FbGVtZW50cyA9IFt0aGlzLl9pblNjZW5lRWxlbWVudHMuZG9tRWxlbWVudCwgdGhpcy5fb3ZlcmxheUVsZW1lbnRzLmRvbUVsZW1lbnQsIHRoaXMuX2luU2NlbmVFbGVtZW50cy5jYW1lcmFFbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHMuY2FtZXJhRWxlbWVudF07XHJcbiAgICAgICAgZm9yIChjb25zdCBkb20gb2YgZG9tRWxlbWVudHMpIHtcclxuICAgICAgICAgICAgaWYgKGRvbSkge1xyXG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJldHRpZXItaWdub3JlXHJcbiAgICBwcm90ZWN0ZWQgX2dldENhbWVyYUNzc01hdHJpeChtYXRyaXg6IE1hdHJpeCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBtYXRyaXgubTtcclxuICAgICAgICByZXR1cm4gYG1hdHJpeDNkKCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzBdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbMV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMl0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbM10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbNF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s1XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s2XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s3XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s4XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzldIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEwXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTJdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbMTNdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzE0XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNV0gKVxyXG4gICAgICAgIH0pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb252ZXJ0IGEgQmFieWxvbiB3b3JsZCBtYXRyaXggdG8gYSBDU1MgbWF0cml4XHJcbiAgICAvLyBUaGlzIGFsc28gaGFuZGxlcyBjb252ZXJzaW9uIGZyb20gQkpTIGxlZnQgaGFuZGVkIGNvb3Jkc1xyXG4gICAgLy8gdG8gQ1NTIHJpZ2h0IGhhbmRlZCBjb29yZHNcclxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxyXG4gICAgcHJvdGVjdGVkIF9nZXRIdG1sQ29udGVudENzc01hdHJpeChtYXRyaXg6IE1hdHJpeCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW06IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gbWF0cml4Lm07XHJcbiAgICAgICAgLy8gSW4gYSByaWdodCBoYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW0sIHRoZSBlbGVtZW50cyAxMSB0byAxNCBoYXZlIHRvIGNoYW5nZSB0aGVpciBkaXJlY3Rpb25cclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB1c2VSaWdodEhhbmRlZFN5c3RlbSA/IC0xIDogMTtcclxuICAgICAgICBjb25zdCBtYXRyaXgzZCA9IGBtYXRyaXgzZCgke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1swXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1syXSAqIC1kaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbM10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s0XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzVdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzZdICAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzddIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzhdICogLWRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s5XSAqIC1kaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTBdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzExXSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMl0gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTNdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzE0XSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNV0gKVxyXG4gICAgICAgIH0pYDtcclxuICAgICAgICByZXR1cm4gbWF0cml4M2Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRUcmFuc2Zvcm1hdGlvbk1hdHJpeChodG1sTWVzaDogSHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtOiBib29sZWFuKTogTWF0cml4IHtcclxuICAgICAgICAvLyBHZXQgdGhlIGNhbWVyYSB3b3JsZCBtYXRyaXhcclxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbWVyYSB3b3JsZCBtYXRyaXggaXMgdXAgdG8gZGF0ZVxyXG4gICAgICAgIGlmICghdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhV29ybGRNYXRyaXggPSBodG1sTWVzaC5nZXRTY2VuZSgpLmFjdGl2ZUNhbWVyYT8uZ2V0V29ybGRNYXRyaXgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0cml4LklkZW50aXR5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvYmplY3RXb3JsZE1hdHJpeCA9IGh0bWxNZXNoLmdldFdvcmxkTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8vIFNjYWxlIHRoZSBvYmplY3QgbWF0cml4IGJ5IHRoZSBiYXNlIHNjYWxlIGZhY3RvciBmb3IgdGhlIG1lc2hcclxuICAgICAgICAvLyB3aGljaCBpcyB0aGUgcmF0aW8gb2YgdGhlIG1lc2ggd2lkdGgvaGVpZ2h0IHRvIHRoZSByZW5kZXJlclxyXG4gICAgICAgIC8vIHdpZHRoL2hlaWdodCBkaXZpZGVkIGJ5IHRoZSBiYWJ5bG9uIHVuaXRzIHRvIHBpeGVscyByYXRpb1xyXG4gICAgICAgIGxldCB3aWR0aFNjYWxlRmFjdG9yID0gMTtcclxuICAgICAgICBsZXQgaGVpZ2h0U2NhbGVGYWN0b3IgPSAxO1xyXG4gICAgICAgIGlmIChodG1sTWVzaC5zb3VyY2VXaWR0aCAmJiBodG1sTWVzaC5zb3VyY2VIZWlnaHQpIHtcclxuICAgICAgICAgICAgd2lkdGhTY2FsZUZhY3RvciA9IGh0bWxNZXNoLndpZHRoISAvIChodG1sTWVzaC5zb3VyY2VXaWR0aCAvIEJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICAgICAgaGVpZ2h0U2NhbGVGYWN0b3IgPSBodG1sTWVzaC5oZWlnaHQhIC8gKGh0bWxNZXNoLnNvdXJjZUhlaWdodCAvIEJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFwcGx5IHRoZSBzY2FsZSB0byB0aGUgb2JqZWN0J3Mgd29ybGQgbWF0cml4LiAgTm90ZSB3ZSBhcmVuJ3Qgc2NhbGluZ1xyXG4gICAgICAgIC8vIHRoZSBvYmplY3QsIGp1c3QgZ2V0dGluZyBhIG1hdHJpeCBhcyB0aG91Z2ggaXQgd2VyZSBzY2FsZWQsIHNvIHdlIGNhblxyXG4gICAgICAgIC8vIHNjYWxlIHRoZSBjb250ZW50XHJcbiAgICAgICAgY29uc3Qgc2NhbGVUcmFuc2Zvcm0gPSB0aGlzLl90ZW1wLnNjYWxlVHJhbnNmb3JtO1xyXG4gICAgICAgIGNvbnN0IHJvdGF0aW9uVHJhbnNmb3JtID0gdGhpcy5fdGVtcC5yb3RhdGlvblRyYW5zZm9ybTtcclxuICAgICAgICBjb25zdCBwb3NpdGlvblRyYW5zZm9ybSA9IHRoaXMuX3RlbXAucG9zaXRpb25UcmFuc2Zvcm07XHJcbiAgICAgICAgY29uc3Qgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeCA9IHRoaXMuX3RlbXAub2JqZWN0TWF0cml4O1xyXG5cclxuICAgICAgICBvYmplY3RXb3JsZE1hdHJpeC5kZWNvbXBvc2Uoc2NhbGVUcmFuc2Zvcm0sIHJvdGF0aW9uVHJhbnNmb3JtLCBwb3NpdGlvblRyYW5zZm9ybSk7XHJcbiAgICAgICAgc2NhbGVUcmFuc2Zvcm0ueCAqPSB3aWR0aFNjYWxlRmFjdG9yO1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtLnkgKj0gaGVpZ2h0U2NhbGVGYWN0b3I7XHJcblxyXG4gICAgICAgIE1hdHJpeC5Db21wb3NlVG9SZWYoc2NhbGVUcmFuc2Zvcm0sIHJvdGF0aW9uVHJhbnNmb3JtLCBwb3NpdGlvblRyYW5zZm9ybSwgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIEFkanVzdCBkaXJlY3Rpb24gb2YgMTIgYW5kIDEzIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYmFzZWQgb24gdGhlIGhhbmRlZG5lc3Mgb2YgdGhlIHN5c3RlbVxyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHVzZVJpZ2h0SGFuZGVkU3lzdGVtID8gLTEgOiAxO1xyXG4gICAgICAgIC8vIEFkanVzdCB0cmFuc2xhdGlvbiB2YWx1ZXMgdG8gYmUgZnJvbSBjYW1lcmEgdnMgd29ybGQgb3JpZ2luXHJcbiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFyZSBhbHNvIGFkanVzdGluZyB0aGVzZSB2YWx1ZXMgdG8gYmUgcGl4ZWxzIHZzIEJhYnlsb24gdW5pdHNcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGh0bWxNZXNoLmdldEFic29sdXRlUG9zaXRpb24oKTtcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4LnNldFJvd0Zyb21GbG9hdHMoXHJcbiAgICAgICAgICAgIDMsXHJcbiAgICAgICAgICAgICgtdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgubVsxMl0gKyBwb3NpdGlvbi54KSAqIEJhYnlsb25Vbml0c1RvUGl4ZWxzICogZGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAoLXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTNdICsgcG9zaXRpb24ueSkgKiBCYWJ5bG9uVW5pdHNUb1BpeGVscyAqIGRpcmVjdGlvbixcclxuICAgICAgICAgICAgKHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTRdIC0gcG9zaXRpb24ueikgKiBCYWJ5bG9uVW5pdHNUb1BpeGVscyxcclxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgubVsxNV0gKiAwLjAwMDAxICogQmFieWxvblVuaXRzVG9QaXhlbHNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBBZGp1c3Qgb3RoZXIgdmFsdWVzIHRvIGJlIHBpeGVscyB2cyBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5tdWx0aXBseUF0SW5kZXgoMywgQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgubXVsdGlwbHlBdEluZGV4KDcsIEJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4Lm11bHRpcGx5QXRJbmRleCgxMSwgQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlckh0bWxNZXNoKGh0bWxNZXNoOiBIdG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW06IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIWh0bWxNZXNoLmVsZW1lbnQgfHwgIWh0bWxNZXNoLmVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcclxuICAgICAgICAgICAgLy8gbm90aGluZyB0byByZW5kZXIsIHNvIGJhaWxcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gV2UgbmVlZCB0byBlbnN1cmUgaHRtbCBtZXNoIGRhdGEgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlXHJcbiAgICAgICAgLy8gY29tcHV0aW5nIHRoZSBiYXNlIHNjYWxlIGZhY3RvclxyXG4gICAgICAgIGxldCBodG1sTWVzaERhdGEgPSB0aGlzLl9jYWNoZS5odG1sTWVzaERhdGEuZ2V0KGh0bWxNZXNoKTtcclxuICAgICAgICBpZiAoIWh0bWxNZXNoRGF0YSkge1xyXG4gICAgICAgICAgICBodG1sTWVzaERhdGEgPSB7IHN0eWxlOiBcIlwiIH07XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmh0bWxNZXNoRGF0YS5zZXQoaHRtbE1lc2gsIGh0bWxNZXNoRGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFFbGVtZW50ID0gaHRtbE1lc2guX2lzQ2FudmFzT3ZlcmxheSA/IHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY2FtZXJhRWxlbWVudCA6IHRoaXMuX2luU2NlbmVFbGVtZW50cz8uY2FtZXJhRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGh0bWxNZXNoLmVsZW1lbnQucGFyZW50Tm9kZSAhPT0gY2FtZXJhRWxlbWVudCkge1xyXG4gICAgICAgICAgICBjYW1lcmFFbGVtZW50IS5hcHBlbmRDaGlsZChodG1sTWVzaC5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBodG1sTWVzaCBjb250ZW50IGhhcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIGJhc2Ugc2NhbGUgZmFjdG9yXHJcbiAgICAgICAgaWYgKGh0bWxNZXNoLnJlcXVpcmVzVXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUJhc2VTY2FsZUZhY3RvcihodG1sTWVzaCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBmb3IgdGhlIGh0bWwgbWVzaFxyXG4gICAgICAgIGNvbnN0IHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXggPSB0aGlzLl9nZXRUcmFuc2Zvcm1hdGlvbk1hdHJpeChodG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW0pO1xyXG5cclxuICAgICAgICBsZXQgc3R5bGUgPSBgdHJhbnNsYXRlKC01MCUsIC01MCUpICR7dGhpcy5fZ2V0SHRtbENvbnRlbnRDc3NNYXRyaXgoc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW0pfWA7XHJcbiAgICAgICAgLy8gSW4gYSByaWdodCBoYW5kZWQgc3lzdGVtLCBzY3JlZW5zIGFyZSBvbiB0aGUgd3Jvbmcgc2lkZSBvZiB0aGUgbWVzaCwgc28gd2UgaGF2ZSB0byByb3RhdGUgYnkgTWF0aC5QSSB3aGljaCByZXN1bHRzIGluIHRoZSBtYXRyaXgzZCBzZWVuIGJlbG93XHJcbiAgICAgICAgc3R5bGUgKz0gYCR7dXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyBcIm1hdHJpeDNkKC0xLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAtMSwgMCwgMCwgMCwgMCwgMSlcIiA6IFwiXCJ9YDtcclxuXHJcbiAgICAgICAgaWYgKGh0bWxNZXNoRGF0YS5zdHlsZSAhPT0gc3R5bGUpIHtcclxuICAgICAgICAgICAgaHRtbE1lc2guZWxlbWVudC5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgaHRtbE1lc2guZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGh0bWxNZXNoLl9tYXJrQXNVcGRhdGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9yZW5kZXIoc2NlbmU6IFNjZW5lLCBjYW1lcmE6IENhbWVyYSkge1xyXG4gICAgICAgIGxldCBuZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCB1c2VSaWdodEhhbmRlZFN5c3RlbSA9IHNjZW5lLnVzZVJpZ2h0SGFuZGVkU3lzdGVtO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbnRhaW5lciBwb3NpdGlvbiBhbmQgc2l6ZSBpZiBuZWNlc3NhcnlcclxuICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJQb3NpdGlvbklmTmVlZGVkKCk7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBhIGNhbWVyYSBjaGFuZ2VcclxuICAgICAgICBpZiAodGhpcy5fY2FtZXJhTWF0cml4VXBkYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFNYXRyaXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBjYW1lcmEgcG9zaXRpb24gaGFzIGNoYW5nZWQsIHRoZW4gd2UgYWxzbyBuZWVkIHRvIHVwZGF0ZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnggIT09IHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24ueCB8fFxyXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24ueSAhPT0gdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi55IHx8XHJcbiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi56ICE9PSB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLnpcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi5jb3B5RnJvbShjYW1lcmEucG9zaXRpb24pO1xyXG4gICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBmb3IgYSBkcHIgY2hhbmdlXHJcbiAgICAgICAgaWYgKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICE9PSB0aGlzLl9sYXN0RGV2aWNlUGl4ZWxSYXRpbykge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0RGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG4gICAgICAgICAgICBMb2dnZXIuTG9nKFwiSW4gcmVuZGVyIC0gZHByIGNoYW5nZWQ6IFwiLCB0aGlzLl9sYXN0RGV2aWNlUGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIGFueSBtZXNoZXMgbmVlZCB0byBiZSB1cGRhdGVkXHJcbiAgICAgICAgY29uc3QgbWVzaGVzTmVlZGluZ1VwZGF0ZSA9IHNjZW5lLm1lc2hlcy5maWx0ZXIoKG1lc2gpID0+IChtZXNoIGFzIGFueSlbXCJpc0h0bWxNZXNoXCJdICYmIChuZWVkc1VwZGF0ZSB8fCAobWVzaCBhcyBIdG1sTWVzaCkucmVxdWlyZXNVcGRhdGUpKTtcclxuICAgICAgICBuZWVkc1VwZGF0ZSA9IG5lZWRzVXBkYXRlIHx8IG1lc2hlc05lZWRpbmdVcGRhdGUubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgaWYgKCFuZWVkc1VwZGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgYSBwcm9qZWN0aW9uIG1hdHJpeCBmb3IgdGhlIGNhbWVyYVxyXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEuZ2V0UHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gICAgICAgIGNvbnN0IGZvdiA9IHByb2plY3Rpb25NYXRyaXgubVs1XSAqIHRoaXMuX2hlaWdodEhhbGY7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLmZvdiAhPT0gZm92KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IFt0aGlzLl9vdmVybGF5RWxlbWVudHM/LmRvbUVsZW1lbnQsIHRoaXMuX2luU2NlbmVFbGVtZW50cz8uZG9tRWxlbWVudF07XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEubW9kZSA9PSBDYW1lcmEuUEVSU1BFQ1RJVkVfQ0FNRVJBKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS53ZWJraXRQZXJzcGVjdGl2ZSA9IGZvdiArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucGVyc3BlY3RpdmUgPSBmb3YgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUud2Via2l0UGVyc3BlY3RpdmUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5wZXJzcGVjdGl2ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuZm92ID0gZm92O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBDU1MgbWF0cml4IGZvciB0aGUgY2FtZXJhICh3aGljaCB3aWxsIGluY2x1ZGUgYW55IGNhbWVyYSByb3RhdGlvbilcclxuICAgICAgICBpZiAoY2FtZXJhLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjYW1lcmEuY29tcHV0ZVdvcmxkTWF0cml4KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFNYXRyaXhXb3JsZCA9IHRoaXMuX3RlbXAuY2FtZXJhV29ybGRNYXRyaXg7XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGQuY29weUZyb20oY2FtZXJhLmdldFdvcmxkTWF0cml4KCkpO1xyXG4gICAgICAgIGNvbnN0IGNhbWVyYVJvdGF0aW9uTWF0cml4ID0gdGhpcy5fdGVtcC5jYW1lcmFSb3RhdGlvbk1hdHJpeDtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZC5nZXRSb3RhdGlvbk1hdHJpeCgpLnRyYW5zcG9zZVRvUmVmKGNhbWVyYVJvdGF0aW9uTWF0cml4KTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5ID0gdGhpcy5fdGVtcC5jYW1lcmFXb3JsZE1hdHJpeEFzQXJyYXk7XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGQuY29weVRvQXJyYXkoY2FtZXJhTWF0cml4V29ybGRBc0FycmF5KTtcclxuXHJcbiAgICAgICAgLy8gRm9yIGEgZmV3IHZhbHVlcywgd2UgaGF2ZSB0byBhZGp1c3QgdGhlIGRpcmVjdGlvbiBiYXNlZCBvbiB0aGUgaGFuZGVkbmVzcyBvZiB0aGUgc3lzdGVtXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyAxIDogLTE7XHJcblxyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVsxXSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bMV07XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzJdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVsyXSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbNF0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzRdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs2XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bNl0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzhdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs4XSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbOV0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzldICogZGlyZWN0aW9uO1xyXG5cclxuICAgICAgICBNYXRyaXguRnJvbUFycmF5VG9SZWYoY2FtZXJhTWF0cml4V29ybGRBc0FycmF5LCAwLCBjYW1lcmFNYXRyaXhXb3JsZCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYUNTU01hdHJpeCA9IHRoaXMuX2dldENhbWVyYUNzc01hdHJpeChjYW1lcmFNYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBjYW1lcmFDU1NNYXRyaXg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnN0eWxlICE9PSBzdHlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBbdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNhbWVyYUVsZW1lbnRdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5zdHlsZSA9IHN0eWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gX1JlbmRlciBvYmplY3RzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgIGZvciAoY29uc3QgbWVzaCBvZiBtZXNoZXNOZWVkaW5nVXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlckh0bWxNZXNoKG1lc2ggYXMgSHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF91cGRhdGVCYXNlU2NhbGVGYWN0b3IoaHRtbE1lc2g6IEh0bWxNZXNoKSB7XHJcbiAgICAgICAgLy8gR2V0IHNjcmVlbiB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgICAgbGV0IHNjcmVlbldpZHRoID0gdGhpcy5fd2lkdGg7XHJcbiAgICAgICAgbGV0IHNjcmVlbkhlaWdodCA9IHRoaXMuX2hlaWdodDtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGFzcGVjdCByYXRpb3NcclxuICAgICAgICBjb25zdCBodG1sTWVzaEFzcGVjdFJhdGlvID0gKGh0bWxNZXNoLndpZHRoIHx8IDEpIC8gKGh0bWxNZXNoLmhlaWdodCB8fCAxKTtcclxuICAgICAgICBjb25zdCBzY3JlZW5Bc3BlY3RSYXRpbyA9IHNjcmVlbldpZHRoIC8gc2NyZWVuSGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBBZGp1c3Qgc2NyZWVuIGRpbWVuc2lvbnMgYmFzZWQgb24gYXNwZWN0IHJhdGlvc1xyXG4gICAgICAgIGlmIChodG1sTWVzaEFzcGVjdFJhdGlvID4gc2NyZWVuQXNwZWN0UmF0aW8pIHtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIEhUTUwgbWVzaCBpcyB3aWRlciByZWxhdGl2ZSB0byBpdHMgaGVpZ2h0IHRoYW4gdGhlIHNjcmVlbiwgYWRqdXN0IHRoZSBzY3JlZW4gd2lkdGhcclxuICAgICAgICAgICAgc2NyZWVuV2lkdGggPSBzY3JlZW5IZWlnaHQgKiBodG1sTWVzaEFzcGVjdFJhdGlvO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBIVE1MIG1lc2ggaXMgdGFsbGVyIHJlbGF0aXZlIHRvIGl0cyB3aWR0aCB0aGFuIHRoZSBzY3JlZW4sIGFkanVzdCB0aGUgc2NyZWVuIGhlaWdodFxyXG4gICAgICAgICAgICBzY3JlZW5IZWlnaHQgPSBzY3JlZW5XaWR0aCAvIGh0bWxNZXNoQXNwZWN0UmF0aW87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgY29udGVudCB0byBmaWxsIHNjcmVlbiBzbyB3ZSBnZXQgbWF4IHJlc29sdXRpb24gd2hlbiBpdCBpcyBzaHJ1bmsgdG8gZml0IHRoZSBtZXNoXHJcbiAgICAgICAgaHRtbE1lc2guc2V0Q29udGVudFNpemVQeChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZUNvbnRhaW5lclBvc2l0aW9uSWZOZWVkZWQoKSB7XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYW52YXMgaGFzIG1vdmVkIG9uIHRoZSBzY3JlZW5cclxuICAgICAgICBjb25zdCBjYW52YXNSZWN0ID0gdGhpcy5fZW5naW5lLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgLy8gY2FudmFzIHJlY3QgbWF5IGJlIG51bGwgaWYgbGF5b3V0IG5vdCBjb21wbGV0ZVxyXG4gICAgICAgIGlmICghY2FudmFzUmVjdCkge1xyXG4gICAgICAgICAgICBMb2dnZXIuV2FybihQb3NpdGlvblVwZGF0ZUZhaWxNZXNzYWdlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSB3aW5kb3cuc2Nyb2xsWTtcclxuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gd2luZG93LnNjcm9sbFg7XHJcbiAgICAgICAgY29uc3QgY2FudmFzRG9jdW1lbnRUb3AgPSBjYW52YXNSZWN0LnRvcCArIHNjcm9sbFRvcDtcclxuICAgICAgICBjb25zdCBjYW52YXNEb2N1bWVudExlZnQgPSBjYW52YXNSZWN0LmxlZnQgKyBzY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLnRvcCAhPT0gY2FudmFzRG9jdW1lbnRUb3AgfHwgdGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLmxlZnQgIT09IGNhbnZhc0RvY3VtZW50TGVmdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24udG9wID0gY2FudmFzRG9jdW1lbnRUb3A7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbi5sZWZ0ID0gY2FudmFzRG9jdW1lbnRMZWZ0O1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gW3RoaXMuX2luU2NlbmVFbGVtZW50cz8uY29udGFpbmVyLCB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNvbnRhaW5lcl07XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdG9wIGFuZCBsZWZ0IG9mIHRoZSBjc3MgY29udGFpbmVyIHRvIG1hdGNoIHRoZSBjYW52YXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclBhcmVudCA9IGNvbnRhaW5lci5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gY29udGFpbmVyUGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RG9jdW1lbnRUb3AgPSBwYXJlbnRSZWN0LnRvcCArIHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERvY3VtZW50TGVmdCA9IHBhcmVudFJlY3QubGVmdCArIHNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyA9IHRoaXMuX2dldEFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcoY29udGFpbmVyUGFyZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGJvZHkgbWFyZ2luXHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlNYXJnaW5Ub3AgPSBwYXJzZUludChib2R5U3R5bGUubWFyZ2luVG9wLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5TWFyZ2luTGVmdCA9IHBhcnNlSW50KGJvZHlTdHlsZS5tYXJnaW5MZWZ0LCAxMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IGAke2NhbnZhc0RvY3VtZW50VG9wIC0gcGFyZW50RG9jdW1lbnRUb3AgLSBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLm1hcmdpblRvcCArIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcucGFkZGluZ1RvcCArIGJvZHlNYXJnaW5Ub3B9cHhgO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHtcclxuICAgICAgICAgICAgICAgICAgICBjYW52YXNEb2N1bWVudExlZnQgLSBwYXJlbnREb2N1bWVudExlZnQgLSBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLm1hcmdpbkxlZnQgKyBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLnBhZGRpbmdMZWZ0ICsgYm9keU1hcmdpbkxlZnRcclxuICAgICAgICAgICAgICAgIH1weGA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9vbkNhbWVyYU1hdHJpeENoYW5nZWQgPSAoY2FtZXJhOiBDYW1lcmEpID0+IHtcclxuICAgICAgICB0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCA9IGNhbWVyYS5nZXRXb3JsZE1hdHJpeCgpO1xyXG4gICAgICAgIHRoaXMuX2NhbWVyYU1hdHJpeFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIF9lcHNpbG9uKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5hYnModmFsdWUpIDwgMWUtMTAgPyAwIDogdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IHRvdGFsIG1hcmdpbnMgYW5kIHBhZGRpbmcgZm9yIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyB0aGUgYm9keSBhbmQgZG9jdW1lbnQgbWFyZ2luc1xyXG4gICAgcHJpdmF0ZSBfZ2V0QW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGxldCBtYXJnaW5Ub3AgPSAwO1xyXG4gICAgICAgIGxldCBtYXJnaW5MZWZ0ID0gMDtcclxuICAgICAgICBsZXQgcGFkZGluZ1RvcCA9IDA7XHJcbiAgICAgICAgbGV0IHBhZGRpbmdMZWZ0ID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBlbGVtZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcclxuICAgICAgICAgICAgbWFyZ2luVG9wICs9IHBhcnNlSW50KHN0eWxlLm1hcmdpblRvcCwgMTApO1xyXG4gICAgICAgICAgICBtYXJnaW5MZWZ0ICs9IHBhcnNlSW50KHN0eWxlLm1hcmdpbkxlZnQsIDEwKTtcclxuICAgICAgICAgICAgcGFkZGluZ1RvcCArPSBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCk7XHJcbiAgICAgICAgICAgIHBhZGRpbmdMZWZ0ICs9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IG1hcmdpblRvcCwgbWFyZ2luTGVmdCwgcGFkZGluZ1RvcCwgcGFkZGluZ0xlZnQgfTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBIdG1sTWVzaFJlbmRlcmVyIH0gZnJvbSBcIi4vaHRtbE1lc2hSZW5kZXJlclwiO1xyXG5pbXBvcnQgeyBIdG1sTWVzaCB9IGZyb20gXCIuL2h0bWxNZXNoXCI7XHJcbmltcG9ydCB7IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfSBmcm9tIFwiLi9wb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yXCI7XHJcbmltcG9ydCB7IEZpdFN0cmF0ZWd5IH0gZnJvbSBcIi4vZml0U3RyYXRlZ3lcIjtcclxuXHJcbi8vIEV4cG9ydCBwdWJsaWMgY2xhc3NlcyBhbmQgZnVuY3Rpb25zXHJcbmV4cG9ydCB7IEh0bWxNZXNoUmVuZGVyZXIsIEh0bWxNZXNoLCBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yLCBGaXRTdHJhdGVneSB9O1xyXG4iLCJpbXBvcnQgeyBUb29scyB9IGZyb20gXCJjb3JlL01pc2MvdG9vbHNcIjtcclxuXHJcbi8vIEEgY2FwdHVyZSBtYW5hZ2VtZW50IHN5c3RlbSB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBvYmplY3QgaGFzIHRoZSBwb2ludGVyXHJcbi8vIGV2ZW50cyBieSBlbGltaW5hdGluZyByYWNlIGNvbmRpdGlvbnMgdGhhdCBjYW4gY2F1c2UgdGhlIHBvaW50ZXIgZXZlbnRzIHRvIGJlXHJcbi8vIHJlbGVhc2VkIGJ5IGEgZGlmZmVyZW50IG9iamVjdCBhZnRlciB0aGV5IGFyZSBjYXB0dXJlZCBsZWF2aW5nIG5vIG9iamVjdFxyXG4vLyBhcyB0aGUgb3duZXIuICBJdCBkb2VzIHRoaXMgYnkgcXVldWVpbmcgcmVxdWVzdHMgYW5kIG9ubHkgYWxsb3dpbmdcclxuLy8gY2FwdHVyZSB3aGVuIHRoZSBjdXJyZW50IGNhcHR1cmUgb3duZXIgcmVsZWFzZXMgcG9pbnRlciBldmVudHMuXHJcblxyXG50eXBlIENhcHR1cmVSZWxlYXNlQ2FsbGJhY2sgPSAoKSA9PiB2b2lkO1xyXG5cclxudHlwZSBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrcyA9IHtcclxuICAgIGNhcHR1cmU6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2s7XHJcbiAgICByZWxlYXNlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrO1xyXG59O1xyXG5cclxubGV0IENhcHR1cmVSZXF1ZXN0UXVldWU6IHN0cmluZ1tdID0gW107XHJcblxyXG4vLyBLZXkgaXMgcmVxdWVzdCBpZCwgdmFsdWUgaXMgb2JqZWN0IHdpdGggY2FwdHVyZSBhbmQgcmVsZWFzZSBjYWxsYmFja3NcclxuY29uc3QgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3M6IE1hcDxzdHJpbmcsIENhcHR1cmVSZWxlYXNlQ2FsbGJhY2tzPiA9IG5ldyBNYXAoKTtcclxuXHJcbi8vIEtlZXAgdHJhY2sgb2YgcmVsZWFzZSByZXF1ZXN0cyB3aXRoIG5vIG1hdGNoaW5nIGNhcHR1cmUgcmVxdWVzdFxyXG4vLyBpbiBjYXNlIHRoZSByZWxlYXNlIHJlcXVlc3QgYXJyaXZlZCBiZWZvcmUgdGhlIGNhcHR1cmUgdG8gYXZvaWRcclxuLy8gdGhlIGNhcHR1cmUgcmVxdWVzdCBuZXZlciBnZXR0aW5nIHJlbGVhc2VkLlxyXG5sZXQgVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxubGV0IEN1cnJlbnRPd25lcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIENhbGxlZCBvbiBmaXJzdCBjYXB0dXJlIG9yIHJlbGVhc2UgcmVxdWVzdFxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgaWQgb2YgdGhlIG9iamVjdCBjdXJyZW50bHkgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqIEByZXR1cm5zIFRoZSBpZCBvZiB0aGUgb2JqZWN0IGN1cnJlbnRseSBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICogb3IgbnVsbCBpZiBubyBvYmplY3QgaXMgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjb25zdCBnZXRDYXB0dXJpbmdJZCA9ICgpID0+IHtcclxuICAgIHJldHVybiBDdXJyZW50T3duZXI7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVxdWVzdCB0aGF0IHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQgY2FwdHVyZSBwb2ludGVyIGV2ZW50cy4gIElmIHRoZXJlIGlzIG5vIGN1cnJlbnRcclxuICogb3duZXIsIHRoZW4gdGhlIHJlcXVlc3QgaXMgZ3JhbnRlZCBpbW1lZGlhdGVseS4gIElmIHRoZXJlIGlzIGEgY3VycmVudCBvd25lciwgdGhlbiB0aGUgcmVxdWVzdFxyXG4gKiBpcyBxdWV1ZWQgdW50aWwgdGhlIGN1cnJlbnQgb3duZXIgcmVsZWFzZXMgcG9pbnRlciBldmVudHMuXHJcbiAqIEBwYXJhbSByZXF1ZXN0SWQgQW4gaWQgdG8gaWRlbnRpZnkgdGhlIHJlcXVlc3QuICBUaGlzIGlkIHdpbGwgYmUgdXNlZCB0byBtYXRjaCB0aGUgY2FwdHVyZVxyXG4gKiByZXF1ZXN0IHdpdGggdGhlIHJlbGVhc2UgcmVxdWVzdC5cclxuICogQHBhcmFtIGNhcHR1cmVDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIGdyYW50ZWQgYW5kIHRoZSBvYmplY3QgaXMgY2FwdHVyaW5nXHJcbiAqIEBwYXJhbSByZWxlYXNlQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIG5vIGxvbmdlciBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RDYXB0dXJlID0gKHJlcXVlc3RJZDogc3RyaW5nLCBjYXB0dXJlQ2FsbGJhY2s6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2ssIHJlbGVhc2VDYWxsYmFjazogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaykgPT4ge1xyXG4gICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RDYXB0dXJlIC0gUG9pbnRlciBldmVudHMgY2FwdHVyZSByZXF1ZXN0ZWQgZm9yICR7cmVxdWVzdElkfWApO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgcmVsZWFzZSBmb3IgdGhpcyByZXF1ZXN0LCB0aGVuIGlnbm9yZSB0aGUgcmVxdWVzdFxyXG4gICAgaWYgKFJlbW92ZVVubWF0Y2hlZFJlcXVlc3QocmVxdWVzdElkKSkge1xyXG4gICAgICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5yZXF1ZXN0Q2FwdHVyZSAtIENhcHR1cmUgcmVxdWVzdCBtYXRjaGVkIHByZXZpb3VzIHJlbGVhc2UgcmVxdWVzdCAke3JlcXVlc3RJZH0uICBDYW5jZWxsaW5nIGNhcHR1cmUgcmVxdWVzdGApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAocmVxdWVzdElkICE9PSBDdXJyZW50T3duZXIpIHtcclxuICAgICAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcXVldWUsIGFkZCBpdCB0byB0aGUgcXVldWVcclxuICAgICAgICBFbnF1ZXVlQ2FwdHVyZVJlcXVlc3QocmVxdWVzdElkLCBjYXB0dXJlQ2FsbGJhY2ssIHJlbGVhc2VDYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFDdXJyZW50T3duZXIpIHtcclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBjdXJyZW50IG93bmVyLCBnbyBhaGVhZCBhbmQgZ3JhbnQgdGhlIHJlcXVlc3RcclxuICAgICAgICBUcmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAoKTtcclxuICAgIH1cclxuICAgIC8vIElmIHRoZSByZXF1ZXN0IGlkIGlzIHRoZSBjdXJyZW50IG93bmVyLCBkbyBub3RoaW5nXHJcbn07XHJcblxyXG4vKipcclxuICogUmVsZWFzZSBwb2ludGVyIGV2ZW50cyBmcm9tIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQuICBJZiB0aGUgb2JqZWN0IGlzIHRoZSBjdXJyZW50IG93bmVyXHJcbiAqIHRoZW4gcG9pbnRlciBldmVudHMgYXJlIHJlbGVhc2VkIGltbWVkaWF0ZWx5LiAgSWYgdGhlIG9iamVjdCBpcyBub3QgdGhlIGN1cnJlbnQgb3duZXIsIHRoZW4gdGhlXHJcbiAqIGFzc29jaWF0ZWQgY2FwdHVyZSByZXF1ZXN0IGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUuICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBjYXB0dXJlIHJlcXVlc3RcclxuICogaW4gdGhlIHF1ZXVlLCB0aGVuIHRoZSByZWxlYXNlIHJlcXVlc3QgaXMgYWRkZWQgdG8gYSBsaXN0IG9mIHVubWF0Y2hlZCByZWxlYXNlIHJlcXVlc3RzIGFuZCB3aWxsXHJcbiAqIG5lZ2F0ZSB0aGUgbmV4dCBjYXB0dXJlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZC4gIFRoaXMgaXMgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgcG9zc2liaWxpdHkgdGhhdFxyXG4gKiB0aGUgcmVsZWFzZSByZXF1ZXN0IGFycml2ZWQgYmVmb3JlIHRoZSBjYXB0dXJlIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSByZXF1ZXN0SWQgVGhlIGlkIHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgaWQgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdFxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY29uc3QgcmVxdWVzdFJlbGVhc2UgPSAocmVxdWVzdElkOiBzdHJpbmcgfCBudWxsKSA9PiB7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdFJlbGVhc2UgLSBQb2ludGVyIGV2ZW50cyByZWxlYXNlIHJlcXVlc3RlZCBmb3IgJHtyZXF1ZXN0SWR9YCk7XHJcblxyXG4gICAgLy8gaWYgdGhlIHJlcXVlc3RJZCBpcyB0aGUgY3VycmVudCBjYXB0dXJlIGhvbGRlciByZWxlYXNlIGl0XHJcbiAgICBpZiAoIXJlcXVlc3RJZCB8fCByZXF1ZXN0SWQgPT09IEN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIFRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCgpO1xyXG4gICAgfSBlbHNlIGlmIChDYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCkpIHtcclxuICAgICAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyBpbiB0aGUgcXVldWUsIGJ1dCBub3QgdGhlIGN1cnJlbnQgY2FwdHVyZSBob2xkZXIsIHJlbW92ZSBpdCBhbmQgaXQncyBjYWxsYmFja3NcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5kZWxldGUocmVxdWVzdElkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RSZWxlYXNlIC0gUmVjZWl2ZWQgcmVsZWFzZSByZXF1ZXN0ICR7cmVxdWVzdElkfSBidXQgbm8gbWF0Y2hpbmcgY2FwdHVyZSByZXF1ZXN0IHdhcyByZWNlaXZlZGApO1xyXG4gICAgICAgIC8vIHJlcXVlc3Qgd2FzIG5vdCBjdXJyZW50IGFuZCBub3QgaW4gcXVldWUsIGxpa2VseSBiZWNhdXNlIHdlIHJlY2VpdmVkIGEgcmVsZWFzZVxyXG4gICAgICAgIC8vIHJlcXVlc3QgYmVmb3JlIHRoZSBjYXB0dXJlLiAgQWRkIGl0IHRvIHRoZSB1bm1hdGNoZWQgbGlzdCB0byBndWFyZCBhZ2FpbnN0IHRoaXMgcG9zc2liaWxpdHlcclxuICAgICAgICBpZiAoIVVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cy5pbmNsdWRlcyhyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgICAgIFVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cy5wdXNoKHJlcXVlc3RJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlbGVhc2UgcG9pbnRlciBldmVudHMgZnJvbSB0aGUgY3VycmVudCBvd25lclxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY29uc3QgcmVsZWFzZUN1cnJlbnQgPSAoKSA9PiB7XHJcbiAgICByZXF1ZXN0UmVsZWFzZShDdXJyZW50T3duZXIpO1xyXG59O1xyXG5cclxuY29uc3QgRW5xdWV1ZUNhcHR1cmVSZXF1ZXN0ID0gKHJlcXVlc3RJZDogc3RyaW5nLCBjYXB0dXJlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrLCByZWxlYXNlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrKSA9PiB7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuZW5xdWV1ZUNhcHR1cmVSZXF1ZXN0IC0gRW5xdWV1ZWluZyBjYXB0dXJlIHJlcXVlc3QgZm9yICAke3JlcXVlc3RJZH1gKTtcclxuICAgIGlmICghQ2FwdHVyZVJlcXVlc3RRdWV1ZS5pbmNsdWRlcyhyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgQ2FwdHVyZVJlcXVlc3RRdWV1ZS5wdXNoKHJlcXVlc3RJZCk7XHJcbiAgICAgICAgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3Muc2V0KHJlcXVlc3RJZCwgeyBjYXB0dXJlLCByZWxlYXNlIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLy8gUmVtb3ZlcyB0aGUgcmVxdWVzdCBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBleGlzdHMuICBSZXR1cm5zIHRydWVcclxuLy8gaWYgdGhlIHJlcXVlc3Qgd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBvdGhlcndpc2UgZmFsc2VcclxuY29uc3QgQ2FuY2VsUmVxdWVzdCA9IChyZXF1ZXN0SWQ6IHN0cmluZyB8IG51bGwpID0+IHtcclxuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XHJcbiAgICBDYXB0dXJlUmVxdWVzdFF1ZXVlID0gQ2FwdHVyZVJlcXVlc3RRdWV1ZS5maWx0ZXIoKGlkKSA9PiB7XHJcbiAgICAgICAgaWYgKGlkICE9PSByZXF1ZXN0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5jYW5jZWxSZXF1ZXN0IC0gQ2FuY2VsaW5nIHBvaW50ZXIgZXZlbnRzIGNhcHR1cmUgcmVxdWVzdCAke3JlcXVlc3RJZH1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbW92ZWQ7XHJcbn07XHJcblxyXG5jb25zdCBSZW1vdmVVbm1hdGNoZWRSZXF1ZXN0ID0gKHJlcXVlc3RJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xyXG4gICAgVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzID0gVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzLmZpbHRlcigoaWQpID0+IHtcclxuICAgICAgICBpZiAoaWQgIT09IHJlcXVlc3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbW92ZWQ7XHJcbn07XHJcblxyXG5jb25zdCBUcmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBuZXdPd25lcklkID0gTmV4dENhcHR1cmVSZXF1ZXN0KCk7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUudHJhbnNmZXJQb2ludGVyRXZlbnRzT3duZXJzaGlwIC0gVHJhbnNmZXJycmluZyBwb2ludGVyIGV2ZW50cyBmcm9tICR7Q3VycmVudE93bmVyfSB0byAke25ld093bmVySWR9YCk7XHJcbiAgICAvLyBSZWxlYXNlIHRoZSBjdXJyZW50IG93bmVyXHJcbiAgICBEb1JlbGVhc2UoKTtcclxuICAgIGlmIChuZXdPd25lcklkKSB7XHJcbiAgICAgICAgRG9DYXB0dXJlKG5ld093bmVySWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgRG9SZWxlYXNlID0gKCkgPT4ge1xyXG4gICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmRvUmVsZWFzZSAtIFJlbGVhc2luZyBwb2ludGVyIGV2ZW50cyBmcm9tICR7Q3VycmVudE93bmVyfWApO1xyXG4gICAgaWYgKEN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIGNhbGwgdGhlIHJlbGVhc2UgY2FsbGJhY2tcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5nZXQoQ3VycmVudE93bmVyKT8ucmVsZWFzZSgpO1xyXG4gICAgICAgIC8vIEFuZCByZW1vdmUgdGhlIGNhbGxiYWNrc1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmRlbGV0ZShDdXJyZW50T3duZXIpO1xyXG4gICAgICAgIEN1cnJlbnRPd25lciA9IG51bGw7XHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCBEb0NhcHR1cmUgPSAobmV3T3duZXJJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAobmV3T3duZXJJZCkge1xyXG4gICAgICAgIC8vIGNhbGwgdGhlIGNhcHR1cmUgY2FsbGJhY2tcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5nZXQobmV3T3duZXJJZCk/LmNhcHR1cmUoKTtcclxuICAgIH1cclxuICAgIEN1cnJlbnRPd25lciA9IG5ld093bmVySWQ7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuZG9DYXB0dXJlIC0gUG9pbnRlciBldmVudHMgbm93IGNhcHR1cmVkIGJ5ICR7bmV3T3duZXJJZH1gKTtcclxufTtcclxuXHJcbmNvbnN0IE5leHRDYXB0dXJlUmVxdWVzdCA9ICgpID0+IHtcclxuICAgIHJldHVybiBDYXB0dXJlUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgPyBDYXB0dXJlUmVxdWVzdFF1ZXVlLnNoaWZ0KCkgOiBudWxsO1xyXG59O1xyXG5cclxuLy8gI3JlZ2lvbiBEZWJ1Z2dpbmcgc3VwcG9ydFxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbiAgICAgICAgXCJwb2ludGVyLWV2ZW50cy1jYXB0dXJlLWRlYnVnXCI6IGJvb2xlYW4gfCBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBEZWJ1Z0xvZyA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgIC8vIElmIHdlIGFyZSBydW5ubmluZyBpbiBhIHRlc3QgcnVubmVyIChpbiBub2RlLCBzbyB3aW5kb3cgaXMgbm90IGRlZmluZWQpXHJcbiAgICAvLyBvciBpZiB0aGUgZGVidWcgZmxhZyBpcyBzZXQsIHRoZW4gbG9nIHRoZSBtZXNzYWdlXHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCB3aW5kb3dbXCJwb2ludGVyLWV2ZW50cy1jYXB0dXJlLWRlYnVnXCJdKSB7XHJcbiAgICAgICAgVG9vbHMuTG9nKFxyXG4gICAgICAgICAgICBgJHtwZXJmb3JtYW5jZS5ub3coKX0gLSBnYW1lLnNjZW5lLnBvaW50ZXJFdmVudHMgLSAke21lc3NhZ2V9XFxuY3VycmVudE93bmVyOiAke0N1cnJlbnRPd25lcn1cXG5xdWV1ZTogJHtDYXB0dXJlUmVxdWVzdFF1ZXVlfVxcbnVubWF0Y2hlZDogJHtVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHN9YFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn07XHJcbi8vICNlbmRyZWdpb24gRGVidWdnaW5nIHN1cHBvcnRcclxuIiwiaW1wb3J0IHR5cGUgeyBBYnN0cmFjdE1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvYWJzdHJhY3RNZXNoXCI7XHJcbmltcG9ydCB0eXBlIHsgQmVoYXZpb3IgfSBmcm9tIFwiY29yZS9CZWhhdmlvcnMvYmVoYXZpb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB7IHJlcXVlc3RDYXB0dXJlLCByZXF1ZXN0UmVsZWFzZSwgcmVsZWFzZUN1cnJlbnQsIGdldENhcHR1cmluZ0lkIH0gZnJvbSBcIi4vcG9pbnRlckV2ZW50c0NhcHR1cmVcIjtcclxuXHJcbi8vIE1vZHVsZSBsZXZlbCB2YXJpYWJsZSBmb3IgaG9sZGluZyB0aGUgY3VycmVudCBzY2VuZVxyXG5sZXQgTG9jYWxTY2VuZTogU2NlbmUgfCBudWxsID0gbnVsbDtcclxuXHJcbi8vIE1vZHVsZSBsZXZlbCB2YXJpYWJsZSB0byBob2xkIHRoZSBjb3VudCBvZiBiZWhhdmlvciBpbnN0YW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4vLyBvbiBlbnRyeS4gIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBzdGFydCBvciBzdG9wIG9ic2VydmluZyBwb2ludGVyIG1vdmVtZW50LlxyXG5sZXQgQ2FwdHVyZU9uRW50ZXJDb3VudCA9IDA7XHJcblxyXG4vLyBNYXAgdXNlZCB0byBzdG9yZSBpbnN0YW5jZSBvZiB0aGUgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBmb3IgYSBtZXNoXHJcbi8vIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGlzIGdldHMgY2hlY2tlZCBvbiBwb2ludGVyIG1vdmUgYW5kIHdlIGRvbid0IHdhbnQgdG9cclxuLy8gdXNlIGdldEJlaGF2aW9yQnlOYW1lKCkgYmVjYXVzZSB0aGF0IGlzIGEgbGluZWFyIHNlYXJjaFxyXG5jb25zdCBNZXNoVG9CZWhhdmlvck1hcCA9IG5ldyBXZWFrTWFwPEFic3RyYWN0TWVzaCwgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcj4oKTtcclxuXHJcbmNvbnN0IFN0YXJ0Q2FwdHVyZU9uRW50ZXIgPSAoc2NlbmU6IFNjZW5lKSA9PiB7XHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGEgYnJvd3NlciwgZG8gbm90aGluZ1xyXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChDYXB0dXJlT25FbnRlckNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIE9uUG9pbnRlck1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIE9uUG9pbnRlck1vdmUpO1xyXG4gICAgICAgIExvY2FsU2NlbmUgPSBMb2NhbFNjZW5lID8/IHNjZW5lO1xyXG4gICAgICAgIExvZ2dlci5Mb2coXCJQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yOiBTdGFydGluZyBvYnNlcnZhdGlvbiBvZiBwb2ludGVyIG1vdmUgZXZlbnRzLlwiKTtcclxuICAgICAgICBMb2NhbFNjZW5lLm9uRGlzcG9zZU9ic2VydmFibGUuYWRkKERvU3RvcENhcHR1cmVPbkVudGVyKTtcclxuICAgIH1cclxuICAgIENhcHR1cmVPbkVudGVyQ291bnQrKztcclxufTtcclxuXHJcbmNvbnN0IERvU3RvcENhcHR1cmVPbkVudGVyID0gKCkgPT4ge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIE9uUG9pbnRlck1vdmUpO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgT25Qb2ludGVyTW92ZSk7XHJcbiAgICBMb2NhbFNjZW5lID0gbnVsbDtcclxuICAgIExvZ2dlci5Mb2coXCJQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yOiBTdG9wcGluZyBvYnNlcnZhdGlvbiBvZiBwb2ludGVyIG1vdmUgZXZlbnRzLlwiKTtcclxuICAgIENhcHR1cmVPbkVudGVyQ291bnQgPSAwO1xyXG59O1xyXG5cclxuY29uc3QgU3RvcENhcHR1cmVPbkVudGVyID0gKCkgPT4ge1xyXG4gICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBhIGJyb3dzZXIsIGRvIG5vdGhpbmdcclxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgd2UgYXJlIG5vdCBvYnNlcnZpbmcgcG9pbnRlciBtb3ZlbWVudCwgZG8gbm90aGluZ1xyXG4gICAgaWYgKCFMb2NhbFNjZW5lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIENhcHR1cmVPbkVudGVyQ291bnQtLTtcclxuICAgIGlmIChDYXB0dXJlT25FbnRlckNvdW50IDw9IDApIHtcclxuICAgICAgICBEb1N0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLy8gTW9kdWxlIGxldmVsIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVudGVyZWQgbWVzaCBzaG91bGQgY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG5jb25zdCBPblBvaW50ZXJNb3ZlID0gKGV2dDogUG9pbnRlckV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xyXG4gICAgaWYgKCFMb2NhbFNjZW5lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhbnZhc1JlY3QgPSBMb2NhbFNjZW5lLmdldEVuZ2luZSgpLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuICAgIGlmICghY2FudmFzUmVjdCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjbGllbnQgWCBhbmQgWSBmcm9tIGVpdGhlciB0aGUgcG9pbnRlciBldmVudCBvciBmcm9tIHRoZVxyXG4gICAgLy8gVG91Y2hFdmVudCB0b3VjaFxyXG4gICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBcInRvdWNoZXNcIiBpbiBldnQgPyBldnQudG91Y2hlc1swXSA6IGV2dDtcclxuXHJcbiAgICAvLyBnZXQgdGhlIHBpY2tlZCBtZXNoLCBpZiBhbnlcclxuICAgIGNvbnN0IHBvaW50ZXJTY3JlZW5YID0gY2xpZW50WCAtIGNhbnZhc1JlY3QubGVmdDtcclxuICAgIGNvbnN0IHBvaW50ZXJTY3JlZW5ZID0gY2xpZW50WSAtIGNhbnZhc1JlY3QudG9wO1xyXG5cclxuICAgIGxldCBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yOiBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcGlja1Jlc3VsdCA9IExvY2FsU2NlbmUucGljayhwb2ludGVyU2NyZWVuWCwgcG9pbnRlclNjcmVlblksIChtZXNoKSA9PiB7XHJcbiAgICAgICAgLy8gSWYgdGhlIG1lc2ggaGFzIGFuIGluc3RhbmNlIG9mIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgYXR0YWNoZWQgdG8gaXQsXHJcbiAgICAgICAgLy8gYW5kIGNhcHR1cmUgb24gcG9pbnRlciBlbnRlciBpcyB0cnVlLCB0aGVuIHdlIHdhbnQgdG8gcGljayBpdFxyXG4gICAgICAgIGNvbnN0IHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgPSBNZXNoVG9CZWhhdmlvck1hcC5nZXQobWVzaCk7XHJcbiAgICAgICAgcmV0dXJuIG1lc2guaXNFbmFibGVkKCkgJiYgdHlwZW9mIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgIT09IFwidW5kZWZpbmVkXCIgJiYgcG9pbnRlckNhcHR1cmVCZWhhdmlvci5fY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHBpY2tlZE1lc2g6IEFic3RyYWN0TWVzaCB8IG51bGw7XHJcbiAgICBpZiAocGlja1Jlc3VsdC5oaXQpIHtcclxuICAgICAgICBwaWNrZWRNZXNoID0gcGlja1Jlc3VsdC5waWNrZWRNZXNoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBwaWNrZWRNZXNoID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYXB0dXJpbmdJZEFzSW50ID0gcGFyc2VJbnQoZ2V0Q2FwdHVyaW5nSWQoKSB8fCBcIlwiKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgcGlja2VkIG1lc2ggaXMgdGhlIGN1cnJlbnQgY2FwdHVyaW5nIG1lc2gsIGRvIG5vdGhpbmdcclxuICAgIGlmIChwaWNrZWRNZXNoICYmIHBpY2tlZE1lc2gudW5pcXVlSWQgPT09IGNhcHR1cmluZ0lkQXNJbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBjYXB0dXJpbmcgbWVzaCBhbmQgaXQgaXMgbm90IHRoZSBjdXJyZW50IHBpY2tlZCBtZXNoLCBvciBub1xyXG4gICAgLy8gbWVzaCBpcyBwaWNrZWQsIHJlbGVhc2UgdGhlIGNhcHR1cmluZyBtZXNoXHJcbiAgICBpZiAoY2FwdHVyaW5nSWRBc0ludCAmJiAoIXBpY2tlZE1lc2ggfHwgcGlja2VkTWVzaC51bmlxdWVJZCAhPT0gY2FwdHVyaW5nSWRBc0ludCkpIHtcclxuICAgICAgICByZWxlYXNlQ3VycmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgcGlja2VkIG1lc2ggYW5kIGl0IGlzIG5vdCB0aGUgY3VycmVudCBjYXB0dXJpbmcgbWVzaCwgY2FwdHVyZVxyXG4gICAgLy8gdGhlIHBvaW50ZXIgZXZlbnRzLiAgTm90ZSB0aGF0IHRoZSBjdXJyZW50IGNhcHR1cmluZyBtZXNoIGhhcyBhbHJlYWR5IGJlZW5cclxuICAgIC8vIHJlbGVhc2VkIGFib3ZlXHJcbiAgICBpZiAocGlja2VkTWVzaCkge1xyXG4gICAgICAgIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgPSBNZXNoVG9CZWhhdmlvck1hcC5nZXQocGlja2VkTWVzaCk7XHJcbiAgICAgICAgcG9pbnRlckNhcHR1cmVCZWhhdmlvciEuY2FwdHVyZVBvaW50ZXJFdmVudHMoKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBCZWhhdmlvciBmb3IgYW55IGNvbnRlbnQgdGhhdCBjYW4gY2FwdHVyZSBwb2ludGVyIGV2ZW50cywgaS5lLiBieXBhc3MgdGhlIEJhYnlsb24gcG9pbnRlciBldmVudCBoYW5kbGluZ1xyXG4gKiBhbmQgcmVjZWl2ZSBwb2ludGVyIGV2ZW50cyBkaXJlY3RseS4gIEl0IHdpbGwgcmVnaXN0ZXIgdGhlIGNhcHR1cmUgdHJpZ2dlcnMgYW5kIG5lZ290aWF0ZSB0aGUgY2FwdHVyZSBhbmRcclxuICogcmVsZWFzZSBvZiBwb2ludGVyIGV2ZW50cy4gIEN1cmVybnRseSB0aGlzIGFwcGxpZXMgb25seSB0byBIdG1sTWVzaFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgaW1wbGVtZW50cyBCZWhhdmlvcjxBYnN0cmFjdE1lc2g+IHtcclxuICAgIC8qKiBnZXRzIG9yIHNldHMgYmVoYXZpb3IncyBuYW1lICovXHJcbiAgICBwdWJsaWMgbmFtZSA9IFwiUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvclwiO1xyXG5cclxuICAgIHByaXZhdGUgX2F0dGFjaGVkTWVzaDogQWJzdHJhY3RNZXNoIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBtZXNoIHRoYXQgdGhlIGJlaGF2aW9yIGlzIGF0dGFjaGVkIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXR0YWNoZWRNZXNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hlZE1lc2g7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhdHRhY2hlZE1lc2godmFsdWU6IEFic3RyYWN0TWVzaCB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9hdHRhY2hlZE1lc2ggPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIF9jYXB0dXJlQ2FsbGJhY2s6ICgpID0+IHZvaWQsXHJcbiAgICAgICAgcHJpdmF0ZSBfcmVsZWFzZUNhbGxiYWNrOiAoKSA9PiB2b2lkLFxyXG4gICAgICAgIHsgY2FwdHVyZU9uUG9pbnRlckVudGVyID0gdHJ1ZSB9ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuX2F0dGFjaGVkTWVzaCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG5cclxuICAgICAgICAvLyBXYXJuIGlmIHdlIGFyZSBub3QgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBMb2dnZXIuV2FybihgQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBvdXRzaWRlIG9mIGEgYnJvd3Nlci4gIFRoZSBiZWhhdmlvciB3aWxsIG5vdCB3b3JrLmApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBpZiB0aGUgYmVoYXZpb3Igc2hvdWxkIGNhcHR1cmUgcG9pbnRlciBldmVudHMgd2hlbiB0aGUgcG9pbnRlciBlbnRlcnMgdGhlIG1lc2hcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBjYXB0dXJlT25Qb2ludGVyRW50ZXIoY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9PT0gY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgICAgIGlmICh0aGlzLl9hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICAgICAgU3RhcnRDYXB0dXJlT25FbnRlcih0aGlzLl9hdHRhY2hlZE1lc2guZ2V0U2NlbmUoKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBTdG9wQ2FwdHVyZU9uRW50ZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBiZWhhdmlvciBuZWVkcyB0byBiZSBpbml0aWFsaXplZCAoYmVmb3JlIGF0dGFjaGluZyBpdCB0byBhIHRhcmdldClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaXQoKSB7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIGlzIGF0dGFjaGVkIHRvIGEgdGFyZ2V0XHJcbiAgICAgKiBAcGFyYW0gbWVzaCBkZWZpbmVzIHRoZSB0YXJnZXQgd2hlcmUgdGhlIGJlaGF2aW9yIGlzIGF0dGFjaGVkIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhdHRhY2gobWVzaDogQWJzdHJhY3RNZXNoKSB7XHJcbiAgICAgICAgLy8gQWRkIGEgcmVmZXJlbmNlIHRvIHRoaXMgYmVoYXZpb3Igb24gdGhlIG1lc2guICBXZSBkbyB0aGlzIHNvIHdlIGNhbiBnZXQgYVxyXG4gICAgICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgYmVoYXZpb3IgaW4gdGhlIG9uUG9pbnRlck1vdmUgZnVuY3Rpb24gd2l0aG91dCByZWx5aW5nIG9uXHJcbiAgICAgICAgLy8gZ2V0QmVoYXZpb3JCeU5hbWUoKSwgd2hpY2ggZG9lcyBhIGxpbmVhciBzZWFyY2ggb2YgdGhlIGJlaGF2aW9ycyBhcnJheS5cclxuICAgICAgICB0aGlzLmF0dGFjaGVkTWVzaCA9IG1lc2g7XHJcbiAgICAgICAgTWVzaFRvQmVoYXZpb3JNYXAuc2V0KG1lc2gsIHRoaXMpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgU3RhcnRDYXB0dXJlT25FbnRlcihtZXNoLmdldFNjZW5lKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBiZWhhdmlvciBpcyBkZXRhY2hlZCBmcm9tIGl0cyB0YXJnZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRldGFjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhpcyBiZWhhdmlvciBmcm9tIHRoZSBtZXNoXHJcbiAgICAgICAgTWVzaFRvQmVoYXZpb3JNYXAuZGVsZXRlKHRoaXMuYXR0YWNoZWRNZXNoKTtcclxuICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgIFN0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0dGFjaGVkTWVzaCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlIHRoZSBiZWhhdmlvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgICAgICB0aGlzLmRldGFjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbGVhc2UgcG9pbnRlciBldmVudHNcclxuICAgIHB1YmxpYyByZWxlYXNlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVxdWVzdFJlbGVhc2UodGhpcy5hdHRhY2hlZE1lc2gudW5pcXVlSWQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgcHVibGljIGNhcHR1cmVQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1ZXN0Q2FwdHVyZSh0aGlzLmF0dGFjaGVkTWVzaC51bmlxdWVJZC50b1N0cmluZygpLCB0aGlzLl9jYXB0dXJlQ2FsbGJhY2ssIHRoaXMuX3JlbGVhc2VDYWxsYmFjayk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vaHRtbE1lc2hcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21zZGZUZXh0XCI7XG4iLCJpbXBvcnQgdHlwZSB7IEJNRm9udENoYXIgfSBmcm9tIFwiLi9zZGYvYm1Gb250XCI7XHJcbmltcG9ydCB0eXBlIHsgU2RmRm9udCB9IGZyb20gXCIuL3NkZi9mb250XCI7XHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5cclxuZW51bSBDaGFyQ29kZSB7XHJcbiAgICBTUEFDRSA9IDMyLFxyXG4gICAgVE9GVSA9IDB4ZmZmYyxcclxufVxyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGZvbnQgYXNzZXQgZm9yIFNERiAoU2lnbmVkIERpc3RhbmNlIEZpZWxkKSByZW5kZXJpbmcuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRm9udEFzc2V0IHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJzID0gbmV3IE1hcDxudW1iZXIsIEJNRm9udENoYXI+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFyc1JlZ2V4OiBSZWdFeHA7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9rZXJuaW5ncyA9IG5ldyBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBudW1iZXI+PigpO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBfZm9udDogU2RmRm9udDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGZvbnQgc2NhbGUgdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHNjYWxlOiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHVzZWQgdGV4dHVyZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHRleHR1cmVzOiBUZXh0dXJlW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbnRBc3NldCBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSBkZWZpbml0aW9uRGF0YSBkZWZpbmVzIHRoZSBmb250IGRhdGEgaW4gSlNPTiBmb3JtYXQuXHJcbiAgICAgKiBAcGFyYW0gdGV4dHVyZVVybCBkZWZpbmVzIHRoZSB1cmwgb2YgdGhlIHRleHR1cmUgdG8gdXNlIGZvciB0aGUgZm9udC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRlZmluaXRpb25EYXRhOiBzdHJpbmcsIHRleHR1cmVVcmw6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX2ZvbnQgPSBKU09OLnBhcnNlKGRlZmluaXRpb25EYXRhKSBhcyBTZGZGb250O1xyXG4gICAgICAgIC8vIFNvIGZhciB3ZSBvbmx5IGNvbnNpZGVyIG9uZSBwYWdlXHJcbiAgICAgICAgdGhpcy5fZm9udC5wYWdlcyA9IFt0ZXh0dXJlVXJsXTtcclxuXHJcbiAgICAgICAgdGhpcy5fZm9udC5jaGFycy5mb3JFYWNoKChjaGFyKSA9PiB0aGlzLl9jaGFycy5zZXQoY2hhci5pZCwgY2hhcikpO1xyXG4gICAgICAgIHRoaXMuX2ZvbnQua2VybmluZ3MuZm9yRWFjaCgoa2VybmluZykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3VibWFwID0gdGhpcy5fa2VybmluZ3MuZ2V0KGtlcm5pbmcuZmlyc3QpO1xyXG4gICAgICAgICAgICBpZiAoIXN1Ym1hcCkge1xyXG4gICAgICAgICAgICAgICAgc3VibWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2VybmluZ3Muc2V0KGtlcm5pbmcuZmlyc3QsIHN1Ym1hcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VibWFwLnNldChrZXJuaW5nLnNlY29uZCwga2VybmluZy5hbW91bnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NoYXJzUmVnZXggPSBuZXcgUmVnRXhwKGBbJHt0aGlzLl9mb250LmNoYXJzLm1hcCgoYykgPT4gYy5jaGFyLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCBcIlxcXFwkJlwiKSkuam9pbihcIlwiKX1dYCwgXCJnXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl91cGRhdGVGYWxsYmFja3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2FsZSA9IDEgLyB0aGlzLl9mb250LmluZm8uc2l6ZTtcclxuICAgICAgICB0aGlzLnRleHR1cmVzID0gdGhpcy5fZm9udC5wYWdlcy5tYXAoKHBhZ2UpID0+IG5ldyBUZXh0dXJlKHBhZ2UsIHVuZGVmaW5lZCwgeyBub01pcG1hcDogdHJ1ZSwgaW52ZXJ0WTogZmFsc2UgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwZGF0ZUZhbGxiYWNrcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NoYXJzLmhhcyhDaGFyQ29kZS5TUEFDRSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhcnMuc2V0KENoYXJDb2RlLlNQQUNFLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogQ2hhckNvZGUuU1BBQ0UsXHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgeG9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgIHlvZmZzZXQ6IDAsXHJcbiAgICAgICAgICAgICAgICB4YWR2YW5jZTogdGhpcy5fZm9udC5pbmZvLnNpemUgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICBwYWdlOiAtMSxcclxuICAgICAgICAgICAgICAgIGNobmw6IC0xLFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IC0xLFxyXG4gICAgICAgICAgICAgICAgY2hhcjogXCIgXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGFycy5oYXMoQ2hhckNvZGUuVE9GVSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhcnMuc2V0KENoYXJDb2RlLlRPRlUsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBDaGFyQ29kZS5UT0ZVLFxyXG4gICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5fZm9udC5pbmZvLnNpemUsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX2ZvbnQuaW5mby5zaXplLFxyXG4gICAgICAgICAgICAgICAgeG9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgIHlvZmZzZXQ6IDAsXHJcbiAgICAgICAgICAgICAgICB4YWR2YW5jZTogdGhpcy5fZm9udC5pbmZvLnNpemUgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICBwYWdlOiAtMSxcclxuICAgICAgICAgICAgICAgIGNobmw6IC0xLFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IC0xLFxyXG4gICAgICAgICAgICAgICAgY2hhcjogXCLvv79cIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfZ2V0Q2hhcihjaGFyQ29kZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoYXJzLmdldChjaGFyQ29kZSkgfHwgdGhpcy5fY2hhcnMuZ2V0KENoYXJDb2RlLlRPRlUpITtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgX2dldEtlcm5pbmcoZmlyc3Q6IG51bWJlciwgc2Vjb25kOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fa2VybmluZ3MuZ2V0KGZpcnN0KT8uZ2V0KHNlY29uZCkgfHwgMDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgX3Vuc3VwcG9ydGVkQ2hhcnModGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSh0aGlzLl9jaGFyc1JlZ2V4LCBcIlwiKTtcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9mb250QXNzZXRcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vcGFyYWdyYXBoT3B0aW9uc1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0UmVuZGVyZXJcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xyXG5cclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCJjb3JlL01hdGhzL21hdGgudmVjdG9yXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCB0eXBlIFBhcmFncmFwaE9wdGlvbnMgPSB7XHJcbiAgICBtYXhXaWR0aDogbnVtYmVyO1xyXG4gICAgbGluZUhlaWdodDogbnVtYmVyO1xyXG4gICAgbGV0dGVyU3BhY2luZzogbnVtYmVyO1xyXG4gICAgdGFiU2l6ZTogbnVtYmVyO1xyXG4gICAgd2hpdGVTcGFjZTogLyogJ25vcm1hbCcgfCAnbm93cmFwJyB8ICdwcmUnIHwgJ3ByZS13cmFwJyB8ICovIFwicHJlLWxpbmVcIiAvKiB8ICdicmVhay1zcGFjZXMnKi87XHJcbiAgICB0ZXh0QWxpZ246IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJjZW50ZXJcIiAvKiB8ICdqdXN0aWZ5JyovO1xyXG4gICAgdHJhbnNsYXRlOiBWZWN0b3IyIHwgdW5kZWZpbmVkO1xyXG59O1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY29uc3QgRGVmYXVsdFBhcmFncmFwaE9wdGlvbnM6IFBhcmFncmFwaE9wdGlvbnMgPSB7XHJcbiAgICBtYXhXaWR0aDogSW5maW5pdHksXHJcbiAgICBsaW5lSGVpZ2h0OiAxLFxyXG4gICAgbGV0dGVyU3BhY2luZzogMSxcclxuICAgIHRhYlNpemU6IDQsXHJcbiAgICB3aGl0ZVNwYWNlOiBcInByZS1saW5lXCIsXHJcbiAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICB0cmFuc2xhdGU6IG5ldyBWZWN0b3IyKC0wLjUsIC0wLjUpLFxyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBiYWJ5bG9uanMvYXZhaWxhYmxlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIGpzZG9jL3JlcXVpcmUtanNkb2MgKi9cclxuaW1wb3J0IHR5cGUgeyBGb250QXNzZXQgfSBmcm9tIFwiLi4vZm9udEFzc2V0XCI7XHJcbmltcG9ydCB7IERlZmF1bHRQYXJhZ3JhcGhPcHRpb25zLCB0eXBlIFBhcmFncmFwaE9wdGlvbnMgfSBmcm9tIFwiLi4vcGFyYWdyYXBoT3B0aW9uc1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJNRm9udENoYXIgfSBmcm9tIFwiLi9ibUZvbnRcIjtcclxuaW1wb3J0IHR5cGUgeyBTZGZHbHlwaCB9IGZyb20gXCIuL2dseXBoXCI7XHJcbmltcG9ydCB0eXBlIHsgU2RmVGV4dExpbmUgfSBmcm9tIFwiLi9saW5lXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTZGZUZXh0UGFyYWdyYXBoIHtcclxuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBQYXJhZ3JhcGhPcHRpb25zO1xyXG5cclxuICAgIGdldCBsaW5lSGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRBc3NldC5fZm9udC5jb21tb24ubGluZUhlaWdodCAqIHRoaXMub3B0aW9ucy5saW5lSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJlYWRvbmx5IHBhcmFncmFwaDtcclxuICAgIHJlYWRvbmx5IGxpbmVzO1xyXG4gICAgcmVhZG9ubHkgd2lkdGg7XHJcbiAgICByZWFkb25seSBoZWlnaHQ7XHJcbiAgICByZWFkb25seSBnbHlwaHM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZyxcclxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZm9udEFzc2V0OiBGb250QXNzZXQsXHJcbiAgICAgICAgb3B0aW9ucz86IFBhcnRpYWw8UGFyYWdyYXBoT3B0aW9ucz5cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHsgLi4uRGVmYXVsdFBhcmFncmFwaE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBwYXJhZ3JhcGgsIGxpbmVzLCBnbHlwaHMsIHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuX2NvbXB1dGVNZXRyaWNzKHRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFncmFwaCA9IHBhcmFncmFwaDtcclxuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XHJcbiAgICAgICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NvbXB1dGVNZXRyaWNzKHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNvbGxhcHNlZCA9IHRoaXMuX2NvbGxhcHNlKHRleHQpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrZWQgPSB0aGlzLl9icmVha0xpbmVzKGNvbGxhcHNlZCk7XHJcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGJyZWFrZWQubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmVzOiBTZGZUZXh0TGluZVtdID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRyaW1tZWQpIHtcclxuICAgICAgICAgICAgbGluZXMucHVzaCguLi50aGlzLl93cmFwKGxpbmUsIGxpbmVzLmxlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCguLi5saW5lcy5tYXAoKGxpbmUpID0+IGxpbmUud2lkdGgpKTtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmxpbmVIZWlnaHQgKiBsaW5lcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudGV4dEFsaWduICE9PSBcImxlZnRcIiB8fCB0aGlzLm9wdGlvbnMudHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudGV4dEFsaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoIC0gbGluZS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh3aWR0aCAtIGxpbmUud2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLm9wdGlvbnMudHJhbnNsYXRlPy5tdWx0aXBseUJ5RmxvYXRzKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgbGluZS5nbHlwaHMuZm9yRWFjaCgoZ2x5cGgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBnbHlwaC54ICs9IGFuY2hvcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLnggKz0gdHJhbnNsYXRlLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLnkgKz0gdHJhbnNsYXRlLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ2x5cGhzID0gbGluZXMuZmxhdE1hcCgobGluZSkgPT4gbGluZS5nbHlwaHMpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwYXJhZ3JhcGg6IHRyaW1tZWQuam9pbihcIlxcblwiKSxcclxuICAgICAgICAgICAgbGluZXMsXHJcbiAgICAgICAgICAgIGdseXBocyxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2JyZWFrTGluZXModGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQuc3BsaXQoXCJcXG5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY29sbGFwc2UodGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFx0L2csIFwiIFwiLnJlcGVhdCh0aGlzLm9wdGlvbnMudGFiU2l6ZSkpLnJlcGxhY2UoLyArL2csIFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF93cmFwKHRleHQ6IHN0cmluZywgbGluZU9mZnNldCA9IDApIHtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxTZGZUZXh0TGluZT4oKTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRMaW5lID0gbGluZU9mZnNldDtcclxuICAgICAgICBsZXQgY3VycmVudEdseXBocyA9IG5ldyBBcnJheTxTZGZHbHlwaD4oKTtcclxuICAgICAgICBsZXQgY3VycmVudEN1cnNvciA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IGxhc3RDaGFyOiBCTUZvbnRDaGFyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBzdGFydCA9IDA7XHJcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0O1xyXG5cclxuICAgICAgICBjb25zdCBwdXNoQ3VycmVudExpbmUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxpbmVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dC5zbGljZShzdGFydCwgZW5kKSxcclxuICAgICAgICAgICAgICAgIGdseXBoczogY3VycmVudEdseXBocyxcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcclxuICAgICAgICAgICAgICAgIGVuZDogZW5kLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGVuZCA8IHRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGkgPSBlbmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyID0gdGhpcy5mb250QXNzZXQuX2dldENoYXIoY2hhckNvZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyV2lkdGggPSBjaGFyLndpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBrZXJuaW5nID0gbGFzdENoYXIgPyB0aGlzLmZvbnRBc3NldC5fZ2V0S2VybmluZyhsYXN0Q2hhci5pZCwgY2hhci5pZCkgOiAwO1xyXG5cclxuICAgICAgICAgICAgY3VycmVudEN1cnNvciArPSBrZXJuaW5nICsgY2hhci54b2Zmc2V0O1xyXG4gICAgICAgICAgICBjb25zdCBuZXdXaWR0aCA9IGN1cnJlbnRDdXJzb3IgKyBjaGFyV2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclByb2dyZXNzID0gY2hhci54YWR2YW5jZSArIHRoaXMub3B0aW9ucy5sZXR0ZXJTcGFjaW5nO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0UG9zaXRpb24gPSBjdXJyZW50Q3Vyc29yICsgY3Vyc29yUHJvZ3Jlc3M7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRCcmVhayA9IG5leHRQb3NpdGlvbiA+IHRoaXMub3B0aW9ucy5tYXhXaWR0aCB8fCBuZXdXaWR0aCA+IHRoaXMub3B0aW9ucy5tYXhXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzaG91bGRCcmVhaykge1xyXG4gICAgICAgICAgICAgICAgcHVzaEN1cnJlbnRMaW5lKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUrKztcclxuICAgICAgICAgICAgICAgIGxhc3RDaGFyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQ7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIDE7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50R2x5cGhzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBjdXJyZW50Q3Vyc29yO1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gY3VycmVudExpbmUgKiB0aGlzLmxpbmVIZWlnaHQgKyBjaGFyLnlvZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50R2x5cGhzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgY2hhcixcclxuICAgICAgICAgICAgICAgIGxpbmU6IGN1cnJlbnRMaW5lLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGN1cnJlbnRHbHlwaHMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgeDogeCxcclxuICAgICAgICAgICAgICAgIHk6IHksXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFzaG91bGRCcmVhaykge1xyXG4gICAgICAgICAgICAgICAgbGFzdENoYXIgPSBjaGFyO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IG5leHRQb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgICAgICAgICAgICAgZW5kKys7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yID0gY3Vyc29yUHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50R2x5cGhzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHVzaEN1cnJlbnRMaW5lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGluZXM7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBWZXJ0ZXhCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0RW5naW5lIH0gZnJvbSBcImNvcmUvRW5naW5lcy9hYnN0cmFjdEVuZ2luZVwiO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiY29yZS9FbmdpbmVzL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IFRoaW5FbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3RoaW5FbmdpbmVcIjtcclxuaW1wb3J0IHsgRHJhd1dyYXBwZXIgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZHJhd1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2hhZGVyTGFuZ3VhZ2UgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvc2hhZGVyTGFuZ3VhZ2VcIjtcclxuaW1wb3J0IHR5cGUgeyBJRGlzcG9zYWJsZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgeyBTZGZUZXh0UGFyYWdyYXBoIH0gZnJvbSBcIi4vc2RmL3BhcmFncmFwaFwiO1xyXG5pbXBvcnQgdHlwZSB7IEZvbnRBc3NldCB9IGZyb20gXCIuL2ZvbnRBc3NldFwiO1xyXG5pbXBvcnQgdHlwZSB7IFBhcmFncmFwaE9wdGlvbnMgfSBmcm9tIFwiLi9wYXJhZ3JhcGhPcHRpb25zXCI7XHJcbmltcG9ydCB7IFRoaW5NYXRyaXggfSBmcm9tIFwiY29yZS9NYXRocy9UaGluTWF0aHMvdGhpbk1hdGgubWF0cml4XCI7XHJcbmltcG9ydCB7XHJcbiAgICBDb3B5TWF0cml4VG9BcnJheSxcclxuICAgIENvcHlNYXRyaXhUb1JlZixcclxuICAgIElkZW50aXR5TWF0cml4VG9SZWYsXHJcbiAgICBJbnZlcnRNYXRyaXhUb1JlZixcclxuICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZixcclxuICAgIFNjYWxpbmdNYXRyaXhUb1JlZixcclxuICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYsXHJcbn0gZnJvbSBcImNvcmUvTWF0aHMvVGhpbk1hdGhzL3RoaW5NYXRoLm1hdHJpeC5mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHR5cGUgeyBJQ29sb3I0TGlrZSwgSU1hdHJpeExpa2UsIElWZWN0b3IzTGlrZSB9IGZyb20gXCJjb3JlL01hdGhzXCI7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgTm9kZSBjbGFzcyBmcm9tIEJhYnlsb24uanNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU5vZGVMaWtlIHtcclxuICAgIGdldFdvcmxkTWF0cml4KCk6IFRoaW5NYXRyaXg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGFzcyB1c2VkIHRvIHJlbmRlciB0ZXh0IHVzaW5nIE1TREYgKE11bHRpLWNoYW5uZWwgU2lnbmVkIERpc3RhbmNlIEZpZWxkKSB0ZWNobmlxdWVcclxuICogVGhhbmtzIGEgbG90IHRvIHRoZSB3b3JrIG9mIEJodXNoYW5fV2FnaCBhbmQgemJfc2ogZm9yIHRoZWlyIGFtYXppbmcgd29yayBvbiBNU0RGIGZvciBCYWJ5bG9uLmpzXHJcbiAqICM2UkxDV1AjMTZcclxuICogU3RhciB3YXJzIHNjcm9sbGVyOiAjNlJMQ1dQIzI5XHJcbiAqIFdpdGggbWV0cmljczogIzZSTENXUCMzNVxyXG4gKiBUaGlja25lc3M6ICNJQUJNRVojM1xyXG4gKiBTb2xhciBzeXN0ZW06ICM5WUNEWUMjOVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRleHRSZW5kZXJlciBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3VzZVZBTzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZW5naW5lOiBBYnN0cmFjdEVuZ2luZTtcclxuICAgIHByaXZhdGUgX3NoYWRlckxhbmd1YWdlOiBTaGFkZXJMYW5ndWFnZTtcclxuICAgIHByaXZhdGUgX3ZlcnRleEJ1ZmZlcnM6IHsgW2tleTogc3RyaW5nXTogVmVydGV4QnVmZmVyIH0gPSB7fTtcclxuICAgIHByaXZhdGUgX3Nwcml0ZUJ1ZmZlcjogTnVsbGFibGU8QnVmZmVyPjtcclxuICAgIHByaXZhdGUgX3dvcmxkQnVmZmVyOiBOdWxsYWJsZTxCdWZmZXI+O1xyXG4gICAgcHJpdmF0ZSBfdXZCdWZmZXI6IE51bGxhYmxlPEJ1ZmZlcj47XHJcbiAgICBwcml2YXRlIF9kcmF3V3JhcHBlckJhc2U6IERyYXdXcmFwcGVyO1xyXG4gICAgcHJpdmF0ZSBfdmVydGV4QXJyYXlPYmplY3Q6IFdlYkdMVmVydGV4QXJyYXlPYmplY3Q7XHJcbiAgICBwcml2YXRlIF9mb250OiBGb250QXNzZXQ7XHJcbiAgICBwcml2YXRlIF9jaGFyTWF0cmljZXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgcHJpdmF0ZSBfY2hhclV2cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICBwcml2YXRlIF9pc0RpcnR5ID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX2Jhc2VMaW5lID0gMDtcclxuXHJcbiAgICAvLyBDYWNoZVxyXG4gICAgcHJpdmF0ZSBfc2NhbGluZ01hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9mb250U2NhbGVNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfb2Zmc2V0TWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2Jhc2VNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfc2NhbGVkTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2xvY2FsTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2ZpbmFsTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2xpbmVNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfcGFyZW50V29ybGRNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfc3RvcmVkVHJhbnNsYXRpb246IElWZWN0b3IzTGlrZSA9IHsgeDogMCwgeTogMCwgejogMCB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBjb2xvciBvZiB0aGUgdGV4dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sb3I6IElDb2xvcjRMaWtlID0geyByOiAxLjAsIGc6IDEuMCwgYjogMS4wLCBhOiAxLjAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB0ZXh0ICgwIG1lYW5zIGFzIGRlZmluZWQgaW4gdGhlIGZvbnQpXHJcbiAgICAgKiBWYWx1ZSBtdXN0IGJlIGJldHdlZW4gLTAuNSBhbmQgMC41XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0aGlja25lc3NDb250cm9sID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9wYXJlbnQ6IE51bGxhYmxlPElOb2RlTGlrZT4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBwYXJlbnQgb2YgdGhlIHRleHQgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwYXJlbnQoKTogTnVsbGFibGU8SU5vZGVMaWtlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHBhcmVudCh2YWx1ZTogTnVsbGFibGU8SU5vZGVMaWtlPikge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGlmIHRoZSB0ZXh0IGlzIGJpbGxib2FyZGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0JpbGxib2FyZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHRleHQgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjaGFyYWN0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFyTWF0cmljZXMubGVuZ3RoIC8gMTY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihlbmdpbmU6IEFic3RyYWN0RW5naW5lLCBzaGFkZXJMYW5ndWFnZTogU2hhZGVyTGFuZ3VhZ2UgPSBTaGFkZXJMYW5ndWFnZS5HTFNMLCBmb250OiBGb250QXNzZXQpIHtcclxuICAgICAgICB0aGlzLl9lbmdpbmUgPSBlbmdpbmU7XHJcbiAgICAgICAgdGhpcy5fc2hhZGVyTGFuZ3VhZ2UgPSBzaGFkZXJMYW5ndWFnZTtcclxuICAgICAgICB0aGlzLl9mb250ID0gZm9udDtcclxuICAgICAgICB0aGlzLl9iYXNlTGluZSA9IGZvbnQuX2ZvbnQuY29tbW9uLmxpbmVIZWlnaHQgKiBmb250LnNjYWxlO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VWQU8gPSBlbmdpbmUuZ2V0Q2FwcygpLnZlcnRleEFycmF5T2JqZWN0ICYmICFlbmdpbmUuZGlzYWJsZVZlcnRleEFycmF5T2JqZWN0cztcclxuXHJcbiAgICAgICAgLy8gTWFpbiB2ZXJ0ZXggYnVmZmVyXHJcbiAgICAgICAgY29uc3Qgc3ByaXRlRGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDEsIDAsIDAsIDEsIDEsIDFdKTtcclxuICAgICAgICB0aGlzLl9zcHJpdGVCdWZmZXIgPSBuZXcgQnVmZmVyKGVuZ2luZSwgc3ByaXRlRGF0YSwgZmFsc2UsIDIpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJvZmZzZXRzXCJdID0gdGhpcy5fc3ByaXRlQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIm9mZnNldHNcIiwgMCwgMik7XHJcblxyXG4gICAgICAgIC8vIEluc3RhbmNlc1xyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZUJ1ZmZlcnMoMTI4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9yZXNpemVCdWZmZXJzKGNhcGFjaXR5OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fd29ybGRCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fdXZCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXZCdWZmZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5fZW5naW5lLCBuZXcgRmxvYXQzMkFycmF5KGNhcGFjaXR5ICogMTYpLCB0cnVlLCAxNik7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIndvcmxkMFwiXSA9IHRoaXMuX3dvcmxkQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIndvcmxkMFwiLCAwLCA0LCAxNiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIndvcmxkMVwiXSA9IHRoaXMuX3dvcmxkQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIndvcmxkMVwiLCA0LCA0LCAxNiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIndvcmxkMlwiXSA9IHRoaXMuX3dvcmxkQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIndvcmxkMlwiLCA4LCA0LCAxNiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIndvcmxkM1wiXSA9IHRoaXMuX3dvcmxkQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIndvcmxkM1wiLCAxMiwgNCwgMTYsIHRydWUpO1xyXG5cclxuICAgICAgICB0aGlzLl91dkJ1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5fZW5naW5lLCBuZXcgRmxvYXQzMkFycmF5KGNhcGFjaXR5ICogNCksIHRydWUsIDQpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ1dnNcIl0gPSB0aGlzLl91dkJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ1dnNcIiwgMCwgNCwgNCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2V0U2hhZGVycyh2ZXJ0ZXg6IHN0cmluZywgZnJhZ21lbnQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX2RyYXdXcmFwcGVyQmFzZT8uZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2UgPSBuZXcgRHJhd1dyYXBwZXIodGhpcy5fZW5naW5lKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYXdXcmFwcGVyQmFzZS5kcmF3Q29udGV4dCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2UuZHJhd0NvbnRleHQudXNlSW5zdGFuY2luZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkZWZpbmVzID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlLmVmZmVjdCA9IHRoaXMuX2VuZ2luZS5jcmVhdGVFZmZlY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZlcnRleFNvdXJjZTogdmVydGV4LFxyXG4gICAgICAgICAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZyYWdtZW50LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbXCJvZmZzZXRzXCIsIFwid29ybGQwXCIsIFwid29ybGQxXCIsIFwid29ybGQyXCIsIFwid29ybGQzXCIsIFwidXZzXCJdLFxyXG4gICAgICAgICAgICBbXCJwYXJlbnRXb3JsZFwiLCBcInZpZXdcIiwgXCJwcm9qZWN0aW9uXCIsIFwidUNvbG9yXCIsIFwidW5pdFJhbmdlXCIsIFwidGV4ZWxTaXplXCIsIFwidGhpY2tuZXNzXCJdLFxyXG4gICAgICAgICAgICBbXCJmb250QXRsYXNcIl0sXHJcbiAgICAgICAgICAgIGRlZmluZXMsXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdGhpcy5fc2hhZGVyTGFuZ3VhZ2VcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2UuZWZmZWN0Ll9yZWZDb3VudCsrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgcGFyYWdyYXBoIG9mIHRleHQgdG8gdGhlIHJlbmRlcmVyXHJcbiAgICAgKiBAcGFyYW0gdGV4dCBkZWZpbmUgdGhlIHRleHQgdG8gYWRkXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBkZWZpbmUgdGhlIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgcGFyYWdyYXBoIChvcHRpb25hbClcclxuICAgICAqIEBwYXJhbSB3b3JsZE1hdHJpeCBkZWZpbmUgdGhlIHdvcmxkIG1hdHJpeCB0byB1c2UgZm9yIHRoZSBwYXJhZ3JhcGggKG9wdGlvbmFsKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkUGFyYWdyYXBoKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8UGFyYWdyYXBoT3B0aW9ucz4sIHdvcmxkTWF0cml4PzogSU1hdHJpeExpa2UpIHtcclxuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBuZXcgU2RmVGV4dFBhcmFncmFwaCh0ZXh0LCB0aGlzLl9mb250LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9udFNjYWxlID0gdGhpcy5fZm9udC5zY2FsZTtcclxuXHJcbiAgICAgICAgY29uc3QgdGV4V2lkdGggPSB0aGlzLl9mb250Ll9mb250LmNvbW1vbi5zY2FsZVc7XHJcbiAgICAgICAgY29uc3QgdGV4SGVpZ2h0ID0gdGhpcy5fZm9udC5fZm9udC5jb21tb24uc2NhbGVIO1xyXG4gICAgICAgIGNvbnN0IGdseXBocyA9IHBhcmFncmFwaC5nbHlwaHMuZmlsdGVyKChnKSA9PiBnLmNoYXIucGFnZSA+PSAwKTtcclxuXHJcbiAgICAgICAgbGV0IHdvcmxkTWF0cml4VG9Vc2UgPSB3b3JsZE1hdHJpeDtcclxuXHJcbiAgICAgICAgaWYgKCF3b3JsZE1hdHJpeFRvVXNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBwYXJhZ3JhcGgubGluZUhlaWdodCAqIGZvbnRTY2FsZTtcclxuICAgICAgICAgICAgY29uc3QgbGluZU9mZnNldCA9IChwYXJhZ3JhcGgubGluZXMubGVuZ3RoICogbGluZUhlaWdodCkgLyAyO1xyXG4gICAgICAgICAgICBUcmFuc2xhdGlvbk1hdHJpeFRvUmVmKDAsIHRoaXMuX2Jhc2VMaW5lIC0gbGluZU9mZnNldCwgMCwgdGhpcy5fbGluZU1hdHJpeCk7XHJcbiAgICAgICAgICAgIHdvcmxkTWF0cml4VG9Vc2UgPSB0aGlzLl9saW5lTWF0cml4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgU2NhbGluZ01hdHJpeFRvUmVmKGZvbnRTY2FsZSwgZm9udFNjYWxlLCAxLjAsIHRoaXMuX2ZvbnRTY2FsZU1hdHJpeCk7XHJcbiAgICAgICAgVHJhbnNsYXRpb25NYXRyaXhUb1JlZigwLjUsIC0wLjUsIDAsIHRoaXMuX29mZnNldE1hdHJpeCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNoYXJzVXZzQmFzZSA9IHRoaXMuX2NoYXJVdnMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IG1hdHJpY2VzQmFzZSA9IHRoaXMuX2NoYXJNYXRyaWNlcy5sZW5ndGg7XHJcbiAgICAgICAgZ2x5cGhzLmZvckVhY2goKGcsIGkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhclV2c1tjaGFyc1V2c0Jhc2UgKyBpICogNCArIDBdID0gZy5jaGFyLnggLyB0ZXhXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5fY2hhclV2c1tjaGFyc1V2c0Jhc2UgKyBpICogNCArIDFdID0gZy5jaGFyLnkgLyB0ZXhIZWlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJVdnNbY2hhcnNVdnNCYXNlICsgaSAqIDQgKyAyXSA9IGcuY2hhci53aWR0aCAvIHRleFdpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFyVXZzW2NoYXJzVXZzQmFzZSArIGkgKiA0ICsgM10gPSBnLmNoYXIuaGVpZ2h0IC8gdGV4SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeCA9IGcueDtcclxuICAgICAgICAgICAgY29uc3QgeSA9IC1nLnk7XHJcblxyXG4gICAgICAgICAgICBTY2FsaW5nTWF0cml4VG9SZWYoZy5jaGFyLndpZHRoLCBnLmNoYXIuaGVpZ2h0LCAxLjAsIHRoaXMuX3NjYWxpbmdNYXRyaXgpO1xyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fb2Zmc2V0TWF0cml4LCB0aGlzLl9zY2FsaW5nTWF0cml4LCB0aGlzLl9iYXNlTWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYoeCAqIGZvbnRTY2FsZSwgeSAqIGZvbnRTY2FsZSwgMC4wLCB0aGlzLl90cmFuc2xhdGlvbk1hdHJpeCk7XHJcbiAgICAgICAgICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZih0aGlzLl9iYXNlTWF0cml4LCB0aGlzLl9mb250U2NhbGVNYXRyaXgsIHRoaXMuX3NjYWxlZE1hdHJpeCk7XHJcbiAgICAgICAgICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZih0aGlzLl9zY2FsZWRNYXRyaXgsIHRoaXMuX3RyYW5zbGF0aW9uTWF0cml4LCB0aGlzLl9sb2NhbE1hdHJpeCk7XHJcblxyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fbG9jYWxNYXRyaXgsIHdvcmxkTWF0cml4VG9Vc2UsIHRoaXMuX2ZpbmFsTWF0cml4KTtcclxuICAgICAgICAgICAgQ29weU1hdHJpeFRvQXJyYXkodGhpcy5fZmluYWxNYXRyaXgsIHRoaXMuX2NoYXJNYXRyaWNlcywgbWF0cmljZXNCYXNlICsgaSAqIDE2KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2Jhc2VMaW5lIC09IHBhcmFncmFwaC5saW5lSGVpZ2h0ICogZm9udFNjYWxlICogcGFyYWdyYXBoLmxpbmVzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlciB0aGUgdGV4dCB1c2luZyB0aGUgcHJvdmlkZWQgdmlldyBhbmQgcHJvamVjdGlvbiBtYXRyaWNlc1xyXG4gICAgICogQHBhcmFtIHZpZXdNYXRyaXggZGVmaW5lIHRoZSB2aWV3IG1hdHJpeCB0byB1c2VcclxuICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uTWF0cml4IGRlZmluZSB0aGUgcHJvamVjdGlvbiBtYXRyaXggdG8gdXNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXIodmlld01hdHJpeDogSU1hdHJpeExpa2UsIHByb2plY3Rpb25NYXRyaXg6IElNYXRyaXhMaWtlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZHJhd1dyYXBwZXIgPSB0aGlzLl9kcmF3V3JhcHBlckJhc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IGRyYXdXcmFwcGVyLmVmZmVjdCE7XHJcblxyXG4gICAgICAgIC8vIENoZWNrXHJcbiAgICAgICAgaWYgKCFlZmZlY3QuaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZW5naW5lID0gdGhpcy5fZW5naW5lO1xyXG5cclxuICAgICAgICBlbmdpbmUuc2V0U3RhdGUoZmFsc2UpO1xyXG4gICAgICAgIGVuZ2luZS5lbmFibGVFZmZlY3QoZHJhd1dyYXBwZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0JpbGxib2FyZCkge1xyXG4gICAgICAgICAgICAvLyBXZSB3aWxsIG9ubHkgY29uc2lkZXIgdHJhbnNsYXRpb24gZm9yIHBhcmVudCB0byBzaW1wbGlmeSBjb21wdXRhdGlvblxyXG4gICAgICAgICAgICAvLyBTYXZlIHBhcmVudCB0cmFuc2xhdGlvblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwd20gPSB0aGlzLl9wYXJlbnQuZ2V0V29ybGRNYXRyaXgoKS5hc0FycmF5KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yZWRUcmFuc2xhdGlvbi54ID0gcHdtWzEyXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JlZFRyYW5zbGF0aW9uLnkgPSBwd21bMTNdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcmVkVHJhbnNsYXRpb24ueiA9IHB3bVsxNF07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yZWRUcmFuc2xhdGlvbi54ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JlZFRyYW5zbGF0aW9uLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcmVkVHJhbnNsYXRpb24ueiA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQ2FuY2VsIGNhbWVyYSByb3RhdGlvblxyXG4gICAgICAgICAgICBjb25zdCBiYXNlTSA9IHRoaXMuX2Jhc2VNYXRyaXguYXNBcnJheSgpO1xyXG4gICAgICAgICAgICBDb3B5TWF0cml4VG9BcnJheSh2aWV3TWF0cml4LCBiYXNlTSk7XHJcbiAgICAgICAgICAgIGJhc2VNWzEyXSA9IDA7XHJcbiAgICAgICAgICAgIGJhc2VNWzEzXSA9IDA7XHJcbiAgICAgICAgICAgIGJhc2VNWzE0XSA9IDA7XHJcbiAgICAgICAgICAgIEludmVydE1hdHJpeFRvUmVmKHRoaXMuX2Jhc2VNYXRyaXgsIHRoaXMuX3BhcmVudFdvcmxkTWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdHJhbnNsYXRpb25cclxuICAgICAgICAgICAgY29uc3QgcHdtID0gdGhpcy5fcGFyZW50V29ybGRNYXRyaXguYXNBcnJheSgpO1xyXG4gICAgICAgICAgICBwd21bMTJdID0gdGhpcy5fc3RvcmVkVHJhbnNsYXRpb24ueDtcclxuICAgICAgICAgICAgcHdtWzEzXSA9IHRoaXMuX3N0b3JlZFRyYW5zbGF0aW9uLnk7XHJcbiAgICAgICAgICAgIHB3bVsxNF0gPSB0aGlzLl9zdG9yZWRUcmFuc2xhdGlvbi56O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgIENvcHlNYXRyaXhUb1JlZih0aGlzLl9wYXJlbnQuZ2V0V29ybGRNYXRyaXgoKSwgdGhpcy5fcGFyZW50V29ybGRNYXRyaXgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgSWRlbnRpdHlNYXRyaXhUb1JlZih0aGlzLl9wYXJlbnRXb3JsZE1hdHJpeCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoXCJwYXJlbnRXb3JsZFwiLCB0aGlzLl9wYXJlbnRXb3JsZE1hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInZpZXdcIiwgdmlld01hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInByb2plY3Rpb25cIiwgcHJvamVjdGlvbk1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIFRleHR1cmVcclxuICAgICAgICBjb25zdCB0ZXh0dXJlV2lkdGggPSB0aGlzLl9mb250Ll9mb250LmNvbW1vbi5zY2FsZVc7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZUhlaWdodCA9IHRoaXMuX2ZvbnQuX2ZvbnQuY29tbW9uLnNjYWxlVztcclxuICAgICAgICBjb25zdCBkaXN0YW5jZVJhbmdlID0gdGhpcy5fZm9udC5fZm9udC5kaXN0YW5jZUZpZWxkLmRpc3RhbmNlUmFuZ2U7XHJcblxyXG4gICAgICAgIGVmZmVjdC5zZXRUZXh0dXJlKFwiZm9udEF0bGFzXCIsIHRoaXMuX2ZvbnQudGV4dHVyZXNbMF0pO1xyXG4gICAgICAgIGVmZmVjdC5zZXRGbG9hdDIoXCJ1bml0UmFuZ2VcIiwgZGlzdGFuY2VSYW5nZSAvIHRleHR1cmVXaWR0aCwgZGlzdGFuY2VSYW5nZSAvIHRleHR1cmVIZWlnaHQpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRGbG9hdDIoXCJ0ZXhlbFNpemVcIiwgMS4wIC8gdGV4dHVyZVdpZHRoLCAxLjAgLyB0ZXh0dXJlSGVpZ2h0KTtcclxuICAgICAgICBlZmZlY3Quc2V0RGlyZWN0Q29sb3I0KFwidUNvbG9yXCIsIHRoaXMuY29sb3IpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRGbG9hdChcInRoaWNrbmVzc1wiLCB0aGlzLnRoaWNrbmVzc0NvbnRyb2wgKiAwLjkpO1xyXG5cclxuICAgICAgICBjb25zdCBpbnN0YW5jZUNvdW50ID0gdGhpcy5fY2hhck1hdHJpY2VzLmxlbmd0aCAvIDE2O1xyXG5cclxuICAgICAgICAvLyBOZWVkIHVwZGF0ZT9cclxuICAgICAgICBpZiAodGhpcy5faXNEaXJ0eSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0RpcnR5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ybGRCdWZmZXIhLmdldEJ1ZmZlcigpIS5jYXBhY2l0eSAvIDQgPCBpbnN0YW5jZUNvdW50ICogMTYpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZUJ1ZmZlcnMoaW5zdGFuY2VDb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyIS51cGRhdGUodGhpcy5fY2hhck1hdHJpY2VzKTtcclxuICAgICAgICAgICAgdGhpcy5fdXZCdWZmZXIhLnVwZGF0ZSh0aGlzLl9jaGFyVXZzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91c2VWQU8pIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmVydGV4QXJyYXlPYmplY3QgPSAoZW5naW5lIGFzIFRoaW5FbmdpbmUpLnJlY29yZFZlcnRleEFycmF5T2JqZWN0KHRoaXMuX3ZlcnRleEJ1ZmZlcnMsIG51bGwsIGVmZmVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKGVuZ2luZSBhcyBUaGluRW5naW5lKS5iaW5kVmVydGV4QXJyYXlPYmplY3QodGhpcy5fdmVydGV4QXJyYXlPYmplY3QsIG51bGwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFZCT3NcclxuICAgICAgICAgICAgZW5naW5lLmJpbmRCdWZmZXJzKHRoaXMuX3ZlcnRleEJ1ZmZlcnMsIG51bGwsIGVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbmdpbmUuc2V0QWxwaGFNb2RlKENvbnN0YW50cy5BTFBIQV9DT01CSU5FKTtcclxuXHJcbiAgICAgICAgZW5naW5lLmRyYXdBcnJheXNUeXBlKENvbnN0YW50cy5NQVRFUklBTF9UcmlhbmdsZVN0cmlwRHJhd01vZGUsIDAsIDQsIGluc3RhbmNlQ291bnQpO1xyXG5cclxuICAgICAgICBlbmdpbmUudW5iaW5kSW5zdGFuY2VBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JsZEJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91dkJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3V2QnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zcHJpdGVCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCkge1xyXG4gICAgICAgICAgICAodGhpcy5fZW5naW5lIGFzIFRoaW5FbmdpbmUpLnJlbGVhc2VWZXJ0ZXhBcnJheU9iamVjdCh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCk7XHJcbiAgICAgICAgICAgICg8YW55PnRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgaW5zdGFuY2UgYXN5bmNocm9ub3VzbHlcclxuICAgICAqIEBwYXJhbSBmb250IGRlZmluZSB0aGUgZm9udCBhc3NldCB0byB1c2VcclxuICAgICAqIEBwYXJhbSBlbmdpbmUgZGVmaW5lIHRoZSBlbmdpbmUgdG8gdXNlXHJcbiAgICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBUZXh0UmVuZGVyZXIgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBDcmVhdGVUZXh0UmVuZGVyZXJBc3luYyhmb250OiBGb250QXNzZXQsIGVuZ2luZTogQWJzdHJhY3RFbmdpbmUpIHtcclxuICAgICAgICBpZiAoIWVuZ2luZS5nZXRDYXBzKCkuaW5zdGFuY2VkQXJyYXlzIHx8ICFlbmdpbmUuX2ZlYXR1cmVzLnN1cHBvcnRTcHJpdGVJbnN0YW5jaW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluc3RhbmNlZCBhcnJheXMgYXJlIHJlcXVpcmVkIGZvciBNU0RGIHRleHQgcmVuZGVyaW5nLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLkdMU0w7XHJcbiAgICAgICAgbGV0IHZlcnRleDogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgZnJhZ21lbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKGVuZ2luZS5pc1dlYkdQVSkge1xyXG4gICAgICAgICAgICBzaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLldHU0w7XHJcbiAgICAgICAgICAgIHZlcnRleCA9IChhd2FpdCBpbXBvcnQoXCIuL3dlYmdwdS92ZXJ0ZXhcIikpLm1zZGZWZXJ0ZXhTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgICAgICBmcmFnbWVudCA9IChhd2FpdCBpbXBvcnQoXCIuL3dlYmdwdS9mcmFnbWVudFwiKSkubXNkZkZyYWdtZW50U2hhZGVyLnNoYWRlcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2ZXJ0ZXggPSAoYXdhaXQgaW1wb3J0KFwiLi93ZWJnbC92ZXJ0ZXhcIikpLm1zZGZWZXJ0ZXhTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgICAgICBmcmFnbWVudCA9IChhd2FpdCBpbXBvcnQoXCIuL3dlYmdsL2ZyYWdtZW50XCIpKS5tc2RmRnJhZ21lbnRTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGV4dFJlbmRlcmVyID0gbmV3IFRleHRSZW5kZXJlcihlbmdpbmUsIHNoYWRlckxhbmd1YWdlLCBmb250KTtcclxuICAgICAgICB0ZXh0UmVuZGVyZXIuX3NldFNoYWRlcnModmVydGV4LCBmcmFnbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0UmVuZGVyZXI7XHJcbiAgICB9XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NYXRoc19tYXRoX3ZlY3Rvcl9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwidmFyIGluUHJvZ3Jlc3MgPSB7fTtcbnZhciBkYXRhV2VicGFja1ByZWZpeCA9IFwiQURET05TOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXG5cdFx0c2NyaXB0LnNyYyA9IHVybDtcblx0fVxuXHRpblByb2dyZXNzW3VybF0gPSBbZG9uZV07XG5cdHZhciBvblNjcmlwdENvbXBsZXRlID0gKHByZXYsIGV2ZW50KSA9PiB7XG5cdFx0Ly8gYXZvaWQgbWVtIGxlYWtzIGluIElFLlxuXHRcdHNjcmlwdC5vbmVycm9yID0gc2NyaXB0Lm9ubG9hZCA9IG51bGw7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdHZhciBkb25lRm5zID0gaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdGRlbGV0ZSBpblByb2dyZXNzW3VybF07XG5cdFx0c2NyaXB0LnBhcmVudE5vZGUgJiYgc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcblx0XHRkb25lRm5zICYmIGRvbmVGbnMuZm9yRWFjaCgoZm4pID0+IChmbihldmVudCkpKTtcblx0XHRpZihwcmV2KSByZXR1cm4gcHJldihldmVudCk7XG5cdH1cblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwidmFyIHNjcmlwdFVybDtcbmlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cykgc2NyaXB0VXJsID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uICsgXCJcIjtcbnZhciBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtcbmlmICghc2NyaXB0VXJsICYmIGRvY3VtZW50KSB7XG5cdGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJylcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYztcblx0aWYgKCFzY3JpcHRVcmwpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGlmKHNjcmlwdHMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgaSA9IHNjcmlwdHMubGVuZ3RoIC0gMTtcblx0XHRcdHdoaWxlIChpID4gLTEgJiYgKCFzY3JpcHRVcmwgfHwgIS9eaHR0cChzPyk6Ly50ZXN0KHNjcmlwdFVybCkpKSBzY3JpcHRVcmwgPSBzY3JpcHRzW2ktLV0uc3JjO1xuXHRcdH1cblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC9eYmxvYjovLCBcIlwiKS5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwiYWRkb25zXCI6IDBcbn07XG5cbl9fd2VicGFja19yZXF1aXJlX18uZi5qID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdFx0Ly8gSlNPTlAgY2h1bmsgbG9hZGluZyBmb3IgamF2YXNjcmlwdFxuXHRcdHZhciBpbnN0YWxsZWRDaHVua0RhdGEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSA/IGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA6IHVuZGVmaW5lZDtcblx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEgIT09IDApIHsgLy8gMCBtZWFucyBcImFscmVhZHkgaW5zdGFsbGVkXCIuXG5cblx0XHRcdC8vIGEgUHJvbWlzZSBtZWFucyBcImN1cnJlbnRseSBsb2FkaW5nXCIuXG5cdFx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEpIHtcblx0XHRcdFx0cHJvbWlzZXMucHVzaChpbnN0YWxsZWRDaHVua0RhdGFbMl0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG59O1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uLCBkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMDtcblx0aWYoY2h1bmtJZHMuc29tZSgoaWQpID0+IChpbnN0YWxsZWRDaHVua3NbaWRdICE9PSAwKSkpIHtcblx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJ1bnRpbWUpIHZhciByZXN1bHQgPSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR9XG5cdGlmKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKSBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bMF0oKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpW1wid2VicGFja0NodW5rQURET05TXCJdID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKVtcIndlYnBhY2tDaHVua0FERE9OU1wiXSB8fCBbXTtcbmNodW5rTG9hZGluZ0dsb2JhbC5mb3JFYWNoKHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgMCkpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKSk7IiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzXHJcbmltcG9ydCAqIGFzIGFkZG9ucyBmcm9tIFwiYWRkb25zL2luZGV4XCI7XHJcblxyXG5leHBvcnQgeyBhZGRvbnMgfTtcclxuZXhwb3J0IGRlZmF1bHQgYWRkb25zO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
2828
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLmFkZG9ucy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFxREE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFwREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQVdBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQS9FQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQWdDQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBeUNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBS0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFLQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQU1BO0FBSkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNVdBO0FBR0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQTRDQTs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFGQTtBQTVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUF1aUJBO0FBQ0E7QUFDQTtBQUNBO0FBaGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0cUJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQWVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdMQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUlBO0FBQ0E7QUFtQkE7QUFHQTtBQUZBO0FBQ0E7QUFwQkE7QUFDQTtBQXNCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQXVCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xPQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQWtCQTs7Ozs7QUFLQTtBQUNBO0FBQUE7QUF2QkE7QUFFQTtBQXNCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNSQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBSXhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUVEQTtBQUtBO0FBQ0E7QUFhQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBO0FBQUE7QUFDQTtBQUNBOzs7QUFBQTtBQXdCQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzS0E7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYkE7QUFDQTtBQUVBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEJBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFFQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25CQTtBQUVBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFpQkE7Ozs7Ozs7OztBQVNBO0FBQ0E7QUEwR0E7QUFBQTtBQXpHQTtBQUdBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBRUE7QUFhQTtBQWVBOztBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQVNBOzs7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBOURBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUpBO0FBYUE7QUFMQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQW9CQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFZQTtBQUNBO0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBS0E7QUFDQTs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUFBO0FBQ0E7O0FBQUE7O0FBRUE7O0FBQUE7QUFDQTs7QUFBQTs7O0FBR0E7QUFDQTtBQUVBOzs7O0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7QUM5WUE7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9maXRTdHJhdGVneS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvaHRtbE1lc2gudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2h0bWxNZXNoUmVuZGVyZXIudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9wb2ludGVyRXZlbnRzQ2FwdHVyZS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvci50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L2ZvbnRBc3NldC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3BhcmFncmFwaE9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9ibUZvbnQudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9mb250LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9tc2RmVGV4dC9zZGYvZ2x5cGgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9pbmRleC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2RmL2xpbmUudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9wYXJhZ3JhcGgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NoYWRlcnMvbXNkZi5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2hhZGVycy9tc2RmLnZlcnRleC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2hhZGVyc1dHU0wvbXNkZi5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2hhZGVyc1dHU0wvbXNkZi52ZXJ0ZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3RleHRSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9BRERPTlMvZXh0ZXJuYWwgdW1kIHtcInJvb3RcIjpcIkJBQllMT05cIixcImNvbW1vbmpzXCI6XCJiYWJ5bG9uanNcIixcImNvbW1vbmpzMlwiOlwiYmFieWxvbmpzXCIsXCJhbWRcIjpcImJhYnlsb25qc1wifSIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQURET05TLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcImJhYnlsb25qcy1hZGRvbnNcIiwgW1wiYmFieWxvbmpzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImJhYnlsb25qcy1hZGRvbnNcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkFERE9OU1wiXSA9IGZhY3Rvcnkocm9vdFtcIkJBQllMT05cIl0pO1xufSkoKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKSwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01hdGhzX21hdGhfXykgPT4ge1xucmV0dXJuICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gIHJldHVybiBjb29rZWQ7XG59O1xuXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59O1xuXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgdmFyIGFyID0gW107XG4gICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICByZXR1cm4gYXI7XG4gIH07XG4gIHJldHVybiBvd25LZXlzKG8pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XG4gICAgaWYgKGFzeW5jKSB7XG4gICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xuICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gIH1cbiAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xuICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgfVxuICB2YXIgciwgcyA9IDA7XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xuICAgICAgICBpZiAoci5kaXNwb3NlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xuICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBzIHw9IDE7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XG4gICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19lc0RlY29yYXRlLFxuICBfX3J1bkluaXRpYWxpemVycyxcbiAgX19wcm9wS2V5LFxuICBfX3NldEZ1bmN0aW9uTmFtZSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG4gIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxufTtcbiIsImV4cG9ydCB0eXBlIEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQ7XHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQ7XHJcbn07XHJcblxyXG5jb25zdCBGaXRTdHJhdGVneUNvbnRhaW46IEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IHNpemluZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuYWxpZ25JdGVtcyA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgY29uc3Qgc2NhbGluZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoc2NhbGluZ0VsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBzaXppbmdFbGVtZW50O1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2NhbGluZ0VsZW1lbnQgPSBzaXppbmdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkISBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuXHJcbiAgICAgICAgY29uc3QgW2NoaWxkV2lkdGgsIGNoaWxkSGVpZ2h0XSA9IFtzY2FsaW5nRWxlbWVudC5vZmZzZXRXaWR0aCwgc2NhbGluZ0VsZW1lbnQub2Zmc2V0SGVpZ2h0XTtcclxuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKHdpZHRoIC8gY2hpbGRXaWR0aCwgaGVpZ2h0IC8gY2hpbGRIZWlnaHQpO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgke3NjYWxlfSlgO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH0sXHJcbn07XHJcblxyXG5jb25zdCBGaXRTdHJhdGVneUNvdmVyOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzaXppbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LmFwcGVuZENoaWxkKHNjYWxpbmdFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gc2l6aW5nRWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gc2l6aW5nRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcblxyXG4gICAgICAgIGNvbnN0IFtjaGlsZFdpZHRoLCBjaGlsZEhlaWdodF0gPSBbc2NhbGluZ0VsZW1lbnQub2Zmc2V0V2lkdGgsIHNjYWxpbmdFbGVtZW50Lm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1heCh3aWR0aCAvIGNoaWxkV2lkdGgsIGhlaWdodCAvIGNoaWxkSGVpZ2h0KTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtzY2FsZX0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lTdHJldGNoOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzaXppbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LmFwcGVuZENoaWxkKHNjYWxpbmdFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gc2l6aW5nRWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gc2l6aW5nRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcblxyXG4gICAgICAgIGNvbnN0IFtjaGlsZFdpZHRoLCBjaGlsZEhlaWdodF0gPSBbc2NhbGluZ0VsZW1lbnQub2Zmc2V0V2lkdGgsIHNjYWxpbmdFbGVtZW50Lm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7d2lkdGggLyBjaGlsZFdpZHRofSwgJHtoZWlnaHQgLyBjaGlsZEhlaWdodH0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lOb25lOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChzaXppbmdFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEZpdFN0cmF0ZWd5ID0ge1xyXG4gICAgQ09OVEFJTjogRml0U3RyYXRlZ3lDb250YWluLFxyXG4gICAgQ09WRVI6IEZpdFN0cmF0ZWd5Q292ZXIsXHJcbiAgICBTVFJFVENIOiBGaXRTdHJhdGVneVN0cmV0Y2gsXHJcbiAgICBOT05FOiBGaXRTdHJhdGVneU5vbmUsXHJcbn07XHJcbiIsImltcG9ydCB7IE1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvbWVzaFwiO1xyXG5pbXBvcnQgeyBDcmVhdGVQbGFuZVZlcnRleERhdGEgfSBmcm9tIFwiY29yZS9NZXNoZXMvQnVpbGRlcnMvcGxhbmVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFN0YW5kYXJkTWF0ZXJpYWwgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvc3RhbmRhcmRNYXRlcmlhbFwiO1xyXG5pbXBvcnQgeyBNYXRyaXggfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoXCI7XHJcbmltcG9ydCB7IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfSBmcm9tIFwiLi9wb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiY29yZS9NaXNjL2xvZ2dlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEZpdFN0cmF0ZWd5VHlwZSB9IGZyb20gXCIuL2ZpdFN0cmF0ZWd5XCI7XHJcbmltcG9ydCB7IEZpdFN0cmF0ZWd5IH0gZnJvbSBcIi4vZml0U3RyYXRlZ3lcIjtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgSFRNTCBjb250ZW50IHRoYXQgd2Ugd2FudCB0byByZW5kZXIgYXMgdGhvdWdoIGl0IGlzIHBhcnQgb2YgdGhlIHNjZW5lLiAgVGhlIEhUTUwgY29udGVudCBpcyBhY3R1YWxseVxyXG4gKiByZW5kZXJlZCBiZWxvdyB0aGUgY2FudmFzLCBidXQgYSBkZXB0aCBtYXNrIGlzIGNyZWF0ZWQgYnkgdGhpcyBjbGFzcyB0aGF0IHdyaXRlcyB0byB0aGUgZGVwdGggYnVmZmVyIGJ1dCBkb2VzIG5vdFxyXG4gKiB3cml0ZSB0byB0aGUgY29sb3IgYnVmZmVyLCBlZmZlY3RpdmVseSBwdW5jaGluZyBhIGhvbGUgaW4gdGhlIGNhbnZhcy4gIENTUyB0cmFuc2Zvcm1zIGFyZSB1c2VkIHRvIHNjYWxlLCB0cmFuc2xhdGUsIGFuZCByb3RhdGVcclxuICogdGhlIEhUTUwgY29udGVudCBzbyB0aGF0IGl0IG1hdGNoZXMgdGhlIGNhbWVyYSBhbmQgbWVzaCBvcmllbnRhdGlvbi4gIFRoZSBjbGFzcyBzdXBwb3J0cyBpbnRlcmFjdGlvbnMgaW4gZWRpdGFibGUgYW5kIG5vbi1lZGl0YWJsZSBtb2RlLlxyXG4gKiBJbiBub24tZWRpdGFibGUgbW9kZSAodGhlIGRlZmF1bHQpLCBldmVudHMgYXJlIHBhc3NlZCB0byB0aGUgSFRNTCBjb250ZW50IHdoZW4gdGhlIHBvaW50ZXIgaXMgb3ZlciB0aGUgbWFzayAoYW5kIG5vdCBvY2NsdWRlZCBieSBvdGhlciBtZXNoZXNcclxuICogaW4gdGhlIHNjZW5lKS5cclxuICogQHNlZSBodHRwczovL3BsYXlncm91bmQuYmFieWxvbmpzLmNvbS8jSFZIWUpDIzVcclxuICogQHNlZSBodHRwczovL3BsYXlncm91bmQuYmFieWxvbmpzLmNvbS8jQjE3VEM3IzExMlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEh0bWxNZXNoIGV4dGVuZHMgTWVzaCB7XHJcbiAgICAvKipcclxuICAgICAqIEhlbHBzIGlkZW50aWZ5aW5nIGEgaHRtbCBtZXNoIGZyb20gYSByZWd1bGFyIG1lc2hcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc0h0bWxNZXNoKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE92ZXJyaWRlIHRoZSBzdXBlciBjbGFzcydzIF9pc0VuYWJsZWQgcHJvcGVydHkgc28gd2UgY2FuIGNvbnRyb2wgd2hlbiB0aGUgbWVzaFxyXG4gICAgLy8gaXMgZW5hYmxlZC4gIEkuZS4sIHdlIGRvbid0IHdhbnQgdG8gcmVuZGVyIHRoZSBtZXNoIHVudGlsIHRoZXJlIGlzIGNvbnRlbnQgdG8gc2hvdy5cclxuICAgIHByaXZhdGUgX2VuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBUaGUgbWVzaCBpcyByZWFkeSB3aGVuIGNvbnRlbnQgaGFzIGJlZW4gc2V0IGFuZCB0aGUgY29udGVudCBzaXplIGhhcyBiZWVuIHNldFxyXG4gICAgLy8gVGhlIGZvcm1lciBpcyBkb25lIGJ5IHRoZSB1c2VyLCB0aGUgbGF0dGVyIGlzIGRvbmUgYnkgdGhlIHJlbmRlcmVyLlxyXG4gICAgcHJpdmF0ZSBfcmVhZHkgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX2lzQ2FudmFzT3ZlcmxheSA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX3JlcXVpcmVzVXBkYXRlID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF9lbGVtZW50PzogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF93aWR0aD86IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2hlaWdodD86IG51bWJlcjtcclxuXHJcbiAgICBwcml2YXRlIF9pbnZlcnNlU2NhbGVNYXRyaXg6IE1hdHJpeCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgX2NhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3I6IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2VXaWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9zb3VyY2VIZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBzb3VyY2Ugd2lkdGggb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc291cmNlV2lkdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBzb3VyY2UgaGVpZ2h0IG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNvdXJjZUhlaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXI6IGFueTtcclxuXHJcbiAgICBwcml2YXRlIF9maXRTdHJhdGVneTogRml0U3RyYXRlZ3lUeXBlID0gRml0U3RyYXRlZ3kuTk9ORTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRydWN0IGFuIGluc3RhbmNlIG9mIEh0bWxNZXNoXHJcbiAgICAgKiBAcGFyYW0gc2NlbmVcclxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG1lc2guICBXaWxsIGJlIHVzZWQgYXMgdGhlIGlkIG9mIHRoZSBIVE1MIGVsZW1lbnQgYXMgd2VsbC5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Ioc2NlbmU6IFNjZW5lLCBpZDogc3RyaW5nLCB7IGNhcHR1cmVPblBvaW50ZXJFbnRlciA9IHRydWUsIGlzQ2FudmFzT3ZlcmxheSA9IGZhbHNlLCBmaXRTdHJhdGVneSA9IEZpdFN0cmF0ZWd5Lk5PTkUgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBCYWlsIGlmIHdlIGFyZW4ndCBydW5uaW5nIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgTG9nZ2VyLldhcm4oYENyZWF0aW5nIGFuIGluc3RhbmNlIG9mIGFuIEh0bWxNZXNoIHdpdGggaWQgJHtpZH0gb3V0c2lkZSBvZiBhIGJyb3dzZXIuICBUaGUgbWVzaCB3aWxsIG5vdCBiZSB2aXNpYmxlLmApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9maXRTdHJhdGVneSA9IGZpdFN0cmF0ZWd5O1xyXG4gICAgICAgIHRoaXMuX2lzQ2FudmFzT3ZlcmxheSA9IGlzQ2FudmFzT3ZlcmxheTtcclxuICAgICAgICB0aGlzLl9jcmVhdGVNYXNrKCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IHRoaXMuX2NyZWF0ZUVsZW1lbnQoKTtcclxuXHJcbiAgICAgICAgLy8gU2V0IGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhpcyB3aWxsIHNob3cgYXMgc29vbiBhcyBpdCdzIHJlYWR5XHJcbiAgICAgICAgdGhpcy5zZXRFbmFibGVkKHRydWUpO1xyXG5cclxuICAgICAgICB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIGJlaGF2aW9yIHRvIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IgPSBuZXcgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcih0aGlzLmNhcHR1cmVQb2ludGVyRXZlbnRzLmJpbmQodGhpcyksIHRoaXMucmVsZWFzZVBvaW50ZXJFdmVudHMuYmluZCh0aGlzKSwge1xyXG4gICAgICAgICAgICBjYXB0dXJlT25Qb2ludGVyRW50ZXI6IHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFkZEJlaGF2aW9yKHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBoZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBIVE1MIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZW5kZXJlZCBhcyBhIG1lc2hcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBlbGVtZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJ1ZSBpZiB0aGUgbWVzaCBoYXMgYmVlbiBtb3ZlZCwgcm90YXRlZCwgb3Igc2NhbGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpc1xyXG4gICAgICogcHJvcGVydHkgd2FzIHJlYWQuICBUaGlzIHByb3BlcnR5IGlzIHJlc2V0IHRvIGZhbHNlIGFmdGVyIHJlYWRpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZXNVcGRhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVzVXBkYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIGNhcHR1cmUgZm9yIHRoZSBwb2ludGVyIHdoZW4gZW50ZXJpbmcgdGhlIG1lc2ggYXJlYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IGNhcHR1cmVPblBvaW50ZXJFbnRlcihjYXB0dXJlT25Qb2ludGVyRW50ZXI6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IuY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3Bvc2VzIG9mIHRoZSBtZXNoIGFuZCB0aGUgSFRNTCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNwb3NlKCkge1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50Py5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIF9tYXJrQXNVcGRhdGVkKCkge1xyXG4gICAgICAgIHRoaXMuX3JlcXVpcmVzVXBkYXRlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgY29udGVudCBhZGp1c3RpbmcgdGhlIG1lc2ggc2NhbGUgdG8gbWF0Y2ggYW5kIG1ha2luZyBpdCB2aXNpYmxlLlxyXG4gICAgICogSWYgdGhlIHRoZSBzcGVjaWZpZWQgY29udGVudCBpcyB1bmRlZmluZWQsIHRoZW4gaXQgd2lsbCBtYWtlIHRoZSBtZXNoIGludmlzaWJsZS4gIEluIGVpdGhlciBjYXNlIGl0IHdpbGwgY2xlYXIgdGhlXHJcbiAgICAgKiBlbGVtZW50IGNvbnRlbnQgZmlyc3QuXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byByZW5kZXIgYXMgYSBtZXNoXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBtZXNoIGluIEJhYnlsb24gdW5pdHNcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbWVzaCBpbiBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgKi9cclxuICAgIHNldENvbnRlbnQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gSWYgY29udGVudCBpcyBjaGFuZ2VkLCB3ZSBhcmUgbm8gbG9uZ2VyIHJlYWR5XHJcbiAgICAgICAgdGhpcy5fc2V0QXNSZWFkeShmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIEFsc28gaW52YWxpZGF0ZSB0aGUgc291cmNlIHdpZHRoIGFuZCBoZWlnaHRcclxuICAgICAgICB0aGlzLl9zb3VyY2VXaWR0aCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc291cmNlSGVpZ2h0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuX3JlcXVpcmVzVXBkYXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2FsaW5nLnNldEFsbCgxKTtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9maXRTdHJhdGVneS53cmFwRWxlbWVudChlbGVtZW50KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTY2FsZUlmTmVjZXNzYXJ5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VXaWR0aCAmJiB0aGlzLnNvdXJjZUhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBPdmVyaWRlcyBCQUJZTE9OLk1lc2guc2V0RW5hYmxlZFxyXG4gICAgcHVibGljIG92ZXJyaWRlIHNldEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIENhcHR1cmUgcmVxdWVzdGVkIGVuYWJsZWQgc3RhdGVcclxuICAgICAgICB0aGlzLl9lbmFibGVkID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgLy8gSWYgZGlzYWJsaW5nIG9yIGVuYWJsaW5nIGFuZCB3ZSBhcmUgcmVhZHlcclxuICAgICAgICBpZiAoIWVuYWJsZWQgfHwgdGhpcy5fcmVhZHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKGVuYWJsZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRlbnQgc2l6ZSBpbiBwaXhlbHNcclxuICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgc291cmNlXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBvZiB0aGUgc291cmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDb250ZW50U2l6ZVB4KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlV2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9zb3VyY2VIZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCB8fCAhdGhpcy5fZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9maXRTdHJhdGVneS51cGRhdGVTaXplKHRoaXMuX2VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLl91cGRhdGVTY2FsZUlmTmVjZXNzYXJ5KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldEFzUmVhZHkodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0QXNSZWFkeShyZWFkeTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX3JlYWR5ID0gcmVhZHk7XHJcbiAgICAgICAgaWYgKHJlYWR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvU2V0RW5hYmxlZCh0aGlzLl9lbmFibGVkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9kb1NldEVuYWJsZWQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RvU2V0RW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaWYgZW5hYmxlZCwgdGhlbiBzdGFydCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgdG8gdGhlXHJcbiAgICAgICAgLy8gc2NhbGluZywgcm90YXRpb24sIGFuZCBwb3NpdGlvbi4gIG90aGVyd2lzZSBzdG9wIGxpc3RlbmluZ1xyXG4gICAgICAgIGlmIChlbmFibGVkICYmICF0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXIgPSB0aGlzLm9uQWZ0ZXJXb3JsZE1hdHJpeFVwZGF0ZU9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyPy5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBlbmFibGVkLCB0aGVuIHJldmVydCB0aGUgY29udGVudCBlbGVtZW50IGRpc3BsYXlcclxuICAgICAgICAvLyBvdGhlcndpc2UgaGlkZSBpdFxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGVuYWJsZWQgPyBcIlwiIDogXCJub25lXCI7XHJcbiAgICAgICAgLy8gQ2FwdHVyZSB0aGUgY29udGVudCB6IGluZGV4XHJcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudHpJbmRleCh0aGlzLnBvc2l0aW9uLnogKiAtMTAwMDApO1xyXG4gICAgICAgIHN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF91cGRhdGVTY2FsZUlmTmVjZXNzYXJ5KCkge1xyXG4gICAgICAgIC8vIElmIHdlIGhhdmUgc2V0Q29udGVudCBiZWZvcmUsIHRoZSBjb250ZW50IHNjYWxlIGlzIGJha2VkIGludG8gdGhlIG1lc2guICBJZiB3ZSBkb24ndCByZXNldCB0aGUgdmVydGljZXMgdG9cclxuICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc2l6ZSwgdGhlbiB3ZSB3aWxsIG11bHRpcGx5IHRoZSBzY2FsZSB3aGVuIHdlIGJha2UgdGhlIHNjYWxlIGJlbG93LiAgQnkgYXBwbHlpbmcgdGhlIGludmVyc2UsIHdlIGJhY2sgb3V0XHJcbiAgICAgICAgLy8gdGhlIHNjYWxpbmcgdGhhdCBoYXMgYmVlbiBkb25lIHNvIHdlIGFyZSBzdGFydGluZyBmcm9tIHRoZSBzYW1lIHBvaW50LlxyXG4gICAgICAgIC8vIEZpcnN0IHJlc2V0IHRoZSBzY2FsZSB0byAxXHJcbiAgICAgICAgdGhpcy5zY2FsaW5nLnNldEFsbCgxKTtcclxuICAgICAgICAvLyBUaGVuIGJhY2sgb3V0IHRoZSBvcmlnaW5hbCB2ZXJ0aWNlcyBjaGFuZ2VzIHRvIG1hdGNoIHRoZSBjb250ZW50IHNjYWxlXHJcbiAgICAgICAgaWYgKHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCkge1xyXG4gICAgICAgICAgICB0aGlzLmJha2VUcmFuc2Zvcm1JbnRvVmVydGljZXModGhpcy5faW52ZXJzZVNjYWxlTWF0cml4KTtcclxuICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBtYXRyaXggc28gaXQgZG9lc24ndCBnZXQgYXBwbGllZCBhZ2FpbiB1bmxlc3Mgd2Ugc2NhbGVcclxuICAgICAgICAgICAgdGhpcy5faW52ZXJzZVNjYWxlTWF0cml4ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCBzY2FsZSB0byBtYXRjaCBjb250ZW50LiAgTm90ZSB3ZSBjYW4ndCBqdXN0IHNjYWxlIHRoZSBtZXNoLCBiZWNhdXNlIHRoYXQgd2lsbCBzY2FsZSB0aGUgY29udGVudCBhcyB3ZWxsXHJcbiAgICAgICAgLy8gV2hhdCB3ZSBuZWVkIHRvIGRvIGlzIGNvbXB1dGUgYSBzY2FsZSBtYXRyaXggYW5kIHRoZW4gYmFrZSB0aGF0IGludG8gdGhlIG1lc2ggdmVydGljZXMuICBUaGlzIHdpbGwgbGVhdmUgdGhlXHJcbiAgICAgICAgLy8gbWVzaCBzY2FsZSBhdCAxLCBzbyBvdXIgY29udGVudCB3aWxsIHN0YXkgaXQncyBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IHVudGlsIHdlIHNjYWxlIHRoZSBtZXNoLlxyXG4gICAgICAgIGNvbnN0IHNjYWxlWCA9IHRoaXMuX3dpZHRoIHx8IDE7XHJcbiAgICAgICAgY29uc3Qgc2NhbGVZID0gdGhpcy5faGVpZ2h0IHx8IDE7XHJcbiAgICAgICAgY29uc3Qgc2NhbGVNYXRyaXggPSBNYXRyaXguU2NhbGluZyhzY2FsZVgsIHNjYWxlWSwgMSk7XHJcbiAgICAgICAgdGhpcy5iYWtlVHJhbnNmb3JtSW50b1ZlcnRpY2VzKHNjYWxlTWF0cml4KTtcclxuXHJcbiAgICAgICAgLy8gR2V0IGFuIGludmVyc2Ugb2YgdGhlIHNjYWxlIG1hdHJpeCB0aGF0IHdlIGNhbiB1c2UgdG8gYmFjayBvdXQgdGhlIHNjYWxlIGNoYW5nZXMgd2UgaGF2ZSBtYWRlIHNvXHJcbiAgICAgICAgLy8gd2UgZG9uJ3QgbXVsdGlwbHkgdGhlIHNjYWxlLlxyXG4gICAgICAgIHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCA9IG5ldyBNYXRyaXgoKTtcclxuICAgICAgICBzY2FsZU1hdHJpeC5pbnZlcnRUb1JlZih0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfY3JlYXRlTWFzaygpIHtcclxuICAgICAgICBjb25zdCB2ZXJ0ZXhEYXRhID0gQ3JlYXRlUGxhbmVWZXJ0ZXhEYXRhKHsgd2lkdGg6IDEsIGhlaWdodDogMSB9KTtcclxuICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGx5VG9NZXNoKHRoaXMpO1xyXG5cclxuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ29sbGlzaW9ucyA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlcHRoTWFzayA9IG5ldyBTdGFuZGFyZE1hdGVyaWFsKGAke3RoaXMuaWR9LW1hdGAsIHNjZW5lKTtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzQ2FudmFzT3ZlcmxheSkge1xyXG4gICAgICAgICAgICBkZXB0aE1hc2suYmFja0ZhY2VDdWxsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlcHRoTWFzay5kaXNhYmxlQ29sb3JXcml0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGRlcHRoTWFzay5kaXNhYmxlTGlnaHRpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IGRlcHRoTWFzaztcclxuXHJcbiAgICAgICAgLy8gT3B0aW1pemF0aW9uIC0gRnJlZXplIG1hdGVyaWFsIHNpbmNlIGl0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZVxyXG4gICAgICAgIHRoaXMubWF0ZXJpYWwuZnJlZXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZXRFbGVtZW50ekluZGV4KHpJbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS56SW5kZXggPSBgJHt6SW5kZXh9YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB1c2VkIGJ5IHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHRvIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuICAgICAqL1xyXG4gICAgY2FwdHVyZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSBkb20gY29udGVudCB0byBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIC8vIFN1cHJlc3MgZXZlbnRzIG91dHNpZGUgb2YgdGhlIGRvbSBjb250ZW50XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHVzZWQgYnkgdGhlIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgdG8gcmVsZWFzZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICovXHJcbiAgICByZWxlYXNlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHBvaW50ZXIgZXZlbnRzIG9uIGNhbnZhc1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIC8vIERpc2FibGUgcG9pbnRlciBldmVudHMgb24gZG9tIGNvbnRlbnRcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZUVsZW1lbnQoKSB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBCYWlsIGlmIHdlIGFyZW4ndCBydW5uaW5nIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRpdi5pZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgZGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuX2lzQ2FudmFzT3ZlcmxheSA/IFwidHJhbnNwYXJlbnRcIiA6IFwiIzAwMFwiO1xyXG4gICAgICAgIGRpdi5zdHlsZS56SW5kZXggPSBcIjFcIjtcclxuICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICBkaXYuc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRpdjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgTWF0cml4LCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aFwiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBIdG1sTWVzaCB9IGZyb20gXCIuL2h0bWxNZXNoXCI7XHJcbmltcG9ydCB7IENhbWVyYSB9IGZyb20gXCJjb3JlL0NhbWVyYXMvY2FtZXJhXCI7XHJcbmltcG9ydCB0eXBlIHsgU3ViTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9zdWJNZXNoXCI7XHJcbmltcG9ydCB7IFJlbmRlcmluZ0dyb3VwIH0gZnJvbSBcImNvcmUvUmVuZGVyaW5nL3JlbmRlcmluZ0dyb3VwXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyIH0gZnJvbSBcImNvcmUvTWlzYy9vYnNlcnZhYmxlXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RFbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzXCI7XHJcblxyXG5jb25zdCBQb3NpdGlvblVwZGF0ZUZhaWxNZXNzYWdlID0gXCJGYWlsZWQgdG8gdXBkYXRlIGh0bWwgbWVzaCByZW5kZXJlciBwb3NpdGlvbiBkdWUgdG8gZmFpbHVyZSB0byBnZXQgY2FudmFzIHJlY3QuICBIdG1sTWVzaCBpbnN0YW5jZXMgbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5XCI7XHJcbmNvbnN0IEJhYnlsb25Vbml0c1RvUGl4ZWxzID0gMTAwO1xyXG5cclxuLyoqXHJcbiAqIEEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0d28gc3VibWVzaGVzIGFuZCByZXR1cm5zIGEgbnVtYmVyIGluZGljYXRpbmcgd2hpY2hcclxuICogc2hvdWxkIGJlIHJlbmRlcmVkIGZpcnN0LlxyXG4gKi9cclxudHlwZSBSZW5kZXJPcmRlckZ1bmN0aW9uID0gKHN1Yk1lc2hBOiBTdWJNZXNoLCBzdWJNZXNoQjogU3ViTWVzaCkgPT4gbnVtYmVyO1xyXG5cclxudHlwZSBSZW5kZXJMYXllckVsZW1lbnRzID0ge1xyXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIGRvbUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgY2FtZXJhRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbn07XHJcblxyXG4vLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBlbnN1cmVzIHRoYXQgSHRtbE1lc2hlcyBhcmUgcmVuZGVyZWQgYmVmb3JlIGFsbCBvdGhlciBtZXNoZXMuXHJcbi8vIE5vdGUgdGhpcyB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBncm91cCAwLlxyXG4vLyBJZiBuZWl0aGVyIG1lc2ggaXMgYW4gSHRtbE1lc2gsIHRoZW4gdGhlIGRlZmF1bHQgcmVuZGVyIG9yZGVyIGlzIHVzZWRcclxuLy8gVGhpcyBwcmV2ZW50cyBIdG1sTWVzaGVzIGZyb20gYXBwZWFyaW5nIGluIGZyb250IG9mIG90aGVyIG1lc2hlcyB3aGVuIHRoZXkgYXJlIGJlaGluZCB0aGVtXHJcbmNvbnN0IFJlbmRlck9yZGVyRnVuYyA9IChkZWZhdWx0UmVuZGVyT3JkZXI6IFJlbmRlck9yZGVyRnVuY3Rpb24pOiBSZW5kZXJPcmRlckZ1bmN0aW9uID0+IHtcclxuICAgIHJldHVybiAoc3ViTWVzaEE6IFN1Yk1lc2gsIHN1Yk1lc2hCOiBTdWJNZXNoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWVzaEEgPSBzdWJNZXNoQS5nZXRNZXNoKCk7XHJcbiAgICAgICAgY29uc3QgbWVzaEIgPSBzdWJNZXNoQi5nZXRNZXNoKCk7XHJcblxyXG4gICAgICAgIC8vIFVzZSBwcm9wZXJ0eSBjaGVjayBpbnN0ZWFkIG9mIGluc3RhbmNlb2Ygc2luY2UgaXQgaXMgbGVzcyBleHBlbnNpdmUgYW5kXHJcbiAgICAgICAgLy8gdGhpcyB3aWxsIGJlIGNhbGxlZCBtYW55IHRpbWVzIHBlciBmcmFtZVxyXG4gICAgICAgIGNvbnN0IG1lc2hJc0h0bWxNZXNoQSA9IChtZXNoQSBhcyBhbnkpW1wiaXNIdG1sTWVzaFwiXTtcclxuICAgICAgICBjb25zdCBtZXNoSXNIdG1sTWVzaEIgPSAobWVzaEIgYXMgYW55KVtcImlzSHRtbE1lc2hcIl07XHJcbiAgICAgICAgaWYgKG1lc2hJc0h0bWxNZXNoQSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWVzaElzSHRtbE1lc2hCID8gKG1lc2hBLmFic29sdXRlUG9zaXRpb24ueiA8PSBtZXNoQi5hYnNvbHV0ZVBvc2l0aW9uLnogPyAxIDogLTEpIDogLTE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lc2hJc0h0bWxNZXNoQiA/IDEgOiBkZWZhdWx0UmVuZGVyT3JkZXIoc3ViTWVzaEEsIHN1Yk1lc2hCKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgaXMgcmVxdWlyZWQgdG8gcmVuZGVyIEh0bWxNZXNoZXMgaW4gdGhlIHNjZW5lLlxyXG4gKiBpZiB1c2luZyBIdG1sTWVzaGVzLCB5b3UgbXVzdCBub3Qgc2V0IHJlbmRlciBvcmRlciBmb3IgZ3JvdXAgMCB1c2luZ1xyXG4gKiBzY2VuZS5zZXRSZW5kZXJpbmdPcmRlci4gIFlvdSBtdXN0IGluc3RlYWQgcGFzcyB0aGUgY29tcGFyZSBmdW5jdGlvbnNcclxuICogdG8gdGhlIEh0bWxNZXNoUmVuZGVyZXIgY29uc3RydWN0b3IuICBJZiB5b3UgZG8gbm90LCB0aGVuIHlvdXIgcmVuZGVyXHJcbiAqIG9yZGVyIHdpbGwgYmUgb3ZlcndyaXR0ZW4gaWYgdGhlIEh0bWxNZXNoUmVuZGVyZXIgaXMgY3JlYXRlZCBhZnRlciBhbmRcclxuICogdGhlIEh0bWxNZXNoZXMgd2lsbCBub3QgcmVuZGVyIGNvcnJlY3RseSAodGhleSB3aWxsIGFwcGVhciBpbiBmcm9udCBvZlxyXG4gKiBtZXNoZXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gZnJvbnQgb2YgdGhlbSkgaWYgdGhlIEh0bWxNZXNoUmVuZGVyZXIgaXNcclxuICogY3JlYXRlZCBiZWZvcmUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSHRtbE1lc2hSZW5kZXJlciB7XHJcbiAgICBwcml2YXRlIF9jb250YWluZXJJZD86IHN0cmluZztcclxuICAgIHByaXZhdGUgX2luU2NlbmVFbGVtZW50cz86IFJlbmRlckxheWVyRWxlbWVudHMgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfb3ZlcmxheUVsZW1lbnRzPzogUmVuZGVyTGF5ZXJFbGVtZW50cyB8IG51bGw7XHJcbiAgICBwcml2YXRlIF9lbmdpbmU6IEFic3RyYWN0RW5naW5lO1xyXG5cclxuICAgIHByaXZhdGUgX2NhY2hlID0ge1xyXG4gICAgICAgIGNhbWVyYURhdGE6IHsgZm92OiAwLCBwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSwgc3R5bGU6IFwiXCIgfSxcclxuICAgICAgICBodG1sTWVzaERhdGE6IG5ldyBXZWFrTWFwPG9iamVjdCwgeyBzdHlsZTogc3RyaW5nIH0+KCksXHJcbiAgICB9O1xyXG4gICAgcHJpdmF0ZSBfd2lkdGggPSAwO1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0ID0gMDtcclxuICAgIHByaXZhdGUgX2hlaWdodEhhbGYgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX2NhbWVyYVdvcmxkTWF0cml4PzogTWF0cml4O1xyXG5cclxuICAgIC8vIENyZWF0ZSBzb21lIHJlZnMgdG8gYXZvaWQgY3JlYXRpbmcgbmV3IG9iamVjdHMgZXZlcnkgZnJhbWVcclxuICAgIHByaXZhdGUgX3RlbXAgPSB7XHJcbiAgICAgICAgc2NhbGVUcmFuc2Zvcm06IG5ldyBWZWN0b3IzKCksXHJcbiAgICAgICAgcm90YXRpb25UcmFuc2Zvcm06IG5ldyBRdWF0ZXJuaW9uKCksXHJcbiAgICAgICAgcG9zaXRpb25UcmFuc2Zvcm06IG5ldyBWZWN0b3IzKCksXHJcbiAgICAgICAgb2JqZWN0TWF0cml4OiBNYXRyaXguSWRlbnRpdHkoKSxcclxuICAgICAgICBjYW1lcmFXb3JsZE1hdHJpeDogTWF0cml4LklkZW50aXR5KCksXHJcbiAgICAgICAgY2FtZXJhUm90YXRpb25NYXRyaXg6IE1hdHJpeC5JZGVudGl0eSgpLFxyXG4gICAgICAgIGNhbWVyYVdvcmxkTWF0cml4QXNBcnJheTogbmV3IEFycmF5KDE2KSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gS2VlcCB0cmFjayBvZiBEUFIgc28gd2UgY2FuIHJlc2l6ZSBpZiBEUFIgY2hhbmdlc1xyXG4gICAgLy8gT3RoZXJ3aXNlIHRoZSBET00gY29udGVudCB3aWxsIHNjYWxlLCBidXQgdGhlIG1lc2ggd29uJ3RcclxuICAgIHByaXZhdGUgX2xhc3REZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XHJcblxyXG4gICAgLy8gS2VlcCB0cmFjayBvZiBjYW1lcmEgbWF0cml4IGNoYW5nZXMgc28gd2Ugb25seSB1cGRhdGUgdGhlXHJcbiAgICAvLyBET00gZWxlbWVudCBzdHlsZXMgd2hlbiBuZWNlc3NhcnlcclxuICAgIHByaXZhdGUgX2NhbWVyYU1hdHJpeFVwZGF0ZWQgPSB0cnVlO1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgcG9zaXRpb24gY2hhbmdlcyBzbyB3ZSBvbmx5IHVwZGF0ZSB0aGUgRE9NIGVsZW1lbnRcclxuICAgIC8vIHN0eWxlcyB3aGVuIG5lY2Vzc2FyeVxyXG4gICAgcHJpdmF0ZSBfcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uID0ge1xyXG4gICAgICAgIHRvcDogMCxcclxuICAgICAgICBsZWZ0OiAwLFxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIF9yZW5kZXJPYnNlcnZlcjogT2JzZXJ2ZXI8U2NlbmU+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cnVjdCBhbiBpbnN0YW5jZSBvZiBIdG1sTWVzaFJlbmRlcmVyXHJcbiAgICAgKiBAcGFyYW0gc2NlbmVcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgcHJvcGVydGllczpcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHNjZW5lOiBTY2VuZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lcklkID0gbnVsbCxcclxuICAgICAgICAgICAgX2NvbnRhaW5lcklkID0gXCJjc3MtY29udGFpbmVyXCIsXHJcbiAgICAgICAgICAgIGVuYWJsZU92ZXJsYXlSZW5kZXIgPSB0cnVlLFxyXG4gICAgICAgICAgICBkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXIgPSBSZW5kZXJpbmdHcm91cC5QYWludGVyU29ydENvbXBhcmUsXHJcbiAgICAgICAgICAgIGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlciA9IFJlbmRlcmluZ0dyb3VwLlBhaW50ZXJTb3J0Q29tcGFyZSxcclxuICAgICAgICAgICAgZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXIgPSBSZW5kZXJpbmdHcm91cC5kZWZhdWx0VHJhbnNwYXJlbnRTb3J0Q29tcGFyZSxcclxuICAgICAgICB9OiB7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lcklkPzogc3RyaW5nIHwgbnVsbDtcclxuICAgICAgICAgICAgX2NvbnRhaW5lcklkPzogc3RyaW5nO1xyXG4gICAgICAgICAgICBkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXI/OiBSZW5kZXJPcmRlckZ1bmN0aW9uO1xyXG4gICAgICAgICAgICBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXI/OiBSZW5kZXJPcmRlckZ1bmN0aW9uO1xyXG4gICAgICAgICAgICBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcj86IFJlbmRlck9yZGVyRnVuY3Rpb247XHJcbiAgICAgICAgICAgIGVuYWJsZU92ZXJsYXlSZW5kZXI/OiBib29sZWFuO1xyXG4gICAgICAgIH0gPSB7fVxyXG4gICAgKSB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBPbmx5IGluaXQgaWYgd2UgYXJlIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb250YWluZXJJZCA9IF9jb250YWluZXJJZDtcclxuICAgICAgICB0aGlzLl9pbml0KHNjZW5lLCBwYXJlbnRDb250YWluZXJJZCwgZW5hYmxlT3ZlcmxheVJlbmRlciwgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyLCBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXIsIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3Bvc2Ugb2YgdGhlIEh0bWxNZXNoUmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlck9ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlck9ic2VydmVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJPYnNlcnZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLl9pblNjZW5lRWxlbWVudHM/LmNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLl9pblNjZW5lRWxlbWVudHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5pdChcclxuICAgICAgICBzY2VuZTogU2NlbmUsXHJcbiAgICAgICAgcGFyZW50Q29udGFpbmVySWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgZW5hYmxlT3ZlcmxheVJlbmRlcjogYm9vbGVhbixcclxuICAgICAgICBkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXI6IFJlbmRlck9yZGVyRnVuY3Rpb24sXHJcbiAgICAgICAgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uLFxyXG4gICAgICAgIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICAvLyBSZXF1aXJlcyBhIGJyb3dzZXIgdG8gd29yay4gIE9ubHkgaW5pdCBpZiB3ZSBhcmUgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlIERPTSBjb250YWluZXJzXHJcbiAgICAgICAgbGV0IHBhcmVudENvbnRhaW5lciA9IHBhcmVudENvbnRhaW5lcklkID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyZW50Q29udGFpbmVySWQpIDogZG9jdW1lbnQuYm9keTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyID0gZG9jdW1lbnQuYm9keTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIHRoZSBjb250YWluZXIgYWxyZWFkeSBleGlzdHMsIHRoZW4gcmVtb3ZlIGl0XHJcbiAgICAgICAgY29uc3QgaW5TY2VuZUNvbnRhaW5lcklkID0gYCR7dGhpcy5fY29udGFpbmVySWR9X2luX3NjZW5lYDtcclxuICAgICAgICB0aGlzLl9pblNjZW5lRWxlbWVudHMgPSB0aGlzLl9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKGluU2NlbmVDb250YWluZXJJZCk7XHJcblxyXG4gICAgICAgIHBhcmVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5faW5TY2VuZUVsZW1lbnRzLmNvbnRhaW5lciwgcGFyZW50Q29udGFpbmVyLmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgICAgICBpZiAoZW5hYmxlT3ZlcmxheVJlbmRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBvdmVybGF5Q29udGFpbmVySWQgPSBgJHt0aGlzLl9jb250YWluZXJJZH1fb3ZlcmxheWA7XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50cyA9IHRoaXMuX2NyZWF0ZVJlbmRlckxheWVyRWxlbWVudHMob3ZlcmxheUNvbnRhaW5lcklkKTtcclxuICAgICAgICAgICAgY29uc3QgekluZGV4ID0gKyhzY2VuZS5nZXRFbmdpbmUoKS5nZXRSZW5kZXJpbmdDYW52YXMoKSEuc3R5bGUuekluZGV4ID8/IFwiMFwiKSArIDE7XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50cy5jb250YWluZXIuc3R5bGUuekluZGV4ID0gYCR7ekluZGV4fWA7XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50cy5jb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuX292ZXJsYXlFbGVtZW50cy5jb250YWluZXIsIHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZW5naW5lID0gc2NlbmUuZ2V0RW5naW5lKCk7XHJcbiAgICAgICAgY29uc3QgY2xpZW50UmVjdCA9IHRoaXMuX2VuZ2luZS5nZXRSZW5kZXJpbmdDYW52YXNDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgaWYgKCFjbGllbnRSZWN0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBnZXQgY2xpZW50IHJlY3QgZm9yIHJlbmRlcmluZyBjYW52YXNcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIHNpemUgYW5kIHJlc2l6ZSBiZWhhdmlvclxyXG4gICAgICAgIHRoaXMuX3NldFNpemUoY2xpZW50UmVjdC53aWR0aCwgY2xpZW50UmVjdC5oZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLl9lbmdpbmUub25SZXNpemVPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLl9lbmdpbmUuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBpZiAoY2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0U2l6ZShjbGllbnRSZWN0LndpZHRoLCBjbGllbnRSZWN0LmhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IHByb2plY3Rpb25PYnM6IE9ic2VydmVyPENhbWVyYT47XHJcbiAgICAgICAgbGV0IG1hdHJpeE9iczogT2JzZXJ2ZXI8Q2FtZXJhPjtcclxuXHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZUNhbWVyYSA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FtZXJhID0gc2NlbmUuYWN0aXZlQ2FtZXJhO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT2JzID0gY2FtZXJhLm9uUHJvamVjdGlvbk1hdHJpeENoYW5nZWRPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DYW1lcmFNYXRyaXhDaGFuZ2VkKGNhbWVyYSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG1hdHJpeE9icyA9IGNhbWVyYS5vblZpZXdNYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2FtZXJhTWF0cml4Q2hhbmdlZChjYW1lcmEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBvYnNlcnZlQ2FtZXJhKCk7XHJcblxyXG4gICAgICAgIHNjZW5lLm9uQWN0aXZlQ2FtZXJhQ2hhbmdlZC5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocHJvamVjdGlvbk9icykge1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuYWN0aXZlQ2FtZXJhPy5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5yZW1vdmUocHJvamVjdGlvbk9icyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1hdHJpeE9icykge1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuYWN0aXZlQ2FtZXJhPy5vblZpZXdNYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5yZW1vdmUobWF0cml4T2JzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvYnNlcnZlQ2FtZXJhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgSHRtbE1lc2hlcyBhcmUgcmVuZGVyZWQgYmVmb3JlIGFsbCBvdGhlciBtZXNoZXNcclxuICAgICAgICAvLyBzbyB0aGF0IHRoZXkgZG9uJ3QgYXBwZWFyIGluIGZyb250IG9mIG1lc2hlcyB0aGF0IGFyZSBhY3R1YWxseSBpbiBmcm9udCBvZiB0aGVtXHJcbiAgICAgICAgLy8gVXBkYXRpbmcgdGhlIHJlbmRlciBvcmRlciBpc24ndCBpZGVhbCwgYnV0IGl0IGlzIHRoZSBvbmx5IHdheSB0byBhY2hlaXZlIHRoaXNcclxuICAgICAgICAvLyBUaGUgaW1wbGljYXRpb24gaXMgdGhhdCBhbiBhcHAgdXNpbmcgdGhlIEh0bWxNZXNoUmVuZGVyZWQgbXVzdCBzZXQgdGhlIHNjZW5lIHJlbmRlciBvcmRlclxyXG4gICAgICAgIC8vIHZpYSB0aGUgSHRtbE1lc2hSZW5kZXJlZCBjb25zdHJ1Y3RvclxyXG4gICAgICAgIGNvbnN0IG9wYXF1ZVJlbmRlck9yZGVyID0gUmVuZGVyT3JkZXJGdW5jKGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgY29uc3QgYWxwaGFUZXN0UmVuZGVyT3JkZXIgPSBSZW5kZXJPcmRlckZ1bmMoZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyKTtcclxuICAgICAgICBjb25zdCB0cmFuc3BhcmVudFJlbmRlck9yZGVyID0gUmVuZGVyT3JkZXJGdW5jKGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyKTtcclxuICAgICAgICBzY2VuZS5zZXRSZW5kZXJpbmdPcmRlcigwLCBvcGFxdWVSZW5kZXJPcmRlciwgYWxwaGFUZXN0UmVuZGVyT3JkZXIsIHRyYW5zcGFyZW50UmVuZGVyT3JkZXIpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJPYnNlcnZlciA9IHNjZW5lLm9uQmVmb3JlUmVuZGVyT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIoc2NlbmUsIHNjZW5lLmFjdGl2ZUNhbWVyYSBhcyBDYW1lcmEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZVJlbmRlckxheWVyRWxlbWVudHMoY29udGFpbmVySWQ6IHN0cmluZyk6IFJlbmRlckxheWVyRWxlbWVudHMge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBleGlzdGluZ0NvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBjb250YWluZXIuaWQgPSBjb250YWluZXJJZDtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBcIi0xXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRvbUVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS53ZWJraXRUcmFuc2Zvcm1TdHlsZSA9IFwicHJlc2VydmUtM2RcIjtcclxuICAgICAgICBjYW1lcmFFbGVtZW50LnN0eWxlLnRyYW5zZm9ybVN0eWxlID0gXCJwcmVzZXJ2ZS0zZFwiO1xyXG5cclxuICAgICAgICBjYW1lcmFFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuXHJcbiAgICAgICAgZG9tRWxlbWVudC5hcHBlbmRDaGlsZChjYW1lcmFFbGVtZW50KTtcclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZG9tRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY29udGFpbmVyLFxyXG4gICAgICAgICAgICBkb21FbGVtZW50LFxyXG4gICAgICAgICAgICBjYW1lcmFFbGVtZW50LFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuX3dpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX2hlaWdodCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuX2hlaWdodEhhbGYgPSB0aGlzLl9oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2luU2NlbmVFbGVtZW50cyB8fCAhdGhpcy5fb3ZlcmxheUVsZW1lbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnRzID0gW3RoaXMuX2luU2NlbmVFbGVtZW50cy5kb21FbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHMuZG9tRWxlbWVudCwgdGhpcy5faW5TY2VuZUVsZW1lbnRzLmNhbWVyYUVsZW1lbnQsIHRoaXMuX292ZXJsYXlFbGVtZW50cy5jYW1lcmFFbGVtZW50XTtcclxuICAgICAgICBmb3IgKGNvbnN0IGRvbSBvZiBkb21FbGVtZW50cykge1xyXG4gICAgICAgICAgICBpZiAoZG9tKSB7XHJcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcclxuICAgIHByb3RlY3RlZCBfZ2V0Q2FtZXJhQ3NzTWF0cml4KG1hdHJpeDogTWF0cml4KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IG1hdHJpeC5tO1xyXG4gICAgICAgIHJldHVybiBgbWF0cml4M2QoJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1sxXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1syXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1szXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s0XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzVdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzZdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzddIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzhdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbOV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTBdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzExXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMl0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1sxM10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTRdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzE1XSApXHJcbiAgICAgICAgfSlgO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnZlcnQgYSBCYWJ5bG9uIHdvcmxkIG1hdHJpeCB0byBhIENTUyBtYXRyaXhcclxuICAgIC8vIFRoaXMgYWxzbyBoYW5kbGVzIGNvbnZlcnNpb24gZnJvbSBCSlMgbGVmdCBoYW5kZWQgY29vcmRzXHJcbiAgICAvLyB0byBDU1MgcmlnaHQgaGFuZGVkIGNvb3Jkc1xyXG4gICAgLy8gcHJldHRpZXItaWdub3JlXHJcbiAgICBwcm90ZWN0ZWQgX2dldEh0bWxDb250ZW50Q3NzTWF0cml4KG1hdHJpeDogTWF0cml4LCB1c2VSaWdodEhhbmRlZFN5c3RlbTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBtYXRyaXgubTtcclxuICAgICAgICAvLyBJbiBhIHJpZ2h0IGhhbmRlZCBjb29yZGluYXRlIHN5c3RlbSwgdGhlIGVsZW1lbnRzIDExIHRvIDE0IGhhdmUgdG8gY2hhbmdlIHRoZWlyIGRpcmVjdGlvblxyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHVzZVJpZ2h0SGFuZGVkU3lzdGVtID8gLTEgOiAxO1xyXG4gICAgICAgIGNvbnN0IG1hdHJpeDNkID0gYG1hdHJpeDNkKCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzBdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzFdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzJdICogLWRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1szXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzRdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbNV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbNl0gICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbN10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbOF0gKiAtZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzldICogLWRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTFdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEyXSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxM10gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTRdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzE1XSApXHJcbiAgICAgICAgfSlgO1xyXG4gICAgICAgIHJldHVybiBtYXRyaXgzZDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2dldFRyYW5zZm9ybWF0aW9uTWF0cml4KGh0bWxNZXNoOiBIdG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW06IGJvb2xlYW4pOiBNYXRyaXgge1xyXG4gICAgICAgIC8vIEdldCB0aGUgY2FtZXJhIHdvcmxkIG1hdHJpeFxyXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FtZXJhIHdvcmxkIG1hdHJpeCBpcyB1cCB0byBkYXRlXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCA9IGh0bWxNZXNoLmdldFNjZW5lKCkuYWN0aXZlQ2FtZXJhPy5nZXRXb3JsZE1hdHJpeCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRyaXguSWRlbnRpdHkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9iamVjdFdvcmxkTWF0cml4ID0gaHRtbE1lc2guZ2V0V29ybGRNYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLy8gU2NhbGUgdGhlIG9iamVjdCBtYXRyaXggYnkgdGhlIGJhc2Ugc2NhbGUgZmFjdG9yIGZvciB0aGUgbWVzaFxyXG4gICAgICAgIC8vIHdoaWNoIGlzIHRoZSByYXRpbyBvZiB0aGUgbWVzaCB3aWR0aC9oZWlnaHQgdG8gdGhlIHJlbmRlcmVyXHJcbiAgICAgICAgLy8gd2lkdGgvaGVpZ2h0IGRpdmlkZWQgYnkgdGhlIGJhYnlsb24gdW5pdHMgdG8gcGl4ZWxzIHJhdGlvXHJcbiAgICAgICAgbGV0IHdpZHRoU2NhbGVGYWN0b3IgPSAxO1xyXG4gICAgICAgIGxldCBoZWlnaHRTY2FsZUZhY3RvciA9IDE7XHJcbiAgICAgICAgaWYgKGh0bWxNZXNoLnNvdXJjZVdpZHRoICYmIGh0bWxNZXNoLnNvdXJjZUhlaWdodCkge1xyXG4gICAgICAgICAgICB3aWR0aFNjYWxlRmFjdG9yID0gaHRtbE1lc2gud2lkdGghIC8gKGh0bWxNZXNoLnNvdXJjZVdpZHRoIC8gQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG4gICAgICAgICAgICBoZWlnaHRTY2FsZUZhY3RvciA9IGh0bWxNZXNoLmhlaWdodCEgLyAoaHRtbE1lc2guc291cmNlSGVpZ2h0IC8gQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQXBwbHkgdGhlIHNjYWxlIHRvIHRoZSBvYmplY3QncyB3b3JsZCBtYXRyaXguICBOb3RlIHdlIGFyZW4ndCBzY2FsaW5nXHJcbiAgICAgICAgLy8gdGhlIG9iamVjdCwganVzdCBnZXR0aW5nIGEgbWF0cml4IGFzIHRob3VnaCBpdCB3ZXJlIHNjYWxlZCwgc28gd2UgY2FuXHJcbiAgICAgICAgLy8gc2NhbGUgdGhlIGNvbnRlbnRcclxuICAgICAgICBjb25zdCBzY2FsZVRyYW5zZm9ybSA9IHRoaXMuX3RlbXAuc2NhbGVUcmFuc2Zvcm07XHJcbiAgICAgICAgY29uc3Qgcm90YXRpb25UcmFuc2Zvcm0gPSB0aGlzLl90ZW1wLnJvdGF0aW9uVHJhbnNmb3JtO1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uVHJhbnNmb3JtID0gdGhpcy5fdGVtcC5wb3NpdGlvblRyYW5zZm9ybTtcclxuICAgICAgICBjb25zdCBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4ID0gdGhpcy5fdGVtcC5vYmplY3RNYXRyaXg7XHJcblxyXG4gICAgICAgIG9iamVjdFdvcmxkTWF0cml4LmRlY29tcG9zZShzY2FsZVRyYW5zZm9ybSwgcm90YXRpb25UcmFuc2Zvcm0sIHBvc2l0aW9uVHJhbnNmb3JtKTtcclxuICAgICAgICBzY2FsZVRyYW5zZm9ybS54ICo9IHdpZHRoU2NhbGVGYWN0b3I7XHJcbiAgICAgICAgc2NhbGVUcmFuc2Zvcm0ueSAqPSBoZWlnaHRTY2FsZUZhY3RvcjtcclxuXHJcbiAgICAgICAgTWF0cml4LkNvbXBvc2VUb1JlZihzY2FsZVRyYW5zZm9ybSwgcm90YXRpb25UcmFuc2Zvcm0sIHBvc2l0aW9uVHJhbnNmb3JtLCBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4KTtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IGRpcmVjdGlvbiBvZiAxMiBhbmQgMTMgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBiYXNlZCBvbiB0aGUgaGFuZGVkbmVzcyBvZiB0aGUgc3lzdGVtXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyAtMSA6IDE7XHJcbiAgICAgICAgLy8gQWRqdXN0IHRyYW5zbGF0aW9uIHZhbHVlcyB0byBiZSBmcm9tIGNhbWVyYSB2cyB3b3JsZCBvcmlnaW5cclxuICAgICAgICAvLyBOb3RlIHRoYXQgd2UgYXJlIGFsc28gYWRqdXN0aW5nIHRoZXNlIHZhbHVlcyB0byBiZSBwaXhlbHMgdnMgQmFieWxvbiB1bml0c1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gaHRtbE1lc2guZ2V0QWJzb2x1dGVQb3NpdGlvbigpO1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXguc2V0Um93RnJvbUZsb2F0cyhcclxuICAgICAgICAgICAgMyxcclxuICAgICAgICAgICAgKC10aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzEyXSArIHBvc2l0aW9uLngpICogQmFieWxvblVuaXRzVG9QaXhlbHMgKiBkaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICgtdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgubVsxM10gKyBwb3NpdGlvbi55KSAqIEJhYnlsb25Vbml0c1RvUGl4ZWxzICogZGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAodGhpcy5fY2FtZXJhV29ybGRNYXRyaXgubVsxNF0gLSBwb3NpdGlvbi56KSAqIEJhYnlsb25Vbml0c1RvUGl4ZWxzLFxyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzE1XSAqIDAuMDAwMDEgKiBCYWJ5bG9uVW5pdHNUb1BpeGVsc1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIEFkanVzdCBvdGhlciB2YWx1ZXMgdG8gYmUgcGl4ZWxzIHZzIEJhYnlsb24gdW5pdHNcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4Lm11bHRpcGx5QXRJbmRleCgzLCBCYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5tdWx0aXBseUF0SW5kZXgoNywgQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgubXVsdGlwbHlBdEluZGV4KDExLCBCYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcblxyXG4gICAgICAgIHJldHVybiBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcmVuZGVySHRtbE1lc2goaHRtbE1lc2g6IEh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghaHRtbE1lc2guZWxlbWVudCB8fCAhaHRtbE1lc2guZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkge1xyXG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIHJlbmRlciwgc28gYmFpbFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSBodG1sIG1lc2ggZGF0YSBpcyBpbml0aWFsaXplZCBiZWZvcmVcclxuICAgICAgICAvLyBjb21wdXRpbmcgdGhlIGJhc2Ugc2NhbGUgZmFjdG9yXHJcbiAgICAgICAgbGV0IGh0bWxNZXNoRGF0YSA9IHRoaXMuX2NhY2hlLmh0bWxNZXNoRGF0YS5nZXQoaHRtbE1lc2gpO1xyXG4gICAgICAgIGlmICghaHRtbE1lc2hEYXRhKSB7XHJcbiAgICAgICAgICAgIGh0bWxNZXNoRGF0YSA9IHsgc3R5bGU6IFwiXCIgfTtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUuaHRtbE1lc2hEYXRhLnNldChodG1sTWVzaCwgaHRtbE1lc2hEYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYUVsZW1lbnQgPSBodG1sTWVzaC5faXNDYW52YXNPdmVybGF5ID8gdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50IDogdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoaHRtbE1lc2guZWxlbWVudC5wYXJlbnROb2RlICE9PSBjYW1lcmFFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNhbWVyYUVsZW1lbnQhLmFwcGVuZENoaWxkKGh0bWxNZXNoLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGh0bWxNZXNoIGNvbnRlbnQgaGFzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgYmFzZSBzY2FsZSBmYWN0b3JcclxuICAgICAgICBpZiAoaHRtbE1lc2gucmVxdWlyZXNVcGRhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQmFzZVNjYWxlRmFjdG9yKGh0bWxNZXNoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGZvciB0aGUgaHRtbCBtZXNoXHJcbiAgICAgICAgY29uc3Qgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeCA9IHRoaXMuX2dldFRyYW5zZm9ybWF0aW9uTWF0cml4KGh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbSk7XHJcblxyXG4gICAgICAgIGxldCBzdHlsZSA9IGB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgJHt0aGlzLl9nZXRIdG1sQ29udGVudENzc01hdHJpeChzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4LCB1c2VSaWdodEhhbmRlZFN5c3RlbSl9YDtcclxuICAgICAgICAvLyBJbiBhIHJpZ2h0IGhhbmRlZCBzeXN0ZW0sIHNjcmVlbnMgYXJlIG9uIHRoZSB3cm9uZyBzaWRlIG9mIHRoZSBtZXNoLCBzbyB3ZSBoYXZlIHRvIHJvdGF0ZSBieSBNYXRoLlBJIHdoaWNoIHJlc3VsdHMgaW4gdGhlIG1hdHJpeDNkIHNlZW4gYmVsb3dcclxuICAgICAgICBzdHlsZSArPSBgJHt1c2VSaWdodEhhbmRlZFN5c3RlbSA/IFwibWF0cml4M2QoLTEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIC0xLCAwLCAwLCAwLCAwLCAxKVwiIDogXCJcIn1gO1xyXG5cclxuICAgICAgICBpZiAoaHRtbE1lc2hEYXRhLnN0eWxlICE9PSBzdHlsZSkge1xyXG4gICAgICAgICAgICBodG1sTWVzaC5lbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gICAgICAgICAgICBodG1sTWVzaC5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaHRtbE1lc2guX21hcmtBc1VwZGF0ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlcihzY2VuZTogU2NlbmUsIGNhbWVyYTogQ2FtZXJhKSB7XHJcbiAgICAgICAgbGV0IG5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHVzZVJpZ2h0SGFuZGVkU3lzdGVtID0gc2NlbmUudXNlUmlnaHRIYW5kZWRTeXN0ZW07XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIHBvc2l0aW9uIGFuZCBzaXplIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRhaW5lclBvc2l0aW9uSWZOZWVkZWQoKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgY2FtZXJhIGNoYW5nZVxyXG4gICAgICAgIGlmICh0aGlzLl9jYW1lcmFNYXRyaXhVcGRhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYU1hdHJpeFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGNhbWVyYSBwb3NpdGlvbiBoYXMgY2hhbmdlZCwgdGhlbiB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24ueCAhPT0gdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi54IHx8XHJcbiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi55ICE9PSB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLnkgfHxcclxuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnogIT09IHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24uelxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLmNvcHlGcm9tKGNhbWVyYS5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBhIGRwciBjaGFuZ2VcclxuICAgICAgICBpZiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gIT09IHRoaXMuX2xhc3REZXZpY2VQaXhlbFJhdGlvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3REZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XHJcbiAgICAgICAgICAgIExvZ2dlci5Mb2coXCJJbiByZW5kZXIgLSBkcHIgY2hhbmdlZDogXCIsIHRoaXMuX2xhc3REZXZpY2VQaXhlbFJhdGlvKTtcclxuICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG1lc2hlcyBuZWVkIHRvIGJlIHVwZGF0ZWRcclxuICAgICAgICBjb25zdCBtZXNoZXNOZWVkaW5nVXBkYXRlID0gc2NlbmUubWVzaGVzLmZpbHRlcigobWVzaCkgPT4gKG1lc2ggYXMgYW55KVtcImlzSHRtbE1lc2hcIl0gJiYgKG5lZWRzVXBkYXRlIHx8IChtZXNoIGFzIEh0bWxNZXNoKS5yZXF1aXJlc1VwZGF0ZSkpO1xyXG4gICAgICAgIG5lZWRzVXBkYXRlID0gbmVlZHNVcGRhdGUgfHwgbWVzaGVzTmVlZGluZ1VwZGF0ZS5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBpZiAoIW5lZWRzVXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCBhIHByb2plY3Rpb24gbWF0cml4IGZvciB0aGUgY2FtZXJhXHJcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5nZXRQcm9qZWN0aW9uTWF0cml4KCk7XHJcbiAgICAgICAgY29uc3QgZm92ID0gcHJvamVjdGlvbk1hdHJpeC5tWzVdICogdGhpcy5faGVpZ2h0SGFsZjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuZm92ICE9PSBmb3YpIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gW3RoaXMuX292ZXJsYXlFbGVtZW50cz8uZG9tRWxlbWVudCwgdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5kb21FbGVtZW50XTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5tb2RlID09IENhbWVyYS5QRVJTUEVDVElWRV9DQU1FUkEpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLndlYmtpdFBlcnNwZWN0aXZlID0gZm92ICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5wZXJzcGVjdGl2ZSA9IGZvdiArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS53ZWJraXRQZXJzcGVjdGl2ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnBlcnNwZWN0aXZlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5mb3YgPSBmb3Y7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIENTUyBtYXRyaXggZm9yIHRoZSBjYW1lcmEgKHdoaWNoIHdpbGwgaW5jbHVkZSBhbnkgY2FtZXJhIHJvdGF0aW9uKVxyXG4gICAgICAgIGlmIChjYW1lcmEucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNhbWVyYS5jb21wdXRlV29ybGRNYXRyaXgoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYU1hdHJpeFdvcmxkID0gdGhpcy5fdGVtcC5jYW1lcmFXb3JsZE1hdHJpeDtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZC5jb3B5RnJvbShjYW1lcmEuZ2V0V29ybGRNYXRyaXgoKSk7XHJcbiAgICAgICAgY29uc3QgY2FtZXJhUm90YXRpb25NYXRyaXggPSB0aGlzLl90ZW1wLmNhbWVyYVJvdGF0aW9uTWF0cml4O1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkLmdldFJvdGF0aW9uTWF0cml4KCkudHJhbnNwb3NlVG9SZWYoY2FtZXJhUm90YXRpb25NYXRyaXgpO1xyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXkgPSB0aGlzLl90ZW1wLmNhbWVyYVdvcmxkTWF0cml4QXNBcnJheTtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZC5jb3B5VG9BcnJheShjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXkpO1xyXG5cclxuICAgICAgICAvLyBGb3IgYSBmZXcgdmFsdWVzLCB3ZSBoYXZlIHRvIGFkanVzdCB0aGUgZGlyZWN0aW9uIGJhc2VkIG9uIHRoZSBoYW5kZWRuZXNzIG9mIHRoZSBzeXN0ZW1cclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB1c2VSaWdodEhhbmRlZFN5c3RlbSA/IDEgOiAtMTtcclxuXHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzFdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVsxXTtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbMl0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzJdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs0XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bNF0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzZdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs2XSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbOF0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzhdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs5XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bOV0gKiBkaXJlY3Rpb247XHJcblxyXG4gICAgICAgIE1hdHJpeC5Gcm9tQXJyYXlUb1JlZihjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXksIDAsIGNhbWVyYU1hdHJpeFdvcmxkKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhQ1NTTWF0cml4ID0gdGhpcy5fZ2V0Q2FtZXJhQ3NzTWF0cml4KGNhbWVyYU1hdHJpeFdvcmxkKTtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IGNhbWVyYUNTU01hdHJpeDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuc3R5bGUgIT09IHN0eWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IFt0aGlzLl9pblNjZW5lRWxlbWVudHM/LmNhbWVyYUVsZW1lbnQsIHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY2FtZXJhRWxlbWVudF07XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnN0eWxlID0gc3R5bGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBfUmVuZGVyIG9iamVjdHMgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgZm9yIChjb25zdCBtZXNoIG9mIG1lc2hlc05lZWRpbmdVcGRhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVySHRtbE1lc2gobWVzaCBhcyBIdG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZUJhc2VTY2FsZUZhY3RvcihodG1sTWVzaDogSHRtbE1lc2gpIHtcclxuICAgICAgICAvLyBHZXQgc2NyZWVuIHdpZHRoIGFuZCBoZWlnaHRcclxuICAgICAgICBsZXQgc2NyZWVuV2lkdGggPSB0aGlzLl93aWR0aDtcclxuICAgICAgICBsZXQgc2NyZWVuSGVpZ2h0ID0gdGhpcy5faGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgYXNwZWN0IHJhdGlvc1xyXG4gICAgICAgIGNvbnN0IGh0bWxNZXNoQXNwZWN0UmF0aW8gPSAoaHRtbE1lc2gud2lkdGggfHwgMSkgLyAoaHRtbE1lc2guaGVpZ2h0IHx8IDEpO1xyXG4gICAgICAgIGNvbnN0IHNjcmVlbkFzcGVjdFJhdGlvID0gc2NyZWVuV2lkdGggLyBzY3JlZW5IZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIEFkanVzdCBzY3JlZW4gZGltZW5zaW9ucyBiYXNlZCBvbiBhc3BlY3QgcmF0aW9zXHJcbiAgICAgICAgaWYgKGh0bWxNZXNoQXNwZWN0UmF0aW8gPiBzY3JlZW5Bc3BlY3RSYXRpbykge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgSFRNTCBtZXNoIGlzIHdpZGVyIHJlbGF0aXZlIHRvIGl0cyBoZWlnaHQgdGhhbiB0aGUgc2NyZWVuLCBhZGp1c3QgdGhlIHNjcmVlbiB3aWR0aFxyXG4gICAgICAgICAgICBzY3JlZW5XaWR0aCA9IHNjcmVlbkhlaWdodCAqIGh0bWxNZXNoQXNwZWN0UmF0aW87XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIEhUTUwgbWVzaCBpcyB0YWxsZXIgcmVsYXRpdmUgdG8gaXRzIHdpZHRoIHRoYW4gdGhlIHNjcmVlbiwgYWRqdXN0IHRoZSBzY3JlZW4gaGVpZ2h0XHJcbiAgICAgICAgICAgIHNjcmVlbkhlaWdodCA9IHNjcmVlbldpZHRoIC8gaHRtbE1lc2hBc3BlY3RSYXRpbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCBjb250ZW50IHRvIGZpbGwgc2NyZWVuIHNvIHdlIGdldCBtYXggcmVzb2x1dGlvbiB3aGVuIGl0IGlzIHNocnVuayB0byBmaXQgdGhlIG1lc2hcclxuICAgICAgICBodG1sTWVzaC5zZXRDb250ZW50U2l6ZVB4KHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBkYXRlQ29udGFpbmVyUG9zaXRpb25JZk5lZWRlZCgpIHtcclxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGNhbnZhcyBoYXMgbW92ZWQgb24gdGhlIHNjcmVlblxyXG4gICAgICAgIGNvbnN0IGNhbnZhc1JlY3QgPSB0aGlzLl9lbmdpbmUuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAvLyBjYW52YXMgcmVjdCBtYXkgYmUgbnVsbCBpZiBsYXlvdXQgbm90IGNvbXBsZXRlXHJcbiAgICAgICAgaWYgKCFjYW52YXNSZWN0KSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5XYXJuKFBvc2l0aW9uVXBkYXRlRmFpbE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5zY3JvbGxZO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB3aW5kb3cuc2Nyb2xsWDtcclxuICAgICAgICBjb25zdCBjYW52YXNEb2N1bWVudFRvcCA9IGNhbnZhc1JlY3QudG9wICsgc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc0RvY3VtZW50TGVmdCA9IGNhbnZhc1JlY3QubGVmdCArIHNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24udG9wICE9PSBjYW52YXNEb2N1bWVudFRvcCB8fCB0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24ubGVmdCAhPT0gY2FudmFzRG9jdW1lbnRMZWZ0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbi50b3AgPSBjYW52YXNEb2N1bWVudFRvcDtcclxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLmxlZnQgPSBjYW52YXNEb2N1bWVudExlZnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBbdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jb250YWluZXIsIHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY29udGFpbmVyXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSB0b3AgYW5kIGxlZnQgb2YgdGhlIGNzcyBjb250YWluZXIgdG8gbWF0Y2ggdGhlIGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUGFyZW50ID0gY29udGFpbmVyLm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSBjb250YWluZXJQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnREb2N1bWVudFRvcCA9IHBhcmVudFJlY3QudG9wICsgc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RG9jdW1lbnRMZWZ0ID0gcGFyZW50UmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nID0gdGhpcy5fZ2V0QW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyhjb250YWluZXJQYXJlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYm9keSBtYXJnaW5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keU1hcmdpblRvcCA9IHBhcnNlSW50KGJvZHlTdHlsZS5tYXJnaW5Ub3AsIDEwKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlNYXJnaW5MZWZ0ID0gcGFyc2VJbnQoYm9keVN0eWxlLm1hcmdpbkxlZnQsIDEwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7Y2FudmFzRG9jdW1lbnRUb3AgLSBwYXJlbnREb2N1bWVudFRvcCAtIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcubWFyZ2luVG9wICsgYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZy5wYWRkaW5nVG9wICsgYm9keU1hcmdpblRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IGAke1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnZhc0RvY3VtZW50TGVmdCAtIHBhcmVudERvY3VtZW50TGVmdCAtIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcubWFyZ2luTGVmdCArIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcucGFkZGluZ0xlZnQgKyBib2R5TWFyZ2luTGVmdFxyXG4gICAgICAgICAgICAgICAgfXB4YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX29uQ2FtZXJhTWF0cml4Q2hhbmdlZCA9IChjYW1lcmE6IENhbWVyYSkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4ID0gY2FtZXJhLmdldFdvcmxkTWF0cml4KCk7XHJcbiAgICAgICAgdGhpcy5fY2FtZXJhTWF0cml4VXBkYXRlZCA9IHRydWU7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgX2Vwc2lsb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmFicyh2YWx1ZSkgPCAxZS0xMCA/IDAgOiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgdG90YWwgbWFyZ2lucyBhbmQgcGFkZGluZyBmb3IgYW4gZWxlbWVudCwgZXhjbHVkaW5nIHRoZSBib2R5IGFuZCBkb2N1bWVudCBtYXJnaW5zXHJcbiAgICBwcml2YXRlIF9nZXRBbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgbGV0IG1hcmdpblRvcCA9IDA7XHJcbiAgICAgICAgbGV0IG1hcmdpbkxlZnQgPSAwO1xyXG4gICAgICAgIGxldCBwYWRkaW5nVG9wID0gMDtcclxuICAgICAgICBsZXQgcGFkZGluZ0xlZnQgPSAwO1xyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBtYXJnaW5Ub3AgKz0gcGFyc2VJbnQoc3R5bGUubWFyZ2luVG9wLCAxMCk7XHJcbiAgICAgICAgICAgIG1hcmdpbkxlZnQgKz0gcGFyc2VJbnQoc3R5bGUubWFyZ2luTGVmdCwgMTApO1xyXG4gICAgICAgICAgICBwYWRkaW5nVG9wICs9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3AsIDEwKTtcclxuICAgICAgICAgICAgcGFkZGluZ0xlZnQgKz0gcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKTtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgbWFyZ2luVG9wLCBtYXJnaW5MZWZ0LCBwYWRkaW5nVG9wLCBwYWRkaW5nTGVmdCB9O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEh0bWxNZXNoUmVuZGVyZXIgfSBmcm9tIFwiLi9odG1sTWVzaFJlbmRlcmVyXCI7XHJcbmltcG9ydCB7IEh0bWxNZXNoIH0gZnJvbSBcIi4vaHRtbE1lc2hcIjtcclxuaW1wb3J0IHsgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB9IGZyb20gXCIuL3BvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3JcIjtcclxuaW1wb3J0IHsgRml0U3RyYXRlZ3kgfSBmcm9tIFwiLi9maXRTdHJhdGVneVwiO1xyXG5cclxuLy8gRXhwb3J0IHB1YmxpYyBjbGFzc2VzIGFuZCBmdW5jdGlvbnNcclxuZXhwb3J0IHsgSHRtbE1lc2hSZW5kZXJlciwgSHRtbE1lc2gsIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IsIEZpdFN0cmF0ZWd5IH07XHJcbiIsImltcG9ydCB7IFRvb2xzIH0gZnJvbSBcImNvcmUvTWlzYy90b29sc1wiO1xyXG5cclxuLy8gQSBjYXB0dXJlIG1hbmFnZW1lbnQgc3lzdGVtIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IG9iamVjdCBoYXMgdGhlIHBvaW50ZXJcclxuLy8gZXZlbnRzIGJ5IGVsaW1pbmF0aW5nIHJhY2UgY29uZGl0aW9ucyB0aGF0IGNhbiBjYXVzZSB0aGUgcG9pbnRlciBldmVudHMgdG8gYmVcclxuLy8gcmVsZWFzZWQgYnkgYSBkaWZmZXJlbnQgb2JqZWN0IGFmdGVyIHRoZXkgYXJlIGNhcHR1cmVkIGxlYXZpbmcgbm8gb2JqZWN0XHJcbi8vIGFzIHRoZSBvd25lci4gIEl0IGRvZXMgdGhpcyBieSBxdWV1ZWluZyByZXF1ZXN0cyBhbmQgb25seSBhbGxvd2luZ1xyXG4vLyBjYXB0dXJlIHdoZW4gdGhlIGN1cnJlbnQgY2FwdHVyZSBvd25lciByZWxlYXNlcyBwb2ludGVyIGV2ZW50cy5cclxuXHJcbnR5cGUgQ2FwdHVyZVJlbGVhc2VDYWxsYmFjayA9ICgpID0+IHZvaWQ7XHJcblxyXG50eXBlIENhcHR1cmVSZWxlYXNlQ2FsbGJhY2tzID0ge1xyXG4gICAgY2FwdHVyZTogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaztcclxuICAgIHJlbGVhc2U6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2s7XHJcbn07XHJcblxyXG5sZXQgQ2FwdHVyZVJlcXVlc3RRdWV1ZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbi8vIEtleSBpcyByZXF1ZXN0IGlkLCB2YWx1ZSBpcyBvYmplY3Qgd2l0aCBjYXB0dXJlIGFuZCByZWxlYXNlIGNhbGxiYWNrc1xyXG5jb25zdCBQZW5kaW5nUmVxdWVzdENhbGxiYWNrczogTWFwPHN0cmluZywgQ2FwdHVyZVJlbGVhc2VDYWxsYmFja3M+ID0gbmV3IE1hcCgpO1xyXG5cclxuLy8gS2VlcCB0cmFjayBvZiByZWxlYXNlIHJlcXVlc3RzIHdpdGggbm8gbWF0Y2hpbmcgY2FwdHVyZSByZXF1ZXN0XHJcbi8vIGluIGNhc2UgdGhlIHJlbGVhc2UgcmVxdWVzdCBhcnJpdmVkIGJlZm9yZSB0aGUgY2FwdHVyZSB0byBhdm9pZFxyXG4vLyB0aGUgY2FwdHVyZSByZXF1ZXN0IG5ldmVyIGdldHRpbmcgcmVsZWFzZWQuXHJcbmxldCBVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHM6IHN0cmluZ1tdID0gW107XHJcblxyXG5sZXQgQ3VycmVudE93bmVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gQ2FsbGVkIG9uIGZpcnN0IGNhcHR1cmUgb3IgcmVsZWFzZSByZXF1ZXN0XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBpZCBvZiB0aGUgb2JqZWN0IGN1cnJlbnRseSBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICogQHJldHVybnMgVGhlIGlkIG9mIHRoZSBvYmplY3QgY3VycmVudGx5IGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKiBvciBudWxsIGlmIG5vIG9iamVjdCBpcyBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNvbnN0IGdldENhcHR1cmluZ0lkID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIEN1cnJlbnRPd25lcjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXF1ZXN0IHRoYXQgdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZCBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzLiAgSWYgdGhlcmUgaXMgbm8gY3VycmVudFxyXG4gKiBvd25lciwgdGhlbiB0aGUgcmVxdWVzdCBpcyBncmFudGVkIGltbWVkaWF0ZWx5LiAgSWYgdGhlcmUgaXMgYSBjdXJyZW50IG93bmVyLCB0aGVuIHRoZSByZXF1ZXN0XHJcbiAqIGlzIHF1ZXVlZCB1bnRpbCB0aGUgY3VycmVudCBvd25lciByZWxlYXNlcyBwb2ludGVyIGV2ZW50cy5cclxuICogQHBhcmFtIHJlcXVlc3RJZCBBbiBpZCB0byBpZGVudGlmeSB0aGUgcmVxdWVzdC4gIFRoaXMgaWQgd2lsbCBiZSB1c2VkIHRvIG1hdGNoIHRoZSBjYXB0dXJlXHJcbiAqIHJlcXVlc3Qgd2l0aCB0aGUgcmVsZWFzZSByZXF1ZXN0LlxyXG4gKiBAcGFyYW0gY2FwdHVyZUNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgZ3JhbnRlZCBhbmQgdGhlIG9iamVjdCBpcyBjYXB0dXJpbmdcclxuICogQHBhcmFtIHJlbGVhc2VDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY29uc3QgcmVxdWVzdENhcHR1cmUgPSAocmVxdWVzdElkOiBzdHJpbmcsIGNhcHR1cmVDYWxsYmFjazogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaywgcmVsZWFzZUNhbGxiYWNrOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrKSA9PiB7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdENhcHR1cmUgLSBQb2ludGVyIGV2ZW50cyBjYXB0dXJlIHJlcXVlc3RlZCBmb3IgJHtyZXF1ZXN0SWR9YCk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgYSByZWxlYXNlIGZvciB0aGlzIHJlcXVlc3QsIHRoZW4gaWdub3JlIHRoZSByZXF1ZXN0XHJcbiAgICBpZiAoUmVtb3ZlVW5tYXRjaGVkUmVxdWVzdChyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RDYXB0dXJlIC0gQ2FwdHVyZSByZXF1ZXN0IG1hdGNoZWQgcHJldmlvdXMgcmVsZWFzZSByZXF1ZXN0ICR7cmVxdWVzdElkfS4gIENhbmNlbGxpbmcgY2FwdHVyZSByZXF1ZXN0YCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0SWQgIT09IEN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgYWRkIGl0IHRvIHRoZSBxdWV1ZVxyXG4gICAgICAgIEVucXVldWVDYXB0dXJlUmVxdWVzdChyZXF1ZXN0SWQsIGNhcHR1cmVDYWxsYmFjaywgcmVsZWFzZUNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIUN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgb3duZXIsIGdvIGFoZWFkIGFuZCBncmFudCB0aGUgcmVxdWVzdFxyXG4gICAgICAgIFRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCgpO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgdGhlIHJlcXVlc3QgaWQgaXMgdGhlIGN1cnJlbnQgb3duZXIsIGRvIG5vdGhpbmdcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZWxlYXNlIHBvaW50ZXIgZXZlbnRzIGZyb20gdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZC4gIElmIHRoZSBvYmplY3QgaXMgdGhlIGN1cnJlbnQgb3duZXJcclxuICogdGhlbiBwb2ludGVyIGV2ZW50cyBhcmUgcmVsZWFzZWQgaW1tZWRpYXRlbHkuICBJZiB0aGUgb2JqZWN0IGlzIG5vdCB0aGUgY3VycmVudCBvd25lciwgdGhlbiB0aGVcclxuICogYXNzb2NpYXRlZCBjYXB0dXJlIHJlcXVlc3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4gIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGNhcHR1cmUgcmVxdWVzdFxyXG4gKiBpbiB0aGUgcXVldWUsIHRoZW4gdGhlIHJlbGVhc2UgcmVxdWVzdCBpcyBhZGRlZCB0byBhIGxpc3Qgb2YgdW5tYXRjaGVkIHJlbGVhc2UgcmVxdWVzdHMgYW5kIHdpbGxcclxuICogbmVnYXRlIHRoZSBuZXh0IGNhcHR1cmUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkLiAgVGhpcyBpcyB0byBndWFyZCBhZ2FpbnN0IHRoZSBwb3NzaWJpbGl0eSB0aGF0XHJcbiAqIHRoZSByZWxlYXNlIHJlcXVlc3QgYXJyaXZlZCBiZWZvcmUgdGhlIGNhcHR1cmUgcmVxdWVzdC5cclxuICogQHBhcmFtIHJlcXVlc3RJZCBUaGUgaWQgd2hpY2ggc2hvdWxkIG1hdGNoIHRoZSBpZCBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0XHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0UmVsZWFzZSA9IChyZXF1ZXN0SWQ6IHN0cmluZyB8IG51bGwpID0+IHtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5yZXF1ZXN0UmVsZWFzZSAtIFBvaW50ZXIgZXZlbnRzIHJlbGVhc2UgcmVxdWVzdGVkIGZvciAke3JlcXVlc3RJZH1gKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgcmVxdWVzdElkIGlzIHRoZSBjdXJyZW50IGNhcHR1cmUgaG9sZGVyIHJlbGVhc2UgaXRcclxuICAgIGlmICghcmVxdWVzdElkIHx8IHJlcXVlc3RJZCA9PT0gQ3VycmVudE93bmVyKSB7XHJcbiAgICAgICAgVHJhbnNmZXJQb2ludGVyRXZlbnRzT3duZXJzaGlwKCk7XHJcbiAgICB9IGVsc2UgaWYgKENhbmNlbFJlcXVlc3QocmVxdWVzdElkKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIGluIHRoZSBxdWV1ZSwgYnV0IG5vdCB0aGUgY3VycmVudCBjYXB0dXJlIGhvbGRlciwgcmVtb3ZlIGl0IGFuZCBpdCdzIGNhbGxiYWNrc1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmRlbGV0ZShyZXF1ZXN0SWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdFJlbGVhc2UgLSBSZWNlaXZlZCByZWxlYXNlIHJlcXVlc3QgJHtyZXF1ZXN0SWR9IGJ1dCBubyBtYXRjaGluZyBjYXB0dXJlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkYCk7XHJcbiAgICAgICAgLy8gcmVxdWVzdCB3YXMgbm90IGN1cnJlbnQgYW5kIG5vdCBpbiBxdWV1ZSwgbGlrZWx5IGJlY2F1c2Ugd2UgcmVjZWl2ZWQgYSByZWxlYXNlXHJcbiAgICAgICAgLy8gcmVxdWVzdCBiZWZvcmUgdGhlIGNhcHR1cmUuICBBZGQgaXQgdG8gdGhlIHVubWF0Y2hlZCBsaXN0IHRvIGd1YXJkIGFnYWluc3QgdGhpcyBwb3NzaWJpbGl0eVxyXG4gICAgICAgIGlmICghVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzLmluY2x1ZGVzKHJlcXVlc3RJZCkpIHtcclxuICAgICAgICAgICAgVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzLnB1c2gocmVxdWVzdElkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogUmVsZWFzZSBwb2ludGVyIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG93bmVyXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjb25zdCByZWxlYXNlQ3VycmVudCA9ICgpID0+IHtcclxuICAgIHJlcXVlc3RSZWxlYXNlKEN1cnJlbnRPd25lcik7XHJcbn07XHJcblxyXG5jb25zdCBFbnF1ZXVlQ2FwdHVyZVJlcXVlc3QgPSAocmVxdWVzdElkOiBzdHJpbmcsIGNhcHR1cmU6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2ssIHJlbGVhc2U6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2spID0+IHtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5lbnF1ZXVlQ2FwdHVyZVJlcXVlc3QgLSBFbnF1ZXVlaW5nIGNhcHR1cmUgcmVxdWVzdCBmb3IgICR7cmVxdWVzdElkfWApO1xyXG4gICAgaWYgKCFDYXB0dXJlUmVxdWVzdFF1ZXVlLmluY2x1ZGVzKHJlcXVlc3RJZCkpIHtcclxuICAgICAgICBDYXB0dXJlUmVxdWVzdFF1ZXVlLnB1c2gocmVxdWVzdElkKTtcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5zZXQocmVxdWVzdElkLCB7IGNhcHR1cmUsIHJlbGVhc2UgfSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vLyBSZW1vdmVzIHRoZSByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlIGlmIGl0IGV4aXN0cy4gIFJldHVybnMgdHJ1ZVxyXG4vLyBpZiB0aGUgcmVxdWVzdCB3YXMgZm91bmQgYW5kIHJlbW92ZWQsIG90aGVyd2lzZSBmYWxzZVxyXG5jb25zdCBDYW5jZWxSZXF1ZXN0ID0gKHJlcXVlc3RJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xyXG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcclxuICAgIENhcHR1cmVSZXF1ZXN0UXVldWUgPSBDYXB0dXJlUmVxdWVzdFF1ZXVlLmZpbHRlcigoaWQpID0+IHtcclxuICAgICAgICBpZiAoaWQgIT09IHJlcXVlc3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmNhbmNlbFJlcXVlc3QgLSBDYW5jZWxpbmcgcG9pbnRlciBldmVudHMgY2FwdHVyZSByZXF1ZXN0ICR7cmVxdWVzdElkfWApO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVtb3ZlZDtcclxufTtcclxuXHJcbmNvbnN0IFJlbW92ZVVubWF0Y2hlZFJlcXVlc3QgPSAocmVxdWVzdElkOiBzdHJpbmcpID0+IHtcclxuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XHJcbiAgICBVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHMgPSBVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHMuZmlsdGVyKChpZCkgPT4ge1xyXG4gICAgICAgIGlmIChpZCAhPT0gcmVxdWVzdElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVtb3ZlZDtcclxufTtcclxuXHJcbmNvbnN0IFRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCA9ICgpID0+IHtcclxuICAgIGNvbnN0IG5ld093bmVySWQgPSBOZXh0Q2FwdHVyZVJlcXVlc3QoKTtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS50cmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAgLSBUcmFuc2ZlcnJyaW5nIHBvaW50ZXIgZXZlbnRzIGZyb20gJHtDdXJyZW50T3duZXJ9IHRvICR7bmV3T3duZXJJZH1gKTtcclxuICAgIC8vIFJlbGVhc2UgdGhlIGN1cnJlbnQgb3duZXJcclxuICAgIERvUmVsZWFzZSgpO1xyXG4gICAgaWYgKG5ld093bmVySWQpIHtcclxuICAgICAgICBEb0NhcHR1cmUobmV3T3duZXJJZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCBEb1JlbGVhc2UgPSAoKSA9PiB7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuZG9SZWxlYXNlIC0gUmVsZWFzaW5nIHBvaW50ZXIgZXZlbnRzIGZyb20gJHtDdXJyZW50T3duZXJ9YCk7XHJcbiAgICBpZiAoQ3VycmVudE93bmVyKSB7XHJcbiAgICAgICAgLy8gY2FsbCB0aGUgcmVsZWFzZSBjYWxsYmFja1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmdldChDdXJyZW50T3duZXIpPy5yZWxlYXNlKCk7XHJcbiAgICAgICAgLy8gQW5kIHJlbW92ZSB0aGUgY2FsbGJhY2tzXHJcbiAgICAgICAgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3MuZGVsZXRlKEN1cnJlbnRPd25lcik7XHJcbiAgICAgICAgQ3VycmVudE93bmVyID0gbnVsbDtcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IERvQ2FwdHVyZSA9IChuZXdPd25lcklkOiBzdHJpbmcpID0+IHtcclxuICAgIGlmIChuZXdPd25lcklkKSB7XHJcbiAgICAgICAgLy8gY2FsbCB0aGUgY2FwdHVyZSBjYWxsYmFja1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmdldChuZXdPd25lcklkKT8uY2FwdHVyZSgpO1xyXG4gICAgfVxyXG4gICAgQ3VycmVudE93bmVyID0gbmV3T3duZXJJZDtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5kb0NhcHR1cmUgLSBQb2ludGVyIGV2ZW50cyBub3cgY2FwdHVyZWQgYnkgJHtuZXdPd25lcklkfWApO1xyXG59O1xyXG5cclxuY29uc3QgTmV4dENhcHR1cmVSZXF1ZXN0ID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIENhcHR1cmVSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCA/IENhcHR1cmVSZXF1ZXN0UXVldWUuc2hpZnQoKSA6IG51bGw7XHJcbn07XHJcblxyXG4vLyAjcmVnaW9uIERlYnVnZ2luZyBzdXBwb3J0XHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuICAgIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuICAgICAgICBcInBvaW50ZXItZXZlbnRzLWNhcHR1cmUtZGVidWdcIjogYm9vbGVhbiB8IG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IERlYnVnTG9nID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xyXG4gICAgLy8gSWYgd2UgYXJlIHJ1bm5uaW5nIGluIGEgdGVzdCBydW5uZXIgKGluIG5vZGUsIHNvIHdpbmRvdyBpcyBub3QgZGVmaW5lZClcclxuICAgIC8vIG9yIGlmIHRoZSBkZWJ1ZyBmbGFnIGlzIHNldCwgdGhlbiBsb2cgdGhlIG1lc3NhZ2VcclxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8IHdpbmRvd1tcInBvaW50ZXItZXZlbnRzLWNhcHR1cmUtZGVidWdcIl0pIHtcclxuICAgICAgICBUb29scy5Mb2coXHJcbiAgICAgICAgICAgIGAke3BlcmZvcm1hbmNlLm5vdygpfSAtIGdhbWUuc2NlbmUucG9pbnRlckV2ZW50cyAtICR7bWVzc2FnZX1cXG5jdXJyZW50T3duZXI6ICR7Q3VycmVudE93bmVyfVxcbnF1ZXVlOiAke0NhcHR1cmVSZXF1ZXN0UXVldWV9XFxudW5tYXRjaGVkOiAke1VubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0c31gXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufTtcclxuLy8gI2VuZHJlZ2lvbiBEZWJ1Z2dpbmcgc3VwcG9ydFxyXG4iLCJpbXBvcnQgdHlwZSB7IEFic3RyYWN0TWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9hYnN0cmFjdE1lc2hcIjtcclxuaW1wb3J0IHR5cGUgeyBCZWhhdmlvciB9IGZyb20gXCJjb3JlL0JlaGF2aW9ycy9iZWhhdmlvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcImNvcmUvTWlzYy9sb2dnZXJcIjtcclxuaW1wb3J0IHsgcmVxdWVzdENhcHR1cmUsIHJlcXVlc3RSZWxlYXNlLCByZWxlYXNlQ3VycmVudCwgZ2V0Q2FwdHVyaW5nSWQgfSBmcm9tIFwiLi9wb2ludGVyRXZlbnRzQ2FwdHVyZVwiO1xyXG5cclxuLy8gTW9kdWxlIGxldmVsIHZhcmlhYmxlIGZvciBob2xkaW5nIHRoZSBjdXJyZW50IHNjZW5lXHJcbmxldCBMb2NhbFNjZW5lOiBTY2VuZSB8IG51bGwgPSBudWxsO1xyXG5cclxuLy8gTW9kdWxlIGxldmVsIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNvdW50IG9mIGJlaGF2aW9yIGluc3RhbmNlcyB0aGF0IGFyZSBjdXJyZW50bHkgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbi8vIG9uIGVudHJ5LiAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IG9yIHN0b3Agb2JzZXJ2aW5nIHBvaW50ZXIgbW92ZW1lbnQuXHJcbmxldCBDYXB0dXJlT25FbnRlckNvdW50ID0gMDtcclxuXHJcbi8vIE1hcCB1c2VkIHRvIHN0b3JlIGluc3RhbmNlIG9mIHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIGZvciBhIG1lc2hcclxuLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHRoaXMgZ2V0cyBjaGVja2VkIG9uIHBvaW50ZXIgbW92ZSBhbmQgd2UgZG9uJ3Qgd2FudCB0b1xyXG4vLyB1c2UgZ2V0QmVoYXZpb3JCeU5hbWUoKSBiZWNhdXNlIHRoYXQgaXMgYSBsaW5lYXIgc2VhcmNoXHJcbmNvbnN0IE1lc2hUb0JlaGF2aW9yTWFwID0gbmV3IFdlYWtNYXA8QWJzdHJhY3RNZXNoLCBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yPigpO1xyXG5cclxuY29uc3QgU3RhcnRDYXB0dXJlT25FbnRlciA9IChzY2VuZTogU2NlbmUpID0+IHtcclxuICAgIC8vIElmIHdlIGFyZSBub3QgaW4gYSBicm93c2VyLCBkbyBub3RoaW5nXHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKENhcHR1cmVPbkVudGVyQ291bnQgPT09IDApIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgT25Qb2ludGVyTW92ZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgT25Qb2ludGVyTW92ZSk7XHJcbiAgICAgICAgTG9jYWxTY2VuZSA9IExvY2FsU2NlbmUgPz8gc2NlbmU7XHJcbiAgICAgICAgTG9nZ2VyLkxvZyhcIlBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3I6IFN0YXJ0aW5nIG9ic2VydmF0aW9uIG9mIHBvaW50ZXIgbW92ZSBldmVudHMuXCIpO1xyXG4gICAgICAgIExvY2FsU2NlbmUub25EaXNwb3NlT2JzZXJ2YWJsZS5hZGQoRG9TdG9wQ2FwdHVyZU9uRW50ZXIpO1xyXG4gICAgfVxyXG4gICAgQ2FwdHVyZU9uRW50ZXJDb3VudCsrO1xyXG59O1xyXG5cclxuY29uc3QgRG9TdG9wQ2FwdHVyZU9uRW50ZXIgPSAoKSA9PiB7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgT25Qb2ludGVyTW92ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBPblBvaW50ZXJNb3ZlKTtcclxuICAgIExvY2FsU2NlbmUgPSBudWxsO1xyXG4gICAgTG9nZ2VyLkxvZyhcIlBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3I6IFN0b3BwaW5nIG9ic2VydmF0aW9uIG9mIHBvaW50ZXIgbW92ZSBldmVudHMuXCIpO1xyXG4gICAgQ2FwdHVyZU9uRW50ZXJDb3VudCA9IDA7XHJcbn07XHJcblxyXG5jb25zdCBTdG9wQ2FwdHVyZU9uRW50ZXIgPSAoKSA9PiB7XHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGEgYnJvd3NlciwgZG8gbm90aGluZ1xyXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IG9ic2VydmluZyBwb2ludGVyIG1vdmVtZW50LCBkbyBub3RoaW5nXHJcbiAgICBpZiAoIUxvY2FsU2NlbmUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgQ2FwdHVyZU9uRW50ZXJDb3VudC0tO1xyXG4gICAgaWYgKENhcHR1cmVPbkVudGVyQ291bnQgPD0gMCkge1xyXG4gICAgICAgIERvU3RvcENhcHR1cmVPbkVudGVyKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vLyBNb2R1bGUgbGV2ZWwgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gZW50ZXJlZCBtZXNoIHNob3VsZCBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbmNvbnN0IE9uUG9pbnRlck1vdmUgPSAoZXZ0OiBQb2ludGVyRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XHJcbiAgICBpZiAoIUxvY2FsU2NlbmUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FudmFzUmVjdCA9IExvY2FsU2NlbmUuZ2V0RW5naW5lKCkuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgaWYgKCFjYW52YXNSZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNsaWVudCBYIGFuZCBZIGZyb20gZWl0aGVyIHRoZSBwb2ludGVyIGV2ZW50IG9yIGZyb20gdGhlXHJcbiAgICAvLyBUb3VjaEV2ZW50IHRvdWNoXHJcbiAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IFwidG91Y2hlc1wiIGluIGV2dCA/IGV2dC50b3VjaGVzWzBdIDogZXZ0O1xyXG5cclxuICAgIC8vIGdldCB0aGUgcGlja2VkIG1lc2gsIGlmIGFueVxyXG4gICAgY29uc3QgcG9pbnRlclNjcmVlblggPSBjbGllbnRYIC0gY2FudmFzUmVjdC5sZWZ0O1xyXG4gICAgY29uc3QgcG9pbnRlclNjcmVlblkgPSBjbGllbnRZIC0gY2FudmFzUmVjdC50b3A7XHJcblxyXG4gICAgbGV0IHBvaW50ZXJDYXB0dXJlQmVoYXZpb3I6IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBwaWNrUmVzdWx0ID0gTG9jYWxTY2VuZS5waWNrKHBvaW50ZXJTY3JlZW5YLCBwb2ludGVyU2NyZWVuWSwgKG1lc2gpID0+IHtcclxuICAgICAgICAvLyBJZiB0aGUgbWVzaCBoYXMgYW4gaW5zdGFuY2Ugb2YgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBhdHRhY2hlZCB0byBpdCxcclxuICAgICAgICAvLyBhbmQgY2FwdHVyZSBvbiBwb2ludGVyIGVudGVyIGlzIHRydWUsIHRoZW4gd2Ugd2FudCB0byBwaWNrIGl0XHJcbiAgICAgICAgY29uc3QgcG9pbnRlckNhcHR1cmVCZWhhdmlvciA9IE1lc2hUb0JlaGF2aW9yTWFwLmdldChtZXNoKTtcclxuICAgICAgICByZXR1cm4gbWVzaC5pc0VuYWJsZWQoKSAmJiB0eXBlb2YgcG9pbnRlckNhcHR1cmVCZWhhdmlvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yLl9jYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgcGlja2VkTWVzaDogQWJzdHJhY3RNZXNoIHwgbnVsbDtcclxuICAgIGlmIChwaWNrUmVzdWx0LmhpdCkge1xyXG4gICAgICAgIHBpY2tlZE1lc2ggPSBwaWNrUmVzdWx0LnBpY2tlZE1lc2g7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBpY2tlZE1lc2ggPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhcHR1cmluZ0lkQXNJbnQgPSBwYXJzZUludChnZXRDYXB0dXJpbmdJZCgpIHx8IFwiXCIpO1xyXG5cclxuICAgIC8vIGlmIHRoZSBwaWNrZWQgbWVzaCBpcyB0aGUgY3VycmVudCBjYXB0dXJpbmcgbWVzaCwgZG8gbm90aGluZ1xyXG4gICAgaWYgKHBpY2tlZE1lc2ggJiYgcGlja2VkTWVzaC51bmlxdWVJZCA9PT0gY2FwdHVyaW5nSWRBc0ludCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB0aGVyZSBpcyBhIGNhcHR1cmluZyBtZXNoIGFuZCBpdCBpcyBub3QgdGhlIGN1cnJlbnQgcGlja2VkIG1lc2gsIG9yIG5vXHJcbiAgICAvLyBtZXNoIGlzIHBpY2tlZCwgcmVsZWFzZSB0aGUgY2FwdHVyaW5nIG1lc2hcclxuICAgIGlmIChjYXB0dXJpbmdJZEFzSW50ICYmICghcGlja2VkTWVzaCB8fCBwaWNrZWRNZXNoLnVuaXF1ZUlkICE9PSBjYXB0dXJpbmdJZEFzSW50KSkge1xyXG4gICAgICAgIHJlbGVhc2VDdXJyZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBwaWNrZWQgbWVzaCBhbmQgaXQgaXMgbm90IHRoZSBjdXJyZW50IGNhcHR1cmluZyBtZXNoLCBjYXB0dXJlXHJcbiAgICAvLyB0aGUgcG9pbnRlciBldmVudHMuICBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgY2FwdHVyaW5nIG1lc2ggaGFzIGFscmVhZHkgYmVlblxyXG4gICAgLy8gcmVsZWFzZWQgYWJvdmVcclxuICAgIGlmIChwaWNrZWRNZXNoKSB7XHJcbiAgICAgICAgcG9pbnRlckNhcHR1cmVCZWhhdmlvciA9IE1lc2hUb0JlaGF2aW9yTWFwLmdldChwaWNrZWRNZXNoKTtcclxuICAgICAgICBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yIS5jYXB0dXJlUG9pbnRlckV2ZW50cygpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEJlaGF2aW9yIGZvciBhbnkgY29udGVudCB0aGF0IGNhbiBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzLCBpLmUuIGJ5cGFzcyB0aGUgQmFieWxvbiBwb2ludGVyIGV2ZW50IGhhbmRsaW5nXHJcbiAqIGFuZCByZWNlaXZlIHBvaW50ZXIgZXZlbnRzIGRpcmVjdGx5LiAgSXQgd2lsbCByZWdpc3RlciB0aGUgY2FwdHVyZSB0cmlnZ2VycyBhbmQgbmVnb3RpYXRlIHRoZSBjYXB0dXJlIGFuZFxyXG4gKiByZWxlYXNlIG9mIHBvaW50ZXIgZXZlbnRzLiAgQ3VyZXJudGx5IHRoaXMgYXBwbGllcyBvbmx5IHRvIEh0bWxNZXNoXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBpbXBsZW1lbnRzIEJlaGF2aW9yPEFic3RyYWN0TWVzaD4ge1xyXG4gICAgLyoqIGdldHMgb3Igc2V0cyBiZWhhdmlvcidzIG5hbWUgKi9cclxuICAgIHB1YmxpYyBuYW1lID0gXCJQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBfYXR0YWNoZWRNZXNoOiBBYnN0cmFjdE1lc2ggfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHVibGljIF9jYXB0dXJlT25Qb2ludGVyRW50ZXI6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIG1lc2ggdGhhdCB0aGUgYmVoYXZpb3IgaXMgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBhdHRhY2hlZE1lc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaGVkTWVzaDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGF0dGFjaGVkTWVzaCh2YWx1ZTogQWJzdHJhY3RNZXNoIHwgbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX2F0dGFjaGVkTWVzaCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgX2NhcHR1cmVDYWxsYmFjazogKCkgPT4gdm9pZCxcclxuICAgICAgICBwcml2YXRlIF9yZWxlYXNlQ2FsbGJhY2s6ICgpID0+IHZvaWQsXHJcbiAgICAgICAgeyBjYXB0dXJlT25Qb2ludGVyRW50ZXIgPSB0cnVlIH0gPSB7fVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fYXR0YWNoZWRNZXNoID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcblxyXG4gICAgICAgIC8vIFdhcm4gaWYgd2UgYXJlIG5vdCBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5XYXJuKGBDcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIG91dHNpZGUgb2YgYSBicm93c2VyLiAgVGhlIGJlaGF2aW9yIHdpbGwgbm90IHdvcmsuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGlmIHRoZSBiZWhhdmlvciBzaG91bGQgY2FwdHVyZSBwb2ludGVyIGV2ZW50cyB3aGVuIHRoZSBwb2ludGVyIGVudGVycyB0aGUgbWVzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IGNhcHR1cmVPblBvaW50ZXJFbnRlcihjYXB0dXJlT25Qb2ludGVyRW50ZXI6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID09PSBjYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F0dGFjaGVkTWVzaCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgICAgICBTdGFydENhcHR1cmVPbkVudGVyKHRoaXMuX2F0dGFjaGVkTWVzaC5nZXRTY2VuZSgpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFN0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIChiZWZvcmUgYXR0YWNoaW5nIGl0IHRvIGEgdGFyZ2V0KVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdCgpIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYmVoYXZpb3IgaXMgYXR0YWNoZWQgdG8gYSB0YXJnZXRcclxuICAgICAqIEBwYXJhbSBtZXNoIGRlZmluZXMgdGhlIHRhcmdldCB3aGVyZSB0aGUgYmVoYXZpb3IgaXMgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGF0dGFjaChtZXNoOiBBYnN0cmFjdE1lc2gpIHtcclxuICAgICAgICAvLyBBZGQgYSByZWZlcmVuY2UgdG8gdGhpcyBiZWhhdmlvciBvbiB0aGUgbWVzaC4gIFdlIGRvIHRoaXMgc28gd2UgY2FuIGdldCBhXHJcbiAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSBiZWhhdmlvciBpbiB0aGUgb25Qb2ludGVyTW92ZSBmdW5jdGlvbiB3aXRob3V0IHJlbHlpbmcgb25cclxuICAgICAgICAvLyBnZXRCZWhhdmlvckJ5TmFtZSgpLCB3aGljaCBkb2VzIGEgbGluZWFyIHNlYXJjaCBvZiB0aGUgYmVoYXZpb3JzIGFycmF5LlxyXG4gICAgICAgIHRoaXMuYXR0YWNoZWRNZXNoID0gbWVzaDtcclxuICAgICAgICBNZXNoVG9CZWhhdmlvck1hcC5zZXQobWVzaCwgdGhpcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICBTdGFydENhcHR1cmVPbkVudGVyKG1lc2guZ2V0U2NlbmUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIGlzIGRldGFjaGVkIGZyb20gaXRzIHRhcmdldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGV0YWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlZmVyZW5jZSB0byB0aGlzIGJlaGF2aW9yIGZyb20gdGhlIG1lc2hcclxuICAgICAgICBNZXNoVG9CZWhhdmlvck1hcC5kZWxldGUodGhpcy5hdHRhY2hlZE1lc2gpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgU3RvcENhcHR1cmVPbkVudGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXR0YWNoZWRNZXNoID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3Bvc2UgdGhlIGJlaGF2aW9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuZGV0YWNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVsZWFzZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgcHVibGljIHJlbGVhc2VQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1ZXN0UmVsZWFzZSh0aGlzLmF0dGFjaGVkTWVzaC51bmlxdWVJZC50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICBwdWJsaWMgY2FwdHVyZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF0dGFjaGVkTWVzaCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcXVlc3RDYXB0dXJlKHRoaXMuYXR0YWNoZWRNZXNoLnVuaXF1ZUlkLnRvU3RyaW5nKCksIHRoaXMuX2NhcHR1cmVDYWxsYmFjaywgdGhpcy5fcmVsZWFzZUNhbGxiYWNrKTtcclxuICAgIH1cclxufVxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAqL1xuZXhwb3J0ICogZnJvbSBcIi4vaHRtbE1lc2gvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21zZGZUZXh0L2luZGV4XCI7XG4iLCJpbXBvcnQgdHlwZSB7IElEaXNwb3NhYmxlLCBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB0eXBlIHsgQk1Gb250Q2hhciB9IGZyb20gXCIuL3NkZi9ibUZvbnRcIjtcclxuaW1wb3J0IHR5cGUgeyBTZGZGb250IH0gZnJvbSBcIi4vc2RmL2ZvbnRcIjtcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcblxyXG5lbnVtIENoYXJDb2RlIHtcclxuICAgIFNQQUNFID0gMzIsXHJcbiAgICBUT0ZVID0gMHhmZmZjLFxyXG59XHJcblxyXG4vKipcclxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgZm9udCBhc3NldCBmb3IgU0RGIChTaWduZWQgRGlzdGFuY2UgRmllbGQpIHJlbmRlcmluZy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBGb250QXNzZXQgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFycyA9IG5ldyBNYXA8bnVtYmVyLCBCTUZvbnRDaGFyPigpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhcnNSZWdleDogUmVnRXhwO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfa2VybmluZ3MgPSBuZXcgTWFwPG51bWJlciwgTWFwPG51bWJlciwgbnVtYmVyPj4oKTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgX2ZvbnQ6IFNkZkZvbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBmb250IHNjYWxlIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBzY2FsZTogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiB1c2VkIHRleHR1cmVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSB0ZXh0dXJlczogVGV4dHVyZVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb250QXNzZXQgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbkRhdGEgZGVmaW5lcyB0aGUgZm9udCBkYXRhIGluIEpTT04gZm9ybWF0LlxyXG4gICAgICogQHBhcmFtIHRleHR1cmVVcmwgZGVmaW5lcyB0aGUgdXJsIG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBmb3IgdGhlIGZvbnQuXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgaG9zdGluZyBzY2VuZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRlZmluaXRpb25EYXRhOiBzdHJpbmcsIHRleHR1cmVVcmw6IHN0cmluZywgc2NlbmU/OiBTY2VuZSkge1xyXG4gICAgICAgIHRoaXMuX2ZvbnQgPSBKU09OLnBhcnNlKGRlZmluaXRpb25EYXRhKSBhcyBTZGZGb250O1xyXG4gICAgICAgIC8vIFNvIGZhciB3ZSBvbmx5IGNvbnNpZGVyIG9uZSBwYWdlXHJcbiAgICAgICAgdGhpcy5fZm9udC5wYWdlcyA9IFt0ZXh0dXJlVXJsXTtcclxuXHJcbiAgICAgICAgdGhpcy5fZm9udC5jaGFycy5mb3JFYWNoKChjaGFyKSA9PiB0aGlzLl9jaGFycy5zZXQoY2hhci5pZCwgY2hhcikpO1xyXG4gICAgICAgIHRoaXMuX2ZvbnQua2VybmluZ3MuZm9yRWFjaCgoa2VybmluZykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3VibWFwID0gdGhpcy5fa2VybmluZ3MuZ2V0KGtlcm5pbmcuZmlyc3QpO1xyXG4gICAgICAgICAgICBpZiAoIXN1Ym1hcCkge1xyXG4gICAgICAgICAgICAgICAgc3VibWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2VybmluZ3Muc2V0KGtlcm5pbmcuZmlyc3QsIHN1Ym1hcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VibWFwLnNldChrZXJuaW5nLnNlY29uZCwga2VybmluZy5hbW91bnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NoYXJzUmVnZXggPSBuZXcgUmVnRXhwKGBbJHt0aGlzLl9mb250LmNoYXJzLm1hcCgoYykgPT4gYy5jaGFyLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCBcIlxcXFwkJlwiKSkuam9pbihcIlwiKX1dYCwgXCJnXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl91cGRhdGVGYWxsYmFja3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2FsZSA9IDEgLyB0aGlzLl9mb250LmluZm8uc2l6ZTtcclxuICAgICAgICB0aGlzLnRleHR1cmVzID0gdGhpcy5fZm9udC5wYWdlcy5tYXAoKHBhZ2UpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKHBhZ2UsIHNjZW5lLCB7IG5vTWlwbWFwOiBmYWxzZSwgaW52ZXJ0WTogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIHRleHR1cmUuYW5pc290cm9waWNGaWx0ZXJpbmdMZXZlbCA9IDE2O1xyXG4gICAgICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgdGV4dHVyZSBvZiB0aGlzLnRleHR1cmVzKSB7XHJcbiAgICAgICAgICAgIHRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRleHR1cmVzLmxlbmd0aCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlRmFsbGJhY2tzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hhcnMuaGFzKENoYXJDb2RlLlNQQUNFKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFycy5zZXQoQ2hhckNvZGUuU1BBQ0UsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBDaGFyQ29kZS5TUEFDRSxcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICB4b2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICAgICAgeW9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgIHhhZHZhbmNlOiB0aGlzLl9mb250LmluZm8uc2l6ZSAqIDAuNSxcclxuICAgICAgICAgICAgICAgIHBhZ2U6IC0xLFxyXG4gICAgICAgICAgICAgICAgY2hubDogLTEsXHJcbiAgICAgICAgICAgICAgICBpbmRleDogLTEsXHJcbiAgICAgICAgICAgICAgICBjaGFyOiBcIiBcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NoYXJzLmhhcyhDaGFyQ29kZS5UT0ZVKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFycy5zZXQoQ2hhckNvZGUuVE9GVSwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IENoYXJDb2RlLlRPRlUsXHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9mb250LmluZm8uc2l6ZSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fZm9udC5pbmZvLnNpemUsXHJcbiAgICAgICAgICAgICAgICB4b2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICAgICAgeW9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgIHhhZHZhbmNlOiB0aGlzLl9mb250LmluZm8uc2l6ZSAqIDAuNSxcclxuICAgICAgICAgICAgICAgIHBhZ2U6IC0xLFxyXG4gICAgICAgICAgICAgICAgY2hubDogLTEsXHJcbiAgICAgICAgICAgICAgICBpbmRleDogLTEsXHJcbiAgICAgICAgICAgICAgICBjaGFyOiBcIu+/v1wiLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHVibGljIF9nZXRDaGFyKGNoYXJDb2RlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnMuZ2V0KGNoYXJDb2RlKSB8fCB0aGlzLl9jaGFycy5nZXQoQ2hhckNvZGUuVE9GVSkhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfZ2V0S2VybmluZyhmaXJzdDogbnVtYmVyLCBzZWNvbmQ6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9rZXJuaW5ncy5nZXQoZmlyc3QpPy5nZXQoc2Vjb25kKSB8fCAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfdW5zdXBwb3J0ZWRDaGFycyh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKHRoaXMuX2NoYXJzUmVnZXgsIFwiXCIpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmV4cG9ydCAqIGZyb20gXCIuL2ZvbnRBc3NldFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9wYXJhZ3JhcGhPcHRpb25zXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRSZW5kZXJlclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9zZGYvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vc2hhZGVycy9tc2RmLnZlcnRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9zaGFkZXJzL21zZGYuZnJhZ21lbnRcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vc2hhZGVyc1dHU0wvbXNkZi52ZXJ0ZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vc2hhZGVyc1dHU0wvbXNkZi5mcmFnbWVudFwiO1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXHJcblxyXG5pbXBvcnQgdHlwZSB7IElWZWN0b3IyTGlrZSB9IGZyb20gXCJjb3JlL01hdGhzXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCB0eXBlIFBhcmFncmFwaE9wdGlvbnMgPSB7XHJcbiAgICBtYXhXaWR0aDogbnVtYmVyO1xyXG4gICAgbGluZUhlaWdodDogbnVtYmVyO1xyXG4gICAgbGV0dGVyU3BhY2luZzogbnVtYmVyO1xyXG4gICAgdGFiU2l6ZTogbnVtYmVyO1xyXG4gICAgd2hpdGVTcGFjZTogLyogJ25vcm1hbCcgfCAnbm93cmFwJyB8ICdwcmUnIHwgJ3ByZS13cmFwJyB8ICovIFwicHJlLWxpbmVcIiAvKiB8ICdicmVhay1zcGFjZXMnKi87XHJcbiAgICB0ZXh0QWxpZ246IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJjZW50ZXJcIiAvKiB8ICdqdXN0aWZ5JyovO1xyXG4gICAgdHJhbnNsYXRlOiBJVmVjdG9yMkxpa2UgfCB1bmRlZmluZWQ7XHJcbn07XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjb25zdCBEZWZhdWx0UGFyYWdyYXBoT3B0aW9uczogUGFyYWdyYXBoT3B0aW9ucyA9IHtcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eSxcclxuICAgIGxpbmVIZWlnaHQ6IDEsXHJcbiAgICBsZXR0ZXJTcGFjaW5nOiAxLFxyXG4gICAgdGFiU2l6ZTogNCxcclxuICAgIHdoaXRlU3BhY2U6IFwicHJlLWxpbmVcIixcclxuICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgIHRyYW5zbGF0ZTogeyB4OiAtMC41LCB5OiAtMC41IH0sXHJcbn07XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG4vKipcclxuICogSG9sZHMgaW5mb3JtYXRpb24gb24gaG93IHRoZSBmb250IHdhcyBnZW5lcmF0ZWQuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCTUZvbnRJbmZvID0ge1xyXG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmb250ICovXHJcbiAgICBmYWNlOiBzdHJpbmc7XHJcbiAgICAvKiogVGhlIHNpemUgb2YgdGhlIGZvbnQgKi9cclxuICAgIHNpemU6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgZm9udCBpcyBib2xkICovXHJcbiAgICBib2xkOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIGZvbnQgaXMgaXRhbGljICovXHJcbiAgICBpdGFsaWM6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgY2hhcnNldCBvZiB0aGUgZm9udCAqL1xyXG4gICAgY2hhcnNldDogc3RyaW5nW107XHJcbiAgICAvKiogVGhlIGNoYXJzZXQgaXMgdW5pY29kZSAgKi9cclxuICAgIHVuaWNvZGU6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgZm9udCBoZWlnaHQgc3RyZXRjaCBpbiBwZXJjZW50YWdlLiAxMDAlIG1lYW5zIG5vIHN0cmV0Y2guICovXHJcbiAgICBzdHJldGNoSDogbnVtYmVyO1xyXG4gICAgLyoqIFNldCB0byAxIGlmIHNtb290aGluZyB3YXMgdHVybmVkIG9uLiAqL1xyXG4gICAgc21vb3RoOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIHN1cGVyc2FtcGxpbmcgbGV2ZWwgdXNlZC4gMSBtZWFucyBubyBzdXBlcnNhbXBsaW5nIHdhcyB1c2VkLiAqL1xyXG4gICAgYWE6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgcGFkZGluZyBmb3IgZWFjaCBjaGFyYWN0ZXIgKHVwLCByaWdodCwgZG93biwgbGVmdCkuICovXHJcbiAgICBwYWRkaW5nOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcclxuICAgIC8qKiBUaGUgc3BhY2luZyBmb3IgZWFjaCBjaGFyYWN0ZXIgKGhvcml6b250YWwsIHZlcnRpY2FsKS4gKi9cclxuICAgIHNwYWNpbmc6IFtudW1iZXIsIG51bWJlcl07XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvdXRsaW5lIHRoaWNrbmVzcyBmb3IgdGhlIGNoYXJhY3RlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFyayBtaXNzaW5nIGluIG1zZGYtYm1mb250LXhtbFxyXG4gICAgICovXHJcbiAgICBvdXRsaW5lPzogbnVtYmVyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEhvbGRzIGluZm9ybWF0aW9uIGNvbW1vbiB0byBhbGwgY2hhcmFjdGVycy5cclxuICovXHJcbmV4cG9ydCB0eXBlIEJNRm9udENvbW1vbiA9IHtcclxuICAgIC8qKiBEaXN0YW5jZSBpbiBwaXhlbHMgYmV0d2VlbiBlYWNoIGxpbmUgb2YgdGV4dCAqL1xyXG4gICAgbGluZUhlaWdodDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgcGl4ZWxzIGZyb20gdGhlIGFic29sdXRlIHRvcCBvZiB0aGUgbGluZSB0byB0aGUgYmFzZSBvZiB0aGUgY2hhcmFjdGVycyAqL1xyXG4gICAgYmFzZTogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZSwgbm9ybWFsbHkgdXNlZCB0byBzY2FsZSB0aGUgeCBwb3Mgb2YgdGhlIGNoYXJhY3RlciBpbWFnZSAqL1xyXG4gICAgc2NhbGVXOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZSwgbm9ybWFsbHkgdXNlZCB0byBzY2FsZSB0aGUgeSBwb3Mgb2YgdGhlIGNoYXJhY3RlciBpbWFnZSAqL1xyXG4gICAgc2NhbGVIOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgZm9udCAqL1xyXG4gICAgcGFnZXM6IG51bWJlcjtcclxuICAgIC8qKiBTZXQgdG8gMSBpZiB0aGUgbW9ub2Nocm9tZSBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBwYWNrZWQgaW50byBlYWNoIG9mIHRoZSB0ZXh0dXJlIGNoYW5uZWxzLiBJbiB0aGlzIGNhc2UgYWxwaGFDaG5sIGRlc2NyaWJlcyB3aGF0IGlzIHN0b3JlZCBpbiBlYWNoIGNoYW5uZWwuICovXHJcbiAgICBwYWNrZWQ6IG51bWJlcjtcclxuICAgIC8qKiBTZXQgdG8gMCBpZiB0aGUgY2hhbm5lbCBob2xkcyB0aGUgZ2x5cGggZGF0YSwgMSBpZiBpdCBob2xkcyB0aGUgb3V0bGluZSwgMiBpZiBpdCBob2xkcyB0aGUgZ2x5cGggYW5kIHRoZSBvdXRsaW5lLCAzIGlmIGl0cyBzZXQgdG8gemVybywgYW5kIDQgaWYgaXRzIHNldCB0byBvbmUuICovXHJcbiAgICBhbHBoYUNobmw6IG51bWJlcjtcclxuICAgIC8qKiBTZXQgdG8gMCBpZiB0aGUgY2hhbm5lbCBob2xkcyB0aGUgZ2x5cGggZGF0YSwgMSBpZiBpdCBob2xkcyB0aGUgb3V0bGluZSwgMiBpZiBpdCBob2xkcyB0aGUgZ2x5cGggYW5kIHRoZSBvdXRsaW5lLCAzIGlmIGl0cyBzZXQgdG8gemVybywgYW5kIDQgaWYgaXRzIHNldCB0byBvbmUuICovXHJcbiAgICByZWRDaG5sOiBudW1iZXI7XHJcbiAgICAvKiogU2V0IHRvIDAgaWYgdGhlIGNoYW5uZWwgaG9sZHMgdGhlIGdseXBoIGRhdGEsIDEgaWYgaXQgaG9sZHMgdGhlIG91dGxpbmUsIDIgaWYgaXQgaG9sZHMgdGhlIGdseXBoIGFuZCB0aGUgb3V0bGluZSwgMyBpZiBpdHMgc2V0IHRvIHplcm8sIGFuZCA0IGlmIGl0cyBzZXQgdG8gb25lLiAqL1xyXG4gICAgZ3JlZW5DaG5sOiBudW1iZXI7XHJcbiAgICAvKiogU2V0IHRvIDAgaWYgdGhlIGNoYW5uZWwgaG9sZHMgdGhlIGdseXBoIGRhdGEsIDEgaWYgaXQgaG9sZHMgdGhlIG91dGxpbmUsIDIgaWYgaXQgaG9sZHMgdGhlIGdseXBoIGFuZCB0aGUgb3V0bGluZSwgMyBpZiBpdHMgc2V0IHRvIHplcm8sIGFuZCA0IGlmIGl0cyBzZXQgdG8gb25lLiAqL1xyXG4gICAgYmx1ZUNobmw6IG51bWJlcjtcclxufTtcclxuXHJcbi8qKiBOYW1lIG9mIGEgdGV4dHVyZSBmaWxlLiBUaGVyZSBpcyBvbmUgZm9yIGVhY2ggcGFnZSBpbiB0aGUgZm9udC4gKi9cclxuZXhwb3J0IHR5cGUgQk1Gb250UGFnZXMgPSB7XHJcbiAgICBbaWQ6IG51bWJlcl06IHN0cmluZztcclxufSAmIEFycmF5PHN0cmluZz47XHJcblxyXG4vKipcclxuICogRGVzY3JpYmVzIGEgc2luZ2xlIGNoYXJhY3RlciBpbiB0aGUgZm9udFxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQk1Gb250Q2hhciA9IHtcclxuICAgIC8qKiBDaGFyYWN0ZXIgaWQgKGNoYXJDb2RlKSAqL1xyXG4gICAgaWQ6IG51bWJlcjtcclxuICAgIC8qKiBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgaW1hZ2UgaW4gdGhlIHRleHR1cmUuICovXHJcbiAgICB4OiBudW1iZXI7XHJcbiAgICAvKiogUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBpbWFnZSBpbiB0aGUgdGV4dHVyZSAqL1xyXG4gICAgeTogbnVtYmVyO1xyXG4gICAgLyoqIFdpZHRoIG9mIHRoZSBjaHJhY3RlciBpbWFnZSBpbiB0aGUgdGV4dHVyZSAqL1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxuICAgIC8qKiBIZWlnaHQgb2YgdGhlIGNocmFjdGVyIGltYWdlIGluIHRoZSB0ZXh0dXJlICovXHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIC8qKiBIb3Jpem9udGFsIG9mZnNldCB0byBiZSBhcHBsaWVkIG9uIHNjcmVlbiAqL1xyXG4gICAgeG9mZnNldDogbnVtYmVyO1xyXG4gICAgLyoqIFZlcnRpY2FsIG9mZnNldCB0byBiZSBhcHBsaWVkIG9uIHNjcmVlbiAqL1xyXG4gICAgeW9mZnNldDogbnVtYmVyO1xyXG4gICAgLyoqIEhvcml6b250YWwgYWR2YW5jZSBhZnRlciB0aGUgY2hhcmFjdGVyICovXHJcbiAgICB4YWR2YW5jZTogbnVtYmVyO1xyXG4gICAgLyoqIFBhZ2UgaW5kZXggd2hlcmUgdGhlIGNoYXJhY3RlciBpbWFnZSBpcyBmb3VuZCAqL1xyXG4gICAgcGFnZTogbnVtYmVyO1xyXG4gICAgLyoqIFRleHR1cmUgY2hhbm5lbCB3aGVyZSB0aGUgY2hyYWN0ZXIgaW1hZ2UgaXMgZm91bmRcclxuICAgICAqIC0gMSA9IGJsdWVcclxuICAgICAqIC0gMiA9IGdyZWVuXHJcbiAgICAgKiAtIDMgPSByZWRcclxuICAgICAqIC0gOCA9IGFscGhhXHJcbiAgICAgKiAtIDE1ID0gYWxsIGNoYW5uZWxzXHJcbiAgICAgKi9cclxuICAgIGNobmw6IG51bWJlcjtcclxufSAmIEJNRm9udENoYXJFeHRyYTtcclxuXHJcbi8qKlxyXG4gKiBhZGRpdGlvbmFsIGNvbnRleHQgZnJvbSBtc2RmLWJtZm9udC14bWxcclxuICovXHJcbmV4cG9ydCB0eXBlIEJNRm9udENoYXJFeHRyYSA9IHtcclxuICAgIC8qKiBpbmRleCBvZiBvcGVudHlwZS5qcyBnbHlwaCAqL1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIC8qKiBhY3R1YWwgY2hhcmFjdGVyKi9cclxuICAgIGNoYXI6IHN0cmluZztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGUga2VybmluZyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGFkanVzdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiBjZXJ0YWluIGNoYXJhY3RlcnMsIGUuZy4gc29tZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBwbGFjZWQgY2xvc2VyIHRvIGVhY2ggb3RoZXIgdGhhbiBvdGhlcnMuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCTUZvbnRLZXJuaW5nID0ge1xyXG4gICAgLyoqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaWQuICovXHJcbiAgICBmaXJzdDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBzZWNvbmQgY2hhcmFjdGVyIGlkLiAqL1xyXG4gICAgc2Vjb25kOiBudW1iZXI7XHJcbiAgICAvKiogSG93IG11Y2ggdGhlIHggcG9zaXRpb24gc2hvdWxkIGJlIGFkanVzdGVkIHdoZW4gZHJhd2luZyB0aGUgc2Vjb25kIGNoYXJhY3RlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGZpcnN0LiAqL1xyXG4gICAgYW1vdW50OiBudW1iZXI7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29tcGF0aWJsZSB3aXRoIFttc2RmLWJtZm9udC14bWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9zb2lteS9tc2RmLWJtZm9udC14bWwpXHJcbiAqIEBzZWUgaHR0cHM6Ly93d3cuYW5nZWxjb2RlLmNvbS9wcm9kdWN0cy9ibWZvbnQvZG9jL2ZpbGVfZm9ybWF0Lmh0bWxcclxuICovXHJcbmV4cG9ydCB0eXBlIEJNRm9udCA9IHtcclxuICAgIC8qKiB7QGluaGVyaXREb2MgQk1Gb250SW5mb30gKi9cclxuICAgIGluZm86IEJNRm9udEluZm87XHJcbiAgICAvKioge0Bpbmhlcml0RG9jIEJNRm9udENvbW1vbn0gKi9cclxuICAgIGNvbW1vbjogQk1Gb250Q29tbW9uO1xyXG4gICAgLyoqIHtAaW5oZXJpdERvYyBCTUZvbnRQYWdlc30gKi9cclxuICAgIHBhZ2VzOiBCTUZvbnRQYWdlcztcclxuICAgIC8qKiB7QGluaGVyaXREb2MgQk1Gb250Q2hhcn0gKi9cclxuICAgIGNoYXJzOiBCTUZvbnRDaGFyW107XHJcbiAgICAvKioge0Bpbmhlcml0RG9jIEJNRm9udEtlcm5pbmd9ICovXHJcbiAgICBrZXJuaW5nczogQk1Gb250S2VybmluZ1tdO1xyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXHJcbmltcG9ydCB0eXBlIHsgQk1Gb250IH0gZnJvbSBcIi4vYm1Gb250XCI7XHJcblxyXG5leHBvcnQgdHlwZSBTZGZGb250RGlzdGFuY2VGaWVsZCA9IHtcclxuICAgIGZpZWxkVHlwZTogXCJzZGZcIiB8IFwibXNkZlwiO1xyXG4gICAgZGlzdGFuY2VSYW5nZTogbnVtYmVyO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgU2RmRm9udCA9IEJNRm9udCAmIHtcclxuICAgIGRpc3RhbmNlRmllbGQ6IFNkZkZvbnREaXN0YW5jZUZpZWxkO1xyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXHJcbmltcG9ydCB0eXBlIHsgQk1Gb250Q2hhciB9IGZyb20gXCIuL2JtRm9udFwiO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgdHlwZSBTZGZHbHlwaCA9IHtcclxuICAgIGNoYXI6IEJNRm9udENoYXI7XHJcbiAgICAvKiogaW5kZXggb2YgdGhlIGxpbmUgKi9cclxuICAgIGxpbmU6IG51bWJlcjtcclxuICAgIC8qKiBwb3NpdGlvbiB3aXRoaW4gdGhlIGxpbmUgKi9cclxuICAgIHBvc2l0aW9uOiBudW1iZXI7XHJcbiAgICB4OiBudW1iZXI7XHJcbiAgICB5OiBudW1iZXI7XHJcbn07XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2JtRm9udFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZm9udFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2x5cGhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BhcmFncmFwaFwiO1xuIiwiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xyXG5pbXBvcnQgdHlwZSB7IFNkZkdseXBoIH0gZnJvbSBcIi4vZ2x5cGhcIjtcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IHR5cGUgU2RmVGV4dExpbmUgPSB7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbiAgICBnbHlwaHM6IFNkZkdseXBoW107XHJcbiAgICBzdGFydDogbnVtYmVyO1xyXG4gICAgZW5kOiBudW1iZXI7XHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBiYWJ5bG9uanMvYXZhaWxhYmxlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIGpzZG9jL3JlcXVpcmUtanNkb2MgKi9cclxuaW1wb3J0IHR5cGUgeyBGb250QXNzZXQgfSBmcm9tIFwiLi4vZm9udEFzc2V0XCI7XHJcbmltcG9ydCB7IERlZmF1bHRQYXJhZ3JhcGhPcHRpb25zLCB0eXBlIFBhcmFncmFwaE9wdGlvbnMgfSBmcm9tIFwiLi4vcGFyYWdyYXBoT3B0aW9uc1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJNRm9udENoYXIgfSBmcm9tIFwiLi9ibUZvbnRcIjtcclxuaW1wb3J0IHR5cGUgeyBTZGZHbHlwaCB9IGZyb20gXCIuL2dseXBoXCI7XHJcbmltcG9ydCB0eXBlIHsgU2RmVGV4dExpbmUgfSBmcm9tIFwiLi9saW5lXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTZGZUZXh0UGFyYWdyYXBoIHtcclxuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBQYXJhZ3JhcGhPcHRpb25zO1xyXG5cclxuICAgIGdldCBsaW5lSGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRBc3NldC5fZm9udC5jb21tb24ubGluZUhlaWdodCAqIHRoaXMub3B0aW9ucy5saW5lSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJlYWRvbmx5IHBhcmFncmFwaDtcclxuICAgIHJlYWRvbmx5IGxpbmVzO1xyXG4gICAgcmVhZG9ubHkgd2lkdGg7XHJcbiAgICByZWFkb25seSBoZWlnaHQ7XHJcbiAgICByZWFkb25seSBnbHlwaHM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZyxcclxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZm9udEFzc2V0OiBGb250QXNzZXQsXHJcbiAgICAgICAgb3B0aW9ucz86IFBhcnRpYWw8UGFyYWdyYXBoT3B0aW9ucz5cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHsgLi4uRGVmYXVsdFBhcmFncmFwaE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBwYXJhZ3JhcGgsIGxpbmVzLCBnbHlwaHMsIHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuX2NvbXB1dGVNZXRyaWNzKHRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFncmFwaCA9IHBhcmFncmFwaDtcclxuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XHJcbiAgICAgICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NvbXB1dGVNZXRyaWNzKHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNvbGxhcHNlZCA9IHRoaXMuX2NvbGxhcHNlKHRleHQpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrZWQgPSB0aGlzLl9icmVha0xpbmVzKGNvbGxhcHNlZCk7XHJcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGJyZWFrZWQubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmVzOiBTZGZUZXh0TGluZVtdID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRyaW1tZWQpIHtcclxuICAgICAgICAgICAgbGluZXMucHVzaCguLi50aGlzLl93cmFwKGxpbmUsIGxpbmVzLmxlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCguLi5saW5lcy5tYXAoKGxpbmUpID0+IGxpbmUud2lkdGgpKTtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmxpbmVIZWlnaHQgKiBsaW5lcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudGV4dEFsaWduICE9PSBcImxlZnRcIiB8fCB0aGlzLm9wdGlvbnMudHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudGV4dEFsaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoIC0gbGluZS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh3aWR0aCAtIGxpbmUud2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHRoaXMub3B0aW9ucy50cmFuc2xhdGUgPyB0aGlzLm9wdGlvbnMudHJhbnNsYXRlLnggKiB3aWR0aCA6IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gdGhpcy5vcHRpb25zLnRyYW5zbGF0ZSA/IHRoaXMub3B0aW9ucy50cmFuc2xhdGUueSAqIGhlaWdodCA6IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGxpbmUuZ2x5cGhzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGgueCArPSBhbmNob3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGgueCArPSB4O1xyXG4gICAgICAgICAgICAgICAgICAgIGdseXBoLnkgKz0geTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBnbHlwaHMgPSBsaW5lcy5mbGF0TWFwKChsaW5lKSA9PiBsaW5lLmdseXBocyk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHBhcmFncmFwaDogdHJpbW1lZC5qb2luKFwiXFxuXCIpLFxyXG4gICAgICAgICAgICBsaW5lcyxcclxuICAgICAgICAgICAgZ2x5cGhzLFxyXG4gICAgICAgICAgICB3aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0LFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYnJlYWtMaW5lcyh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGV4dC5zcGxpdChcIlxcblwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jb2xsYXBzZSh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHQvZywgXCIgXCIucmVwZWF0KHRoaXMub3B0aW9ucy50YWJTaXplKSkucmVwbGFjZSgvICsvZywgXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3dyYXAodGV4dDogc3RyaW5nLCBsaW5lT2Zmc2V0ID0gMCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5PFNkZlRleHRMaW5lPigpO1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudExpbmUgPSBsaW5lT2Zmc2V0O1xyXG4gICAgICAgIGxldCBjdXJyZW50R2x5cGhzID0gbmV3IEFycmF5PFNkZkdseXBoPigpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Q3Vyc29yID0gMDtcclxuICAgICAgICBsZXQgY3VycmVudFdpZHRoID0gMDtcclxuICAgICAgICBsZXQgbGFzdENoYXI6IEJNRm9udENoYXIgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcclxuICAgICAgICBsZXQgZW5kID0gc3RhcnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHB1c2hDdXJyZW50TGluZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgbGluZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LnNsaWNlKHN0YXJ0LCBlbmQpLFxyXG4gICAgICAgICAgICAgICAgZ2x5cGhzOiBjdXJyZW50R2x5cGhzLFxyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgZW5kOiBlbmQsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogY3VycmVudFdpZHRoLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgaSA9IGVuZDtcclxuICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSB0aGlzLmZvbnRBc3NldC5fZ2V0Q2hhcihjaGFyQ29kZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJXaWR0aCA9IGNoYXIud2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGtlcm5pbmcgPSBsYXN0Q2hhciA/IHRoaXMuZm9udEFzc2V0Ll9nZXRLZXJuaW5nKGxhc3RDaGFyLmlkLCBjaGFyLmlkKSA6IDA7XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50Q3Vyc29yICs9IGtlcm5pbmc7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1dpZHRoID0gY3VycmVudEN1cnNvciArIGNoYXJXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgY3Vyc29yUHJvZ3Jlc3MgPSBjaGFyLnhhZHZhbmNlICsgdGhpcy5vcHRpb25zLmxldHRlclNwYWNpbmc7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IGN1cnJlbnRDdXJzb3IgKyBjdXJzb3JQcm9ncmVzcztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEJyZWFrID0gbmV4dFBvc2l0aW9uID4gdGhpcy5vcHRpb25zLm1heFdpZHRoIHx8IG5ld1dpZHRoID4gdGhpcy5vcHRpb25zLm1heFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3VsZEJyZWFrKSB7XHJcbiAgICAgICAgICAgICAgICBwdXNoQ3VycmVudExpbmUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZSsrO1xyXG4gICAgICAgICAgICAgICAgbGFzdENoYXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yID0gMDtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICBzdGFydCA9IGVuZDtcclxuICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgMTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRHbHlwaHMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgeCA9IGN1cnJlbnRDdXJzb3I7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjdXJyZW50TGluZSAqIHRoaXMubGluZUhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGN1cnJlbnRHbHlwaHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBjaGFyLFxyXG4gICAgICAgICAgICAgICAgbGluZTogY3VycmVudExpbmUsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogY3VycmVudEdseXBocy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICB4OiB4LFxyXG4gICAgICAgICAgICAgICAgeTogeSxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNob3VsZEJyZWFrKSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0Q2hhciA9IGNoYXI7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yID0gbmV4dFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFdpZHRoID0gbmV3V2lkdGg7XHJcbiAgICAgICAgICAgICAgICBlbmQrKztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRDdXJzb3IgPSBjdXJzb3JQcm9ncmVzcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRHbHlwaHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAobGFzdENoYXIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRXaWR0aCArPSBsYXN0Q2hhci54YWR2YW5jZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwdXNoQ3VycmVudExpbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaW5lcztcclxuICAgIH1cclxufVxyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJtc2RmUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGAjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZVxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIGZvbnRBdGxhczt1bmlmb3JtIHZlYzQgdUNvbG9yO3VuaWZvcm0gdmVjNCB1U3Ryb2tlQ29sb3I7dW5pZm9ybSBmbG9hdCB1U3Ryb2tlSW5zZXRXaWR0aDt1bmlmb3JtIGZsb2F0IHVTdHJva2VPdXRzZXRXaWR0aDt1bmlmb3JtIGZsb2F0IHRoaWNrbmVzczt2YXJ5aW5nIHZlYzIgYXRsYXNVVjtmbG9hdCBtZWRpYW4odmVjMyBtc2RmKSB7cmV0dXJuIG1heChtaW4obXNkZi5yLG1zZGYuZyksbWluKG1heChtc2RmLnIsbXNkZi5nKSxtc2RmLmIpKTt9XG52b2lkIG1haW4odm9pZClcbnt2ZWMzIHM9dGV4dHVyZTJEKGZvbnRBdGxhcyxhdGxhc1VWKS5yZ2I7ZmxvYXQgc2lnRGlzdD1tZWRpYW4ocyktMC41K3RoaWNrbmVzcztmbG9hdCBhbHBoYT1jbGFtcChzaWdEaXN0L2Z3aWR0aChzaWdEaXN0KSswLjUsMC4wLDEuMCk7ZmxvYXQgc2lnRGlzdE91dHNldD1zaWdEaXN0K3VTdHJva2VPdXRzZXRXaWR0aCowLjU7ZmxvYXQgc2lnRGlzdEluc2V0PXNpZ0Rpc3QtdVN0cm9rZUluc2V0V2lkdGgqMC41O2Zsb2F0IG91dHNldD1jbGFtcChzaWdEaXN0T3V0c2V0L2Z3aWR0aChzaWdEaXN0T3V0c2V0KSswLjUsMC4wLDEuMCk7ZmxvYXQgaW5zZXQ9MS4wLWNsYW1wKHNpZ0Rpc3RJbnNldC9md2lkdGgoc2lnRGlzdEluc2V0KSswLjUsMC4wLDEuMCk7ZmxvYXQgYm9yZGVyPW91dHNldCppbnNldDt2ZWM0IGZpbGxlZEZyYWdDb2xvcj12ZWM0KHVDb2xvci5yZ2IsYWxwaGEqdUNvbG9yLmEpO3ZlYzQgc3Ryb2tlZEZyYWdDb2xvcj12ZWM0KHVTdHJva2VDb2xvci5yZ2IsYm9yZGVyKnVTdHJva2VDb2xvci5hKTtnbF9GcmFnQ29sb3I9bWl4KGZpbGxlZEZyYWdDb2xvcixzdHJva2VkRnJhZ0NvbG9yLGJvcmRlcik7fWA7XG4vLyBTaWRlZWZmZWN0XG5pZiAoIVNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSkge1xuICAgIFNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBtc2RmUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwibXNkZlZlcnRleFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYCNkZWZpbmUgQklMTEJPQVJEIDFcbiNkZWZpbmUgQklMTEJPQVJEU0NSRUVOUFJPSkVDVEVEIDJcbmF0dHJpYnV0ZSB2ZWMyIG9mZnNldHM7YXR0cmlidXRlIHZlYzQgd29ybGQwO2F0dHJpYnV0ZSB2ZWM0IHdvcmxkMTthdHRyaWJ1dGUgdmVjNCB3b3JsZDI7YXR0cmlidXRlIHZlYzQgd29ybGQzO2F0dHJpYnV0ZSB2ZWM0IHV2czt1bmlmb3JtIG1hdDQgdHJhbnNmb3JtO3VuaWZvcm0gbWF0NCBwYXJlbnRXb3JsZDt1bmlmb3JtIG1hdDQgdmlldzt1bmlmb3JtIG1hdDQgcHJvamVjdGlvbjt1bmlmb3JtIHZlYzMgY2VudGVyO3VuaWZvcm0gaW50IG1vZGU7dmFyeWluZyB2ZWMyIGF0bGFzVVY7dm9pZCBtYWluKHZvaWQpIHttYXQ0IHdvcmxkPW1hdDQod29ybGQwLHdvcmxkMSx3b3JsZDIsd29ybGQzKTt2ZWM0IHdvcmxkUG9zPXRyYW5zZm9ybSood29ybGQqdmVjNChvZmZzZXRzLnh5LXZlYzIoMC41LDAuNSksMC4sMS4wKSk7aWYgKG1vZGU+PUJJTExCT0FSRCkge3ZlYzMgdmlld1Bvcz0odmlldypwYXJlbnRXb3JsZCp2ZWM0KDAuLDAuLDAuLDEuMCkpLnh5ejsgXG5pZiAobW9kZT09QklMTEJPQVJEU0NSRUVOUFJPSkVDVEVEKSB7dmlld1Bvcy54Lz12aWV3UG9zLno7dmlld1Bvcy55Lz12aWV3UG9zLno7dmlld1Bvcy56PTEuMDt9XG5nbF9Qb3NpdGlvbj1wcm9qZWN0aW9uKnZlYzQodmlld1Bvcyt3b3JsZFBvcy54eXosMS4wKTsgfSBlbHNlIHt2ZWMzIHZpZXdQb3M9KHZpZXcqcGFyZW50V29ybGQqd29ybGRQb3MpLnh5ejsgXG5nbF9Qb3NpdGlvbj1wcm9qZWN0aW9uKnZlYzQodmlld1BvcywxLjApOyB9XG5hdGxhc1VWPXZlYzIodXZzLngrb2Zmc2V0cy54KnV2cy56LHV2cy55KygxLjAtb2Zmc2V0cy55KSp1dnMudyk7fWA7XG4vLyBTaWRlZWZmZWN0XG5pZiAoIVNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSkge1xuICAgIFNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBtc2RmVmVydGV4U2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcIm1zZGZQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHZhciBmb250QXRsYXM6IHRleHR1cmVfMmQ8ZjMyPjt2YXIgZm9udEF0bGFzU2FtcGxlcjogc2FtcGxlcjt1bmlmb3JtIHVDb2xvcjogdmVjNGY7dW5pZm9ybSB0aGlja25lc3M6IGYzMjt1bmlmb3JtIHVTdHJva2VDb2xvcjogdmVjNGY7dW5pZm9ybSB1U3Ryb2tlSW5zZXRXaWR0aDogZjMyO3VuaWZvcm0gdVN0cm9rZU91dHNldFdpZHRoOiBmMzI7dmFyeWluZyBhdGxhc1VWOiB2ZWMyZjtmbiBtZWRpYW4obXNkZjogdmVjMzxmMzI+KS0+ZjMyIHtsZXQgYT1taW4obXNkZi5yLG1zZGYuZyk7bGV0IGI9bWF4KG1zZGYucixtc2RmLmcpO3JldHVybiBtYXgoYSxtaW4oYixtc2RmLmIpKTt9XG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IEZyYWdtZW50SW5wdXRzKS0+RnJhZ21lbnRPdXRwdXRzIHtsZXQgcz10ZXh0dXJlU2FtcGxlKGZvbnRBdGxhcyxmb250QXRsYXNTYW1wbGVyLGlucHV0LmF0bGFzVVYpLnJnYjtsZXQgc2lnRGlzdD1tZWRpYW4ocyktMC41K3VuaWZvcm1zLnRoaWNrbmVzcztsZXQgYWZ3aWR0aD1sZW5ndGgodmVjMjxmMzI+KGRwZHgoc2lnRGlzdCksZHBkeShzaWdEaXN0KSkpO2xldCBhbHBoYT1jbGFtcChzaWdEaXN0L2Fmd2lkdGgrMC41LDAuMCwxLjApO2xldCBzaWdEaXN0T3V0c2V0PXNpZ0Rpc3QrdW5pZm9ybXMudVN0cm9rZU91dHNldFdpZHRoKjAuNTtsZXQgc2lnRGlzdEluc2V0PXNpZ0Rpc3QtdW5pZm9ybXMudVN0cm9rZUluc2V0V2lkdGgqMC41O2xldCBhZndpZHRoT3V0c2V0PWxlbmd0aCh2ZWMyPGYzMj4oZHBkeChzaWdEaXN0T3V0c2V0KSxkcGR5KHNpZ0Rpc3RPdXRzZXQpKSk7bGV0IGFmd2lkdGhJbnNldD1sZW5ndGgodmVjMjxmMzI+KGRwZHgoc2lnRGlzdEluc2V0KSxkcGR5KHNpZ0Rpc3RJbnNldCkpKTtsZXQgb3V0c2V0PWNsYW1wKHNpZ0Rpc3RPdXRzZXQvYWZ3aWR0aE91dHNldCswLjUsMC4wLDEuMCk7bGV0IGluc2V0PTEuMC1jbGFtcChzaWdEaXN0SW5zZXQvYWZ3aWR0aEluc2V0KzAuNSwwLjAsMS4wKTtsZXQgYm9yZGVyPW91dHNldCppbnNldDtsZXQgZmlsbGVkRnJhZ0NvbG9yPXZlYzQ8ZjMyPih1bmlmb3Jtcy51Q29sb3IucmdiLGFscGhhKnVuaWZvcm1zLnVDb2xvci5hKTtsZXQgc3Ryb2tlZEZyYWdDb2xvcj12ZWM0PGYzMj4odW5pZm9ybXMudVN0cm9rZUNvbG9yLnJnYixib3JkZXIqdW5pZm9ybXMudVN0cm9rZUNvbG9yLmEpO2ZyYWdtZW50T3V0cHV0cy5jb2xvcj1taXgoZmlsbGVkRnJhZ0NvbG9yLHN0cm9rZWRGcmFnQ29sb3IsYm9yZGVyKTt9YDtcbi8vIFNpZGVlZmZlY3RcbmlmICghU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlV0dTTFtuYW1lXSkge1xuICAgIFNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVdHU0xbbmFtZV0gPSBzaGFkZXI7XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgbXNkZlBpeGVsU2hhZGVyV0dTTCA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJtc2RmVmVydGV4U2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgI2RlZmluZSBCSUxMQk9BUkQgMVxuI2RlZmluZSBCSUxMQk9BUkRTQ1JFRU5QUk9KRUNURUQgMlxuYXR0cmlidXRlIG9mZnNldHM6IHZlYzJmO2F0dHJpYnV0ZSB3b3JsZDA6IHZlYzRmO2F0dHJpYnV0ZSB3b3JsZDE6IHZlYzRmO2F0dHJpYnV0ZSB3b3JsZDI6IHZlYzRmO2F0dHJpYnV0ZSB3b3JsZDM6IHZlYzRmO2F0dHJpYnV0ZSB1dnM6IHZlYzRmO3VuaWZvcm0gdHJhbnNmb3JtOiBtYXQ0eDRmO3VuaWZvcm0gcGFyZW50V29ybGQ6IG1hdDR4NGY7dW5pZm9ybSB2aWV3OiBtYXQ0eDRmO3VuaWZvcm0gcHJvamVjdGlvbjogbWF0NHg0Zjt1bmlmb3JtIG1vZGU6IHUzMjt2YXJ5aW5nIGF0bGFzVVY6IHZlYzJmO0B2ZXJ0ZXhcbmZuIG1haW4oaW5wdXQ6IFZlcnRleElucHV0cyktPkZyYWdtZW50SW5wdXRzIHtsZXQgd29ybGQ9bWF0NHg0PGYzMj4oaW5wdXQud29ybGQwLGlucHV0LndvcmxkMSxpbnB1dC53b3JsZDIsaW5wdXQud29ybGQzKTtsZXQgbG9jYWxPZmZzZXQ9dmVjNDxmMzI+KGlucHV0Lm9mZnNldHMtdmVjMjxmMzI+KDAuNSwwLjUpLDAuMCwxLjApO2xldCB3b3JsZFBvcz11bmlmb3Jtcy50cmFuc2Zvcm0qd29ybGQqbG9jYWxPZmZzZXQ7aWYgKHVuaWZvcm1zLm1vZGU+PUJJTExCT0FSRCkgeyBcbnZhciB2aWV3UG9zPSh1bmlmb3Jtcy52aWV3KnVuaWZvcm1zLnBhcmVudFdvcmxkKnZlYzRmKDAuLDAuLDAuLDEuMCkpLnh5ejtpZiAodW5pZm9ybXMubW9kZT09QklMTEJPQVJEU0NSRUVOUFJPSkVDVEVEKSB7dmlld1Bvcz12ZWMzZih2aWV3UG9zLngvdmlld1Bvcy56LHZpZXdQb3MueS92aWV3UG9zLnosMS4wKTt9IFxudmVydGV4T3V0cHV0cy5wb3NpdGlvbj11bmlmb3Jtcy5wcm9qZWN0aW9uKnZlYzQ8ZjMyPih2aWV3UG9zK3dvcmxkUG9zLnh5eiwxLjApO30gZWxzZSB7IFxubGV0IHZpZXdQb3M9KHVuaWZvcm1zLnZpZXcqdW5pZm9ybXMucGFyZW50V29ybGQqd29ybGRQb3MpLnh5ejt2ZXJ0ZXhPdXRwdXRzLnBvc2l0aW9uPXVuaWZvcm1zLnByb2plY3Rpb24qdmVjNDxmMzI+KHZpZXdQb3MsMS4wKTt9XG52ZXJ0ZXhPdXRwdXRzLmF0bGFzVVY9dmVjMjxmMzI+KFxuaW5wdXQudXZzLngraW5wdXQub2Zmc2V0cy54KmlucHV0LnV2cy56LFxuaW5wdXQudXZzLnkrKDEuMC1pbnB1dC5vZmZzZXRzLnkpKmlucHV0LnV2cy53XG4pO31gO1xuLy8gU2lkZWVmZmVjdFxuaWYgKCFTaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVXR1NMW25hbWVdKSB7XG4gICAgU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlV0dTTFtuYW1lXSA9IHNoYWRlcjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBtc2RmVmVydGV4U2hhZGVyV0dTTCA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgdHlwZSB7IFZlcnRleEJ1ZmZlciB9IGZyb20gXCJjb3JlL0J1ZmZlcnMvYnVmZmVyXCI7XHJcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJjb3JlL0J1ZmZlcnMvYnVmZmVyXCI7XHJcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RFbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL2Fic3RyYWN0RW5naW5lXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCJjb3JlL0VuZ2luZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgVGhpbkVuZ2luZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvdGhpbkVuZ2luZVwiO1xyXG5pbXBvcnQgeyBEcmF3V3JhcHBlciB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9kcmF3V3JhcHBlclwiO1xyXG5pbXBvcnQgeyBTaGFkZXJMYW5ndWFnZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9zaGFkZXJMYW5ndWFnZVwiO1xyXG5pbXBvcnQgdHlwZSB7IElEaXNwb3NhYmxlIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCB7IFNkZlRleHRQYXJhZ3JhcGggfSBmcm9tIFwiLi9zZGYvcGFyYWdyYXBoXCI7XHJcbmltcG9ydCB0eXBlIHsgRm9udEFzc2V0IH0gZnJvbSBcIi4vZm9udEFzc2V0XCI7XHJcbmltcG9ydCB0eXBlIHsgUGFyYWdyYXBoT3B0aW9ucyB9IGZyb20gXCIuL3BhcmFncmFwaE9wdGlvbnNcIjtcclxuaW1wb3J0IHsgVGhpbk1hdHJpeCB9IGZyb20gXCJjb3JlL01hdGhzL1RoaW5NYXRocy90aGluTWF0aC5tYXRyaXhcIjtcclxuaW1wb3J0IHtcclxuICAgIENvcHlNYXRyaXhUb0FycmF5LFxyXG4gICAgQ29weU1hdHJpeFRvUmVmLFxyXG4gICAgSWRlbnRpdHlNYXRyaXhUb1JlZixcclxuICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZixcclxuICAgIFNjYWxpbmdNYXRyaXhUb1JlZixcclxuICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYsXHJcbn0gZnJvbSBcImNvcmUvTWF0aHMvVGhpbk1hdGhzL3RoaW5NYXRoLm1hdHJpeC5mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHR5cGUgeyBJQ29sb3I0TGlrZSwgSU1hdHJpeExpa2UgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmxpa2VcIjtcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBOb2RlIGNsYXNzIGZyb20gQmFieWxvbi5qc1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJTm9kZUxpa2Uge1xyXG4gICAgZ2V0V29ybGRNYXRyaXgoKTogSU1hdHJpeExpa2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGFzcyB1c2VkIHRvIHJlbmRlciB0ZXh0IHVzaW5nIE1TREYgKE11bHRpLWNoYW5uZWwgU2lnbmVkIERpc3RhbmNlIEZpZWxkKSB0ZWNobmlxdWVcclxuICogVGhhbmtzIGEgbG90IHRvIHRoZSB3b3JrIG9mIEJodXNoYW5fV2FnaCBhbmQgemJfc2ogZm9yIHRoZWlyIGFtYXppbmcgd29yayBvbiBNU0RGIGZvciBCYWJ5bG9uLmpzXHJcbiAqICM2UkxDV1AjMTZcclxuICogU3RhciB3YXJzIHNjcm9sbGVyOiAjNlJMQ1dQIzI5XHJcbiAqIFdpdGggbWV0cmljczogIzZSTENXUCMzNVxyXG4gKiBUaGlja25lc3M6ICNJQUJNRVojM1xyXG4gKiBTb2xhciBzeXN0ZW06ICM5WUNEWUMjOVxyXG4gKiBTdHJva2U6ICM2UkxDV1AjMzdcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUZXh0UmVuZGVyZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF91c2VWQU86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2VuZ2luZTogQWJzdHJhY3RFbmdpbmU7XHJcbiAgICBwcml2YXRlIF9zaGFkZXJMYW5ndWFnZTogU2hhZGVyTGFuZ3VhZ2U7XHJcbiAgICBwcml2YXRlIF92ZXJ0ZXhCdWZmZXJzOiB7IFtrZXk6IHN0cmluZ106IFZlcnRleEJ1ZmZlciB9ID0ge307XHJcbiAgICBwcml2YXRlIF9zcHJpdGVCdWZmZXI6IE51bGxhYmxlPEJ1ZmZlcj47XHJcbiAgICBwcml2YXRlIF93b3JsZEJ1ZmZlcjogTnVsbGFibGU8QnVmZmVyPjtcclxuICAgIHByaXZhdGUgX3V2QnVmZmVyOiBOdWxsYWJsZTxCdWZmZXI+O1xyXG4gICAgcHJpdmF0ZSBfZHJhd1dyYXBwZXJCYXNlOiBEcmF3V3JhcHBlcjtcclxuICAgIHByaXZhdGUgX3ZlcnRleEFycmF5T2JqZWN0OiBXZWJHTFZlcnRleEFycmF5T2JqZWN0O1xyXG4gICAgcHJpdmF0ZSBfZm9udDogRm9udEFzc2V0O1xyXG4gICAgcHJpdmF0ZSBfY2hhck1hdHJpY2VzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgIHByaXZhdGUgX2NoYXJVdnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgcHJpdmF0ZSBfaXNEaXJ0eSA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9iYXNlTGluZSA9IDA7XHJcblxyXG4gICAgLy8gQ2FjaGVcclxuICAgIHByaXZhdGUgX3NjYWxpbmdNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfZm9udFNjYWxlTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX29mZnNldE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGlvbk1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9iYXNlTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX3NjYWxlZE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9sb2NhbE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9maW5hbE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9saW5lTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX3BhcmVudFdvcmxkTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgY29sb3Igb2YgdGhlIHRleHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbG9yOiBJQ29sb3I0TGlrZSA9IHsgcjogMS4wLCBnOiAxLjAsIGI6IDEuMCwgYTogMS4wIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGNvbG9yIG9mIHRoZSBzdHJva2UgYXJvdW5kIHRoZSB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdHJva2VDb2xvcjogSUNvbG9yNExpa2UgPSB7IHI6IDEuMCwgZzogMS4wLCBiOiAxLjAsIGE6IDEuMCB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgc3Ryb2tlIGFyb3VuZCB0aGUgdGV4dCAoaW5zZXQpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdHJva2VJbnNldFdpZHRoID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgd2lkdGggb2YgdGhlIHN0cm9rZSBhcm91bmQgdGhlIHRleHQgKG91dHNldClcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cm9rZU91dHNldFdpZHRoID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB0ZXh0ICgwIG1lYW5zIGFzIGRlZmluZWQgaW4gdGhlIGZvbnQpXHJcbiAgICAgKiBWYWx1ZSBtdXN0IGJlIGJldHdlZW4gLTAuNSBhbmQgMC41XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0aGlja25lc3NDb250cm9sID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9wYXJlbnQ6IE51bGxhYmxlPElOb2RlTGlrZT4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBwYXJlbnQgb2YgdGhlIHRleHQgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwYXJlbnQoKTogTnVsbGFibGU8SU5vZGVMaWtlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHBhcmVudCh2YWx1ZTogTnVsbGFibGU8SU5vZGVMaWtlPikge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3RyYW5zZm9ybU1hdHJpeDogSU1hdHJpeExpa2UgPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB0cmFuc2Zvcm0gbWF0cml4IG9mIHRoZSB0ZXh0IHJlbmRlcmVyXHJcbiAgICAgKiBJdCB3aWxsIGJlIGFwcGxpZWQgaW4gdGhhdCBvcmRlcjpcclxuICAgICAqIHBhcmVudCB4IHRyYW5zZm9ybSB4IHBhcmFncmFwaCB3b3JsZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHRyYW5zZm9ybU1hdHJpeCgpOiBJTWF0cml4TGlrZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybU1hdHJpeDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRyYW5zZm9ybU1hdHJpeCh2YWx1ZTogSU1hdHJpeExpa2UpIHtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm1NYXRyaXggPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBpZiB0aGUgdGV4dCBpcyBiaWxsYm9hcmRlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNCaWxsYm9hcmQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBpZiB0aGUgdGV4dCBpcyBzY3JlZW4gcHJvamVjdGVkXHJcbiAgICAgKiBUaGlzIHdpbGwgd29yayBvbmx5IGlmIHRoZSB0ZXh0IGlzIGJpbGxib2FyZGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0JpbGxib2FyZFNjcmVlblByb2plY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHRleHQgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjaGFyYWN0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFyTWF0cmljZXMubGVuZ3RoIC8gMTY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgaWYgdGhlIHRleHQgcmVuZGVyZXIgc2hvdWxkIGlnbm9yZSB0aGUgZGVwdGggYnVmZmVyXHJcbiAgICAgKiBEZWZhdWx0IGlzIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpZ25vcmVEZXB0aEJ1ZmZlciA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZW5naW5lOiBBYnN0cmFjdEVuZ2luZSwgc2hhZGVyTGFuZ3VhZ2U6IFNoYWRlckxhbmd1YWdlID0gU2hhZGVyTGFuZ3VhZ2UuR0xTTCwgZm9udDogRm9udEFzc2V0KSB7XHJcbiAgICAgICAgdGhpcy5fZW5naW5lID0gZW5naW5lO1xyXG4gICAgICAgIHRoaXMuX3NoYWRlckxhbmd1YWdlID0gc2hhZGVyTGFuZ3VhZ2U7XHJcbiAgICAgICAgdGhpcy5fZm9udCA9IGZvbnQ7XHJcbiAgICAgICAgdGhpcy5fYmFzZUxpbmUgPSBmb250Ll9mb250LmNvbW1vbi5saW5lSGVpZ2h0ICogZm9udC5zY2FsZTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXNlVkFPID0gZW5naW5lLmdldENhcHMoKS52ZXJ0ZXhBcnJheU9iamVjdCAmJiAhZW5naW5lLmRpc2FibGVWZXJ0ZXhBcnJheU9iamVjdHM7XHJcblxyXG4gICAgICAgIC8vIE1haW4gdmVydGV4IGJ1ZmZlclxyXG4gICAgICAgIGNvbnN0IHNwcml0ZURhdGEgPSBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAxLCAwLCAwLCAxLCAxLCAxXSk7XHJcbiAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyID0gbmV3IEJ1ZmZlcihlbmdpbmUsIHNwcml0ZURhdGEsIGZhbHNlLCAyKTtcclxuICAgICAgICB0aGlzLl92ZXJ0ZXhCdWZmZXJzW1wib2Zmc2V0c1wiXSA9IHRoaXMuX3Nwcml0ZUJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJvZmZzZXRzXCIsIDAsIDIpO1xyXG5cclxuICAgICAgICAvLyBJbnN0YW5jZXNcclxuICAgICAgICB0aGlzLl9yZXNpemVCdWZmZXJzKDEyOCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVzaXplQnVmZmVycyhjYXBhY2l0eTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmxkQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3V2QnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3V2QnVmZmVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fdXZCdWZmZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIgPSBuZXcgQnVmZmVyKHRoaXMuX2VuZ2luZSwgbmV3IEZsb2F0MzJBcnJheShjYXBhY2l0eSAqIDE2KSwgdHJ1ZSwgMTYpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ3b3JsZDBcIl0gPSB0aGlzLl93b3JsZEJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ3b3JsZDBcIiwgMCwgNCwgMTYsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ3b3JsZDFcIl0gPSB0aGlzLl93b3JsZEJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ3b3JsZDFcIiwgNCwgNCwgMTYsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ3b3JsZDJcIl0gPSB0aGlzLl93b3JsZEJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ3b3JsZDJcIiwgOCwgNCwgMTYsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ3b3JsZDNcIl0gPSB0aGlzLl93b3JsZEJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ3b3JsZDNcIiwgMTIsIDQsIDE2LCB0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXZCdWZmZXIgPSBuZXcgQnVmZmVyKHRoaXMuX2VuZ2luZSwgbmV3IEZsb2F0MzJBcnJheShjYXBhY2l0eSAqIDQpLCB0cnVlLCA0KTtcclxuICAgICAgICB0aGlzLl92ZXJ0ZXhCdWZmZXJzW1widXZzXCJdID0gdGhpcy5fdXZCdWZmZXIuY3JlYXRlVmVydGV4QnVmZmVyKFwidXZzXCIsIDAsIDQsIDQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldFNoYWRlcnModmVydGV4OiBzdHJpbmcsIGZyYWdtZW50OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2U/LmRpc3Bvc2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlID0gbmV3IERyYXdXcmFwcGVyKHRoaXMuX2VuZ2luZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmF3V3JhcHBlckJhc2UuZHJhd0NvbnRleHQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlLmRyYXdDb250ZXh0LnVzZUluc3RhbmNpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGVmaW5lcyA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYXdXcmFwcGVyQmFzZS5lZmZlY3QgPSB0aGlzLl9lbmdpbmUuY3JlYXRlRWZmZWN0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhTb3VyY2U6IHZlcnRleCxcclxuICAgICAgICAgICAgICAgIGZyYWdtZW50U291cmNlOiBmcmFnbWVudCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW1wib2Zmc2V0c1wiLCBcIndvcmxkMFwiLCBcIndvcmxkMVwiLCBcIndvcmxkMlwiLCBcIndvcmxkM1wiLCBcInV2c1wiXSxcclxuICAgICAgICAgICAgW1wicGFyZW50V29ybGRcIiwgXCJ2aWV3XCIsIFwicHJvamVjdGlvblwiLCBcInVDb2xvclwiLCBcInRoaWNrbmVzc1wiLCBcInVTdHJva2VDb2xvclwiLCBcInVTdHJva2VJbnNldFdpZHRoXCIsIFwidVN0cm9rZU91dHNldFdpZHRoXCIsIFwibW9kZVwiLCBcInRyYW5zZm9ybVwiXSxcclxuICAgICAgICAgICAgW1wiZm9udEF0bGFzXCJdLFxyXG4gICAgICAgICAgICBkZWZpbmVzLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRoaXMuX3NoYWRlckxhbmd1YWdlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlLmVmZmVjdC5fcmVmQ291bnQrKztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIHBhcmFncmFwaCBvZiB0ZXh0IHRvIHRoZSByZW5kZXJlclxyXG4gICAgICogQHBhcmFtIHRleHQgZGVmaW5lIHRoZSB0ZXh0IHRvIGFkZFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgZGVmaW5lIHRoZSBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIHBhcmFncmFwaCAob3B0aW9uYWwpXHJcbiAgICAgKiBAcGFyYW0gd29ybGRNYXRyaXggZGVmaW5lIHRoZSB3b3JsZCBtYXRyaXggdG8gdXNlIGZvciB0aGUgcGFyYWdyYXBoIChvcHRpb25hbClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFBhcmFncmFwaCh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPFBhcmFncmFwaE9wdGlvbnM+LCB3b3JsZE1hdHJpeD86IElNYXRyaXhMaWtlKSB7XHJcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gbmV3IFNkZlRleHRQYXJhZ3JhcGgodGV4dCwgdGhpcy5fZm9udCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvbnRTY2FsZSA9IHRoaXMuX2ZvbnQuc2NhbGU7XHJcblxyXG4gICAgICAgIGNvbnN0IHRleFdpZHRoID0gdGhpcy5fZm9udC5fZm9udC5jb21tb24uc2NhbGVXO1xyXG4gICAgICAgIGNvbnN0IHRleEhlaWdodCA9IHRoaXMuX2ZvbnQuX2ZvbnQuY29tbW9uLnNjYWxlSDtcclxuICAgICAgICBjb25zdCBnbHlwaHMgPSBwYXJhZ3JhcGguZ2x5cGhzLmZpbHRlcigoZykgPT4gZy5jaGFyLnBhZ2UgPj0gMCk7XHJcblxyXG4gICAgICAgIGxldCB3b3JsZE1hdHJpeFRvVXNlID0gd29ybGRNYXRyaXg7XHJcblxyXG4gICAgICAgIGlmICghd29ybGRNYXRyaXhUb1VzZSkge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gcGFyYWdyYXBoLmxpbmVIZWlnaHQgKiBmb250U2NhbGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVPZmZzZXQgPSAocGFyYWdyYXBoLmxpbmVzLmxlbmd0aCAqIGxpbmVIZWlnaHQpIC8gMjtcclxuICAgICAgICAgICAgVHJhbnNsYXRpb25NYXRyaXhUb1JlZigwLCB0aGlzLl9iYXNlTGluZSAtIGxpbmVPZmZzZXQsIDAsIHRoaXMuX2xpbmVNYXRyaXgpO1xyXG4gICAgICAgICAgICB3b3JsZE1hdHJpeFRvVXNlID0gdGhpcy5fbGluZU1hdHJpeDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFNjYWxpbmdNYXRyaXhUb1JlZihmb250U2NhbGUsIGZvbnRTY2FsZSwgMS4wLCB0aGlzLl9mb250U2NhbGVNYXRyaXgpO1xyXG4gICAgICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYoMC41LCAtMC41LCAwLCB0aGlzLl9vZmZzZXRNYXRyaXgpO1xyXG5cclxuICAgICAgICBjb25zdCBjaGFyc1V2c0Jhc2UgPSB0aGlzLl9jaGFyVXZzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBtYXRyaWNlc0Jhc2UgPSB0aGlzLl9jaGFyTWF0cmljZXMubGVuZ3RoO1xyXG4gICAgICAgIGdseXBocy5mb3JFYWNoKChnLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJVdnNbY2hhcnNVdnNCYXNlICsgaSAqIDQgKyAwXSA9IGcuY2hhci54IC8gdGV4V2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJVdnNbY2hhcnNVdnNCYXNlICsgaSAqIDQgKyAxXSA9IGcuY2hhci55IC8gdGV4SGVpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFyVXZzW2NoYXJzVXZzQmFzZSArIGkgKiA0ICsgMl0gPSBnLmNoYXIud2lkdGggLyB0ZXhXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5fY2hhclV2c1tjaGFyc1V2c0Jhc2UgKyBpICogNCArIDNdID0gZy5jaGFyLmhlaWdodCAvIHRleEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBnLnggKyBnLmNoYXIueG9mZnNldDtcclxuICAgICAgICAgICAgY29uc3QgeSA9IDEuMCAtIChnLnkgKyBnLmNoYXIueW9mZnNldCk7XHJcblxyXG4gICAgICAgICAgICBTY2FsaW5nTWF0cml4VG9SZWYoZy5jaGFyLndpZHRoLCBnLmNoYXIuaGVpZ2h0LCAxLjAsIHRoaXMuX3NjYWxpbmdNYXRyaXgpO1xyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fb2Zmc2V0TWF0cml4LCB0aGlzLl9zY2FsaW5nTWF0cml4LCB0aGlzLl9iYXNlTWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYoeCAqIGZvbnRTY2FsZSwgeSAqIGZvbnRTY2FsZSwgMC4wLCB0aGlzLl90cmFuc2xhdGlvbk1hdHJpeCk7XHJcbiAgICAgICAgICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZih0aGlzLl9iYXNlTWF0cml4LCB0aGlzLl9mb250U2NhbGVNYXRyaXgsIHRoaXMuX3NjYWxlZE1hdHJpeCk7XHJcbiAgICAgICAgICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZih0aGlzLl9zY2FsZWRNYXRyaXgsIHRoaXMuX3RyYW5zbGF0aW9uTWF0cml4LCB0aGlzLl9sb2NhbE1hdHJpeCk7XHJcblxyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fbG9jYWxNYXRyaXgsIHdvcmxkTWF0cml4VG9Vc2UsIHRoaXMuX2ZpbmFsTWF0cml4KTtcclxuICAgICAgICAgICAgQ29weU1hdHJpeFRvQXJyYXkodGhpcy5fZmluYWxNYXRyaXgsIHRoaXMuX2NoYXJNYXRyaWNlcywgbWF0cmljZXNCYXNlICsgaSAqIDE2KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2Jhc2VMaW5lIC09IHBhcmFncmFwaC5saW5lSGVpZ2h0ICogZm9udFNjYWxlICogcGFyYWdyYXBoLmxpbmVzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlciB0aGUgdGV4dCB1c2luZyB0aGUgcHJvdmlkZWQgdmlldyBhbmQgcHJvamVjdGlvbiBtYXRyaWNlc1xyXG4gICAgICogQHBhcmFtIHZpZXdNYXRyaXggZGVmaW5lIHRoZSB2aWV3IG1hdHJpeCB0byB1c2VcclxuICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uTWF0cml4IGRlZmluZSB0aGUgcHJvamVjdGlvbiBtYXRyaXggdG8gdXNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXIodmlld01hdHJpeDogSU1hdHJpeExpa2UsIHByb2plY3Rpb25NYXRyaXg6IElNYXRyaXhMaWtlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZHJhd1dyYXBwZXIgPSB0aGlzLl9kcmF3V3JhcHBlckJhc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IGRyYXdXcmFwcGVyLmVmZmVjdCE7XHJcblxyXG4gICAgICAgIC8vIENoZWNrXHJcbiAgICAgICAgaWYgKCFlZmZlY3QuaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZW5naW5lID0gdGhpcy5fZW5naW5lO1xyXG5cclxuICAgICAgICBlbmdpbmUuc2V0U3RhdGUoZmFsc2UpO1xyXG4gICAgICAgIGVuZ2luZS5lbmFibGVFZmZlY3QoZHJhd1dyYXBwZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pZ25vcmVEZXB0aEJ1ZmZlcikge1xyXG4gICAgICAgICAgICBlbmdpbmUuc2V0RGVwdGhCdWZmZXIoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICBDb3B5TWF0cml4VG9SZWYodGhpcy5fcGFyZW50LmdldFdvcmxkTWF0cml4KCksIHRoaXMuX3BhcmVudFdvcmxkTWF0cml4KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBJZGVudGl0eU1hdHJpeFRvUmVmKHRoaXMuX3BhcmVudFdvcmxkTWF0cml4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVmZmVjdC5zZXRJbnQoXCJtb2RlXCIsIHRoaXMuaXNCaWxsYm9hcmQgPyAodGhpcy5pc0JpbGxib2FyZFNjcmVlblByb2plY3RlZCA/IDIgOiAxKSA6IDApO1xyXG4gICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoXCJwYXJlbnRXb3JsZFwiLCB0aGlzLl9wYXJlbnRXb3JsZE1hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInZpZXdcIiwgdmlld01hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInByb2plY3Rpb25cIiwgcHJvamVjdGlvbk1hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInRyYW5zZm9ybVwiLCB0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIFRleHR1cmVcclxuICAgICAgICBlZmZlY3Quc2V0VGV4dHVyZShcImZvbnRBdGxhc1wiLCB0aGlzLl9mb250LnRleHR1cmVzWzBdKTtcclxuICAgICAgICBlZmZlY3Quc2V0RGlyZWN0Q29sb3I0KFwidUNvbG9yXCIsIHRoaXMuY29sb3IpO1xyXG4gICAgICAgIGVmZmVjdC5zZXREaXJlY3RDb2xvcjQoXCJ1U3Ryb2tlQ29sb3JcIiwgdGhpcy5zdHJva2VDb2xvcik7XHJcbiAgICAgICAgZWZmZWN0LnNldEZsb2F0KFwidGhpY2tuZXNzXCIsIHRoaXMudGhpY2tuZXNzQ29udHJvbCAqIDAuOSk7XHJcbiAgICAgICAgZWZmZWN0LnNldEZsb2F0KFwidVN0cm9rZUluc2V0V2lkdGhcIiwgdGhpcy5zdHJva2VJbnNldFdpZHRoKTtcclxuICAgICAgICBlZmZlY3Quc2V0RmxvYXQoXCJ1U3Ryb2tlT3V0c2V0V2lkdGhcIiwgdGhpcy5zdHJva2VPdXRzZXRXaWR0aCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlQ291bnQgPSB0aGlzLl9jaGFyTWF0cmljZXMubGVuZ3RoIC8gMTY7XHJcblxyXG4gICAgICAgIC8vIE5lZWQgdXBkYXRlP1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0RpcnR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3JsZEJ1ZmZlciEuZ2V0QnVmZmVyKCkhLmNhcGFjaXR5IC8gNCA8IGluc3RhbmNlQ291bnQgKiAxNikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplQnVmZmVycyhpbnN0YW5jZUNvdW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIhLnVwZGF0ZSh0aGlzLl9jaGFyTWF0cmljZXMpO1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlciEudXBkYXRlKHRoaXMuX2NoYXJVdnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3VzZVZBTykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCA9IChlbmdpbmUgYXMgVGhpbkVuZ2luZSkucmVjb3JkVmVydGV4QXJyYXlPYmplY3QodGhpcy5fdmVydGV4QnVmZmVycywgbnVsbCwgZWZmZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAoZW5naW5lIGFzIFRoaW5FbmdpbmUpLmJpbmRWZXJ0ZXhBcnJheU9iamVjdCh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCwgbnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVkJPc1xyXG4gICAgICAgICAgICBlbmdpbmUuYmluZEJ1ZmZlcnModGhpcy5fdmVydGV4QnVmZmVycywgbnVsbCwgZWZmZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVuZ2luZS5zZXRBbHBoYU1vZGUoQ29uc3RhbnRzLkFMUEhBX0NPTUJJTkUpO1xyXG4gICAgICAgIGVuZ2luZS5kcmF3QXJyYXlzVHlwZShDb25zdGFudHMuTUFURVJJQUxfVHJpYW5nbGVTdHJpcERyYXdNb2RlLCAwLCA0LCBpbnN0YW5jZUNvdW50KTtcclxuICAgICAgICBlbmdpbmUudW5iaW5kSW5zdGFuY2VBdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgZW5naW5lLnNldEFscGhhTW9kZShDb25zdGFudHMuQUxQSEFfRElTQUJMRSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlnbm9yZURlcHRoQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIGVuZ2luZS5zZXREZXB0aEJ1ZmZlcih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JsZEJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91dkJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3V2QnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zcHJpdGVCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCkge1xyXG4gICAgICAgICAgICAodGhpcy5fZW5naW5lIGFzIFRoaW5FbmdpbmUpLnJlbGVhc2VWZXJ0ZXhBcnJheU9iamVjdCh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCk7XHJcbiAgICAgICAgICAgICg8YW55PnRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgaW5zdGFuY2UgYXN5bmNocm9ub3VzbHlcclxuICAgICAqIEBwYXJhbSBmb250IGRlZmluZSB0aGUgZm9udCBhc3NldCB0byB1c2VcclxuICAgICAqIEBwYXJhbSBlbmdpbmUgZGVmaW5lIHRoZSBlbmdpbmUgdG8gdXNlXHJcbiAgICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBUZXh0UmVuZGVyZXIgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBDcmVhdGVUZXh0UmVuZGVyZXJBc3luYyhmb250OiBGb250QXNzZXQsIGVuZ2luZTogQWJzdHJhY3RFbmdpbmUpIHtcclxuICAgICAgICBpZiAoIWVuZ2luZS5nZXRDYXBzKCkuaW5zdGFuY2VkQXJyYXlzIHx8ICFlbmdpbmUuX2ZlYXR1cmVzLnN1cHBvcnRTcHJpdGVJbnN0YW5jaW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluc3RhbmNlZCBhcnJheXMgYXJlIHJlcXVpcmVkIGZvciBNU0RGIHRleHQgcmVuZGVyaW5nLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLkdMU0w7XHJcbiAgICAgICAgbGV0IHZlcnRleDogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgZnJhZ21lbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKGVuZ2luZS5pc1dlYkdQVSkge1xyXG4gICAgICAgICAgICBzaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLldHU0w7XHJcbiAgICAgICAgICAgIHZlcnRleCA9IChhd2FpdCBpbXBvcnQoXCIuL3NoYWRlcnNXR1NML21zZGYudmVydGV4XCIpKS5tc2RmVmVydGV4U2hhZGVyV0dTTC5zaGFkZXI7XHJcbiAgICAgICAgICAgIGZyYWdtZW50ID0gKGF3YWl0IGltcG9ydChcIi4vc2hhZGVyc1dHU0wvbXNkZi5mcmFnbWVudFwiKSkubXNkZlBpeGVsU2hhZGVyV0dTTC5zaGFkZXI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmVydGV4ID0gKGF3YWl0IGltcG9ydChcIi4vc2hhZGVycy9tc2RmLnZlcnRleFwiKSkubXNkZlZlcnRleFNoYWRlci5zaGFkZXI7XHJcbiAgICAgICAgICAgIGZyYWdtZW50ID0gKGF3YWl0IGltcG9ydChcIi4vc2hhZGVycy9tc2RmLmZyYWdtZW50XCIpKS5tc2RmUGl4ZWxTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGV4dFJlbmRlcmVyID0gbmV3IFRleHRSZW5kZXJlcihlbmdpbmUsIHNoYWRlckxhbmd1YWdlLCBmb250KTtcclxuICAgICAgICB0ZXh0UmVuZGVyZXIuX3NldFNoYWRlcnModmVydGV4LCBmcmFnbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0UmVuZGVyZXI7XHJcbiAgICB9XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NYXRoc19tYXRoX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlc1xyXG5pbXBvcnQgKiBhcyBhZGRvbnMgZnJvbSBcImFkZG9ucy9pbmRleFwiO1xyXG5cclxuZXhwb3J0IHsgYWRkb25zIH07XHJcbmV4cG9ydCBkZWZhdWx0IGFkZG9ucztcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9