@kepler.gl/deckgl-layers 3.3.0-alpha.4 → 3.3.0-alpha.6

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.
Files changed (190) hide show
  1. package/dist/cjs/3d-building-layer/3d-building-layer.js +66 -0
  2. package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
  3. package/dist/cjs/3d-building-layer/types.js +6 -0
  4. package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
  5. package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
  6. package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
  7. package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
  8. package/dist/cjs/globe/atmosphere-layer.js +220 -0
  9. package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
  10. package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
  11. package/dist/cjs/globe/globe-layers.js +569 -0
  12. package/dist/cjs/globe/globe-stars-layer.js +69 -0
  13. package/dist/cjs/globe/globe-view.js +407 -0
  14. package/dist/{globe → cjs/globe}/index.js +1 -1
  15. package/dist/cjs/globe/mvt-label-layer.js +190 -0
  16. package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
  17. package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
  18. package/dist/{index.js → cjs/index.js} +1 -1
  19. package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
  20. package/dist/cjs/layer-utils/cluster-utils.js +93 -0
  21. package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
  22. package/dist/cjs/layer-utils/globe-cell-utils.js +173 -0
  23. package/dist/cjs/layer-utils/shader-utils.js +38 -0
  24. package/dist/cjs/line-layer/line-layer.js +95 -0
  25. package/dist/cjs/raster/images.js +271 -0
  26. package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
  27. package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
  28. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
  29. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
  30. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
  31. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
  32. package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
  33. package/dist/cjs/raster/raster-mesh-layer/matrix.js +18 -0
  34. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
  35. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
  36. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
  37. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
  38. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
  39. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
  40. package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
  41. package/dist/cjs/raster/types.js +6 -0
  42. package/dist/cjs/raster/util.js +139 -0
  43. package/dist/cjs/raster/webgl/color/colormap.js +45 -0
  44. package/dist/cjs/raster/webgl/color/filter.js +58 -0
  45. package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
  46. package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
  47. package/dist/cjs/raster/webgl/color/saturation.js +42 -0
  48. package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
  49. package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
  50. package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
  51. package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
  52. package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
  53. package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
  54. package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
  55. package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
  56. package/dist/cjs/raster/webgl/texture/mask.js +50 -0
  57. package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
  58. package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
  59. package/dist/cjs/raster/webgl/types.js +6 -0
  60. package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
  61. package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
  62. package/dist/cjs/wms/wms-layer.js +624 -0
  63. package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
  64. package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
  65. package/dist/esm/3d-building-layer/types.js +3 -0
  66. package/dist/esm/cluster-layer/cluster-layer.js +286 -0
  67. package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
  68. package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
  69. package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
  70. package/dist/esm/globe/atmosphere-layer.js +214 -0
  71. package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
  72. package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
  73. package/dist/esm/globe/globe-layers.js +561 -0
  74. package/dist/esm/globe/globe-stars-layer.js +63 -0
  75. package/dist/esm/globe/globe-view.js +401 -0
  76. package/dist/esm/globe/index.js +26 -0
  77. package/dist/esm/globe/mvt-label-layer.js +187 -0
  78. package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
  79. package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
  80. package/dist/esm/index.js +22 -0
  81. package/dist/esm/layer-utils/aggregation-utils.js +172 -0
  82. package/dist/esm/layer-utils/cluster-utils.js +86 -0
  83. package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
  84. package/dist/esm/layer-utils/globe-cell-utils.js +167 -0
  85. package/dist/esm/layer-utils/shader-utils.js +32 -0
  86. package/dist/esm/line-layer/line-layer.js +91 -0
  87. package/dist/esm/raster/images.js +267 -0
  88. package/dist/esm/raster/pipeline-validation-patch.js +94 -0
  89. package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
  90. package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
  91. package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
  92. package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
  93. package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
  94. package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
  95. package/dist/esm/raster/raster-mesh-layer/matrix.js +12 -0
  96. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
  97. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
  98. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
  99. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
  100. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
  101. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
  102. package/dist/esm/raster/raster-processing-uniforms.js +118 -0
  103. package/dist/esm/raster/types.js +3 -0
  104. package/dist/esm/raster/util.js +134 -0
  105. package/dist/esm/raster/webgl/color/colormap.js +39 -0
  106. package/dist/esm/raster/webgl/color/filter.js +52 -0
  107. package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
  108. package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
  109. package/dist/esm/raster/webgl/color/saturation.js +36 -0
  110. package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
  111. package/dist/esm/raster/webgl/index.js +26 -0
  112. package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
  113. package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
  114. package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
  115. package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
  116. package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
  117. package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
  118. package/dist/esm/raster/webgl/texture/mask.js +44 -0
  119. package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
  120. package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
  121. package/dist/esm/raster/webgl/types.js +3 -0
  122. package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
  123. package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
  124. package/dist/esm/wms/wms-layer.js +619 -0
  125. package/dist/globe/atmosphere-layer.d.ts +13 -2
  126. package/dist/globe/globe-depth-disk-layer.d.ts +1 -0
  127. package/dist/globe/globe-layers.d.ts +8 -2
  128. package/dist/raster/images.d.ts +10 -1
  129. package/dist/raster/raster-layer/raster-layer.d.ts +4 -0
  130. package/dist/raster/raster-mesh-layer/raster-mesh-layer.d.ts +4 -0
  131. package/dist/wms/wms-layer.d.ts +8 -0
  132. package/package.json +18 -11
  133. package/dist/3d-building-layer/3d-building-layer.js +0 -66
  134. package/dist/3d-building-layer/3d-building-utils.js +0 -166
  135. package/dist/3d-building-layer/types.js +0 -6
  136. package/dist/cluster-layer/cluster-layer.js +0 -292
  137. package/dist/column-layer/enhanced-column-layer.js +0 -160
  138. package/dist/deckgl-extensions/filter-shader-module.js +0 -26
  139. package/dist/globe/atmosphere-layer.js +0 -184
  140. package/dist/globe/enhanced-multi-icon-layer.js +0 -63
  141. package/dist/globe/globe-depth-disk-layer.js +0 -145
  142. package/dist/globe/globe-layers.js +0 -565
  143. package/dist/globe/globe-stars-layer.js +0 -69
  144. package/dist/globe/globe-view.js +0 -316
  145. package/dist/globe/mvt-label-layer.js +0 -190
  146. package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -116
  147. package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -134
  148. package/dist/layer-utils/aggregation-utils.js +0 -181
  149. package/dist/layer-utils/cluster-utils.js +0 -93
  150. package/dist/layer-utils/cpu-aggregator.js +0 -798
  151. package/dist/layer-utils/globe-cell-utils.js +0 -173
  152. package/dist/layer-utils/shader-utils.js +0 -38
  153. package/dist/line-layer/line-layer.js +0 -95
  154. package/dist/raster/images.js +0 -259
  155. package/dist/raster/pipeline-validation-patch.js +0 -101
  156. package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
  157. package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
  158. package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
  159. package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
  160. package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
  161. package/dist/raster/raster-layer/raster-layer.js +0 -237
  162. package/dist/raster/raster-mesh-layer/matrix.js +0 -18
  163. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
  164. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
  165. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
  166. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
  167. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
  168. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -271
  169. package/dist/raster/raster-processing-uniforms.js +0 -124
  170. package/dist/raster/types.js +0 -6
  171. package/dist/raster/util.js +0 -139
  172. package/dist/raster/webgl/color/colormap.js +0 -45
  173. package/dist/raster/webgl/color/filter.js +0 -58
  174. package/dist/raster/webgl/color/gamma-contrast.js +0 -68
  175. package/dist/raster/webgl/color/linear-rescale.js +0 -35
  176. package/dist/raster/webgl/color/saturation.js +0 -42
  177. package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
  178. package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
  179. package/dist/raster/webgl/spectral-indices/evi.js +0 -26
  180. package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
  181. package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
  182. package/dist/raster/webgl/spectral-indices/savi.js +0 -21
  183. package/dist/raster/webgl/texture/combine-bands.js +0 -65
  184. package/dist/raster/webgl/texture/mask.js +0 -50
  185. package/dist/raster/webgl/texture/reorder-bands.js +0 -72
  186. package/dist/raster/webgl/texture/rgba-image.js +0 -34
  187. package/dist/raster/webgl/types.js +0 -6
  188. package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -88
  189. package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
  190. package/dist/wms/wms-layer.js +0 -594
@@ -0,0 +1,569 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getGlobeBasemapAttributions = exports.getGlobeBaseLayers = exports.getBasemapColorsForStyle = exports.getBasemapColors = exports.DEFAULT_BASEMAP_COLOR = void 0;
7
+ exports.getGlobeClearColor = getGlobeClearColor;
8
+ exports.resolveGlobeBasemapProvider = exports.getGlobeTopLayers = void 0;
9
+ var _core = require("@deck.gl/core");
10
+ var _layers = require("@deck.gl/layers");
11
+ var _geoLayers = require("@deck.gl/geo-layers");
12
+ var _atmosphereLayer = require("./atmosphere-layer");
13
+ var _globeDepthDiskLayer = require("./globe-depth-disk-layer");
14
+ var _mvtLabelLayer = require("./mvt-label-layer");
15
+ // SPDX-License-Identifier: MIT
16
+ // Copyright contributors to the kepler.gl project
17
+
18
+ var devicePixelRatio = Math.min(2, typeof window !== 'undefined' && window.devicePixelRatio || 1);
19
+ var BACKGROUND_PARAMETERS = {
20
+ depthTest: true,
21
+ cull: true,
22
+ depthMask: false
23
+ };
24
+ var BASEMAP_RASTER_PARAMETERS = {
25
+ depthMask: false
26
+ };
27
+ var BACKGROUND_DATA = [[[-180, 90], [0, 90], [180, 90], [180, -90], [0, -90], [-180, -90]]];
28
+ var BACKGROUND_NORTH_POLE_DATA = [[[-180, 90], [0, 90], [180, 90], [180, 85], [0, 85], [-180, 85]]];
29
+ var DEFAULT_BASEMAP_COLOR = exports.DEFAULT_BASEMAP_COLOR = {
30
+ backgroundFillColor: [9, 16, 29],
31
+ basemapDefaultFillColor: [255, 255, 255],
32
+ basemapWaterFillColor: [17, 35, 48],
33
+ basemapDefaultLineColor: [40, 63, 93],
34
+ basemapAdminLineColor: [40, 63, 93],
35
+ basemapLabelColor: [114.75, 114.75, 114.75]
36
+ };
37
+ function getPaintColor(color) {
38
+ if (Array.isArray(color) && color[0] === 'interpolate') {
39
+ return color[4];
40
+ }
41
+ return color;
42
+ }
43
+ function colorStringToRGB(color) {
44
+ if (!color) return null;
45
+ if (typeof color !== 'string') return null;
46
+
47
+ // Handle hsl() format
48
+ var hslMatch = color.match(/hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/);
49
+ if (hslMatch) {
50
+ var h = parseInt(hslMatch[1], 10) / 360;
51
+ var s = parseInt(hslMatch[2], 10) / 100;
52
+ var l = parseInt(hslMatch[3], 10) / 100;
53
+ // HSL to RGB conversion
54
+ var r, g, b;
55
+ if (s === 0) {
56
+ r = g = b = l;
57
+ } else {
58
+ var hue2rgb = function hue2rgb(p, q, t) {
59
+ if (t < 0) t += 1;
60
+ if (t > 1) t -= 1;
61
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
62
+ if (t < 1 / 2) return q;
63
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
64
+ return p;
65
+ };
66
+ var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
67
+ var p = 2 * l - q;
68
+ r = hue2rgb(p, q, h + 1 / 3);
69
+ g = hue2rgb(p, q, h);
70
+ b = hue2rgb(p, q, h - 1 / 3);
71
+ }
72
+ return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
73
+ }
74
+
75
+ // Handle rgb() format
76
+ var rgbMatch = color.match(/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/);
77
+ if (rgbMatch) {
78
+ return [parseInt(rgbMatch[1], 10), parseInt(rgbMatch[2], 10), parseInt(rgbMatch[3], 10)];
79
+ }
80
+
81
+ // Handle hex format
82
+ var hexMatch = color.match(/^#([0-9a-f]{6})$/i);
83
+ if (hexMatch) {
84
+ var hex = hexMatch[1];
85
+ return [parseInt(hex.slice(0, 2), 16), parseInt(hex.slice(2, 4), 16), parseInt(hex.slice(4, 6), 16)];
86
+ }
87
+ return null;
88
+ }
89
+ function findFirstLayerByGroup(layers, layerGroups, groupSlug) {
90
+ var layerGroup = layerGroups.find(function (group) {
91
+ return group.slug === groupSlug;
92
+ });
93
+ if (!layerGroup) return null;
94
+ return layers.find(function (layer) {
95
+ return layerGroup.filter(layer);
96
+ });
97
+ }
98
+ function findBackgroundColor(style) {
99
+ var _found;
100
+ var found = style.layers.find(function (l) {
101
+ return l.id === 'background' || l.id === 'land';
102
+ });
103
+ found = found || style.layers.find(function (l) {
104
+ return l.type === 'background';
105
+ });
106
+ return colorStringToRGB(getPaintColor((_found = found) === null || _found === void 0 || (_found = _found.paint) === null || _found === void 0 ? void 0 : _found['background-color']));
107
+ }
108
+ function findWaterColor(style, layerGroups) {
109
+ var _found$paint;
110
+ var found = style.layers.find(function (l) {
111
+ return l.id === 'water';
112
+ }) || findFirstLayerByGroup(style.layers, layerGroups, 'water');
113
+ return colorStringToRGB(found === null || found === void 0 || (_found$paint = found.paint) === null || _found$paint === void 0 ? void 0 : _found$paint['fill-color']);
114
+ }
115
+ function findAdminColor(style, layerGroups) {
116
+ var _borderLayers$paint;
117
+ var borderLayers = style.layers.find(function (lyr) {
118
+ return lyr.id === 'admin-3-4-boundaries';
119
+ }) || findFirstLayerByGroup(style.layers, layerGroups, 'border');
120
+ return colorStringToRGB(borderLayers === null || borderLayers === void 0 || (_borderLayers$paint = borderLayers.paint) === null || _borderLayers$paint === void 0 ? void 0 : _borderLayers$paint['line-color']);
121
+ }
122
+ function findLabelColor(style, layerGroups) {
123
+ var _labelLayer;
124
+ var labelLayer = style.layers.find(function (lyr) {
125
+ return lyr.id === 'country-label-lg' && lyr.type === 'symbol';
126
+ });
127
+ labelLayer = labelLayer || style.layers.find(function (lyr) {
128
+ return lyr.id === 'country-label' && lyr.type === 'symbol';
129
+ });
130
+ labelLayer = labelLayer || findFirstLayerByGroup(style.layers, layerGroups, 'label');
131
+ return colorStringToRGB((_labelLayer = labelLayer) === null || _labelLayer === void 0 || (_labelLayer = _labelLayer.paint) === null || _labelLayer === void 0 ? void 0 : _labelLayer['text-color']);
132
+ }
133
+ var getBasemapColors = exports.getBasemapColors = function getBasemapColors(mapStyle) {
134
+ var _findBackgroundColor, _findWaterColor, _findAdminColor, _findLabelColor;
135
+ var _mapStyle$style = mapStyle.style,
136
+ styleJson = _mapStyle$style === void 0 ? {
137
+ layers: []
138
+ } : _mapStyle$style,
139
+ _mapStyle$layerGroups = mapStyle.layerGroups,
140
+ layerGroups = _mapStyle$layerGroups === void 0 ? [] : _mapStyle$layerGroups;
141
+ return {
142
+ backgroundFillColor: (_findBackgroundColor = findBackgroundColor(styleJson)) !== null && _findBackgroundColor !== void 0 ? _findBackgroundColor : DEFAULT_BASEMAP_COLOR.backgroundFillColor,
143
+ basemapWaterFillColor: (_findWaterColor = findWaterColor(styleJson, layerGroups)) !== null && _findWaterColor !== void 0 ? _findWaterColor : DEFAULT_BASEMAP_COLOR.basemapWaterFillColor,
144
+ basemapAdminLineColor: (_findAdminColor = findAdminColor(styleJson, layerGroups)) !== null && _findAdminColor !== void 0 ? _findAdminColor : DEFAULT_BASEMAP_COLOR.basemapAdminLineColor,
145
+ basemapLabelColor: (_findLabelColor = findLabelColor(styleJson, layerGroups)) !== null && _findLabelColor !== void 0 ? _findLabelColor : DEFAULT_BASEMAP_COLOR.basemapLabelColor
146
+ };
147
+ };
148
+
149
+ // Predefined color schemes for well-known basemap styles
150
+ var KNOWN_STYLE_COLORS = {
151
+ dark: {
152
+ backgroundFillColor: [15, 15, 15],
153
+ basemapWaterFillColor: [10, 20, 35],
154
+ basemapAdminLineColor: [60, 60, 80],
155
+ basemapLabelColor: [150, 150, 150]
156
+ },
157
+ 'dark-matter': {
158
+ backgroundFillColor: [18, 18, 18],
159
+ basemapWaterFillColor: [14, 19, 29],
160
+ basemapAdminLineColor: [50, 50, 60],
161
+ basemapLabelColor: [130, 130, 130]
162
+ },
163
+ light: {
164
+ backgroundFillColor: [235, 233, 228],
165
+ basemapWaterFillColor: [170, 211, 223],
166
+ basemapAdminLineColor: [180, 175, 170],
167
+ basemapLabelColor: [80, 80, 80]
168
+ },
169
+ positron: {
170
+ backgroundFillColor: [242, 239, 233],
171
+ basemapWaterFillColor: [174, 209, 220],
172
+ basemapAdminLineColor: [190, 185, 180],
173
+ basemapLabelColor: [90, 90, 90]
174
+ },
175
+ voyager: {
176
+ backgroundFillColor: [234, 229, 220],
177
+ basemapWaterFillColor: [170, 211, 223],
178
+ basemapAdminLineColor: [180, 170, 160],
179
+ basemapLabelColor: [70, 70, 70]
180
+ },
181
+ muted: {
182
+ backgroundFillColor: [225, 225, 218],
183
+ basemapWaterFillColor: [180, 210, 220],
184
+ basemapAdminLineColor: [170, 165, 160],
185
+ basemapLabelColor: [90, 90, 90]
186
+ },
187
+ muted_night: {
188
+ backgroundFillColor: [22, 26, 30],
189
+ basemapWaterFillColor: [15, 25, 40],
190
+ basemapAdminLineColor: [55, 60, 70],
191
+ basemapLabelColor: [140, 140, 140]
192
+ }
193
+ };
194
+
195
+ /**
196
+ * Get basemap colors either from the style JSON or from known style presets.
197
+ * Falls back to default dark colors if style is unknown and no JSON is available.
198
+ */
199
+ var getBasemapColorsForStyle = exports.getBasemapColorsForStyle = function getBasemapColorsForStyle(styleType, mapStyle) {
200
+ var _mapStyle$style2;
201
+ // Try to extract from style JSON first
202
+ if (mapStyle !== null && mapStyle !== void 0 && (_mapStyle$style2 = mapStyle.style) !== null && _mapStyle$style2 !== void 0 && (_mapStyle$style2 = _mapStyle$style2.layers) !== null && _mapStyle$style2 !== void 0 && _mapStyle$style2.length) {
203
+ return getBasemapColors(mapStyle);
204
+ }
205
+ // Fall back to known style presets
206
+ if (KNOWN_STYLE_COLORS[styleType]) {
207
+ return KNOWN_STYLE_COLORS[styleType];
208
+ }
209
+ // Default dark colors
210
+ return {
211
+ backgroundFillColor: DEFAULT_BASEMAP_COLOR.backgroundFillColor,
212
+ basemapWaterFillColor: DEFAULT_BASEMAP_COLOR.basemapWaterFillColor,
213
+ basemapAdminLineColor: DEFAULT_BASEMAP_COLOR.basemapAdminLineColor,
214
+ basemapLabelColor: DEFAULT_BASEMAP_COLOR.basemapLabelColor
215
+ };
216
+ };
217
+
218
+ /**
219
+ * Clear color (background around the globe) for globe mode, in RGBA 0-255 as
220
+ * expected by deck.gl's View `clearColor` prop (deck.gl >= 9 no longer supports
221
+ * the global `parameters.clearColor`; it must be set per-view with `clear: true`).
222
+ */
223
+ function getGlobeClearColor(backgroundColor) {
224
+ if (backgroundColor) {
225
+ return [backgroundColor[0], backgroundColor[1], backgroundColor[2], 255];
226
+ }
227
+ // Default matches the previous hardcoded clear color [0.015, 0.035, 0.065] in 0-1 space.
228
+ return [4, 9, 17, 255];
229
+ }
230
+ var INVISIBLE_COLOR = [0, 0, 0, 0];
231
+ var BASEMAP_MVT_PARAMETERS = {
232
+ // Occlude the far side of the globe via the DEPTH DISK (getGlobeDepthDiskLayer)
233
+ // rather than back-face culling. Globe mode sets a global `cull: true` for the
234
+ // opaque sphere surface, but back-face culling relies on stable triangle
235
+ // winding — and deck.gl 9's globe projection loses precision at high zoom
236
+ // (float32), flipping the winding of the small admin/water triangles so they
237
+ // get wrongly culled and the geometry vanishes past ~zoom 12 (you then see
238
+ // through to the far side / "different geometry"). Depth testing against the disk
239
+ // is a precision-robust occluder that works at any zoom, so:
240
+ // - cull: false → don't winding-cull the near-side geometry
241
+ // - depthTest: true → far-side geometry (behind the disk) fails depth, hidden
242
+ // - depthMask: false → don't write depth (avoid self z-fighting on the shell)
243
+ // Raster tiles are unaffected (their 4-corner quads keep stable winding), which
244
+ // is why satellite already zooms to max cleanly. Labels disable cull for the
245
+ // same reason (see mvt-label-layer.ts).
246
+ depthTest: true,
247
+ depthMask: false,
248
+ cull: false
249
+ };
250
+
251
+ // deck.gl 9's globe selects finer tiles than needed for a given view (its
252
+ // GlobeViewport scale is ~3x smaller than the equivalent mercator zoom), so bias
253
+ // vector tile selection coarser to keep the tile count — and thus performance —
254
+ // in check. This trades a little detail for far fewer tiles; make it less negative
255
+ // (toward 0) for sharper detail, or more negative for more perf.
256
+ // These are *base* offsets: globeLatitudeZoomCompensation is added on top at draw
257
+ // time, so the effective zoomOffset only equals these exact values at the equator.
258
+ // Satellite raster uses base 0 — it doesn't need the vector bias (a coarser raster
259
+ // tile just looks softer rather than dropping features).
260
+ var MAPBOX_GLOBE_VECTOR_ZOOM_OFFSET = -2;
261
+ var CARTO_GLOBE_VECTOR_ZOOM_OFFSET = -2;
262
+ var GLOBE_SATELLITE_ZOOM_OFFSET = 0;
263
+
264
+ // Whole-world tile extent (Web Mercator latitude limit). Required whenever a
265
+ // negative `zoomOffset` is used: deck's `getTileIndices` returns NO tiles when
266
+ // the target zoom drops below `minZoom` *unless* an `extent` is set (in which
267
+ // case it clamps to `minZoom` instead). Without this, zooming out or panning
268
+ // toward the poles (where deck 9's globe controller lowers the effective zoom)
269
+ // makes the whole globe basemap disappear.
270
+ var GLOBE_TILE_EXTENT = [-180, -85.051129, 180, 85.051129];
271
+
272
+ // Max *native* zoom of each vector tile source. Set this (not an arbitrarily
273
+ // high number) so deck overzooms — i.e. keeps rendering the deepest real tile
274
+ // when the view zooms past it — instead of requesting tiles that don't exist
275
+ // and 404 (which shows up as empty rectangles). The raw `.vector.pbf` /`.mvt`
276
+ // endpoints do NOT auto-overzoom the way Mapbox GL does.
277
+ // - mapbox-streets-v8 has data up to z16
278
+ // - CARTO carto.streets v1 has data up to z14
279
+ var MAPBOX_VECTOR_MAX_DATA_ZOOM = 16;
280
+ var CARTO_VECTOR_MAX_DATA_ZOOM = 14;
281
+
282
+ /**
283
+ * deck.gl 9's globe couples zoom to latitude via `zoomAdjust` (see
284
+ * globe-viewport.js): `scale = 2^(zoom - zoomAdjust(lat))`, and its controller
285
+ * *lowers* the stored `zoom` as you pan toward the poles to keep the globe's
286
+ * on-screen size constant. Tile LOD, however, is selected from the raw `zoom`,
287
+ * so rotating toward a pole silently drops the LOD and thins out labels.
288
+ * Replicated from `@deck.gl/core` globe-viewport.js `zoomAdjust`.
289
+ */
290
+ function zoomAdjust(latitude) {
291
+ return Math.log2(Math.PI * Math.cos(latitude * Math.PI / 180));
292
+ }
293
+
294
+ /**
295
+ * Latitude compensation to add to a globe tile layer's `zoomOffset`, so tile LOD
296
+ * tracks the *visual* (on-screen) scale instead of the latitude-adjusted mercator
297
+ * zoom. This cancels the pan-induced zoom drop, keeping tile detail/labels
298
+ * constant while rotating toward the poles.
299
+ */
300
+ function globeLatitudeZoomCompensation(latitude) {
301
+ if (latitude == null || !Number.isFinite(latitude)) {
302
+ return 0;
303
+ }
304
+ // Clamp away from the poles to avoid log2(0) = -Infinity at |lat| = 90.
305
+ var clamped = Math.max(-85, Math.min(85, latitude));
306
+ return zoomAdjust(0) - zoomAdjust(clamped);
307
+ }
308
+
309
+ /**
310
+ * Globe basemap tile provider.
311
+ *
312
+ * - `mapbox` uses Mapbox vector/raster tiles and requires an access token.
313
+ * - `carto` uses CARTO's free OpenMapTiles vector tiles + Esri World Imagery
314
+ * raster, and needs no token. Used as an automatic fallback when no Mapbox
315
+ * token is available (e.g. MapLibre / CARTO basemap setups), so the globe
316
+ * basemap still renders instead of showing a solid-color sphere.
317
+ */
318
+
319
+ /**
320
+ * Resolve which globe basemap tile provider to use.
321
+ *
322
+ * The globe should follow the *selected basemap style's* rendering library so
323
+ * it stays consistent with the flat 2D map: a MapLibre/CARTO style uses the
324
+ * free CARTO tiles (even when a Mapbox token is available), and a Mapbox style
325
+ * uses Mapbox tiles. A Mapbox style with no token falls back to CARTO so the
326
+ * globe still renders instead of showing a bare colored sphere.
327
+ *
328
+ * @param baseMapLibrary the selected style's library ('mapbox' | 'maplibre'),
329
+ * e.g. from `getBaseMapLibrary(currentStyle)`.
330
+ */
331
+ var resolveGlobeBasemapProvider = exports.resolveGlobeBasemapProvider = function resolveGlobeBasemapProvider(baseMapLibrary, mapboxApiAccessToken) {
332
+ if (baseMapLibrary === 'maplibre') {
333
+ return 'carto';
334
+ }
335
+ if (baseMapLibrary === 'mapbox') {
336
+ return mapboxApiAccessToken ? 'mapbox' : 'carto';
337
+ }
338
+ // Unknown library: prefer Mapbox when a token exists, otherwise CARTO.
339
+ return mapboxApiAccessToken ? 'mapbox' : 'carto';
340
+ };
341
+
342
+ // CARTO free vector tiles (OpenMapTiles schema, no API key required).
343
+ var CARTO_VECTOR_TILE_URLS = ['https://tiles-a.basemaps.cartocdn.com/vectortiles/carto.streets/v1/{z}/{x}/{y}.mvt', 'https://tiles-b.basemaps.cartocdn.com/vectortiles/carto.streets/v1/{z}/{x}/{y}.mvt', 'https://tiles-c.basemaps.cartocdn.com/vectortiles/carto.streets/v1/{z}/{x}/{y}.mvt', 'https://tiles-d.basemaps.cartocdn.com/vectortiles/carto.streets/v1/{z}/{x}/{y}.mvt'];
344
+
345
+ // Free satellite raster fallback (Esri World Imagery, no API key required).
346
+ var ESRI_WORLD_IMAGERY_URL = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}';
347
+
348
+ /**
349
+ * Maps a raw MVT source-layer name to a normalized semantic layer kind, so the
350
+ * fill/line/label accessors work across both the Mapbox (`mapbox-streets-v8`)
351
+ * and CARTO/OpenMapTiles schemas.
352
+ *
353
+ * | semantic | mapbox | openmaptiles |
354
+ * | -------- | ------------- | ------------ |
355
+ * | water | `water` | `water` |
356
+ * | admin | `admin` | `boundary` |
357
+ * | label | `place_label` | `place` |
358
+ */
359
+
360
+ function getBasemapLayerKind(layerName) {
361
+ switch (layerName) {
362
+ case 'water':
363
+ return 'water';
364
+ case 'admin':
365
+ case 'boundary':
366
+ return 'admin';
367
+ case 'place_label':
368
+ case 'place':
369
+ return 'label';
370
+ default:
371
+ return 'other';
372
+ }
373
+ }
374
+ var MAPBOX_ATTRIBUTION = {
375
+ label: '© Mapbox',
376
+ href: 'https://www.mapbox.com/about/maps/'
377
+ };
378
+ var OSM_ATTRIBUTION = {
379
+ label: '© OpenStreetMap',
380
+ href: 'https://www.openstreetmap.org/copyright'
381
+ };
382
+ var CARTO_ATTRIBUTION = {
383
+ label: '© CARTO',
384
+ href: 'https://carto.com/attributions'
385
+ };
386
+ var ESRI_ATTRIBUTION = {
387
+ label: 'Powered by Esri',
388
+ href: 'https://www.esri.com/'
389
+ };
390
+
391
+ /**
392
+ * Resolve the tile-source attribution entries for the globe basemap. deck.gl
393
+ * renders the globe basemap tiles itself (not the base Maplibre/Mapbox map), so
394
+ * the base map's attribution machinery never sees them. This lets the UI credit
395
+ * the actual tile provider(s) in globe mode.
396
+ */
397
+ var getGlobeBasemapAttributions = exports.getGlobeBasemapAttributions = function getGlobeBasemapAttributions(_ref) {
398
+ var _globe$config;
399
+ var globe = _ref.globe,
400
+ mapboxApiAccessToken = _ref.mapboxApiAccessToken,
401
+ mapStyleType = _ref.mapStyleType,
402
+ basemapProvider = _ref.basemapProvider;
403
+ if (!(globe !== null && globe !== void 0 && globe.enabled) || !((_globe$config = globe.config) !== null && _globe$config !== void 0 && _globe$config.basemap)) {
404
+ return [];
405
+ }
406
+ var provider = basemapProvider !== null && basemapProvider !== void 0 ? basemapProvider : resolveGlobeBasemapProvider(undefined, mapboxApiAccessToken);
407
+ if (provider === 'mapbox') {
408
+ return mapboxApiAccessToken ? [MAPBOX_ATTRIBUTION, OSM_ATTRIBUTION] : [];
409
+ }
410
+ var isSatellite = mapStyleType === 'satellite' || mapStyleType === 'satellite-street';
411
+ // CARTO vector tiles are OpenStreetMap-derived; Esri imagery is credited separately.
412
+ return isSatellite ? [ESRI_ATTRIBUTION, CARTO_ATTRIBUTION, OSM_ATTRIBUTION] : [CARTO_ATTRIBUTION, OSM_ATTRIBUTION];
413
+ };
414
+
415
+ // eslint-disable-next-line complexity
416
+ var getGlobeBaseLayers = exports.getGlobeBaseLayers = function getGlobeBaseLayers(_ref2) {
417
+ var mapboxApiAccessToken = _ref2.mapboxApiAccessToken,
418
+ globe = _ref2.globe,
419
+ mapStyleType = _ref2.mapStyleType,
420
+ basemapProvider = _ref2.basemapProvider,
421
+ latitude = _ref2.latitude,
422
+ zoom = _ref2.zoom;
423
+ var config = globe.config;
424
+ var isSatellite = mapStyleType === 'satellite';
425
+ var isSatelliteStreet = mapStyleType === 'satellite-street';
426
+ var latZoomCompensation = globeLatitudeZoomCompensation(latitude);
427
+
428
+ // Fall back to the free CARTO tiles whenever no Mapbox token is available so
429
+ // the globe basemap still renders (matches kepler's default token-free
430
+ // MapLibre/CARTO basemaps). Callers should pass an explicit `basemapProvider`
431
+ // (derived from the selected style) so the globe follows the 2D basemap.
432
+ var provider = basemapProvider !== null && basemapProvider !== void 0 ? basemapProvider : resolveGlobeBasemapProvider(undefined, mapboxApiAccessToken);
433
+ var useCarto = provider === 'carto';
434
+ var hasTileAccess = useCarto || Boolean(mapboxApiAccessToken);
435
+ return [config.atmosphere ? (0, _atmosphereLayer.getGlobeAtmosphereSkyLayer)({
436
+ config: config,
437
+ zoom: zoom
438
+ }) : null,
439
+ // Depth-only cross-section disk: writes depth at the globe's silhouette so
440
+ // far-side geometry (arcs/lines) is occluded by the planet.
441
+ (0, _globeDepthDiskLayer.getGlobeDepthDiskLayer)({
442
+ fillColor: config.surfaceColor
443
+ }),
444
+ // Background surface polygon
445
+ (!config.basemap || !isSatellite && !isSatelliteStreet) && new _layers.SolidPolygonLayer({
446
+ id: 'globe-background',
447
+ data: BACKGROUND_DATA,
448
+ getPolygon: function getPolygon(d) {
449
+ return d;
450
+ },
451
+ filled: true,
452
+ getFillColor: config.surfaceColor,
453
+ parameters: BACKGROUND_PARAMETERS
454
+ }),
455
+ // Fill hole at north pole
456
+ config.basemap && new _layers.SolidPolygonLayer({
457
+ id: 'globe-background-north-pole',
458
+ data: BACKGROUND_NORTH_POLE_DATA,
459
+ getPolygon: function getPolygon(d) {
460
+ return d;
461
+ },
462
+ filled: true,
463
+ getFillColor: config.water ? config.waterColor : config.surfaceColor,
464
+ parameters: BACKGROUND_PARAMETERS
465
+ }),
466
+ // Satellite tiles
467
+ config.basemap && (isSatellite || isSatelliteStreet) && hasTileAccess && new _geoLayers.TileLayer({
468
+ id: "globe-satellite-tiles-".concat(provider),
469
+ data: useCarto ? [ESRI_WORLD_IMAGERY_URL] : ["https://api.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}@2x.png?access_token=".concat(mapboxApiAccessToken)],
470
+ minZoom: 0,
471
+ maxZoom: useCarto ? 18 : 19,
472
+ zoomOffset: GLOBE_SATELLITE_ZOOM_OFFSET + latZoomCompensation,
473
+ extent: GLOBE_TILE_EXTENT,
474
+ // Esri tiles are 256px; Mapbox @2x tiles are 512px.
475
+ tileSize: useCarto ? 256 : 512 / devicePixelRatio,
476
+ renderSubLayers: function renderSubLayers(props) {
477
+ var _props$tile$bbox = props.tile.bbox,
478
+ west = _props$tile$bbox.west,
479
+ south = _props$tile$bbox.south,
480
+ east = _props$tile$bbox.east,
481
+ north = _props$tile$bbox.north;
482
+ return [new _layers.BitmapLayer(props, {
483
+ _imageCoordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
484
+ data: undefined,
485
+ image: props.data,
486
+ bounds: [west, south, east, north]
487
+ })];
488
+ },
489
+ parameters: BASEMAP_RASTER_PARAMETERS
490
+ }),
491
+ // Vector basemap (MVT labels/admin/water)
492
+ config.basemap && !isSatellite && hasTileAccess && new _geoLayers.MVTLayer({
493
+ // force the layer to update when the style/label/provider config changes
494
+ id: "globe-basemap-mvt-layer-".concat(provider, "-").concat(mapStyleType),
495
+ data: useCarto ? CARTO_VECTOR_TILE_URLS : "https://a.tiles.mapbox.com/v4/mapbox.mapbox-streets-v8/{z}/{x}/{y}.vector.pbf?access_token=".concat(mapboxApiAccessToken),
496
+ minZoom: 0,
497
+ // Overzoom past the source's native max instead of 404-ing on tiles that
498
+ // don't exist (which renders as empty rectangles at high zoom).
499
+ maxZoom: useCarto ? CARTO_VECTOR_MAX_DATA_ZOOM : MAPBOX_VECTOR_MAX_DATA_ZOOM,
500
+ zoomOffset: (useCarto ? CARTO_GLOBE_VECTOR_ZOOM_OFFSET : MAPBOX_GLOBE_VECTOR_ZOOM_OFFSET) + latZoomCompensation,
501
+ extent: GLOBE_TILE_EXTENT,
502
+ binary: false,
503
+ parameters: BASEMAP_MVT_PARAMETERS,
504
+ loadOptions: useCarto ? {
505
+ // OpenMapTiles schema: `boundary` = admin lines, `place` = labels.
506
+ mvt: {
507
+ layers: isSatelliteStreet ? ['place', 'boundary'] : ['place', 'boundary', 'water', 'transportation']
508
+ }
509
+ } : {
510
+ mvt: {
511
+ layers: isSatelliteStreet ? ['place_label', 'admin'] : ['place_label', 'admin', 'water', 'road']
512
+ }
513
+ },
514
+ // Render admin/water via GeoJsonLayer and place labels via TextLayer.
515
+ config: config,
516
+ renderSubLayers: function renderSubLayers(props) {
517
+ return new _mvtLabelLayer.MVTLabelLayer(props);
518
+ },
519
+ getFillColor: function getFillColor(f) {
520
+ switch (getBasemapLayerKind(f.properties.layerName)) {
521
+ case 'water':
522
+ return config.water ? config.waterColor : INVISIBLE_COLOR;
523
+ default:
524
+ return config.surfaceColor;
525
+ }
526
+ },
527
+ getLineColor: function getLineColor(f) {
528
+ switch (getBasemapLayerKind(f.properties.layerName)) {
529
+ case 'admin':
530
+ return config.adminLines ? config.adminLinesColor : INVISIBLE_COLOR;
531
+ default:
532
+ return config.surfaceColor;
533
+ }
534
+ },
535
+ getLineWidth: function getLineWidth(f) {
536
+ switch (getBasemapLayerKind(f.properties.layerName)) {
537
+ case 'admin':
538
+ switch (f.properties.admin_level) {
539
+ case 0:
540
+ case 2:
541
+ return 1;
542
+ default:
543
+ return 0.75;
544
+ }
545
+ default:
546
+ return 0;
547
+ }
548
+ },
549
+ updateTriggers: {
550
+ getFillColor: [config.waterColor, config.surfaceColor, config.water],
551
+ getLineColor: [config.adminLinesColor, config.surfaceColor, config.adminLines]
552
+ },
553
+ lineWidthUnits: 'pixels',
554
+ lineWidthMinPixels: 0,
555
+ lineWidthMaxPixels: 20,
556
+ getPointRadius: 0,
557
+ pointRadiusMinPixels: 0
558
+ })].filter(Boolean);
559
+ };
560
+ var getGlobeTopLayers = exports.getGlobeTopLayers = function getGlobeTopLayers(_ref3) {
561
+ var globe = _ref3.globe,
562
+ zoom = _ref3.zoom;
563
+ var config = globe.config;
564
+ return [config.atmosphere ? (0, _atmosphereLayer.getGlobeAtmosphereLayer)({
565
+ config: config,
566
+ zoom: zoom
567
+ }) : null].filter(Boolean);
568
+ };
569
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbGF5ZXJzIiwiX2dlb0xheWVycyIsIl9hdG1vc3BoZXJlTGF5ZXIiLCJfZ2xvYmVEZXB0aERpc2tMYXllciIsIl9tdnRMYWJlbExheWVyIiwiZGV2aWNlUGl4ZWxSYXRpbyIsIk1hdGgiLCJtaW4iLCJ3aW5kb3ciLCJCQUNLR1JPVU5EX1BBUkFNRVRFUlMiLCJkZXB0aFRlc3QiLCJjdWxsIiwiZGVwdGhNYXNrIiwiQkFTRU1BUF9SQVNURVJfUEFSQU1FVEVSUyIsIkJBQ0tHUk9VTkRfREFUQSIsIkJBQ0tHUk9VTkRfTk9SVEhfUE9MRV9EQVRBIiwiREVGQVVMVF9CQVNFTUFQX0NPTE9SIiwiZXhwb3J0cyIsImJhY2tncm91bmRGaWxsQ29sb3IiLCJiYXNlbWFwRGVmYXVsdEZpbGxDb2xvciIsImJhc2VtYXBXYXRlckZpbGxDb2xvciIsImJhc2VtYXBEZWZhdWx0TGluZUNvbG9yIiwiYmFzZW1hcEFkbWluTGluZUNvbG9yIiwiYmFzZW1hcExhYmVsQ29sb3IiLCJnZXRQYWludENvbG9yIiwiY29sb3IiLCJBcnJheSIsImlzQXJyYXkiLCJjb2xvclN0cmluZ1RvUkdCIiwiaHNsTWF0Y2giLCJtYXRjaCIsImgiLCJwYXJzZUludCIsInMiLCJsIiwiciIsImciLCJiIiwiaHVlMnJnYiIsInAiLCJxIiwidCIsInJvdW5kIiwicmdiTWF0Y2giLCJoZXhNYXRjaCIsImhleCIsInNsaWNlIiwiZmluZEZpcnN0TGF5ZXJCeUdyb3VwIiwibGF5ZXJzIiwibGF5ZXJHcm91cHMiLCJncm91cFNsdWciLCJsYXllckdyb3VwIiwiZmluZCIsImdyb3VwIiwic2x1ZyIsImxheWVyIiwiZmlsdGVyIiwiZmluZEJhY2tncm91bmRDb2xvciIsInN0eWxlIiwiX2ZvdW5kIiwiZm91bmQiLCJpZCIsInR5cGUiLCJwYWludCIsImZpbmRXYXRlckNvbG9yIiwiX2ZvdW5kJHBhaW50IiwiZmluZEFkbWluQ29sb3IiLCJfYm9yZGVyTGF5ZXJzJHBhaW50IiwiYm9yZGVyTGF5ZXJzIiwibHlyIiwiZmluZExhYmVsQ29sb3IiLCJfbGFiZWxMYXllciIsImxhYmVsTGF5ZXIiLCJnZXRCYXNlbWFwQ29sb3JzIiwibWFwU3R5bGUiLCJfZmluZEJhY2tncm91bmRDb2xvciIsIl9maW5kV2F0ZXJDb2xvciIsIl9maW5kQWRtaW5Db2xvciIsIl9maW5kTGFiZWxDb2xvciIsIl9tYXBTdHlsZSRzdHlsZSIsInN0eWxlSnNvbiIsIl9tYXBTdHlsZSRsYXllckdyb3VwcyIsIktOT1dOX1NUWUxFX0NPTE9SUyIsImRhcmsiLCJsaWdodCIsInBvc2l0cm9uIiwidm95YWdlciIsIm11dGVkIiwibXV0ZWRfbmlnaHQiLCJnZXRCYXNlbWFwQ29sb3JzRm9yU3R5bGUiLCJzdHlsZVR5cGUiLCJfbWFwU3R5bGUkc3R5bGUyIiwibGVuZ3RoIiwiZ2V0R2xvYmVDbGVhckNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiSU5WSVNJQkxFX0NPTE9SIiwiQkFTRU1BUF9NVlRfUEFSQU1FVEVSUyIsIk1BUEJPWF9HTE9CRV9WRUNUT1JfWk9PTV9PRkZTRVQiLCJDQVJUT19HTE9CRV9WRUNUT1JfWk9PTV9PRkZTRVQiLCJHTE9CRV9TQVRFTExJVEVfWk9PTV9PRkZTRVQiLCJHTE9CRV9USUxFX0VYVEVOVCIsIk1BUEJPWF9WRUNUT1JfTUFYX0RBVEFfWk9PTSIsIkNBUlRPX1ZFQ1RPUl9NQVhfREFUQV9aT09NIiwiem9vbUFkanVzdCIsImxhdGl0dWRlIiwibG9nMiIsIlBJIiwiY29zIiwiZ2xvYmVMYXRpdHVkZVpvb21Db21wZW5zYXRpb24iLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImNsYW1wZWQiLCJtYXgiLCJyZXNvbHZlR2xvYmVCYXNlbWFwUHJvdmlkZXIiLCJiYXNlTWFwTGlicmFyeSIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwiQ0FSVE9fVkVDVE9SX1RJTEVfVVJMUyIsIkVTUklfV09STERfSU1BR0VSWV9VUkwiLCJnZXRCYXNlbWFwTGF5ZXJLaW5kIiwibGF5ZXJOYW1lIiwiTUFQQk9YX0FUVFJJQlVUSU9OIiwibGFiZWwiLCJocmVmIiwiT1NNX0FUVFJJQlVUSU9OIiwiQ0FSVE9fQVRUUklCVVRJT04iLCJFU1JJX0FUVFJJQlVUSU9OIiwiZ2V0R2xvYmVCYXNlbWFwQXR0cmlidXRpb25zIiwiX3JlZiIsIl9nbG9iZSRjb25maWciLCJnbG9iZSIsIm1hcFN0eWxlVHlwZSIsImJhc2VtYXBQcm92aWRlciIsImVuYWJsZWQiLCJjb25maWciLCJiYXNlbWFwIiwicHJvdmlkZXIiLCJ1bmRlZmluZWQiLCJpc1NhdGVsbGl0ZSIsImdldEdsb2JlQmFzZUxheWVycyIsIl9yZWYyIiwiem9vbSIsImlzU2F0ZWxsaXRlU3RyZWV0IiwibGF0Wm9vbUNvbXBlbnNhdGlvbiIsInVzZUNhcnRvIiwiaGFzVGlsZUFjY2VzcyIsIkJvb2xlYW4iLCJhdG1vc3BoZXJlIiwiZ2V0R2xvYmVBdG1vc3BoZXJlU2t5TGF5ZXIiLCJnZXRHbG9iZURlcHRoRGlza0xheWVyIiwiZmlsbENvbG9yIiwic3VyZmFjZUNvbG9yIiwiU29saWRQb2x5Z29uTGF5ZXIiLCJkYXRhIiwiZ2V0UG9seWdvbiIsImQiLCJmaWxsZWQiLCJnZXRGaWxsQ29sb3IiLCJwYXJhbWV0ZXJzIiwid2F0ZXIiLCJ3YXRlckNvbG9yIiwiVGlsZUxheWVyIiwiY29uY2F0IiwibWluWm9vbSIsIm1heFpvb20iLCJ6b29tT2Zmc2V0IiwiZXh0ZW50IiwidGlsZVNpemUiLCJyZW5kZXJTdWJMYXllcnMiLCJwcm9wcyIsIl9wcm9wcyR0aWxlJGJib3giLCJ0aWxlIiwiYmJveCIsIndlc3QiLCJzb3V0aCIsImVhc3QiLCJub3J0aCIsIkJpdG1hcExheWVyIiwiX2ltYWdlQ29vcmRpbmF0ZVN5c3RlbSIsIkNPT1JESU5BVEVfU1lTVEVNIiwiQ0FSVEVTSUFOIiwiaW1hZ2UiLCJib3VuZHMiLCJNVlRMYXllciIsImJpbmFyeSIsImxvYWRPcHRpb25zIiwibXZ0IiwiTVZUTGFiZWxMYXllciIsImYiLCJwcm9wZXJ0aWVzIiwiZ2V0TGluZUNvbG9yIiwiYWRtaW5MaW5lcyIsImFkbWluTGluZXNDb2xvciIsImdldExpbmVXaWR0aCIsImFkbWluX2xldmVsIiwidXBkYXRlVHJpZ2dlcnMiLCJsaW5lV2lkdGhVbml0cyIsImxpbmVXaWR0aE1pblBpeGVscyIsImxpbmVXaWR0aE1heFBpeGVscyIsImdldFBvaW50UmFkaXVzIiwicG9pbnRSYWRpdXNNaW5QaXhlbHMiLCJnZXRHbG9iZVRvcExheWVycyIsIl9yZWYzIiwiZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2xvYmUvZ2xvYmUtbGF5ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7Q09PUkRJTkFURV9TWVNURU0sIExheWVyfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7U29saWRQb2x5Z29uTGF5ZXIsIEJpdG1hcExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtUaWxlTGF5ZXIsIE1WVExheWVyfSBmcm9tICdAZGVjay5nbC9nZW8tbGF5ZXJzJztcblxuaW1wb3J0IHR5cGUge0dsb2JlfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7UkdCQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge2dldEdsb2JlQXRtb3NwaGVyZUxheWVyLCBnZXRHbG9iZUF0bW9zcGhlcmVTa3lMYXllcn0gZnJvbSAnLi9hdG1vc3BoZXJlLWxheWVyJztcbmltcG9ydCB7Z2V0R2xvYmVEZXB0aERpc2tMYXllcn0gZnJvbSAnLi9nbG9iZS1kZXB0aC1kaXNrLWxheWVyJztcbmltcG9ydCB7TVZUTGFiZWxMYXllcn0gZnJvbSAnLi9tdnQtbGFiZWwtbGF5ZXInO1xuXG50eXBlIExheWVyR3JvdXAgPSB7c2x1Zzogc3RyaW5nOyBmaWx0ZXI6IChsYXllcjogYW55KSA9PiBib29sZWFufTtcblxuY29uc3QgZGV2aWNlUGl4ZWxSYXRpbyA9IE1hdGgubWluKFxuICAyLFxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8pIHx8IDFcbik7XG5cbmNvbnN0IEJBQ0tHUk9VTkRfUEFSQU1FVEVSUyA9IHtcbiAgZGVwdGhUZXN0OiB0cnVlLFxuICBjdWxsOiB0cnVlLFxuICBkZXB0aE1hc2s6IGZhbHNlXG59O1xuXG5jb25zdCBCQVNFTUFQX1JBU1RFUl9QQVJBTUVURVJTID0ge1xuICBkZXB0aE1hc2s6IGZhbHNlXG59O1xuXG5jb25zdCBCQUNLR1JPVU5EX0RBVEEgPSBbXG4gIFtcbiAgICBbLTE4MCwgOTBdLFxuICAgIFswLCA5MF0sXG4gICAgWzE4MCwgOTBdLFxuICAgIFsxODAsIC05MF0sXG4gICAgWzAsIC05MF0sXG4gICAgWy0xODAsIC05MF1cbiAgXVxuXTtcblxuY29uc3QgQkFDS0dST1VORF9OT1JUSF9QT0xFX0RBVEEgPSBbXG4gIFtcbiAgICBbLTE4MCwgOTBdLFxuICAgIFswLCA5MF0sXG4gICAgWzE4MCwgOTBdLFxuICAgIFsxODAsIDg1XSxcbiAgICBbMCwgODVdLFxuICAgIFstMTgwLCA4NV1cbiAgXVxuXTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkFTRU1BUF9DT0xPUiA9IHtcbiAgYmFja2dyb3VuZEZpbGxDb2xvcjogWzksIDE2LCAyOV0gYXMgUkdCQ29sb3IsXG4gIGJhc2VtYXBEZWZhdWx0RmlsbENvbG9yOiBbMjU1LCAyNTUsIDI1NV0gYXMgUkdCQ29sb3IsXG4gIGJhc2VtYXBXYXRlckZpbGxDb2xvcjogWzE3LCAzNSwgNDhdIGFzIFJHQkNvbG9yLFxuICBiYXNlbWFwRGVmYXVsdExpbmVDb2xvcjogWzQwLCA2MywgOTNdIGFzIFJHQkNvbG9yLFxuICBiYXNlbWFwQWRtaW5MaW5lQ29sb3I6IFs0MCwgNjMsIDkzXSBhcyBSR0JDb2xvcixcbiAgYmFzZW1hcExhYmVsQ29sb3I6IFsxMTQuNzUsIDExNC43NSwgMTE0Ljc1XSBhcyBSR0JDb2xvclxufTtcblxuZnVuY3Rpb24gZ2V0UGFpbnRDb2xvcihjb2xvcjogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbG9yKSAmJiBjb2xvclswXSA9PT0gJ2ludGVycG9sYXRlJykge1xuICAgIHJldHVybiBjb2xvcls0XTtcbiAgfVxuICByZXR1cm4gY29sb3I7XG59XG5cbmZ1bmN0aW9uIGNvbG9yU3RyaW5nVG9SR0IoY29sb3I6IHN0cmluZyB8IG51bGwpOiBSR0JDb2xvciB8IG51bGwge1xuICBpZiAoIWNvbG9yKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb2xvciAhPT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xuXG4gIC8vIEhhbmRsZSBoc2woKSBmb3JtYXRcbiAgY29uc3QgaHNsTWF0Y2ggPSBjb2xvci5tYXRjaCgvaHNsXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKSVcXHMqLFxccyooXFxkKyklXFxzKlxcKS8pO1xuICBpZiAoaHNsTWF0Y2gpIHtcbiAgICBjb25zdCBoID0gcGFyc2VJbnQoaHNsTWF0Y2hbMV0sIDEwKSAvIDM2MDtcbiAgICBjb25zdCBzID0gcGFyc2VJbnQoaHNsTWF0Y2hbMl0sIDEwKSAvIDEwMDtcbiAgICBjb25zdCBsID0gcGFyc2VJbnQoaHNsTWF0Y2hbM10sIDEwKSAvIDEwMDtcbiAgICAvLyBIU0wgdG8gUkdCIGNvbnZlcnNpb25cbiAgICBsZXQgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcjtcbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgciA9IGcgPSBiID0gbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaHVlMnJnYiA9IChwOiBudW1iZXIsIHE6IG51bWJlciwgdDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh0IDwgMCkgdCArPSAxO1xuICAgICAgICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgICAgICAgaWYgKHQgPCAxIC8gNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7XG4gICAgICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxO1xuICAgICAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgY29uc3QgcCA9IDIgKiBsIC0gcTtcbiAgICAgIHIgPSBodWUycmdiKHAsIHEsIGggKyAxIC8gMyk7XG4gICAgICBnID0gaHVlMnJnYihwLCBxLCBoKTtcbiAgICAgIGIgPSBodWUycmdiKHAsIHEsIGggLSAxIC8gMyk7XG4gICAgfVxuICAgIHJldHVybiBbTWF0aC5yb3VuZChyICogMjU1KSwgTWF0aC5yb3VuZChnICogMjU1KSwgTWF0aC5yb3VuZChiICogMjU1KV0gYXMgUkdCQ29sb3I7XG4gIH1cblxuICAvLyBIYW5kbGUgcmdiKCkgZm9ybWF0XG4gIGNvbnN0IHJnYk1hdGNoID0gY29sb3IubWF0Y2goL3JnYlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLyk7XG4gIGlmIChyZ2JNYXRjaCkge1xuICAgIHJldHVybiBbXG4gICAgICBwYXJzZUludChyZ2JNYXRjaFsxXSwgMTApLFxuICAgICAgcGFyc2VJbnQocmdiTWF0Y2hbMl0sIDEwKSxcbiAgICAgIHBhcnNlSW50KHJnYk1hdGNoWzNdLCAxMClcbiAgICBdIGFzIFJHQkNvbG9yO1xuICB9XG5cbiAgLy8gSGFuZGxlIGhleCBmb3JtYXRcbiAgY29uc3QgaGV4TWF0Y2ggPSBjb2xvci5tYXRjaCgvXiMoWzAtOWEtZl17Nn0pJC9pKTtcbiAgaWYgKGhleE1hdGNoKSB7XG4gICAgY29uc3QgaGV4ID0gaGV4TWF0Y2hbMV07XG4gICAgcmV0dXJuIFtcbiAgICAgIHBhcnNlSW50KGhleC5zbGljZSgwLCAyKSwgMTYpLFxuICAgICAgcGFyc2VJbnQoaGV4LnNsaWNlKDIsIDQpLCAxNiksXG4gICAgICBwYXJzZUludChoZXguc2xpY2UoNCwgNiksIDE2KVxuICAgIF0gYXMgUkdCQ29sb3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEZpcnN0TGF5ZXJCeUdyb3VwKGxheWVyczogYW55W10sIGxheWVyR3JvdXBzOiBMYXllckdyb3VwW10sIGdyb3VwU2x1Zzogc3RyaW5nKSB7XG4gIGNvbnN0IGxheWVyR3JvdXAgPSBsYXllckdyb3Vwcy5maW5kKGdyb3VwID0+IGdyb3VwLnNsdWcgPT09IGdyb3VwU2x1Zyk7XG4gIGlmICghbGF5ZXJHcm91cCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBsYXllcnMuZmluZChsYXllciA9PiBsYXllckdyb3VwLmZpbHRlcihsYXllcikpO1xufVxuXG5mdW5jdGlvbiBmaW5kQmFja2dyb3VuZENvbG9yKHN0eWxlOiBhbnkpOiBSR0JDb2xvciB8IG51bGwge1xuICBsZXQgZm91bmQgPSBzdHlsZS5sYXllcnMuZmluZCgobDogYW55KSA9PiBsLmlkID09PSAnYmFja2dyb3VuZCcgfHwgbC5pZCA9PT0gJ2xhbmQnKTtcbiAgZm91bmQgPSBmb3VuZCB8fCBzdHlsZS5sYXllcnMuZmluZCgobDogYW55KSA9PiBsLnR5cGUgPT09ICdiYWNrZ3JvdW5kJyk7XG4gIHJldHVybiBjb2xvclN0cmluZ1RvUkdCKGdldFBhaW50Q29sb3IoZm91bmQ/LnBhaW50Py5bJ2JhY2tncm91bmQtY29sb3InXSkpO1xufVxuXG5mdW5jdGlvbiBmaW5kV2F0ZXJDb2xvcihzdHlsZTogYW55LCBsYXllckdyb3VwczogTGF5ZXJHcm91cFtdKTogUkdCQ29sb3IgfCBudWxsIHtcbiAgY29uc3QgZm91bmQgPVxuICAgIHN0eWxlLmxheWVycy5maW5kKChsOiBhbnkpID0+IGwuaWQgPT09ICd3YXRlcicpIHx8XG4gICAgZmluZEZpcnN0TGF5ZXJCeUdyb3VwKHN0eWxlLmxheWVycywgbGF5ZXJHcm91cHMsICd3YXRlcicpO1xuICByZXR1cm4gY29sb3JTdHJpbmdUb1JHQihmb3VuZD8ucGFpbnQ/LlsnZmlsbC1jb2xvciddKTtcbn1cblxuZnVuY3Rpb24gZmluZEFkbWluQ29sb3Ioc3R5bGU6IGFueSwgbGF5ZXJHcm91cHM6IExheWVyR3JvdXBbXSk6IFJHQkNvbG9yIHwgbnVsbCB7XG4gIGNvbnN0IGJvcmRlckxheWVycyA9XG4gICAgc3R5bGUubGF5ZXJzLmZpbmQoKGx5cjogYW55KSA9PiBseXIuaWQgPT09ICdhZG1pbi0zLTQtYm91bmRhcmllcycpIHx8XG4gICAgZmluZEZpcnN0TGF5ZXJCeUdyb3VwKHN0eWxlLmxheWVycywgbGF5ZXJHcm91cHMsICdib3JkZXInKTtcbiAgcmV0dXJuIGNvbG9yU3RyaW5nVG9SR0IoYm9yZGVyTGF5ZXJzPy5wYWludD8uWydsaW5lLWNvbG9yJ10pO1xufVxuXG5mdW5jdGlvbiBmaW5kTGFiZWxDb2xvcihzdHlsZTogYW55LCBsYXllckdyb3VwczogTGF5ZXJHcm91cFtdKTogUkdCQ29sb3IgfCBudWxsIHtcbiAgbGV0IGxhYmVsTGF5ZXIgPSBzdHlsZS5sYXllcnMuZmluZChcbiAgICAobHlyOiBhbnkpID0+IGx5ci5pZCA9PT0gJ2NvdW50cnktbGFiZWwtbGcnICYmIGx5ci50eXBlID09PSAnc3ltYm9sJ1xuICApO1xuICBsYWJlbExheWVyID1cbiAgICBsYWJlbExheWVyIHx8XG4gICAgc3R5bGUubGF5ZXJzLmZpbmQoKGx5cjogYW55KSA9PiBseXIuaWQgPT09ICdjb3VudHJ5LWxhYmVsJyAmJiBseXIudHlwZSA9PT0gJ3N5bWJvbCcpO1xuICBsYWJlbExheWVyID0gbGFiZWxMYXllciB8fCBmaW5kRmlyc3RMYXllckJ5R3JvdXAoc3R5bGUubGF5ZXJzLCBsYXllckdyb3VwcywgJ2xhYmVsJyk7XG4gIHJldHVybiBjb2xvclN0cmluZ1RvUkdCKGxhYmVsTGF5ZXI/LnBhaW50Py5bJ3RleHQtY29sb3InXSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRCYXNlbWFwQ29sb3JzID0gKFxuICBtYXBTdHlsZTogUGFydGlhbDx7c3R5bGU6IGFueTsgbGF5ZXJHcm91cHM6IExheWVyR3JvdXBbXX0+XG4pOiB7XG4gIGJhY2tncm91bmRGaWxsQ29sb3I6IFJHQkNvbG9yO1xuICBiYXNlbWFwV2F0ZXJGaWxsQ29sb3I6IFJHQkNvbG9yO1xuICBiYXNlbWFwQWRtaW5MaW5lQ29sb3I6IFJHQkNvbG9yO1xuICBiYXNlbWFwTGFiZWxDb2xvcjogUkdCQ29sb3I7XG59ID0+IHtcbiAgY29uc3Qge3N0eWxlOiBzdHlsZUpzb24gPSB7bGF5ZXJzOiBbXX0sIGxheWVyR3JvdXBzID0gW119ID0gbWFwU3R5bGU7XG5cbiAgcmV0dXJuIHtcbiAgICBiYWNrZ3JvdW5kRmlsbENvbG9yOlxuICAgICAgZmluZEJhY2tncm91bmRDb2xvcihzdHlsZUpzb24pID8/IERFRkFVTFRfQkFTRU1BUF9DT0xPUi5iYWNrZ3JvdW5kRmlsbENvbG9yLFxuICAgIGJhc2VtYXBXYXRlckZpbGxDb2xvcjpcbiAgICAgIGZpbmRXYXRlckNvbG9yKHN0eWxlSnNvbiwgbGF5ZXJHcm91cHMpID8/IERFRkFVTFRfQkFTRU1BUF9DT0xPUi5iYXNlbWFwV2F0ZXJGaWxsQ29sb3IsXG4gICAgYmFzZW1hcEFkbWluTGluZUNvbG9yOlxuICAgICAgZmluZEFkbWluQ29sb3Ioc3R5bGVKc29uLCBsYXllckdyb3VwcykgPz8gREVGQVVMVF9CQVNFTUFQX0NPTE9SLmJhc2VtYXBBZG1pbkxpbmVDb2xvcixcbiAgICBiYXNlbWFwTGFiZWxDb2xvcjpcbiAgICAgIGZpbmRMYWJlbENvbG9yKHN0eWxlSnNvbiwgbGF5ZXJHcm91cHMpID8/IERFRkFVTFRfQkFTRU1BUF9DT0xPUi5iYXNlbWFwTGFiZWxDb2xvclxuICB9O1xufTtcblxuLy8gUHJlZGVmaW5lZCBjb2xvciBzY2hlbWVzIGZvciB3ZWxsLWtub3duIGJhc2VtYXAgc3R5bGVzXG5jb25zdCBLTk9XTl9TVFlMRV9DT0xPUlM6IFJlY29yZDxcbiAgc3RyaW5nLFxuICB7XG4gICAgYmFja2dyb3VuZEZpbGxDb2xvcjogUkdCQ29sb3I7XG4gICAgYmFzZW1hcFdhdGVyRmlsbENvbG9yOiBSR0JDb2xvcjtcbiAgICBiYXNlbWFwQWRtaW5MaW5lQ29sb3I6IFJHQkNvbG9yO1xuICAgIGJhc2VtYXBMYWJlbENvbG9yOiBSR0JDb2xvcjtcbiAgfVxuPiA9IHtcbiAgZGFyazoge1xuICAgIGJhY2tncm91bmRGaWxsQ29sb3I6IFsxNSwgMTUsIDE1XSxcbiAgICBiYXNlbWFwV2F0ZXJGaWxsQ29sb3I6IFsxMCwgMjAsIDM1XSxcbiAgICBiYXNlbWFwQWRtaW5MaW5lQ29sb3I6IFs2MCwgNjAsIDgwXSxcbiAgICBiYXNlbWFwTGFiZWxDb2xvcjogWzE1MCwgMTUwLCAxNTBdXG4gIH0sXG4gICdkYXJrLW1hdHRlcic6IHtcbiAgICBiYWNrZ3JvdW5kRmlsbENvbG9yOiBbMTgsIDE4LCAxOF0sXG4gICAgYmFzZW1hcFdhdGVyRmlsbENvbG9yOiBbMTQsIDE5LCAyOV0sXG4gICAgYmFzZW1hcEFkbWluTGluZUNvbG9yOiBbNTAsIDUwLCA2MF0sXG4gICAgYmFzZW1hcExhYmVsQ29sb3I6IFsxMzAsIDEzMCwgMTMwXVxuICB9LFxuICBsaWdodDoge1xuICAgIGJhY2tncm91bmRGaWxsQ29sb3I6IFsyMzUsIDIzMywgMjI4XSxcbiAgICBiYXNlbWFwV2F0ZXJGaWxsQ29sb3I6IFsxNzAsIDIxMSwgMjIzXSxcbiAgICBiYXNlbWFwQWRtaW5MaW5lQ29sb3I6IFsxODAsIDE3NSwgMTcwXSxcbiAgICBiYXNlbWFwTGFiZWxDb2xvcjogWzgwLCA4MCwgODBdXG4gIH0sXG4gIHBvc2l0cm9uOiB7XG4gICAgYmFja2dyb3VuZEZpbGxDb2xvcjogWzI0MiwgMjM5LCAyMzNdLFxuICAgIGJhc2VtYXBXYXRlckZpbGxDb2xvcjogWzE3NCwgMjA5LCAyMjBdLFxuICAgIGJhc2VtYXBBZG1pbkxpbmVDb2xvcjogWzE5MCwgMTg1LCAxODBdLFxuICAgIGJhc2VtYXBMYWJlbENvbG9yOiBbOTAsIDkwLCA5MF1cbiAgfSxcbiAgdm95YWdlcjoge1xuICAgIGJhY2tncm91bmRGaWxsQ29sb3I6IFsyMzQsIDIyOSwgMjIwXSxcbiAgICBiYXNlbWFwV2F0ZXJGaWxsQ29sb3I6IFsxNzAsIDIxMSwgMjIzXSxcbiAgICBiYXNlbWFwQWRtaW5MaW5lQ29sb3I6IFsxODAsIDE3MCwgMTYwXSxcbiAgICBiYXNlbWFwTGFiZWxDb2xvcjogWzcwLCA3MCwgNzBdXG4gIH0sXG4gIG11dGVkOiB7XG4gICAgYmFja2dyb3VuZEZpbGxDb2xvcjogWzIyNSwgMjI1LCAyMThdLFxuICAgIGJhc2VtYXBXYXRlckZpbGxDb2xvcjogWzE4MCwgMjEwLCAyMjBdLFxuICAgIGJhc2VtYXBBZG1pbkxpbmVDb2xvcjogWzE3MCwgMTY1LCAxNjBdLFxuICAgIGJhc2VtYXBMYWJlbENvbG9yOiBbOTAsIDkwLCA5MF1cbiAgfSxcbiAgbXV0ZWRfbmlnaHQ6IHtcbiAgICBiYWNrZ3JvdW5kRmlsbENvbG9yOiBbMjIsIDI2LCAzMF0sXG4gICAgYmFzZW1hcFdhdGVyRmlsbENvbG9yOiBbMTUsIDI1LCA0MF0sXG4gICAgYmFzZW1hcEFkbWluTGluZUNvbG9yOiBbNTUsIDYwLCA3MF0sXG4gICAgYmFzZW1hcExhYmVsQ29sb3I6IFsxNDAsIDE0MCwgMTQwXVxuICB9XG59O1xuXG4vKipcbiAqIEdldCBiYXNlbWFwIGNvbG9ycyBlaXRoZXIgZnJvbSB0aGUgc3R5bGUgSlNPTiBvciBmcm9tIGtub3duIHN0eWxlIHByZXNldHMuXG4gKiBGYWxscyBiYWNrIHRvIGRlZmF1bHQgZGFyayBjb2xvcnMgaWYgc3R5bGUgaXMgdW5rbm93biBhbmQgbm8gSlNPTiBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRCYXNlbWFwQ29sb3JzRm9yU3R5bGUgPSAoXG4gIHN0eWxlVHlwZTogc3RyaW5nLFxuICBtYXBTdHlsZT86IFBhcnRpYWw8e3N0eWxlOiBhbnk7IGxheWVyR3JvdXBzOiBMYXllckdyb3VwW119PlxuKToge1xuICBiYWNrZ3JvdW5kRmlsbENvbG9yOiBSR0JDb2xvcjtcbiAgYmFzZW1hcFdhdGVyRmlsbENvbG9yOiBSR0JDb2xvcjtcbiAgYmFzZW1hcEFkbWluTGluZUNvbG9yOiBSR0JDb2xvcjtcbiAgYmFzZW1hcExhYmVsQ29sb3I6IFJHQkNvbG9yO1xufSA9PiB7XG4gIC8vIFRyeSB0byBleHRyYWN0IGZyb20gc3R5bGUgSlNPTiBmaXJzdFxuICBpZiAobWFwU3R5bGU/LnN0eWxlPy5sYXllcnM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBnZXRCYXNlbWFwQ29sb3JzKG1hcFN0eWxlKTtcbiAgfVxuICAvLyBGYWxsIGJhY2sgdG8ga25vd24gc3R5bGUgcHJlc2V0c1xuICBpZiAoS05PV05fU1RZTEVfQ09MT1JTW3N0eWxlVHlwZV0pIHtcbiAgICByZXR1cm4gS05PV05fU1RZTEVfQ09MT1JTW3N0eWxlVHlwZV07XG4gIH1cbiAgLy8gRGVmYXVsdCBkYXJrIGNvbG9yc1xuICByZXR1cm4ge1xuICAgIGJhY2tncm91bmRGaWxsQ29sb3I6IERFRkFVTFRfQkFTRU1BUF9DT0xPUi5iYWNrZ3JvdW5kRmlsbENvbG9yLFxuICAgIGJhc2VtYXBXYXRlckZpbGxDb2xvcjogREVGQVVMVF9CQVNFTUFQX0NPTE9SLmJhc2VtYXBXYXRlckZpbGxDb2xvcixcbiAgICBiYXNlbWFwQWRtaW5MaW5lQ29sb3I6IERFRkFVTFRfQkFTRU1BUF9DT0xPUi5iYXNlbWFwQWRtaW5MaW5lQ29sb3IsXG4gICAgYmFzZW1hcExhYmVsQ29sb3I6IERFRkFVTFRfQkFTRU1BUF9DT0xPUi5iYXNlbWFwTGFiZWxDb2xvclxuICB9O1xufTtcblxuLyoqXG4gKiBDbGVhciBjb2xvciAoYmFja2dyb3VuZCBhcm91bmQgdGhlIGdsb2JlKSBmb3IgZ2xvYmUgbW9kZSwgaW4gUkdCQSAwLTI1NSBhc1xuICogZXhwZWN0ZWQgYnkgZGVjay5nbCdzIFZpZXcgYGNsZWFyQ29sb3JgIHByb3AgKGRlY2suZ2wgPj0gOSBubyBsb25nZXIgc3VwcG9ydHNcbiAqIHRoZSBnbG9iYWwgYHBhcmFtZXRlcnMuY2xlYXJDb2xvcmA7IGl0IG11c3QgYmUgc2V0IHBlci12aWV3IHdpdGggYGNsZWFyOiB0cnVlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iZUNsZWFyQ29sb3IoXG4gIGJhY2tncm91bmRDb2xvcj86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bWJlcltdXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICByZXR1cm4gW2JhY2tncm91bmRDb2xvclswXSwgYmFja2dyb3VuZENvbG9yWzFdLCBiYWNrZ3JvdW5kQ29sb3JbMl0sIDI1NV07XG4gIH1cbiAgLy8gRGVmYXVsdCBtYXRjaGVzIHRoZSBwcmV2aW91cyBoYXJkY29kZWQgY2xlYXIgY29sb3IgWzAuMDE1LCAwLjAzNSwgMC4wNjVdIGluIDAtMSBzcGFjZS5cbiAgcmV0dXJuIFs0LCA5LCAxNywgMjU1XTtcbn1cblxuY29uc3QgSU5WSVNJQkxFX0NPTE9SOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFswLCAwLCAwLCAwXTtcblxuY29uc3QgQkFTRU1BUF9NVlRfUEFSQU1FVEVSUyA9IHtcbiAgLy8gT2NjbHVkZSB0aGUgZmFyIHNpZGUgb2YgdGhlIGdsb2JlIHZpYSB0aGUgREVQVEggRElTSyAoZ2V0R2xvYmVEZXB0aERpc2tMYXllcilcbiAgLy8gcmF0aGVyIHRoYW4gYmFjay1mYWNlIGN1bGxpbmcuIEdsb2JlIG1vZGUgc2V0cyBhIGdsb2JhbCBgY3VsbDogdHJ1ZWAgZm9yIHRoZVxuICAvLyBvcGFxdWUgc3BoZXJlIHN1cmZhY2UsIGJ1dCBiYWNrLWZhY2UgY3VsbGluZyByZWxpZXMgb24gc3RhYmxlIHRyaWFuZ2xlXG4gIC8vIHdpbmRpbmcg4oCUIGFuZCBkZWNrLmdsIDkncyBnbG9iZSBwcm9qZWN0aW9uIGxvc2VzIHByZWNpc2lvbiBhdCBoaWdoIHpvb21cbiAgLy8gKGZsb2F0MzIpLCBmbGlwcGluZyB0aGUgd2luZGluZyBvZiB0aGUgc21hbGwgYWRtaW4vd2F0ZXIgdHJpYW5nbGVzIHNvIHRoZXlcbiAgLy8gZ2V0IHdyb25nbHkgY3VsbGVkIGFuZCB0aGUgZ2VvbWV0cnkgdmFuaXNoZXMgcGFzdCB+em9vbSAxMiAoeW91IHRoZW4gc2VlXG4gIC8vIHRocm91Z2ggdG8gdGhlIGZhciBzaWRlIC8gXCJkaWZmZXJlbnQgZ2VvbWV0cnlcIikuIERlcHRoIHRlc3RpbmcgYWdhaW5zdCB0aGUgZGlza1xuICAvLyBpcyBhIHByZWNpc2lvbi1yb2J1c3Qgb2NjbHVkZXIgdGhhdCB3b3JrcyBhdCBhbnkgem9vbSwgc286XG4gIC8vICAgLSBjdWxsOiBmYWxzZSAgICAg4oaSIGRvbid0IHdpbmRpbmctY3VsbCB0aGUgbmVhci1zaWRlIGdlb21ldHJ5XG4gIC8vICAgLSBkZXB0aFRlc3Q6IHRydWUg4oaSIGZhci1zaWRlIGdlb21ldHJ5IChiZWhpbmQgdGhlIGRpc2spIGZhaWxzIGRlcHRoLCBoaWRkZW5cbiAgLy8gICAtIGRlcHRoTWFzazogZmFsc2Ug4oaSIGRvbid0IHdyaXRlIGRlcHRoIChhdm9pZCBzZWxmIHotZmlnaHRpbmcgb24gdGhlIHNoZWxsKVxuICAvLyBSYXN0ZXIgdGlsZXMgYXJlIHVuYWZmZWN0ZWQgKHRoZWlyIDQtY29ybmVyIHF1YWRzIGtlZXAgc3RhYmxlIHdpbmRpbmcpLCB3aGljaFxuICAvLyBpcyB3aHkgc2F0ZWxsaXRlIGFscmVhZHkgem9vbXMgdG8gbWF4IGNsZWFubHkuIExhYmVscyBkaXNhYmxlIGN1bGwgZm9yIHRoZVxuICAvLyBzYW1lIHJlYXNvbiAoc2VlIG12dC1sYWJlbC1sYXllci50cykuXG4gIGRlcHRoVGVzdDogdHJ1ZSxcbiAgZGVwdGhNYXNrOiBmYWxzZSxcbiAgY3VsbDogZmFsc2Vcbn07XG5cbi8vIGRlY2suZ2wgOSdzIGdsb2JlIHNlbGVjdHMgZmluZXIgdGlsZXMgdGhhbiBuZWVkZWQgZm9yIGEgZ2l2ZW4gdmlldyAoaXRzXG4vLyBHbG9iZVZpZXdwb3J0IHNjYWxlIGlzIH4zeCBzbWFsbGVyIHRoYW4gdGhlIGVxdWl2YWxlbnQgbWVyY2F0b3Igem9vbSksIHNvIGJpYXNcbi8vIHZlY3RvciB0aWxlIHNlbGVjdGlvbiBjb2Fyc2VyIHRvIGtlZXAgdGhlIHRpbGUgY291bnQg4oCUIGFuZCB0aHVzIHBlcmZvcm1hbmNlIOKAlFxuLy8gaW4gY2hlY2suIFRoaXMgdHJhZGVzIGEgbGl0dGxlIGRldGFpbCBmb3IgZmFyIGZld2VyIHRpbGVzOyBtYWtlIGl0IGxlc3MgbmVnYXRpdmVcbi8vICh0b3dhcmQgMCkgZm9yIHNoYXJwZXIgZGV0YWlsLCBvciBtb3JlIG5lZ2F0aXZlIGZvciBtb3JlIHBlcmYuXG4vLyBUaGVzZSBhcmUgKmJhc2UqIG9mZnNldHM6IGdsb2JlTGF0aXR1ZGVab29tQ29tcGVuc2F0aW9uIGlzIGFkZGVkIG9uIHRvcCBhdCBkcmF3XG4vLyB0aW1lLCBzbyB0aGUgZWZmZWN0aXZlIHpvb21PZmZzZXQgb25seSBlcXVhbHMgdGhlc2UgZXhhY3QgdmFsdWVzIGF0IHRoZSBlcXVhdG9yLlxuLy8gU2F0ZWxsaXRlIHJhc3RlciB1c2VzIGJhc2UgMCDigJQgaXQgZG9lc24ndCBuZWVkIHRoZSB2ZWN0b3IgYmlhcyAoYSBjb2Fyc2VyIHJhc3RlclxuLy8gdGlsZSBqdXN0IGxvb2tzIHNvZnRlciByYXRoZXIgdGhhbiBkcm9wcGluZyBmZWF0dXJlcykuXG5jb25zdCBNQVBCT1hfR0xPQkVfVkVDVE9SX1pPT01fT0ZGU0VUID0gLTI7XG5jb25zdCBDQVJUT19HTE9CRV9WRUNUT1JfWk9PTV9PRkZTRVQgPSAtMjtcbmNvbnN0IEdMT0JFX1NBVEVMTElURV9aT09NX09GRlNFVCA9IDA7XG5cbi8vIFdob2xlLXdvcmxkIHRpbGUgZXh0ZW50IChXZWIgTWVyY2F0b3IgbGF0aXR1ZGUgbGltaXQpLiBSZXF1aXJlZCB3aGVuZXZlciBhXG4vLyBuZWdhdGl2ZSBgem9vbU9mZnNldGAgaXMgdXNlZDogZGVjaydzIGBnZXRUaWxlSW5kaWNlc2AgcmV0dXJucyBOTyB0aWxlcyB3aGVuXG4vLyB0aGUgdGFyZ2V0IHpvb20gZHJvcHMgYmVsb3cgYG1pblpvb21gICp1bmxlc3MqIGFuIGBleHRlbnRgIGlzIHNldCAoaW4gd2hpY2hcbi8vIGNhc2UgaXQgY2xhbXBzIHRvIGBtaW5ab29tYCBpbnN0ZWFkKS4gV2l0aG91dCB0aGlzLCB6b29taW5nIG91dCBvciBwYW5uaW5nXG4vLyB0b3dhcmQgdGhlIHBvbGVzICh3aGVyZSBkZWNrIDkncyBnbG9iZSBjb250cm9sbGVyIGxvd2VycyB0aGUgZWZmZWN0aXZlIHpvb20pXG4vLyBtYWtlcyB0aGUgd2hvbGUgZ2xvYmUgYmFzZW1hcCBkaXNhcHBlYXIuXG5jb25zdCBHTE9CRV9USUxFX0VYVEVOVDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gIC0xODAsIC04NS4wNTExMjksIDE4MCwgODUuMDUxMTI5XG5dO1xuXG4vLyBNYXggKm5hdGl2ZSogem9vbSBvZiBlYWNoIHZlY3RvciB0aWxlIHNvdXJjZS4gU2V0IHRoaXMgKG5vdCBhbiBhcmJpdHJhcmlseVxuLy8gaGlnaCBudW1iZXIpIHNvIGRlY2sgb3Zlcnpvb21zIOKAlCBpLmUuIGtlZXBzIHJlbmRlcmluZyB0aGUgZGVlcGVzdCByZWFsIHRpbGVcbi8vIHdoZW4gdGhlIHZpZXcgem9vbXMgcGFzdCBpdCDigJQgaW5zdGVhZCBvZiByZXF1ZXN0aW5nIHRpbGVzIHRoYXQgZG9uJ3QgZXhpc3Rcbi8vIGFuZCA0MDQgKHdoaWNoIHNob3dzIHVwIGFzIGVtcHR5IHJlY3RhbmdsZXMpLiBUaGUgcmF3IGAudmVjdG9yLnBiZmAgL2AubXZ0YFxuLy8gZW5kcG9pbnRzIGRvIE5PVCBhdXRvLW92ZXJ6b29tIHRoZSB3YXkgTWFwYm94IEdMIGRvZXMuXG4vLyAgIC0gbWFwYm94LXN0cmVldHMtdjggaGFzIGRhdGEgdXAgdG8gejE2XG4vLyAgIC0gQ0FSVE8gY2FydG8uc3RyZWV0cyB2MSBoYXMgZGF0YSB1cCB0byB6MTRcbmNvbnN0IE1BUEJPWF9WRUNUT1JfTUFYX0RBVEFfWk9PTSA9IDE2O1xuY29uc3QgQ0FSVE9fVkVDVE9SX01BWF9EQVRBX1pPT00gPSAxNDtcblxuLyoqXG4gKiBkZWNrLmdsIDkncyBnbG9iZSBjb3VwbGVzIHpvb20gdG8gbGF0aXR1ZGUgdmlhIGB6b29tQWRqdXN0YCAoc2VlXG4gKiBnbG9iZS12aWV3cG9ydC5qcyk6IGBzY2FsZSA9IDJeKHpvb20gLSB6b29tQWRqdXN0KGxhdCkpYCwgYW5kIGl0cyBjb250cm9sbGVyXG4gKiAqbG93ZXJzKiB0aGUgc3RvcmVkIGB6b29tYCBhcyB5b3UgcGFuIHRvd2FyZCB0aGUgcG9sZXMgdG8ga2VlcCB0aGUgZ2xvYmUnc1xuICogb24tc2NyZWVuIHNpemUgY29uc3RhbnQuIFRpbGUgTE9ELCBob3dldmVyLCBpcyBzZWxlY3RlZCBmcm9tIHRoZSByYXcgYHpvb21gLFxuICogc28gcm90YXRpbmcgdG93YXJkIGEgcG9sZSBzaWxlbnRseSBkcm9wcyB0aGUgTE9EIGFuZCB0aGlucyBvdXQgbGFiZWxzLlxuICogUmVwbGljYXRlZCBmcm9tIGBAZGVjay5nbC9jb3JlYCBnbG9iZS12aWV3cG9ydC5qcyBgem9vbUFkanVzdGAuXG4gKi9cbmZ1bmN0aW9uIHpvb21BZGp1c3QobGF0aXR1ZGU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmxvZzIoTWF0aC5QSSAqIE1hdGguY29zKChsYXRpdHVkZSAqIE1hdGguUEkpIC8gMTgwKSk7XG59XG5cbi8qKlxuICogTGF0aXR1ZGUgY29tcGVuc2F0aW9uIHRvIGFkZCB0byBhIGdsb2JlIHRpbGUgbGF5ZXIncyBgem9vbU9mZnNldGAsIHNvIHRpbGUgTE9EXG4gKiB0cmFja3MgdGhlICp2aXN1YWwqIChvbi1zY3JlZW4pIHNjYWxlIGluc3RlYWQgb2YgdGhlIGxhdGl0dWRlLWFkanVzdGVkIG1lcmNhdG9yXG4gKiB6b29tLiBUaGlzIGNhbmNlbHMgdGhlIHBhbi1pbmR1Y2VkIHpvb20gZHJvcCwga2VlcGluZyB0aWxlIGRldGFpbC9sYWJlbHNcbiAqIGNvbnN0YW50IHdoaWxlIHJvdGF0aW5nIHRvd2FyZCB0aGUgcG9sZXMuXG4gKi9cbmZ1bmN0aW9uIGdsb2JlTGF0aXR1ZGVab29tQ29tcGVuc2F0aW9uKGxhdGl0dWRlPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGxhdGl0dWRlID09IG51bGwgfHwgIU51bWJlci5pc0Zpbml0ZShsYXRpdHVkZSkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICAvLyBDbGFtcCBhd2F5IGZyb20gdGhlIHBvbGVzIHRvIGF2b2lkIGxvZzIoMCkgPSAtSW5maW5pdHkgYXQgfGxhdHwgPSA5MC5cbiAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KC04NSwgTWF0aC5taW4oODUsIGxhdGl0dWRlKSk7XG4gIHJldHVybiB6b29tQWRqdXN0KDApIC0gem9vbUFkanVzdChjbGFtcGVkKTtcbn1cblxuLyoqXG4gKiBHbG9iZSBiYXNlbWFwIHRpbGUgcHJvdmlkZXIuXG4gKlxuICogLSBgbWFwYm94YCB1c2VzIE1hcGJveCB2ZWN0b3IvcmFzdGVyIHRpbGVzIGFuZCByZXF1aXJlcyBhbiBhY2Nlc3MgdG9rZW4uXG4gKiAtIGBjYXJ0b2AgdXNlcyBDQVJUTydzIGZyZWUgT3Blbk1hcFRpbGVzIHZlY3RvciB0aWxlcyArIEVzcmkgV29ybGQgSW1hZ2VyeVxuICogICByYXN0ZXIsIGFuZCBuZWVkcyBubyB0b2tlbi4gVXNlZCBhcyBhbiBhdXRvbWF0aWMgZmFsbGJhY2sgd2hlbiBubyBNYXBib3hcbiAqICAgdG9rZW4gaXMgYXZhaWxhYmxlIChlLmcuIE1hcExpYnJlIC8gQ0FSVE8gYmFzZW1hcCBzZXR1cHMpLCBzbyB0aGUgZ2xvYmVcbiAqICAgYmFzZW1hcCBzdGlsbCByZW5kZXJzIGluc3RlYWQgb2Ygc2hvd2luZyBhIHNvbGlkLWNvbG9yIHNwaGVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgR2xvYmVCYXNlbWFwUHJvdmlkZXIgPSAnbWFwYm94JyB8ICdjYXJ0byc7XG5cbi8qKlxuICogUmVzb2x2ZSB3aGljaCBnbG9iZSBiYXNlbWFwIHRpbGUgcHJvdmlkZXIgdG8gdXNlLlxuICpcbiAqIFRoZSBnbG9iZSBzaG91bGQgZm9sbG93IHRoZSAqc2VsZWN0ZWQgYmFzZW1hcCBzdHlsZSdzKiByZW5kZXJpbmcgbGlicmFyeSBzb1xuICogaXQgc3RheXMgY29uc2lzdGVudCB3aXRoIHRoZSBmbGF0IDJEIG1hcDogYSBNYXBMaWJyZS9DQVJUTyBzdHlsZSB1c2VzIHRoZVxuICogZnJlZSBDQVJUTyB0aWxlcyAoZXZlbiB3aGVuIGEgTWFwYm94IHRva2VuIGlzIGF2YWlsYWJsZSksIGFuZCBhIE1hcGJveCBzdHlsZVxuICogdXNlcyBNYXBib3ggdGlsZXMuIEEgTWFwYm94IHN0eWxlIHdpdGggbm8gdG9rZW4gZmFsbHMgYmFjayB0byBDQVJUTyBzbyB0aGVcbiAqIGdsb2JlIHN0aWxsIHJlbmRlcnMgaW5zdGVhZCBvZiBzaG93aW5nIGEgYmFyZSBjb2xvcmVkIHNwaGVyZS5cbiAqXG4gKiBAcGFyYW0gYmFzZU1hcExpYnJhcnkgdGhlIHNlbGVjdGVkIHN0eWxlJ3MgbGlicmFyeSAoJ21hcGJveCcgfCAnbWFwbGlicmUnKSxcbiAqICAgZS5nLiBmcm9tIGBnZXRCYXNlTWFwTGlicmFyeShjdXJyZW50U3R5bGUpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVHbG9iZUJhc2VtYXBQcm92aWRlciA9IChcbiAgYmFzZU1hcExpYnJhcnk6ICdtYXBib3gnIHwgJ21hcGxpYnJlJyB8IHVuZGVmaW5lZCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW4/OiBzdHJpbmdcbik6IEdsb2JlQmFzZW1hcFByb3ZpZGVyID0+IHtcbiAgaWYgKGJhc2VNYXBMaWJyYXJ5ID09PSAnbWFwbGlicmUnKSB7XG4gICAgcmV0dXJuICdjYXJ0byc7XG4gIH1cbiAgaWYgKGJhc2VNYXBMaWJyYXJ5ID09PSAnbWFwYm94Jykge1xuICAgIHJldHVybiBtYXBib3hBcGlBY2Nlc3NUb2tlbiA/ICdtYXBib3gnIDogJ2NhcnRvJztcbiAgfVxuICAvLyBVbmtub3duIGxpYnJhcnk6IHByZWZlciBNYXBib3ggd2hlbiBhIHRva2VuIGV4aXN0cywgb3RoZXJ3aXNlIENBUlRPLlxuICByZXR1cm4gbWFwYm94QXBpQWNjZXNzVG9rZW4gPyAnbWFwYm94JyA6ICdjYXJ0byc7XG59O1xuXG4vLyBDQVJUTyBmcmVlIHZlY3RvciB0aWxlcyAoT3Blbk1hcFRpbGVzIHNjaGVtYSwgbm8gQVBJIGtleSByZXF1aXJlZCkuXG5jb25zdCBDQVJUT19WRUNUT1JfVElMRV9VUkxTID0gW1xuICAnaHR0cHM6Ly90aWxlcy1hLmJhc2VtYXBzLmNhcnRvY2RuLmNvbS92ZWN0b3J0aWxlcy9jYXJ0by5zdHJlZXRzL3YxL3t6fS97eH0ve3l9Lm12dCcsXG4gICdodHRwczovL3RpbGVzLWIuYmFzZW1hcHMuY2FydG9jZG4uY29tL3ZlY3RvcnRpbGVzL2NhcnRvLnN0cmVldHMvdjEve3p9L3t4fS97eX0ubXZ0JyxcbiAgJ2h0dHBzOi8vdGlsZXMtYy5iYXNlbWFwcy5jYXJ0b2Nkbi5jb20vdmVjdG9ydGlsZXMvY2FydG8uc3RyZWV0cy92MS97en0ve3h9L3t5fS5tdnQnLFxuICAnaHR0cHM6Ly90aWxlcy1kLmJhc2VtYXBzLmNhcnRvY2RuLmNvbS92ZWN0b3J0aWxlcy9jYXJ0by5zdHJlZXRzL3YxL3t6fS97eH0ve3l9Lm12dCdcbl07XG5cbi8vIEZyZWUgc2F0ZWxsaXRlIHJhc3RlciBmYWxsYmFjayAoRXNyaSBXb3JsZCBJbWFnZXJ5LCBubyBBUEkga2V5IHJlcXVpcmVkKS5cbmNvbnN0IEVTUklfV09STERfSU1BR0VSWV9VUkwgPVxuICAnaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9JbWFnZXJ5L01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JztcblxuLyoqXG4gKiBNYXBzIGEgcmF3IE1WVCBzb3VyY2UtbGF5ZXIgbmFtZSB0byBhIG5vcm1hbGl6ZWQgc2VtYW50aWMgbGF5ZXIga2luZCwgc28gdGhlXG4gKiBmaWxsL2xpbmUvbGFiZWwgYWNjZXNzb3JzIHdvcmsgYWNyb3NzIGJvdGggdGhlIE1hcGJveCAoYG1hcGJveC1zdHJlZXRzLXY4YClcbiAqIGFuZCBDQVJUTy9PcGVuTWFwVGlsZXMgc2NoZW1hcy5cbiAqXG4gKiB8IHNlbWFudGljIHwgbWFwYm94ICAgICAgICB8IG9wZW5tYXB0aWxlcyB8XG4gKiB8IC0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLSB8XG4gKiB8IHdhdGVyICAgIHwgYHdhdGVyYCAgICAgICB8IGB3YXRlcmAgICAgICB8XG4gKiB8IGFkbWluICAgIHwgYGFkbWluYCAgICAgICB8IGBib3VuZGFyeWAgICB8XG4gKiB8IGxhYmVsICAgIHwgYHBsYWNlX2xhYmVsYCB8IGBwbGFjZWAgICAgICB8XG4gKi9cbnR5cGUgQmFzZW1hcExheWVyS2luZCA9ICd3YXRlcicgfCAnYWRtaW4nIHwgJ2xhYmVsJyB8ICdvdGhlcic7XG5cbmZ1bmN0aW9uIGdldEJhc2VtYXBMYXllcktpbmQobGF5ZXJOYW1lPzogc3RyaW5nKTogQmFzZW1hcExheWVyS2luZCB7XG4gIHN3aXRjaCAobGF5ZXJOYW1lKSB7XG4gICAgY2FzZSAnd2F0ZXInOlxuICAgICAgcmV0dXJuICd3YXRlcic7XG4gICAgY2FzZSAnYWRtaW4nOlxuICAgIGNhc2UgJ2JvdW5kYXJ5JzpcbiAgICAgIHJldHVybiAnYWRtaW4nO1xuICAgIGNhc2UgJ3BsYWNlX2xhYmVsJzpcbiAgICBjYXNlICdwbGFjZSc6XG4gICAgICByZXR1cm4gJ2xhYmVsJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdvdGhlcic7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgR2xvYmVBdHRyaWJ1dGlvbiA9IHtsYWJlbDogc3RyaW5nOyBocmVmOiBzdHJpbmd9O1xuXG5jb25zdCBNQVBCT1hfQVRUUklCVVRJT046IEdsb2JlQXR0cmlidXRpb24gPSB7XG4gIGxhYmVsOiAnwqkgTWFwYm94JyxcbiAgaHJlZjogJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vYWJvdXQvbWFwcy8nXG59O1xuY29uc3QgT1NNX0FUVFJJQlVUSU9OOiBHbG9iZUF0dHJpYnV0aW9uID0ge1xuICBsYWJlbDogJ8KpIE9wZW5TdHJlZXRNYXAnLFxuICBocmVmOiAnaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0J1xufTtcbmNvbnN0IENBUlRPX0FUVFJJQlVUSU9OOiBHbG9iZUF0dHJpYnV0aW9uID0ge1xuICBsYWJlbDogJ8KpIENBUlRPJyxcbiAgaHJlZjogJ2h0dHBzOi8vY2FydG8uY29tL2F0dHJpYnV0aW9ucydcbn07XG5jb25zdCBFU1JJX0FUVFJJQlVUSU9OOiBHbG9iZUF0dHJpYnV0aW9uID0ge1xuICBsYWJlbDogJ1Bvd2VyZWQgYnkgRXNyaScsXG4gIGhyZWY6ICdodHRwczovL3d3dy5lc3JpLmNvbS8nXG59O1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHRpbGUtc291cmNlIGF0dHJpYnV0aW9uIGVudHJpZXMgZm9yIHRoZSBnbG9iZSBiYXNlbWFwLiBkZWNrLmdsXG4gKiByZW5kZXJzIHRoZSBnbG9iZSBiYXNlbWFwIHRpbGVzIGl0c2VsZiAobm90IHRoZSBiYXNlIE1hcGxpYnJlL01hcGJveCBtYXApLCBzb1xuICogdGhlIGJhc2UgbWFwJ3MgYXR0cmlidXRpb24gbWFjaGluZXJ5IG5ldmVyIHNlZXMgdGhlbS4gVGhpcyBsZXRzIHRoZSBVSSBjcmVkaXRcbiAqIHRoZSBhY3R1YWwgdGlsZSBwcm92aWRlcihzKSBpbiBnbG9iZSBtb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVCYXNlbWFwQXR0cmlidXRpb25zID0gKHtcbiAgZ2xvYmUsXG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICBtYXBTdHlsZVR5cGUsXG4gIGJhc2VtYXBQcm92aWRlclxufToge1xuICBnbG9iZT86IEdsb2JlO1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgbWFwU3R5bGVUeXBlPzogc3RyaW5nO1xuICBiYXNlbWFwUHJvdmlkZXI/OiBHbG9iZUJhc2VtYXBQcm92aWRlcjtcbn0pOiBHbG9iZUF0dHJpYnV0aW9uW10gPT4ge1xuICBpZiAoIWdsb2JlPy5lbmFibGVkIHx8ICFnbG9iZS5jb25maWc/LmJhc2VtYXApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwcm92aWRlcjogR2xvYmVCYXNlbWFwUHJvdmlkZXIgPVxuICAgIGJhc2VtYXBQcm92aWRlciA/PyByZXNvbHZlR2xvYmVCYXNlbWFwUHJvdmlkZXIodW5kZWZpbmVkLCBtYXBib3hBcGlBY2Nlc3NUb2tlbik7XG5cbiAgaWYgKHByb3ZpZGVyID09PSAnbWFwYm94Jykge1xuICAgIHJldHVybiBtYXBib3hBcGlBY2Nlc3NUb2tlbiA/IFtNQVBCT1hfQVRUUklCVVRJT04sIE9TTV9BVFRSSUJVVElPTl0gOiBbXTtcbiAgfVxuXG4gIGNvbnN0IGlzU2F0ZWxsaXRlID0gbWFwU3R5bGVUeXBlID09PSAnc2F0ZWxsaXRlJyB8fCBtYXBTdHlsZVR5cGUgPT09ICdzYXRlbGxpdGUtc3RyZWV0JztcbiAgLy8gQ0FSVE8gdmVjdG9yIHRpbGVzIGFyZSBPcGVuU3RyZWV0TWFwLWRlcml2ZWQ7IEVzcmkgaW1hZ2VyeSBpcyBjcmVkaXRlZCBzZXBhcmF0ZWx5LlxuICByZXR1cm4gaXNTYXRlbGxpdGVcbiAgICA/IFtFU1JJX0FUVFJJQlVUSU9OLCBDQVJUT19BVFRSSUJVVElPTiwgT1NNX0FUVFJJQlVUSU9OXVxuICAgIDogW0NBUlRPX0FUVFJJQlVUSU9OLCBPU01fQVRUUklCVVRJT05dO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCBnZXRHbG9iZUJhc2VMYXllcnMgPSAoe1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgZ2xvYmUsXG4gIG1hcFN0eWxlVHlwZSxcbiAgYmFzZW1hcFByb3ZpZGVyLFxuICBsYXRpdHVkZSxcbiAgem9vbVxufToge1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBnbG9iZTogR2xvYmU7XG4gIG1hcFN0eWxlVHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoaWNoIHRpbGUgcHJvdmlkZXIgdG8gdXNlIGZvciB0aGUgZ2xvYmUgYmFzZW1hcC4gRGVmYXVsdHMgdG8gYG1hcGJveGAgd2hlblxuICAgKiBhIHRva2VuIGlzIHByZXNlbnQsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIHRoZSB0b2tlbi1mcmVlIGBjYXJ0b2AgdGlsZXMuXG4gICAqL1xuICBiYXNlbWFwUHJvdmlkZXI/OiBHbG9iZUJhc2VtYXBQcm92aWRlcjtcbiAgLyoqXG4gICAqIEN1cnJlbnQgY2FtZXJhIGNlbnRlciBsYXRpdHVkZS4gVXNlZCB0byBrZWVwIHRpbGUgTE9EIGNvbnN0YW50IHdoaWxlIHJvdGF0aW5nXG4gICAqIHRvd2FyZCB0aGUgcG9sZXMgKGRlY2suZ2wgOSBsb3dlcnMgdGhlIGVmZmVjdGl2ZSB6b29tIG5lYXIgdGhlIHBvbGVzKS4gV2hlblxuICAgKiBvbWl0dGVkLCBubyBsYXRpdHVkZSBjb21wZW5zYXRpb24gaXMgYXBwbGllZCAoZXF1YXRvciBiZWhhdmlvcikuXG4gICAqL1xuICBsYXRpdHVkZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIEN1cnJlbnQgbWFwIHpvb20gbGV2ZWwuIFVzZWQgdG8gZmFkZSB0aGUgYXRtb3NwaGVyZSBlZmZlY3RzIG91dCB3aGVuIHRoZSB1c2VyXG4gICAqIHpvb21zIGluIHBhc3QgYSBjZXJ0YWluIHRocmVzaG9sZCAobWlycm9ycyBHb29nbGUgTWFwcyBnbG9iZSBiZWhhdmlvdXIpLlxuICAgKi9cbiAgem9vbT86IG51bWJlcjtcbn0pOiBMYXllcltdID0+IHtcbiAgY29uc3Qge2NvbmZpZ30gPSBnbG9iZTtcblxuICBjb25zdCBpc1NhdGVsbGl0ZSA9IG1hcFN0eWxlVHlwZSA9PT0gJ3NhdGVsbGl0ZSc7XG4gIGNvbnN0IGlzU2F0ZWxsaXRlU3RyZWV0ID0gbWFwU3R5bGVUeXBlID09PSAnc2F0ZWxsaXRlLXN0cmVldCc7XG5cbiAgY29uc3QgbGF0Wm9vbUNvbXBlbnNhdGlvbiA9IGdsb2JlTGF0aXR1ZGVab29tQ29tcGVuc2F0aW9uKGxhdGl0dWRlKTtcblxuICAvLyBGYWxsIGJhY2sgdG8gdGhlIGZyZWUgQ0FSVE8gdGlsZXMgd2hlbmV2ZXIgbm8gTWFwYm94IHRva2VuIGlzIGF2YWlsYWJsZSBzb1xuICAvLyB0aGUgZ2xvYmUgYmFzZW1hcCBzdGlsbCByZW5kZXJzIChtYXRjaGVzIGtlcGxlcidzIGRlZmF1bHQgdG9rZW4tZnJlZVxuICAvLyBNYXBMaWJyZS9DQVJUTyBiYXNlbWFwcykuIENhbGxlcnMgc2hvdWxkIHBhc3MgYW4gZXhwbGljaXQgYGJhc2VtYXBQcm92aWRlcmBcbiAgLy8gKGRlcml2ZWQgZnJvbSB0aGUgc2VsZWN0ZWQgc3R5bGUpIHNvIHRoZSBnbG9iZSBmb2xsb3dzIHRoZSAyRCBiYXNlbWFwLlxuICBjb25zdCBwcm92aWRlcjogR2xvYmVCYXNlbWFwUHJvdmlkZXIgPVxuICAgIGJhc2VtYXBQcm92aWRlciA/PyByZXNvbHZlR2xvYmVCYXNlbWFwUHJvdmlkZXIodW5kZWZpbmVkLCBtYXBib3hBcGlBY2Nlc3NUb2tlbik7XG4gIGNvbnN0IHVzZUNhcnRvID0gcHJvdmlkZXIgPT09ICdjYXJ0byc7XG4gIGNvbnN0IGhhc1RpbGVBY2Nlc3MgPSB1c2VDYXJ0byB8fCBCb29sZWFuKG1hcGJveEFwaUFjY2Vzc1Rva2VuKTtcblxuICByZXR1cm4gW1xuICAgIGNvbmZpZy5hdG1vc3BoZXJlID8gZ2V0R2xvYmVBdG1vc3BoZXJlU2t5TGF5ZXIoe2NvbmZpZywgem9vbX0pIDogbnVsbCxcblxuICAgIC8vIERlcHRoLW9ubHkgY3Jvc3Mtc2VjdGlvbiBkaXNrOiB3cml0ZXMgZGVwdGggYXQgdGhlIGdsb2JlJ3Mgc2lsaG91ZXR0ZSBzb1xuICAgIC8vIGZhci1zaWRlIGdlb21ldHJ5IChhcmNzL2xpbmVzKSBpcyBvY2NsdWRlZCBieSB0aGUgcGxhbmV0LlxuICAgIGdldEdsb2JlRGVwdGhEaXNrTGF5ZXIoe2ZpbGxDb2xvcjogY29uZmlnLnN1cmZhY2VDb2xvcn0pLFxuXG4gICAgLy8gQmFja2dyb3VuZCBzdXJmYWNlIHBvbHlnb25cbiAgICAoIWNvbmZpZy5iYXNlbWFwIHx8ICghaXNTYXRlbGxpdGUgJiYgIWlzU2F0ZWxsaXRlU3RyZWV0KSkgJiZcbiAgICAgIG5ldyBTb2xpZFBvbHlnb25MYXllcih7XG4gICAgICAgIGlkOiAnZ2xvYmUtYmFja2dyb3VuZCcsXG4gICAgICAgIGRhdGE6IEJBQ0tHUk9VTkRfREFUQSxcbiAgICAgICAgZ2V0UG9seWdvbjogKChkOiBudW1iZXJbXVtdKSA9PiBkKSBhcyBhbnksXG4gICAgICAgIGZpbGxlZDogdHJ1ZSxcbiAgICAgICAgZ2V0RmlsbENvbG9yOiBjb25maWcuc3VyZmFjZUNvbG9yIGFzIGFueSxcbiAgICAgICAgcGFyYW1ldGVyczogQkFDS0dST1VORF9QQVJBTUVURVJTXG4gICAgICB9KSxcblxuICAgIC8vIEZpbGwgaG9sZSBhdCBub3J0aCBwb2xlXG4gICAgY29uZmlnLmJhc2VtYXAgJiZcbiAgICAgIG5ldyBTb2xpZFBvbHlnb25MYXllcih7XG4gICAgICAgIGlkOiAnZ2xvYmUtYmFja2dyb3VuZC1ub3J0aC1wb2xlJyxcbiAgICAgICAgZGF0YTogQkFDS0dST1VORF9OT1JUSF9QT0xFX0RBVEEsXG4gICAgICAgIGdldFBvbHlnb246ICgoZDogbnVtYmVyW11bXSkgPT4gZCkgYXMgYW55LFxuICAgICAgICBmaWxsZWQ6IHRydWUsXG4gICAgICAgIGdldEZpbGxDb2xvcjogKGNvbmZpZy53YXRlciA/IGNvbmZpZy53YXRlckNvbG9yIDogY29uZmlnLnN1cmZhY2VDb2xvcikgYXMgYW55LFxuICAgICAgICBwYXJhbWV0ZXJzOiBCQUNLR1JPVU5EX1BBUkFNRVRFUlNcbiAgICAgIH0pLFxuXG4gICAgLy8gU2F0ZWxsaXRlIHRpbGVzXG4gICAgY29uZmlnLmJhc2VtYXAgJiZcbiAgICAgIChpc1NhdGVsbGl0ZSB8fCBpc1NhdGVsbGl0ZVN0cmVldCkgJiZcbiAgICAgIGhhc1RpbGVBY2Nlc3MgJiZcbiAgICAgIG5ldyBUaWxlTGF5ZXIoe1xuICAgICAgICBpZDogYGdsb2JlLXNhdGVsbGl0ZS10aWxlcy0ke3Byb3ZpZGVyfWAsXG4gICAgICAgIGRhdGE6IHVzZUNhcnRvXG4gICAgICAgICAgPyBbRVNSSV9XT1JMRF9JTUFHRVJZX1VSTF1cbiAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgYGh0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvbWFwYm94LnNhdGVsbGl0ZS97en0ve3h9L3t5fUAyeC5wbmc/YWNjZXNzX3Rva2VuPSR7bWFwYm94QXBpQWNjZXNzVG9rZW59YFxuICAgICAgICAgICAgXSxcbiAgICAgICAgbWluWm9vbTogMCxcbiAgICAgICAgbWF4Wm9vbTogdXNlQ2FydG8gPyAxOCA6IDE5LFxuICAgICAgICB6b29tT2Zmc2V0OiBHTE9CRV9TQVRFTExJVEVfWk9PTV9PRkZTRVQgKyBsYXRab29tQ29tcGVuc2F0aW9uLFxuICAgICAgICBleHRlbnQ6IEdMT0JFX1RJTEVfRVhURU5ULFxuICAgICAgICAvLyBFc3JpIHRpbGVzIGFyZSAyNTZweDsgTWFwYm94IEAyeCB0aWxlcyBhcmUgNTEycHguXG4gICAgICAgIHRpbGVTaXplOiB1c2VDYXJ0byA/IDI1NiA6IDUxMiAvIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIHJlbmRlclN1YkxheWVyczogKHByb3BzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBiYm94OiB7d2VzdCwgc291dGgsIGVhc3QsIG5vcnRofVxuICAgICAgICAgIH0gPSBwcm9wcy50aWxlO1xuXG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBCaXRtYXBMYXllcihwcm9wcywge1xuICAgICAgICAgICAgICBfaW1hZ2VDb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgICAgICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgaW1hZ2U6IHByb3BzLmRhdGEsXG4gICAgICAgICAgICAgIGJvdW5kczogW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1ldGVyczogQkFTRU1BUF9SQVNURVJfUEFSQU1FVEVSU1xuICAgICAgfSksXG5cbiAgICAvLyBWZWN0b3IgYmFzZW1hcCAoTVZUIGxhYmVscy9hZG1pbi93YXRlcilcbiAgICBjb25maWcuYmFzZW1hcCAmJlxuICAgICAgIWlzU2F0ZWxsaXRlICYmXG4gICAgICBoYXNUaWxlQWNjZXNzICYmXG4gICAgICBuZXcgTVZUTGF5ZXIoe1xuICAgICAgICAvLyBmb3JjZSB0aGUgbGF5ZXIgdG8gdXBkYXRlIHdoZW4gdGhlIHN0eWxlL2xhYmVsL3Byb3ZpZGVyIGNvbmZpZyBjaGFuZ2VzXG4gICAgICAgIGlkOiBgZ2xvYmUtYmFzZW1hcC1tdnQtbGF5ZXItJHtwcm92aWRlcn0tJHttYXBTdHlsZVR5cGV9YCxcbiAgICAgICAgZGF0YTogdXNlQ2FydG9cbiAgICAgICAgICA/IENBUlRPX1ZFQ1RPUl9USUxFX1VSTFNcbiAgICAgICAgICA6IGBodHRwczovL2EudGlsZXMubWFwYm94LmNvbS92NC9tYXBib3gubWFwYm94LXN0cmVldHMtdjgve3p9L3t4fS97eX0udmVjdG9yLnBiZj9hY2Nlc3NfdG9rZW49JHttYXBib3hBcGlBY2Nlc3NUb2tlbn1gLFxuICAgICAgICBtaW5ab29tOiAwLFxuICAgICAgICAvLyBPdmVyem9vbSBwYXN0IHRoZSBzb3VyY2UncyBuYXRpdmUgbWF4IGluc3RlYWQgb2YgNDA0LWluZyBvbiB0aWxlcyB0aGF0XG4gICAgICAgIC8vIGRvbid0IGV4aXN0ICh3aGljaCByZW5kZXJzIGFzIGVtcHR5IHJlY3RhbmdsZXMgYXQgaGlnaCB6b29tKS5cbiAgICAgICAgbWF4Wm9vbTogdXNlQ2FydG8gPyBDQVJUT19WRUNUT1JfTUFYX0RBVEFfWk9PTSA6IE1BUEJPWF9WRUNUT1JfTUFYX0RBVEFfWk9PTSxcbiAgICAgICAgem9vbU9mZnNldDpcbiAgICAgICAgICAodXNlQ2FydG8gPyBDQVJUT19HTE9CRV9WRUNUT1JfWk9PTV9PRkZTRVQgOiBNQVBCT1hfR0xPQkVfVkVDVE9SX1pPT01fT0ZGU0VUKSArXG4gICAgICAgICAgbGF0Wm9vbUNvbXBlbnNhdGlvbixcbiAgICAgICAgZXh0ZW50OiBHTE9CRV9USUxFX0VYVEVOVCxcbiAgICAgICAgYmluYXJ5OiBmYWxzZSxcbiAgICAgICAgcGFyYW1ldGVyczogQkFTRU1BUF9NVlRfUEFSQU1FVEVSUyxcbiAgICAgICAgbG9hZE9wdGlvbnM6IHVzZUNhcnRvXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC8vIE9wZW5NYXBUaWxlcyBzY2hlbWE6IGBib3VuZGFyeWAgPSBhZG1pbiBsaW5lcywgYHBsYWNlYCA9IGxhYmVscy5cbiAgICAgICAgICAgICAgbXZ0OiB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzOiBpc1NhdGVsbGl0ZVN0cmVldFxuICAgICAgICAgICAgICAgICAgPyBbJ3BsYWNlJywgJ2JvdW5kYXJ5J11cbiAgICAgICAgICAgICAgICAgIDogWydwbGFjZScsICdib3VuZGFyeScsICd3YXRlcicsICd0cmFuc3BvcnRhdGlvbiddXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbXZ0OiB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzOiBpc1NhdGVsbGl0ZVN0cmVldFxuICAgICAgICAgICAgICAgICAgPyBbJ3BsYWNlX2xhYmVsJywgJ2FkbWluJ11cbiAgICAgICAgICAgICAgICAgIDogWydwbGFjZV9sYWJlbCcsICdhZG1pbicsICd3YXRlcicsICdyb2FkJ11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgLy8gUmVuZGVyIGFkbWluL3dhdGVyIHZpYSBHZW9Kc29uTGF5ZXIgYW5kIHBsYWNlIGxhYmVscyB2aWEgVGV4dExheWVyLlxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlbmRlclN1YkxheWVyczogKHByb3BzOiBhbnkpID0+IG5ldyBNVlRMYWJlbExheWVyKHByb3BzKSxcbiAgICAgICAgZ2V0RmlsbENvbG9yOiAoZjogYW55KSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChnZXRCYXNlbWFwTGF5ZXJLaW5kKGYucHJvcGVydGllcy5sYXllck5hbWUpKSB7XG4gICAgICAgICAgICBjYXNlICd3YXRlcic6XG4gICAgICAgICAgICAgIHJldHVybiBjb25maWcud2F0ZXIgPyBjb25maWcud2F0ZXJDb2xvciA6IElOVklTSUJMRV9DT0xPUjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBjb25maWcuc3VyZmFjZUNvbG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TGluZUNvbG9yOiAoZjogYW55KSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChnZXRCYXNlbWFwTGF5ZXJLaW5kKGYucHJvcGVydGllcy5sYXllck5hbWUpKSB7XG4gICAgICAgICAgICBjYXNlICdhZG1pbic6XG4gICAgICAgICAgICAgIHJldHVybiBjb25maWcuYWRtaW5MaW5lcyA/IGNvbmZpZy5hZG1pbkxpbmVzQ29sb3IgOiBJTlZJU0lCTEVfQ09MT1I7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLnN1cmZhY2VDb2xvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldExpbmVXaWR0aDogKGY6IGFueSkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAoZ2V0QmFzZW1hcExheWVyS2luZChmLnByb3BlcnRpZXMubGF5ZXJOYW1lKSkge1xuICAgICAgICAgICAgY2FzZSAnYWRtaW4nOlxuICAgICAgICAgICAgICBzd2l0Y2ggKGYucHJvcGVydGllcy5hZG1pbl9sZXZlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIDAuNzU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICBnZXRGaWxsQ29sb3I6IFtjb25maWcud2F0ZXJDb2xvciwgY29uZmlnLnN1cmZhY2VDb2xvciwgY29uZmlnLndhdGVyXSxcbiAgICAgICAgICBnZXRMaW5lQ29sb3I6IFtjb25maWcuYWRtaW5MaW5lc0NvbG9yLCBjb25maWcuc3VyZmFjZUNvbG9yLCBjb25maWcuYWRtaW5MaW5lc11cbiAgICAgICAgfSxcbiAgICAgICAgbGluZVdpZHRoVW5pdHM6ICdwaXhlbHMnLFxuICAgICAgICBsaW5lV2lkdGhNaW5QaXhlbHM6IDAsXG4gICAgICAgIGxpbmVXaWR0aE1heFBpeGVsczogMjAsXG4gICAgICAgIGdldFBvaW50UmFkaXVzOiAwLFxuICAgICAgICBwb2ludFJhZGl1c01pblBpeGVsczogMFxuICAgICAgfSBhcyBhbnkpXG4gIF0uZmlsdGVyKEJvb2xlYW4pIGFzIExheWVyW107XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVUb3BMYXllcnMgPSAoe2dsb2JlLCB6b29tfToge2dsb2JlOiBHbG9iZTsgem9vbT86IG51bWJlcn0pOiBMYXllcltdID0+IHtcbiAgY29uc3Qge2NvbmZpZ30gPSBnbG9iZTtcbiAgcmV0dXJuIFtjb25maWcuYXRtb3NwaGVyZSA/IGdldEdsb2JlQXRtb3NwaGVyZUxheWVyKHtjb25maWcsIHpvb219KSA6IG51bGxdLmZpbHRlcihCb29sZWFuKSBhcyBMYXllcltdO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7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