payload 2.24.0 → 2.24.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.
Files changed (56) hide show
  1. package/dist/admin/components/elements/EditUpload/index.d.ts +12 -4
  2. package/dist/admin/components/elements/EditUpload/index.d.ts.map +1 -1
  3. package/dist/admin/components/elements/EditUpload/index.js +41 -40
  4. package/dist/admin/components/views/collections/Edit/Upload/index.d.ts.map +1 -1
  5. package/dist/admin/components/views/collections/Edit/Upload/index.js +18 -4
  6. package/dist/admin/components/views/collections/Edit/types.d.ts +0 -12
  7. package/dist/admin/components/views/collections/Edit/types.d.ts.map +1 -1
  8. package/dist/collections/config/types.d.ts.map +1 -1
  9. package/dist/collections/config/types.js +1 -1
  10. package/dist/exports/types.d.ts +1 -1
  11. package/dist/exports/types.d.ts.map +1 -1
  12. package/dist/exports/types.js +1 -1
  13. package/dist/translations/ar.json +1 -1
  14. package/dist/translations/az.json +1 -1
  15. package/dist/translations/bg.json +1 -1
  16. package/dist/translations/cs.json +1 -1
  17. package/dist/translations/de.json +1 -1
  18. package/dist/translations/en.json +1 -1
  19. package/dist/translations/es.json +1 -1
  20. package/dist/translations/fa.json +1 -1
  21. package/dist/translations/fr.json +1 -1
  22. package/dist/translations/hr.json +1 -1
  23. package/dist/translations/hu.json +1 -1
  24. package/dist/translations/index.d.ts +30 -30
  25. package/dist/translations/it.json +1 -1
  26. package/dist/translations/ja.json +1 -1
  27. package/dist/translations/ko.json +1 -1
  28. package/dist/translations/my.json +1 -1
  29. package/dist/translations/nb.json +1 -1
  30. package/dist/translations/nl.json +1 -1
  31. package/dist/translations/pl.json +1 -1
  32. package/dist/translations/pt.json +1 -1
  33. package/dist/translations/ro.json +1 -1
  34. package/dist/translations/rs-latin.json +1 -1
  35. package/dist/translations/rs.json +1 -1
  36. package/dist/translations/ru.json +1 -1
  37. package/dist/translations/sv.json +1 -1
  38. package/dist/translations/th.json +1 -1
  39. package/dist/translations/tr.json +1 -1
  40. package/dist/translations/translation-schema.json +1 -1
  41. package/dist/translations/ua.json +1 -1
  42. package/dist/translations/vi.json +1 -1
  43. package/dist/translations/zh-tw.json +1 -1
  44. package/dist/translations/zh.json +1 -1
  45. package/dist/uploads/cropImage.d.ts +15 -6
  46. package/dist/uploads/cropImage.d.ts.map +1 -1
  47. package/dist/uploads/cropImage.js +6 -6
  48. package/dist/uploads/generateFileData.d.ts.map +1 -1
  49. package/dist/uploads/generateFileData.js +6 -4
  50. package/dist/uploads/imageResizer.d.ts.map +1 -1
  51. package/dist/uploads/imageResizer.js +117 -84
  52. package/dist/uploads/types.d.ts +16 -10
  53. package/dist/uploads/types.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/types.d.ts +1 -1
  56. package/types.js +1 -1
@@ -45,19 +45,9 @@ function _interop_require_default(obj) {
45
45
  ext: extension
46
46
  };
47
47
  };
48
- /**
49
- * Create a new image name based on the output image name, the dimensions and
50
- * the extension.
51
- *
52
- * Ignore the fact that duplicate names could happen if the there is one
53
- * size with `width AND height` and one with only `height OR width`. Because
54
- * space is expensive, we will reuse the same image for both sizes.
55
- *
56
- * @param outputImageName - the sanitized image name
57
- * @param bufferInfo - the buffer info
58
- * @param extension - the extension to use
59
- * @returns the new image name that is not taken
60
- */ const createImageName = (outputImageName, { height, width }, extension)=>`${outputImageName}-${width}x${height}.${extension}`;
48
+ const createImageName = ({ extension, height, outputImageName, width })=>{
49
+ return `${outputImageName}-${width}x${height}.${extension}`;
50
+ };
61
51
  /**
62
52
  * Create the result object for the image resize operation based on the
63
53
  * provided parameters. If the name is not provided, an empty result object
@@ -86,43 +76,40 @@ function _interop_require_default(obj) {
86
76
  };
87
77
  };
88
78
  /**
89
- * Check if the image needs to be resized according to the requested dimensions
90
- * and the original image size. If the resize options withoutEnlargement or withoutReduction are provided,
91
- * the image will be resized regardless of the requested dimensions, given that the
92
- * width or height to be resized is provided.
79
+ * Determine whether or not to resize the image.
80
+ * - resize using image config
81
+ * - resize using image config with focal adjustments
82
+ * - do not resize at all
93
83
  *
94
- * @param resizeConfig - object containing the requested dimensions and resize options
95
- * @param original - the original image size
96
- * @returns true if resizing is not needed, false otherwise
97
- */ const preventResize = ({ height: desiredHeight, width: desiredWidth, withoutEnlargement, withoutReduction }, original)=>{
98
- // default is to allow reduction
99
- if (withoutReduction !== undefined) {
100
- return false // needs resize
101
- ;
102
- }
103
- // default is to prevent enlargement
104
- if (withoutEnlargement !== undefined) {
105
- return false // needs resize
106
- ;
107
- }
108
- const isWidthOrHeightNotDefined = !desiredHeight || !desiredWidth;
109
- if (isWidthOrHeightNotDefined) {
110
- // If width and height are not defined, it means there is a format conversion
111
- // and the image needs to be "resized" (transformed).
112
- return false // needs resize
113
- ;
114
- }
115
- const hasInsufficientWidth = desiredWidth > original.width;
116
- const hasInsufficientHeight = desiredHeight > original.height;
117
- if (hasInsufficientWidth && hasInsufficientHeight) {
118
- // doesn't need resize - prevent enlargement. This should only happen if both width and height are insufficient.
119
- // if only one dimension is insufficient and the other is sufficient, resizing needs to happen, as the image
120
- // should be resized to the sufficient dimension.
121
- return true // do not create a new size
122
- ;
84
+ * `imageResizeConfig.withoutEnlargement`:
85
+ * - undefined [default]: uploading images with smaller width AND height than the image size will return null
86
+ * - false: always enlarge images to the image size
87
+ * - true: if the image is smaller than the image size, return the original image
88
+ *
89
+ * `imageResizeConfig.withoutReduction`:
90
+ * - false [default]: always enlarge images to the image size
91
+ * - true: if the image is smaller than the image size, return the original image
92
+ *
93
+ * @return 'omit' | 'resize' | 'resizeWithFocalPoint'
94
+ */ const getImageResizeAction = ({ dimensions: originalImage, hasFocalPoint, imageResizeConfig })=>{
95
+ const { fit, height: targetHeight, width: targetWidth, withoutEnlargement, withoutReduction } = imageResizeConfig;
96
+ // prevent upscaling by default when x and y are both smaller than target image size
97
+ if (targetHeight && targetWidth) {
98
+ const originalImageIsSmallerXAndY = originalImage.width < targetWidth && originalImage.height < targetHeight;
99
+ if (withoutEnlargement === undefined && originalImageIsSmallerXAndY) {
100
+ return 'omit' // prevent image size from being enlarged
101
+ ;
102
+ }
123
103
  }
124
- return false // needs resize
125
- ;
104
+ const originalImageIsSmallerXOrY = originalImage.width < targetWidth || originalImage.height < targetHeight;
105
+ if (fit === 'contain' || fit === 'inside') return 'resize';
106
+ if (!(0, _isNumber.isNumber)(targetHeight) && !(0, _isNumber.isNumber)(targetWidth)) return 'resize';
107
+ const targetAspectRatio = targetWidth / targetHeight;
108
+ const originalAspectRatio = originalImage.width / originalImage.height;
109
+ if (originalAspectRatio === targetAspectRatio) return 'resize';
110
+ if (withoutEnlargement && originalImageIsSmallerXOrY) return 'resize';
111
+ if (withoutReduction && !originalImageIsSmallerXOrY) return 'resize';
112
+ return hasFocalPoint ? 'resizeWithFocalPoint' : 'resize';
126
113
  };
127
114
  /**
128
115
  * Check if the image should be passed directly to sharp without payload adjusting properties.
@@ -159,6 +146,17 @@ function _interop_require_default(obj) {
159
146
  }
160
147
  return resizeConfig;
161
148
  };
149
+ /**
150
+ * Used to extract height from images, animated or not.
151
+ *
152
+ * @param sharpMetadata - the sharp metadata
153
+ * @returns the height of the image
154
+ */ function extractHeightFromImage(sharpMetadata) {
155
+ if (sharpMetadata?.pages) {
156
+ return sharpMetadata.height / sharpMetadata.pages;
157
+ }
158
+ return sharpMetadata.height;
159
+ }
162
160
  async function resizeAndTransformImageSizes({ config, dimensions, file, mimeType, req, savedFilename, staticPath, uploadEdits }) {
163
161
  const { focalPoint: focalPointEnabled = true, imageSizes } = config.upload;
164
162
  // Focal point adjustments
@@ -185,20 +183,24 @@ async function resizeAndTransformImageSizes({ config, dimensions, file, mimeType
185
183
  if (fileIsAnimatedType) sharpOptions.animated = true;
186
184
  const sharpBase = (0, _sharp.default)(file.tempFilePath || file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081
187
185
  ;
186
+ const originalImageMeta = await sharpBase.metadata();
187
+ const resizeImageMeta = {
188
+ height: extractHeightFromImage(originalImageMeta),
189
+ width: originalImageMeta.width
190
+ };
188
191
  const results = await Promise.all(imageSizes.map(async (imageResizeConfig)=>{
189
192
  imageResizeConfig = sanitizeResizeConfig(imageResizeConfig);
190
- // This checks if a resize should happen. If not, the resized image will be
191
- // skipped COMPLETELY and thus will not be included in the resulting images.
192
- // All further format/trim options will thus be skipped as well.
193
- if (preventResize(imageResizeConfig, dimensions)) {
194
- return createResult({
195
- name: imageResizeConfig.name
196
- });
197
- }
193
+ const resizeAction = getImageResizeAction({
194
+ dimensions,
195
+ hasFocalPoint: Boolean(incomingFocalPoint),
196
+ imageResizeConfig
197
+ });
198
+ if (resizeAction === 'omit') return createResult({
199
+ name: imageResizeConfig.name
200
+ });
198
201
  const imageToResize = sharpBase.clone();
199
202
  let resized = imageToResize;
200
- const metadata = await sharpBase.metadata();
201
- if (incomingFocalPoint && applyPayloadAdjustments(imageResizeConfig, dimensions)) {
203
+ if (resizeAction === 'resizeWithFocalPoint') {
202
204
  let { height: resizeHeight, width: resizeWidth } = imageResizeConfig;
203
205
  const originalAspectRatio = dimensions.width / dimensions.height;
204
206
  // Calculate resizeWidth based on original aspect ratio if it's undefined
@@ -209,32 +211,53 @@ async function resizeAndTransformImageSizes({ config, dimensions, file, mimeType
209
211
  if (resizeWidth && !resizeHeight) {
210
212
  resizeHeight = Math.round(resizeWidth / originalAspectRatio);
211
213
  }
212
- // Scale the image up or down to fit the resize dimensions
213
- const scaledImage = imageToResize.resize({
214
- height: resizeHeight,
215
- width: resizeWidth
214
+ if (!resizeHeight) resizeHeight = resizeImageMeta.height;
215
+ if (!resizeWidth) resizeWidth = resizeImageMeta.width;
216
+ const resizeAspectRatio = resizeWidth / resizeHeight;
217
+ const prioritizeHeight = resizeAspectRatio < originalAspectRatio;
218
+ // Scales the image before extracting from it
219
+ resized = imageToResize.resize({
220
+ height: prioritizeHeight ? resizeHeight : undefined,
221
+ width: prioritizeHeight ? undefined : resizeWidth
216
222
  });
217
- const { info: scaledImageInfo } = await scaledImage.toBuffer({
223
+ // must read from buffer, resize.metadata will return the original image metadata
224
+ const { info } = await resized.toBuffer({
218
225
  resolveWithObject: true
219
226
  });
220
- const safeResizeWidth = resizeWidth ?? scaledImageInfo.width;
221
- const maxOffsetX = scaledImageInfo.width - safeResizeWidth;
222
- const leftFocalEdge = Math.round(scaledImageInfo.width * (incomingFocalPoint.x / 100) - safeResizeWidth / 2);
223
- const safeOffsetX = Math.min(Math.max(0, leftFocalEdge), maxOffsetX);
224
- const isAnimated = fileIsAnimatedType && metadata.pages;
225
- let safeResizeHeight = resizeHeight ?? scaledImageInfo.height;
226
- if (isAnimated && resizeHeight === undefined) {
227
- safeResizeHeight = scaledImageInfo.height / metadata.pages;
227
+ resizeImageMeta.height = extractHeightFromImage({
228
+ ...originalImageMeta,
229
+ height: info.height
230
+ });
231
+ resizeImageMeta.width = info.width;
232
+ const halfResizeX = resizeWidth / 2;
233
+ const xFocalCenter = resizeImageMeta.width * (incomingFocalPoint.x / 100);
234
+ const calculatedRightPixelBound = xFocalCenter + halfResizeX;
235
+ let leftBound = xFocalCenter - halfResizeX;
236
+ // if the right bound is greater than the image width, adjust the left bound
237
+ // keeping focus on the right
238
+ if (calculatedRightPixelBound > resizeImageMeta.width) {
239
+ leftBound = resizeImageMeta.width - resizeWidth;
240
+ }
241
+ // if the left bound is less than 0, adjust the left bound to 0
242
+ // keeping the focus on the left
243
+ if (leftBound < 0) leftBound = 0;
244
+ const halfResizeY = resizeHeight / 2;
245
+ const yFocalCenter = resizeImageMeta.height * (incomingFocalPoint.y / 100);
246
+ const calculatedBottomPixelBound = yFocalCenter + halfResizeY;
247
+ let topBound = yFocalCenter - halfResizeY;
248
+ // if the bottom bound is greater than the image height, adjust the top bound
249
+ // keeping the image as far right as possible
250
+ if (calculatedBottomPixelBound > resizeImageMeta.height) {
251
+ topBound = resizeImageMeta.height - resizeHeight;
228
252
  }
229
- const maxOffsetY = isAnimated ? safeResizeHeight - (resizeHeight ?? safeResizeHeight) : scaledImageInfo.height - safeResizeHeight;
230
- const topFocalEdge = Math.round(scaledImageInfo.height * (incomingFocalPoint.y / 100) - safeResizeHeight / 2);
231
- const safeOffsetY = Math.min(Math.max(0, topFocalEdge), maxOffsetY);
232
- // extract the focal area from the scaled image
233
- resized = (fileIsAnimatedType ? imageToResize : scaledImage).extract({
234
- height: safeResizeHeight,
235
- left: safeOffsetX,
236
- top: safeOffsetY,
237
- width: safeResizeWidth
253
+ // if the top bound is less than 0, adjust the top bound to 0
254
+ // keeping the image focus near the top
255
+ if (topBound < 0) topBound = 0;
256
+ resized = resized.extract({
257
+ height: resizeHeight,
258
+ left: Math.floor(leftBound),
259
+ top: Math.floor(topBound),
260
+ width: resizeWidth
238
261
  });
239
262
  } else {
240
263
  resized = imageToResize.resize(imageResizeConfig);
@@ -253,7 +276,15 @@ async function resizeAndTransformImageSizes({ config, dimensions, file, mimeType
253
276
  req.payloadUploadSizes[imageResizeConfig.name] = bufferData;
254
277
  }
255
278
  const mimeInfo = await (0, _filetype.fromBuffer)(bufferData);
256
- const imageNameWithDimensions = createImageName(sanitizedImage.name, bufferInfo, mimeInfo?.ext || sanitizedImage.ext);
279
+ const imageNameWithDimensions = createImageName({
280
+ extension: mimeInfo?.ext || sanitizedImage.ext,
281
+ height: extractHeightFromImage({
282
+ ...originalImageMeta,
283
+ height: bufferInfo.height
284
+ }),
285
+ outputImageName: sanitizedImage.name,
286
+ width: bufferInfo.width
287
+ });
257
288
  const imagePath = `${staticPath}/${imageNameWithDimensions}`;
258
289
  if (await (0, _fileExists.default)(imagePath)) {
259
290
  try {
@@ -267,7 +298,7 @@ async function resizeAndTransformImageSizes({ config, dimensions, file, mimeType
267
298
  name: imageResizeConfig.name,
268
299
  filename: imageNameWithDimensions,
269
300
  filesize: size,
270
- height: fileIsAnimatedType && metadata.pages ? height / metadata.pages : height,
301
+ height: fileIsAnimatedType && originalImageMeta.pages ? height / originalImageMeta.pages : height,
271
302
  mimeType: mimeInfo?.mime || mimeType,
272
303
  sizesToSave: [
273
304
  {
@@ -282,7 +313,9 @@ async function resizeAndTransformImageSizes({ config, dimensions, file, mimeType
282
313
  Object.assign(acc.sizeData, result.sizeData);
283
314
  acc.sizesToSave.push(...result.sizesToSave);
284
315
  return acc;
285
- }, defaultResult);
316
+ }, {
317
+ ...defaultResult
318
+ });
286
319
  }
287
320
 
288
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91cGxvYWRzL2ltYWdlUmVzaXplci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFVwbG9hZGVkRmlsZSB9IGZyb20gJ2V4cHJlc3MtZmlsZXVwbG9hZCdcbmltcG9ydCB0eXBlIHsgT3V0cHV0SW5mbywgU2hhcnAsIFNoYXJwT3B0aW9ucyB9IGZyb20gJ3NoYXJwJ1xuXG5pbXBvcnQgeyBmcm9tQnVmZmVyIH0gZnJvbSAnZmlsZS10eXBlJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHNhbml0aXplIGZyb20gJ3Nhbml0aXplLWZpbGVuYW1lJ1xuaW1wb3J0IHNoYXJwIGZyb20gJ3NoYXJwJ1xuXG5pbXBvcnQgdHlwZSB7IFNhbml0aXplZENvbGxlY3Rpb25Db25maWcgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBheWxvYWRSZXF1ZXN0IH0gZnJvbSAnLi4vZXhwcmVzcy90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgRmlsZVNpemUsXG4gIEZpbGVTaXplcyxcbiAgRmlsZVRvU2F2ZSxcbiAgSW1hZ2VTaXplLFxuICBQcm9iZWRJbWFnZVNpemUsXG4gIFVwbG9hZEVkaXRzLFxufSBmcm9tICcuL3R5cGVzJ1xuXG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4uL3V0aWxpdGllcy9pc051bWJlcidcbmltcG9ydCBmaWxlRXhpc3RzIGZyb20gJy4vZmlsZUV4aXN0cydcblxudHlwZSBSZXNpemVBcmdzID0ge1xuICBjb25maWc6IFNhbml0aXplZENvbGxlY3Rpb25Db25maWdcbiAgZGltZW5zaW9uczogUHJvYmVkSW1hZ2VTaXplXG4gIGZpbGU6IFVwbG9hZGVkRmlsZVxuICBtaW1lVHlwZTogc3RyaW5nXG4gIHJlcTogUGF5bG9hZFJlcXVlc3RcbiAgc2F2ZWRGaWxlbmFtZTogc3RyaW5nXG4gIHN0YXRpY1BhdGg6IHN0cmluZ1xuICB1cGxvYWRFZGl0cz86IFVwbG9hZEVkaXRzXG59XG5cbi8qKiBSZXN1bHQgZnJvbSByZXNpemluZyBhbmQgdHJhbnNmb3JtaW5nIHRoZSByZXF1ZXN0ZWQgaW1hZ2Ugc2l6ZXMgKi9cbnR5cGUgSW1hZ2VTaXplc1Jlc3VsdCA9IHtcbiAgZm9jYWxQb2ludD86IFVwbG9hZEVkaXRzWydmb2NhbFBvaW50J11cbiAgc2l6ZURhdGE6IEZpbGVTaXplc1xuICBzaXplc1RvU2F2ZTogRmlsZVRvU2F2ZVtdXG59XG5cbnR5cGUgU2FuaXRpemVkSW1hZ2VEYXRhID0ge1xuICBleHQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZSB0aGUgaW1hZ2UgbmFtZSBhbmQgZXh0cmFjdCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNvdXJjZSBpbWFnZVxuICpcbiAqIEBwYXJhbSBzb3VyY2VJbWFnZSAtIHRoZSBzb3VyY2UgaW1hZ2VcbiAqIEByZXR1cm5zIHRoZSBzYW5pdGl6ZWQgbmFtZSBhbmQgZXh0ZW5zaW9uXG4gKi9cbmNvbnN0IGdldFNhbml0aXplZEltYWdlRGF0YSA9IChzb3VyY2VJbWFnZTogc3RyaW5nKTogU2FuaXRpemVkSW1hZ2VEYXRhID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gc291cmNlSW1hZ2Uuc3BsaXQoJy4nKS5wb3AoKVxuICBjb25zdCBuYW1lID0gc2FuaXRpemUoc291cmNlSW1hZ2Uuc3Vic3RyaW5nKDAsIHNvdXJjZUltYWdlLmxhc3RJbmRleE9mKCcuJykpIHx8IHNvdXJjZUltYWdlKVxuICByZXR1cm4geyBuYW1lLCBleHQ6IGV4dGVuc2lvbiB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGltYWdlIG5hbWUgYmFzZWQgb24gdGhlIG91dHB1dCBpbWFnZSBuYW1lLCB0aGUgZGltZW5zaW9ucyBhbmRcbiAqIHRoZSBleHRlbnNpb24uXG4gKlxuICogSWdub3JlIHRoZSBmYWN0IHRoYXQgZHVwbGljYXRlIG5hbWVzIGNvdWxkIGhhcHBlbiBpZiB0aGUgdGhlcmUgaXMgb25lXG4gKiBzaXplIHdpdGggYHdpZHRoIEFORCBoZWlnaHRgIGFuZCBvbmUgd2l0aCBvbmx5IGBoZWlnaHQgT1Igd2lkdGhgLiBCZWNhdXNlXG4gKiBzcGFjZSBpcyBleHBlbnNpdmUsIHdlIHdpbGwgcmV1c2UgdGhlIHNhbWUgaW1hZ2UgZm9yIGJvdGggc2l6ZXMuXG4gKlxuICogQHBhcmFtIG91dHB1dEltYWdlTmFtZSAtIHRoZSBzYW5pdGl6ZWQgaW1hZ2UgbmFtZVxuICogQHBhcmFtIGJ1ZmZlckluZm8gLSB0aGUgYnVmZmVyIGluZm9cbiAqIEBwYXJhbSBleHRlbnNpb24gLSB0aGUgZXh0ZW5zaW9uIHRvIHVzZVxuICogQHJldHVybnMgdGhlIG5ldyBpbWFnZSBuYW1lIHRoYXQgaXMgbm90IHRha2VuXG4gKi9cbmNvbnN0IGNyZWF0ZUltYWdlTmFtZSA9IChcbiAgb3V0cHV0SW1hZ2VOYW1lOiBzdHJpbmcsXG4gIHsgaGVpZ2h0LCB3aWR0aCB9OiBPdXRwdXRJbmZvLFxuICBleHRlbnNpb246IHN0cmluZyxcbikgPT4gYCR7b3V0cHV0SW1hZ2VOYW1lfS0ke3dpZHRofXgke2hlaWdodH0uJHtleHRlbnNpb259YFxuXG50eXBlIENyZWF0ZVJlc3VsdEFyZ3MgPSB7XG4gIGZpbGVuYW1lPzogRmlsZVNpemVbJ2ZpbGVuYW1lJ11cbiAgZmlsZXNpemU/OiBGaWxlU2l6ZVsnZmlsZXNpemUnXVxuICBoZWlnaHQ/OiBGaWxlU2l6ZVsnaGVpZ2h0J11cbiAgbWltZVR5cGU/OiBGaWxlU2l6ZVsnbWltZVR5cGUnXVxuICBuYW1lOiBzdHJpbmdcbiAgc2l6ZXNUb1NhdmU/OiBGaWxlVG9TYXZlW11cbiAgd2lkdGg/OiBGaWxlU2l6ZVsnd2lkdGgnXVxufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgcmVzdWx0IG9iamVjdCBmb3IgdGhlIGltYWdlIHJlc2l6ZSBvcGVyYXRpb24gYmFzZWQgb24gdGhlXG4gKiBwcm92aWRlZCBwYXJhbWV0ZXJzLiBJZiB0aGUgbmFtZSBpcyBub3QgcHJvdmlkZWQsIGFuIGVtcHR5IHJlc3VsdCBvYmplY3RcbiAqIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gZmlsZW5hbWUgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gaGVpZ2h0IC0gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2VcbiAqIEBwYXJhbSBmaWxlc2l6ZSAtIHRoZSBmaWxlc2l6ZSBvZiB0aGUgaW1hZ2VcbiAqIEBwYXJhbSBtaW1lVHlwZSAtIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gc2l6ZXNUb1NhdmUgLSB0aGUgc2l6ZXMgdG8gc2F2ZVxuICogQHJldHVybnMgdGhlIHJlc3VsdCBvYmplY3RcbiAqL1xuY29uc3QgY3JlYXRlUmVzdWx0ID0gKHtcbiAgbmFtZSxcbiAgZmlsZW5hbWUgPSBudWxsLFxuICBmaWxlc2l6ZSA9IG51bGwsXG4gIGhlaWdodCA9IG51bGwsXG4gIG1pbWVUeXBlID0gbnVsbCxcbiAgc2l6ZXNUb1NhdmUgPSBbXSxcbiAgd2lkdGggPSBudWxsLFxufTogQ3JlYXRlUmVzdWx0QXJncyk6IEltYWdlU2l6ZXNSZXN1bHQgPT4ge1xuICByZXR1cm4ge1xuICAgIHNpemVEYXRhOiB7XG4gICAgICBbbmFtZV06IHtcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIGZpbGVzaXplLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIG1pbWVUeXBlLFxuICAgICAgICB3aWR0aCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzaXplc1RvU2F2ZSxcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbWFnZSBuZWVkcyB0byBiZSByZXNpemVkIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIGRpbWVuc2lvbnNcbiAqIGFuZCB0aGUgb3JpZ2luYWwgaW1hZ2Ugc2l6ZS4gSWYgdGhlIHJlc2l6ZSBvcHRpb25zIHdpdGhvdXRFbmxhcmdlbWVudCBvciB3aXRob3V0UmVkdWN0aW9uIGFyZSBwcm92aWRlZCxcbiAqIHRoZSBpbWFnZSB3aWxsIGJlIHJlc2l6ZWQgcmVnYXJkbGVzcyBvZiB0aGUgcmVxdWVzdGVkIGRpbWVuc2lvbnMsIGdpdmVuIHRoYXQgdGhlXG4gKiB3aWR0aCBvciBoZWlnaHQgdG8gYmUgcmVzaXplZCBpcyBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0gcmVzaXplQ29uZmlnIC0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGFuZCByZXNpemUgb3B0aW9uc1xuICogQHBhcmFtIG9yaWdpbmFsIC0gdGhlIG9yaWdpbmFsIGltYWdlIHNpemVcbiAqIEByZXR1cm5zIHRydWUgaWYgcmVzaXppbmcgaXMgbm90IG5lZWRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmNvbnN0IHByZXZlbnRSZXNpemUgPSAoXG4gIHsgaGVpZ2h0OiBkZXNpcmVkSGVpZ2h0LCB3aWR0aDogZGVzaXJlZFdpZHRoLCB3aXRob3V0RW5sYXJnZW1lbnQsIHdpdGhvdXRSZWR1Y3Rpb24gfTogSW1hZ2VTaXplLFxuICBvcmlnaW5hbDogUHJvYmVkSW1hZ2VTaXplLFxuKTogYm9vbGVhbiA9PiB7XG4gIC8vIGRlZmF1bHQgaXMgdG8gYWxsb3cgcmVkdWN0aW9uXG4gIGlmICh3aXRob3V0UmVkdWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2UgLy8gbmVlZHMgcmVzaXplXG4gIH1cblxuICAvLyBkZWZhdWx0IGlzIHRvIHByZXZlbnQgZW5sYXJnZW1lbnRcbiAgaWYgKHdpdGhvdXRFbmxhcmdlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlIC8vIG5lZWRzIHJlc2l6ZVxuICB9XG5cbiAgY29uc3QgaXNXaWR0aE9ySGVpZ2h0Tm90RGVmaW5lZCA9ICFkZXNpcmVkSGVpZ2h0IHx8ICFkZXNpcmVkV2lkdGhcbiAgaWYgKGlzV2lkdGhPckhlaWdodE5vdERlZmluZWQpIHtcbiAgICAvLyBJZiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBub3QgZGVmaW5lZCwgaXQgbWVhbnMgdGhlcmUgaXMgYSBmb3JtYXQgY29udmVyc2lvblxuICAgIC8vIGFuZCB0aGUgaW1hZ2UgbmVlZHMgdG8gYmUgXCJyZXNpemVkXCIgKHRyYW5zZm9ybWVkKS5cbiAgICByZXR1cm4gZmFsc2UgLy8gbmVlZHMgcmVzaXplXG4gIH1cblxuICBjb25zdCBoYXNJbnN1ZmZpY2llbnRXaWR0aCA9IGRlc2lyZWRXaWR0aCA+IG9yaWdpbmFsLndpZHRoXG4gIGNvbnN0IGhhc0luc3VmZmljaWVudEhlaWdodCA9IGRlc2lyZWRIZWlnaHQgPiBvcmlnaW5hbC5oZWlnaHRcbiAgaWYgKGhhc0luc3VmZmljaWVudFdpZHRoICYmIGhhc0luc3VmZmljaWVudEhlaWdodCkge1xuICAgIC8vIGRvZXNuJ3QgbmVlZCByZXNpemUgLSBwcmV2ZW50IGVubGFyZ2VtZW50LiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiBib3RoIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGluc3VmZmljaWVudC5cbiAgICAvLyBpZiBvbmx5IG9uZSBkaW1lbnNpb24gaXMgaW5zdWZmaWNpZW50IGFuZCB0aGUgb3RoZXIgaXMgc3VmZmljaWVudCwgcmVzaXppbmcgbmVlZHMgdG8gaGFwcGVuLCBhcyB0aGUgaW1hZ2VcbiAgICAvLyBzaG91bGQgYmUgcmVzaXplZCB0byB0aGUgc3VmZmljaWVudCBkaW1lbnNpb24uXG4gICAgcmV0dXJuIHRydWUgLy8gZG8gbm90IGNyZWF0ZSBhIG5ldyBzaXplXG4gIH1cblxuICByZXR1cm4gZmFsc2UgLy8gbmVlZHMgcmVzaXplXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGltYWdlIHNob3VsZCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gc2hhcnAgd2l0aG91dCBwYXlsb2FkIGFkanVzdGluZyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSByZXNpemVDb25maWcgLSBvYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIGRpbWVuc2lvbnMgYW5kIHJlc2l6ZSBvcHRpb25zXG4gKiBAcGFyYW0gb3JpZ2luYWwgLSB0aGUgb3JpZ2luYWwgaW1hZ2Ugc2l6ZVxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW1hZ2Ugc2hvdWxkIHBhc3NlZCBkaXJlY3RseSB0byBzaGFycFxuICovXG5jb25zdCBhcHBseVBheWxvYWRBZGp1c3RtZW50cyA9IChcbiAgeyBmaXQsIGhlaWdodCwgd2lkdGgsIHdpdGhvdXRFbmxhcmdlbWVudCwgd2l0aG91dFJlZHVjdGlvbiB9OiBJbWFnZVNpemUsXG4gIG9yaWdpbmFsOiBQcm9iZWRJbWFnZVNpemUsXG4pID0+IHtcbiAgaWYgKGZpdCA9PT0gJ2NvbnRhaW4nIHx8IGZpdCA9PT0gJ2luc2lkZScpIHJldHVybiBmYWxzZVxuICBpZiAoIWlzTnVtYmVyKGhlaWdodCkgJiYgIWlzTnVtYmVyKHdpZHRoKSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgdGFyZ2V0QXNwZWN0UmF0aW8gPSB3aWR0aCAvIGhlaWdodFxuICBjb25zdCBvcmlnaW5hbEFzcGVjdFJhdGlvID0gb3JpZ2luYWwud2lkdGggLyBvcmlnaW5hbC5oZWlnaHRcbiAgaWYgKG9yaWdpbmFsQXNwZWN0UmF0aW8gPT09IHRhcmdldEFzcGVjdFJhdGlvKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBza2lwRW5sYXJnZW1lbnQgPSB3aXRob3V0RW5sYXJnZW1lbnQgJiYgKG9yaWdpbmFsLmhlaWdodCA8IGhlaWdodCB8fCBvcmlnaW5hbC53aWR0aCA8IHdpZHRoKVxuICBjb25zdCBza2lwUmVkdWN0aW9uID0gd2l0aG91dFJlZHVjdGlvbiAmJiAob3JpZ2luYWwuaGVpZ2h0ID4gaGVpZ2h0IHx8IG9yaWdpbmFsLndpZHRoID4gd2lkdGgpXG4gIGlmIChza2lwRW5sYXJnZW1lbnQgfHwgc2tpcFJlZHVjdGlvbikgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZSB0aGUgcmVzaXplIGNvbmZpZy4gSWYgdGhlIHJlc2l6ZSBjb25maWcgaGFzIHRoZSBgd2l0aG91dFJlZHVjdGlvbmBcbiAqIHByb3BlcnR5IHNldCB0byB0cnVlLCB0aGUgYGZpdGAgYW5kIGBwb3NpdGlvbmAgcHJvcGVydGllcyB3aWxsIGJlIHNldCB0byBgY29udGFpbmBcbiAqIGFuZCBgdG9wIGxlZnRgIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBAcGFyYW0gcmVzaXplQ29uZmlnIC0gdGhlIHJlc2l6ZSBjb25maWdcbiAqIEByZXR1cm5zIGEgc2FuaXRpemVkIHJlc2l6ZSBjb25maWdcbiAqL1xuY29uc3Qgc2FuaXRpemVSZXNpemVDb25maWcgPSAocmVzaXplQ29uZmlnOiBJbWFnZVNpemUpOiBJbWFnZVNpemUgPT4ge1xuICBpZiAocmVzaXplQ29uZmlnLndpdGhvdXRSZWR1Y3Rpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzaXplQ29uZmlnLFxuICAgICAgLy8gV2h5IGZpdCBgY29udGFpbmAgc2hvdWxkIGFsc28gYmUgc2V0IHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9sb3ZlbGwvc2hhcnAvaXNzdWVzLzM1OTVcbiAgICAgIGZpdDogcmVzaXplQ29uZmlnPy5maXQgfHwgJ2NvbnRhaW4nLFxuICAgICAgcG9zaXRpb246IHJlc2l6ZUNvbmZpZz8ucG9zaXRpb24gfHwgJ2xlZnQgdG9wJyxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc2l6ZUNvbmZpZ1xufVxuXG4vKipcbiAqIEZvciB0aGUgcHJvdmlkZWQgaW1hZ2Ugc2l6ZXMsIGhhbmRsZSB0aGUgcmVzaXppbmcgYW5kIHRoZSB0cmFuc2Zvcm1zXG4gKiAoZm9ybWF0LCB0cmltLCBldGMuKSBvZiBlYWNoIHJlcXVlc3RlZCBpbWFnZSBzaXplIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvYmplY3QuXG4gKiBUaGlzIG9ubHkgaGFuZGxlcyB0aGUgaW1hZ2Ugc2l6ZXMuIFRoZSB0cmFuc2Zvcm1zIG9mIHRoZSBvcmlnaW5hbCBpbWFnZVxuICogYXJlIGhhbmRsZWQgaW4ge0BsaW5rIC4vZ2VuZXJhdGVGaWxlRGF0YS50c30uXG4gKlxuICogVGhlIGltYWdlIHdpbGwgYmUgcmVzaXplZCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkXG4gKiByZXNpemUgY29uZmlnLiBJZiBubyBpbWFnZSBzaXplcyBhcmUgcmVxdWVzdGVkLCB0aGUgcmVzb2x2ZWQgZGF0YSB3aWxsIGJlIGVtcHR5LlxuICogRm9yIGV2ZXJ5IGltYWdlIHRoYXQgZG9lcyBub3QgbmVlZCB0byBiZSByZXNpemVkLCBhIHJlc3VsdCBvYmplY3Qgd2l0aCBgbnVsbGBcbiAqIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gcmVzaXplQ29uZmlnIC0gdGhlIHJlc2l6ZSBjb25maWdcbiAqIEByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHJlc2l6ZSBvcGVyYXRpb24ocylcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcmVzaXplQW5kVHJhbnNmb3JtSW1hZ2VTaXplcyh7XG4gIGNvbmZpZyxcbiAgZGltZW5zaW9ucyxcbiAgZmlsZSxcbiAgbWltZVR5cGUsXG4gIHJlcSxcbiAgc2F2ZWRGaWxlbmFtZSxcbiAgc3RhdGljUGF0aCxcbiAgdXBsb2FkRWRpdHMsXG59OiBSZXNpemVBcmdzKTogUHJvbWlzZTxJbWFnZVNpemVzUmVzdWx0PiB7XG4gIGNvbnN0IHsgZm9jYWxQb2ludDogZm9jYWxQb2ludEVuYWJsZWQgPSB0cnVlLCBpbWFnZVNpemVzIH0gPSBjb25maWcudXBsb2FkXG5cbiAgLy8gRm9jYWwgcG9pbnQgYWRqdXN0bWVudHNcbiAgY29uc3QgaW5jb21pbmdGb2NhbFBvaW50ID0gdXBsb2FkRWRpdHM/LmZvY2FsUG9pbnRcbiAgICA/IHtcbiAgICAgICAgeDogaXNOdW1iZXIodXBsb2FkRWRpdHMuZm9jYWxQb2ludC54KSA/IE1hdGgucm91bmQodXBsb2FkRWRpdHMuZm9jYWxQb2ludC54KSA6IDUwLFxuICAgICAgICB5OiBpc051bWJlcih1cGxvYWRFZGl0cy5mb2NhbFBvaW50LnkpID8gTWF0aC5yb3VuZCh1cGxvYWRFZGl0cy5mb2NhbFBvaW50LnkpIDogNTAsXG4gICAgICB9XG4gICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBkZWZhdWx0UmVzdWx0OiBJbWFnZVNpemVzUmVzdWx0ID0ge1xuICAgIC4uLihmb2NhbFBvaW50RW5hYmxlZCAmJiBpbmNvbWluZ0ZvY2FsUG9pbnQgJiYgeyBmb2NhbFBvaW50OiBpbmNvbWluZ0ZvY2FsUG9pbnQgfSksXG4gICAgc2l6ZURhdGE6IHt9LFxuICAgIHNpemVzVG9TYXZlOiBbXSxcbiAgfVxuXG4gIC8vIE5vdGhpbmcgdG8gcmVzaXplIGhlcmUgc28gcmV0dXJuIGFzIGVhcmx5IGFzIHBvc3NpYmxlXG4gIGlmICghaW1hZ2VTaXplcykgcmV0dXJuIGRlZmF1bHRSZXN1bHRcblxuICAvLyBEZXRlcm1pbmUgaWYgdGhlIGZpbGUgaXMgYW5pbWF0ZWRcbiAgY29uc3QgZmlsZUlzQW5pbWF0ZWRUeXBlID0gWydpbWFnZS9hdmlmJywgJ2ltYWdlL2dpZicsICdpbWFnZS93ZWJwJ10uaW5jbHVkZXMoZmlsZS5taW1ldHlwZSlcbiAgY29uc3Qgc2hhcnBPcHRpb25zOiBTaGFycE9wdGlvbnMgPSB7fVxuXG4gIGlmIChmaWxlSXNBbmltYXRlZFR5cGUpIHNoYXJwT3B0aW9ucy5hbmltYXRlZCA9IHRydWVcblxuICBjb25zdCBzaGFycEJhc2U6IFNoYXJwIHwgdW5kZWZpbmVkID0gc2hhcnAoZmlsZS50ZW1wRmlsZVBhdGggfHwgZmlsZS5kYXRhLCBzaGFycE9wdGlvbnMpLnJvdGF0ZSgpIC8vIHBhc3Mgcm90YXRlKCkgdG8gYXV0by1yb3RhdGUgYmFzZWQgb24gRVhJRiBkYXRhLiBodHRwczovL2dpdGh1Yi5jb20vcGF5bG9hZGNtcy9wYXlsb2FkL3B1bGwvMzA4MVxuXG4gIGNvbnN0IHJlc3VsdHM6IEltYWdlU2l6ZXNSZXN1bHRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGltYWdlU2l6ZXMubWFwKGFzeW5jIChpbWFnZVJlc2l6ZUNvbmZpZyk6IFByb21pc2U8SW1hZ2VTaXplc1Jlc3VsdD4gPT4ge1xuICAgICAgaW1hZ2VSZXNpemVDb25maWcgPSBzYW5pdGl6ZVJlc2l6ZUNvbmZpZyhpbWFnZVJlc2l6ZUNvbmZpZylcblxuICAgICAgLy8gVGhpcyBjaGVja3MgaWYgYSByZXNpemUgc2hvdWxkIGhhcHBlbi4gSWYgbm90LCB0aGUgcmVzaXplZCBpbWFnZSB3aWxsIGJlXG4gICAgICAvLyBza2lwcGVkIENPTVBMRVRFTFkgYW5kIHRodXMgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBpbWFnZXMuXG4gICAgICAvLyBBbGwgZnVydGhlciBmb3JtYXQvdHJpbSBvcHRpb25zIHdpbGwgdGh1cyBiZSBza2lwcGVkIGFzIHdlbGwuXG4gICAgICBpZiAocHJldmVudFJlc2l6ZShpbWFnZVJlc2l6ZUNvbmZpZywgZGltZW5zaW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdCh7IG5hbWU6IGltYWdlUmVzaXplQ29uZmlnLm5hbWUgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW1hZ2VUb1Jlc2l6ZSA9IHNoYXJwQmFzZS5jbG9uZSgpXG4gICAgICBsZXQgcmVzaXplZCA9IGltYWdlVG9SZXNpemVcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBzaGFycEJhc2UubWV0YWRhdGEoKVxuXG4gICAgICBpZiAoaW5jb21pbmdGb2NhbFBvaW50ICYmIGFwcGx5UGF5bG9hZEFkanVzdG1lbnRzKGltYWdlUmVzaXplQ29uZmlnLCBkaW1lbnNpb25zKSkge1xuICAgICAgICBsZXQgeyBoZWlnaHQ6IHJlc2l6ZUhlaWdodCwgd2lkdGg6IHJlc2l6ZVdpZHRoIH0gPSBpbWFnZVJlc2l6ZUNvbmZpZ1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQXNwZWN0UmF0aW8gPSBkaW1lbnNpb25zLndpZHRoIC8gZGltZW5zaW9ucy5oZWlnaHRcblxuICAgICAgICAvLyBDYWxjdWxhdGUgcmVzaXplV2lkdGggYmFzZWQgb24gb3JpZ2luYWwgYXNwZWN0IHJhdGlvIGlmIGl0J3MgdW5kZWZpbmVkXG4gICAgICAgIGlmIChyZXNpemVIZWlnaHQgJiYgIXJlc2l6ZVdpZHRoKSB7XG4gICAgICAgICAgcmVzaXplV2lkdGggPSBNYXRoLnJvdW5kKHJlc2l6ZUhlaWdodCAqIG9yaWdpbmFsQXNwZWN0UmF0aW8pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgcmVzaXplSGVpZ2h0IGJhc2VkIG9uIG9yaWdpbmFsIGFzcGVjdCByYXRpbyBpZiBpdCdzIHVuZGVmaW5lZFxuICAgICAgICBpZiAocmVzaXplV2lkdGggJiYgIXJlc2l6ZUhlaWdodCkge1xuICAgICAgICAgIHJlc2l6ZUhlaWdodCA9IE1hdGgucm91bmQocmVzaXplV2lkdGggLyBvcmlnaW5hbEFzcGVjdFJhdGlvKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2NhbGUgdGhlIGltYWdlIHVwIG9yIGRvd24gdG8gZml0IHRoZSByZXNpemUgZGltZW5zaW9uc1xuICAgICAgICBjb25zdCBzY2FsZWRJbWFnZSA9IGltYWdlVG9SZXNpemUucmVzaXplKHtcbiAgICAgICAgICBoZWlnaHQ6IHJlc2l6ZUhlaWdodCxcbiAgICAgICAgICB3aWR0aDogcmVzaXplV2lkdGgsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgeyBpbmZvOiBzY2FsZWRJbWFnZUluZm8gfSA9IGF3YWl0IHNjYWxlZEltYWdlLnRvQnVmZmVyKHsgcmVzb2x2ZVdpdGhPYmplY3Q6IHRydWUgfSlcblxuICAgICAgICBjb25zdCBzYWZlUmVzaXplV2lkdGggPSByZXNpemVXaWR0aCA/PyBzY2FsZWRJbWFnZUluZm8ud2lkdGhcbiAgICAgICAgY29uc3QgbWF4T2Zmc2V0WCA9IHNjYWxlZEltYWdlSW5mby53aWR0aCAtIHNhZmVSZXNpemVXaWR0aFxuICAgICAgICBjb25zdCBsZWZ0Rm9jYWxFZGdlID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBzY2FsZWRJbWFnZUluZm8ud2lkdGggKiAoaW5jb21pbmdGb2NhbFBvaW50LnggLyAxMDApIC0gc2FmZVJlc2l6ZVdpZHRoIC8gMixcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBzYWZlT2Zmc2V0WCA9IE1hdGgubWluKE1hdGgubWF4KDAsIGxlZnRGb2NhbEVkZ2UpLCBtYXhPZmZzZXRYKVxuXG4gICAgICAgIGNvbnN0IGlzQW5pbWF0ZWQgPSBmaWxlSXNBbmltYXRlZFR5cGUgJiYgbWV0YWRhdGEucGFnZXNcblxuICAgICAgICBsZXQgc2FmZVJlc2l6ZUhlaWdodCA9IHJlc2l6ZUhlaWdodCA/PyBzY2FsZWRJbWFnZUluZm8uaGVpZ2h0XG5cbiAgICAgICAgaWYgKGlzQW5pbWF0ZWQgJiYgcmVzaXplSGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzYWZlUmVzaXplSGVpZ2h0ID0gc2NhbGVkSW1hZ2VJbmZvLmhlaWdodCAvIG1ldGFkYXRhLnBhZ2VzXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhPZmZzZXRZID0gaXNBbmltYXRlZFxuICAgICAgICAgID8gc2FmZVJlc2l6ZUhlaWdodCAtIChyZXNpemVIZWlnaHQgPz8gc2FmZVJlc2l6ZUhlaWdodClcbiAgICAgICAgICA6IHNjYWxlZEltYWdlSW5mby5oZWlnaHQgLSBzYWZlUmVzaXplSGVpZ2h0XG5cbiAgICAgICAgY29uc3QgdG9wRm9jYWxFZGdlID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBzY2FsZWRJbWFnZUluZm8uaGVpZ2h0ICogKGluY29taW5nRm9jYWxQb2ludC55IC8gMTAwKSAtIHNhZmVSZXNpemVIZWlnaHQgLyAyLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHNhZmVPZmZzZXRZID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgdG9wRm9jYWxFZGdlKSwgbWF4T2Zmc2V0WSlcblxuICAgICAgICAvLyBleHRyYWN0IHRoZSBmb2NhbCBhcmVhIGZyb20gdGhlIHNjYWxlZCBpbWFnZVxuICAgICAgICByZXNpemVkID0gKGZpbGVJc0FuaW1hdGVkVHlwZSA/IGltYWdlVG9SZXNpemUgOiBzY2FsZWRJbWFnZSkuZXh0cmFjdCh7XG4gICAgICAgICAgaGVpZ2h0OiBzYWZlUmVzaXplSGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IHNhZmVPZmZzZXRYLFxuICAgICAgICAgIHRvcDogc2FmZU9mZnNldFksXG4gICAgICAgICAgd2lkdGg6IHNhZmVSZXNpemVXaWR0aCxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2l6ZWQgPSBpbWFnZVRvUmVzaXplLnJlc2l6ZShpbWFnZVJlc2l6ZUNvbmZpZylcbiAgICAgIH1cblxuICAgICAgaWYgKGltYWdlUmVzaXplQ29uZmlnLmZvcm1hdE9wdGlvbnMpIHtcbiAgICAgICAgcmVzaXplZCA9IHJlc2l6ZWQudG9Gb3JtYXQoXG4gICAgICAgICAgaW1hZ2VSZXNpemVDb25maWcuZm9ybWF0T3B0aW9ucy5mb3JtYXQsXG4gICAgICAgICAgaW1hZ2VSZXNpemVDb25maWcuZm9ybWF0T3B0aW9ucy5vcHRpb25zLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZVJlc2l6ZUNvbmZpZy50cmltT3B0aW9ucykge1xuICAgICAgICByZXNpemVkID0gcmVzaXplZC50cmltKGltYWdlUmVzaXplQ29uZmlnLnRyaW1PcHRpb25zKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGRhdGE6IGJ1ZmZlckRhdGEsIGluZm86IGJ1ZmZlckluZm8gfSA9IGF3YWl0IHJlc2l6ZWQudG9CdWZmZXIoe1xuICAgICAgICByZXNvbHZlV2l0aE9iamVjdDogdHJ1ZSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHNhbml0aXplZEltYWdlID0gZ2V0U2FuaXRpemVkSW1hZ2VEYXRhKHNhdmVkRmlsZW5hbWUpXG5cbiAgICAgIGlmIChyZXEucGF5bG9hZFVwbG9hZFNpemVzKSB7XG4gICAgICAgIHJlcS5wYXlsb2FkVXBsb2FkU2l6ZXNbaW1hZ2VSZXNpemVDb25maWcubmFtZV0gPSBidWZmZXJEYXRhXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pbWVJbmZvID0gYXdhaXQgZnJvbUJ1ZmZlcihidWZmZXJEYXRhKVxuXG4gICAgICBjb25zdCBpbWFnZU5hbWVXaXRoRGltZW5zaW9ucyA9IGNyZWF0ZUltYWdlTmFtZShcbiAgICAgICAgc2FuaXRpemVkSW1hZ2UubmFtZSxcbiAgICAgICAgYnVmZmVySW5mbyxcbiAgICAgICAgbWltZUluZm8/LmV4dCB8fCBzYW5pdGl6ZWRJbWFnZS5leHQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGltYWdlUGF0aCA9IGAke3N0YXRpY1BhdGh9LyR7aW1hZ2VOYW1lV2l0aERpbWVuc2lvbnN9YFxuXG4gICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhpbWFnZVBhdGgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZnMudW5saW5rU3luYyhpbWFnZVBhdGgpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSB1bmxpbmsgZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBoZWlnaHQsIHNpemUsIHdpZHRoIH0gPSBidWZmZXJJbmZvXG4gICAgICByZXR1cm4gY3JlYXRlUmVzdWx0KHtcbiAgICAgICAgbmFtZTogaW1hZ2VSZXNpemVDb25maWcubmFtZSxcbiAgICAgICAgZmlsZW5hbWU6IGltYWdlTmFtZVdpdGhEaW1lbnNpb25zLFxuICAgICAgICBmaWxlc2l6ZTogc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBmaWxlSXNBbmltYXRlZFR5cGUgJiYgbWV0YWRhdGEucGFnZXMgPyBoZWlnaHQgLyBtZXRhZGF0YS5wYWdlcyA6IGhlaWdodCxcbiAgICAgICAgbWltZVR5cGU6IG1pbWVJbmZvPy5taW1lIHx8IG1pbWVUeXBlLFxuICAgICAgICBzaXplc1RvU2F2ZTogW3sgYnVmZmVyOiBidWZmZXJEYXRhLCBwYXRoOiBpbWFnZVBhdGggfV0sXG4gICAgICAgIHdpZHRoLFxuICAgICAgfSlcbiAgICB9KSxcbiAgKVxuXG4gIHJldHVybiByZXN1bHRzLnJlZHVjZSgoYWNjLCByZXN1bHQpID0+IHtcbiAgICBPYmplY3QuYXNzaWduKGFjYy5zaXplRGF0YSwgcmVzdWx0LnNpemVEYXRhKVxuICAgIGFjYy5zaXplc1RvU2F2ZS5wdXNoKC4uLnJlc3VsdC5zaXplc1RvU2F2ZSlcbiAgICByZXR1cm4gYWNjXG4gIH0sIGRlZmF1bHRSZXN1bHQpXG59XG4iXSwibmFtZXMiOlsicmVzaXplQW5kVHJhbnNmb3JtSW1hZ2VTaXplcyIsImdldFNhbml0aXplZEltYWdlRGF0YSIsInNvdXJjZUltYWdlIiwiZXh0ZW5zaW9uIiwic3BsaXQiLCJwb3AiLCJuYW1lIiwic2FuaXRpemUiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImV4dCIsImNyZWF0ZUltYWdlTmFtZSIsIm91dHB1dEltYWdlTmFtZSIsImhlaWdodCIsIndpZHRoIiwiY3JlYXRlUmVzdWx0IiwiZmlsZW5hbWUiLCJmaWxlc2l6ZSIsIm1pbWVUeXBlIiwic2l6ZXNUb1NhdmUiLCJzaXplRGF0YSIsInByZXZlbnRSZXNpemUiLCJkZXNpcmVkSGVpZ2h0IiwiZGVzaXJlZFdpZHRoIiwid2l0aG91dEVubGFyZ2VtZW50Iiwid2l0aG91dFJlZHVjdGlvbiIsIm9yaWdpbmFsIiwidW5kZWZpbmVkIiwiaXNXaWR0aE9ySGVpZ2h0Tm90RGVmaW5lZCIsImhhc0luc3VmZmljaWVudFdpZHRoIiwiaGFzSW5zdWZmaWNpZW50SGVpZ2h0IiwiYXBwbHlQYXlsb2FkQWRqdXN0bWVudHMiLCJmaXQiLCJpc051bWJlciIsInRhcmdldEFzcGVjdFJhdGlvIiwib3JpZ2luYWxBc3BlY3RSYXRpbyIsInNraXBFbmxhcmdlbWVudCIsInNraXBSZWR1Y3Rpb24iLCJzYW5pdGl6ZVJlc2l6ZUNvbmZpZyIsInJlc2l6ZUNvbmZpZyIsInBvc2l0aW9uIiwiY29uZmlnIiwiZGltZW5zaW9ucyIsImZpbGUiLCJyZXEiLCJzYXZlZEZpbGVuYW1lIiwic3RhdGljUGF0aCIsInVwbG9hZEVkaXRzIiwiZm9jYWxQb2ludCIsImZvY2FsUG9pbnRFbmFibGVkIiwiaW1hZ2VTaXplcyIsInVwbG9hZCIsImluY29taW5nRm9jYWxQb2ludCIsIngiLCJNYXRoIiwicm91bmQiLCJ5IiwiZGVmYXVsdFJlc3VsdCIsImZpbGVJc0FuaW1hdGVkVHlwZSIsImluY2x1ZGVzIiwibWltZXR5cGUiLCJzaGFycE9wdGlvbnMiLCJhbmltYXRlZCIsInNoYXJwQmFzZSIsInNoYXJwIiwidGVtcEZpbGVQYXRoIiwiZGF0YSIsInJvdGF0ZSIsInJlc3VsdHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiaW1hZ2VSZXNpemVDb25maWciLCJpbWFnZVRvUmVzaXplIiwiY2xvbmUiLCJyZXNpemVkIiwibWV0YWRhdGEiLCJyZXNpemVIZWlnaHQiLCJyZXNpemVXaWR0aCIsInNjYWxlZEltYWdlIiwicmVzaXplIiwiaW5mbyIsInNjYWxlZEltYWdlSW5mbyIsInRvQnVmZmVyIiwicmVzb2x2ZVdpdGhPYmplY3QiLCJzYWZlUmVzaXplV2lkdGgiLCJtYXhPZmZzZXRYIiwibGVmdEZvY2FsRWRnZSIsInNhZmVPZmZzZXRYIiwibWluIiwibWF4IiwiaXNBbmltYXRlZCIsInBhZ2VzIiwic2FmZVJlc2l6ZUhlaWdodCIsIm1heE9mZnNldFkiLCJ0b3BGb2NhbEVkZ2UiLCJzYWZlT2Zmc2V0WSIsImV4dHJhY3QiLCJsZWZ0IiwidG9wIiwiZm9ybWF0T3B0aW9ucyIsInRvRm9ybWF0IiwiZm9ybWF0Iiwib3B0aW9ucyIsInRyaW1PcHRpb25zIiwidHJpbSIsImJ1ZmZlckRhdGEiLCJidWZmZXJJbmZvIiwic2FuaXRpemVkSW1hZ2UiLCJwYXlsb2FkVXBsb2FkU2l6ZXMiLCJtaW1lSW5mbyIsImZyb21CdWZmZXIiLCJpbWFnZU5hbWVXaXRoRGltZW5zaW9ucyIsImltYWdlUGF0aCIsImZpbGVFeGlzdHMiLCJmcyIsInVubGlua1N5bmMiLCJzaXplIiwibWltZSIsImJ1ZmZlciIsInBhdGgiLCJyZWR1Y2UiLCJhY2MiLCJyZXN1bHQiLCJPYmplY3QiLCJhc3NpZ24iLCJwdXNoIl0sInJhbmdlTWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsiLCJtYXBwaW5ncyI6Ijs7OzsrQkFtTkE7Ozs7Ozs7Ozs7Ozs7Q0FhQyxHQUNEOzs7ZUFBOEJBOzs7MEJBOU5IOzJEQUNaO3lFQUNNOzhEQUNIOzBCQWFPO21FQUNGOzs7Ozs7QUF5QnZCOzs7OztDQUtDLEdBQ0QsTUFBTUMsd0JBQXdCLENBQUNDO0lBQzdCLE1BQU1DLFlBQVlELFlBQVlFLEtBQUssQ0FBQyxLQUFLQyxHQUFHO0lBQzVDLE1BQU1DLE9BQU9DLElBQUFBLHlCQUFRLEVBQUNMLFlBQVlNLFNBQVMsQ0FBQyxHQUFHTixZQUFZTyxXQUFXLENBQUMsU0FBU1A7SUFDaEYsT0FBTztRQUFFSTtRQUFNSSxLQUFLUDtJQUFVO0FBQ2hDO0FBRUE7Ozs7Ozs7Ozs7OztDQVlDLEdBQ0QsTUFBTVEsa0JBQWtCLENBQ3RCQyxpQkFDQSxFQUFFQyxNQUFNLEVBQUVDLEtBQUssRUFBYyxFQUM3QlgsWUFDRyxDQUFDLEVBQUVTLGdCQUFnQixDQUFDLEVBQUVFLE1BQU0sQ0FBQyxFQUFFRCxPQUFPLENBQUMsRUFBRVYsVUFBVSxDQUFDO0FBWXpEOzs7Ozs7Ozs7Ozs7O0NBYUMsR0FDRCxNQUFNWSxlQUFlLENBQUMsRUFDcEJULElBQUksRUFDSlUsV0FBVyxJQUFJ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
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91cGxvYWRzL2ltYWdlUmVzaXplci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFVwbG9hZGVkRmlsZSB9IGZyb20gJ2V4cHJlc3MtZmlsZXVwbG9hZCdcbmltcG9ydCB0eXBlIHsgU2hhcnAsIE1ldGFkYXRhIGFzIFNoYXJwTWV0YWRhdGEsIFNoYXJwT3B0aW9ucyB9IGZyb20gJ3NoYXJwJ1xuXG5pbXBvcnQgeyBmcm9tQnVmZmVyIH0gZnJvbSAnZmlsZS10eXBlJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHNhbml0aXplIGZyb20gJ3Nhbml0aXplLWZpbGVuYW1lJ1xuaW1wb3J0IHNoYXJwIGZyb20gJ3NoYXJwJ1xuXG5pbXBvcnQgdHlwZSB7IFNhbml0aXplZENvbGxlY3Rpb25Db25maWcgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBheWxvYWRSZXF1ZXN0IH0gZnJvbSAnLi4vZXhwcmVzcy90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgRmlsZVNpemUsXG4gIEZpbGVTaXplcyxcbiAgRmlsZVRvU2F2ZSxcbiAgSW1hZ2VTaXplLFxuICBQcm9iZWRJbWFnZVNpemUsXG4gIFVwbG9hZEVkaXRzLFxufSBmcm9tICcuL3R5cGVzJ1xuXG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4uL3V0aWxpdGllcy9pc051bWJlcidcbmltcG9ydCBmaWxlRXhpc3RzIGZyb20gJy4vZmlsZUV4aXN0cydcblxudHlwZSBSZXNpemVBcmdzID0ge1xuICBjb25maWc6IFNhbml0aXplZENvbGxlY3Rpb25Db25maWdcbiAgZGltZW5zaW9uczogUHJvYmVkSW1hZ2VTaXplXG4gIGZpbGU6IFVwbG9hZGVkRmlsZVxuICBtaW1lVHlwZTogc3RyaW5nXG4gIHJlcTogUGF5bG9hZFJlcXVlc3RcbiAgc2F2ZWRGaWxlbmFtZTogc3RyaW5nXG4gIHN0YXRpY1BhdGg6IHN0cmluZ1xuICB1cGxvYWRFZGl0cz86IFVwbG9hZEVkaXRzXG59XG5cbi8qKiBSZXN1bHQgZnJvbSByZXNpemluZyBhbmQgdHJhbnNmb3JtaW5nIHRoZSByZXF1ZXN0ZWQgaW1hZ2Ugc2l6ZXMgKi9cbnR5cGUgSW1hZ2VTaXplc1Jlc3VsdCA9IHtcbiAgZm9jYWxQb2ludD86IFVwbG9hZEVkaXRzWydmb2NhbFBvaW50J11cbiAgc2l6ZURhdGE6IEZpbGVTaXplc1xuICBzaXplc1RvU2F2ZTogRmlsZVRvU2F2ZVtdXG59XG5cbnR5cGUgU2FuaXRpemVkSW1hZ2VEYXRhID0ge1xuICBleHQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZSB0aGUgaW1hZ2UgbmFtZSBhbmQgZXh0cmFjdCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNvdXJjZSBpbWFnZVxuICpcbiAqIEBwYXJhbSBzb3VyY2VJbWFnZSAtIHRoZSBzb3VyY2UgaW1hZ2VcbiAqIEByZXR1cm5zIHRoZSBzYW5pdGl6ZWQgbmFtZSBhbmQgZXh0ZW5zaW9uXG4gKi9cbmNvbnN0IGdldFNhbml0aXplZEltYWdlRGF0YSA9IChzb3VyY2VJbWFnZTogc3RyaW5nKTogU2FuaXRpemVkSW1hZ2VEYXRhID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gc291cmNlSW1hZ2Uuc3BsaXQoJy4nKS5wb3AoKVxuICBjb25zdCBuYW1lID0gc2FuaXRpemUoc291cmNlSW1hZ2Uuc3Vic3RyaW5nKDAsIHNvdXJjZUltYWdlLmxhc3RJbmRleE9mKCcuJykpIHx8IHNvdXJjZUltYWdlKVxuICByZXR1cm4geyBuYW1lLCBleHQ6IGV4dGVuc2lvbiB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGltYWdlIG5hbWUgYmFzZWQgb24gdGhlIG91dHB1dCBpbWFnZSBuYW1lLCB0aGUgZGltZW5zaW9ucyBhbmRcbiAqIHRoZSBleHRlbnNpb24uXG4gKlxuICogSWdub3JlIHRoZSBmYWN0IHRoYXQgZHVwbGljYXRlIG5hbWVzIGNvdWxkIGhhcHBlbiBpZiB0aGUgdGhlcmUgaXMgb25lXG4gKiBzaXplIHdpdGggYHdpZHRoIEFORCBoZWlnaHRgIGFuZCBvbmUgd2l0aCBvbmx5IGBoZWlnaHQgT1Igd2lkdGhgLiBCZWNhdXNlXG4gKiBzcGFjZSBpcyBleHBlbnNpdmUsIHdlIHdpbGwgcmV1c2UgdGhlIHNhbWUgaW1hZ2UgZm9yIGJvdGggc2l6ZXMuXG4gKlxuICogQHBhcmFtIG91dHB1dEltYWdlTmFtZSAtIHRoZSBzYW5pdGl6ZWQgaW1hZ2UgbmFtZVxuICogQHBhcmFtIGJ1ZmZlckluZm8gLSB0aGUgYnVmZmVyIGluZm9cbiAqIEBwYXJhbSBleHRlbnNpb24gLSB0aGUgZXh0ZW5zaW9uIHRvIHVzZVxuICogQHJldHVybnMgdGhlIG5ldyBpbWFnZSBuYW1lIHRoYXQgaXMgbm90IHRha2VuXG4gKi9cblxudHlwZSBDcmVhdGVJbWFnZU5hbWVBcmdzID0ge1xuICBleHRlbnNpb246IHN0cmluZ1xuICBoZWlnaHQ6IG51bWJlclxuICBvdXRwdXRJbWFnZU5hbWU6IHN0cmluZ1xuICB3aWR0aDogbnVtYmVyXG59XG5jb25zdCBjcmVhdGVJbWFnZU5hbWUgPSAoe1xuICBleHRlbnNpb24sXG4gIGhlaWdodCxcbiAgb3V0cHV0SW1hZ2VOYW1lLFxuICB3aWR0aCxcbn06IENyZWF0ZUltYWdlTmFtZUFyZ3MpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYCR7b3V0cHV0SW1hZ2VOYW1lfS0ke3dpZHRofXgke2hlaWdodH0uJHtleHRlbnNpb259YFxufVxuXG50eXBlIENyZWF0ZVJlc3VsdEFyZ3MgPSB7XG4gIGZpbGVuYW1lPzogRmlsZVNpemVbJ2ZpbGVuYW1lJ11cbiAgZmlsZXNpemU/OiBGaWxlU2l6ZVsnZmlsZXNpemUnXVxuICBoZWlnaHQ/OiBGaWxlU2l6ZVsnaGVpZ2h0J11cbiAgbWltZVR5cGU/OiBGaWxlU2l6ZVsnbWltZVR5cGUnXVxuICBuYW1lOiBzdHJpbmdcbiAgc2l6ZXNUb1NhdmU/OiBGaWxlVG9TYXZlW11cbiAgd2lkdGg/OiBGaWxlU2l6ZVsnd2lkdGgnXVxufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgcmVzdWx0IG9iamVjdCBmb3IgdGhlIGltYWdlIHJlc2l6ZSBvcGVyYXRpb24gYmFzZWQgb24gdGhlXG4gKiBwcm92aWRlZCBwYXJhbWV0ZXJzLiBJZiB0aGUgbmFtZSBpcyBub3QgcHJvdmlkZWQsIGFuIGVtcHR5IHJlc3VsdCBvYmplY3RcbiAqIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gZmlsZW5hbWUgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gaGVpZ2h0IC0gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2VcbiAqIEBwYXJhbSBmaWxlc2l6ZSAtIHRoZSBmaWxlc2l6ZSBvZiB0aGUgaW1hZ2VcbiAqIEBwYXJhbSBtaW1lVHlwZSAtIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gc2l6ZXNUb1NhdmUgLSB0aGUgc2l6ZXMgdG8gc2F2ZVxuICogQHJldHVybnMgdGhlIHJlc3VsdCBvYmplY3RcbiAqL1xuY29uc3QgY3JlYXRlUmVzdWx0ID0gKHtcbiAgbmFtZSxcbiAgZmlsZW5hbWUgPSBudWxsLFxuICBmaWxlc2l6ZSA9IG51bGwsXG4gIGhlaWdodCA9IG51bGwsXG4gIG1pbWVUeXBlID0gbnVsbCxcbiAgc2l6ZXNUb1NhdmUgPSBbXSxcbiAgd2lkdGggPSBudWxsLFxufTogQ3JlYXRlUmVzdWx0QXJncyk6IEltYWdlU2l6ZXNSZXN1bHQgPT4ge1xuICByZXR1cm4ge1xuICAgIHNpemVEYXRhOiB7XG4gICAgICBbbmFtZV06IHtcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIGZpbGVzaXplLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIG1pbWVUeXBlLFxuICAgICAgICB3aWR0aCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzaXplc1RvU2F2ZSxcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0byByZXNpemUgdGhlIGltYWdlLlxuICogLSByZXNpemUgdXNpbmcgaW1hZ2UgY29uZmlnXG4gKiAtIHJlc2l6ZSB1c2luZyBpbWFnZSBjb25maWcgd2l0aCBmb2NhbCBhZGp1c3RtZW50c1xuICogLSBkbyBub3QgcmVzaXplIGF0IGFsbFxuICpcbiAqIGBpbWFnZVJlc2l6ZUNvbmZpZy53aXRob3V0RW5sYXJnZW1lbnRgOlxuICogLSB1bmRlZmluZWQgW2RlZmF1bHRdOiB1cGxvYWRpbmcgaW1hZ2VzIHdpdGggc21hbGxlciB3aWR0aCBBTkQgaGVpZ2h0IHRoYW4gdGhlIGltYWdlIHNpemUgd2lsbCByZXR1cm4gbnVsbFxuICogLSBmYWxzZTogYWx3YXlzIGVubGFyZ2UgaW1hZ2VzIHRvIHRoZSBpbWFnZSBzaXplXG4gKiAtIHRydWU6IGlmIHRoZSBpbWFnZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGltYWdlIHNpemUsIHJldHVybiB0aGUgb3JpZ2luYWwgaW1hZ2VcbiAqXG4gKiBgaW1hZ2VSZXNpemVDb25maWcud2l0aG91dFJlZHVjdGlvbmA6XG4gKiAtIGZhbHNlIFtkZWZhdWx0XTogYWx3YXlzIGVubGFyZ2UgaW1hZ2VzIHRvIHRoZSBpbWFnZSBzaXplXG4gKiAtIHRydWU6IGlmIHRoZSBpbWFnZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGltYWdlIHNpemUsIHJldHVybiB0aGUgb3JpZ2luYWwgaW1hZ2VcbiAqXG4gKiBAcmV0dXJuICdvbWl0JyB8ICdyZXNpemUnIHwgJ3Jlc2l6ZVdpdGhGb2NhbFBvaW50J1xuICovXG5jb25zdCBnZXRJbWFnZVJlc2l6ZUFjdGlvbiA9ICh7XG4gIGRpbWVuc2lvbnM6IG9yaWdpbmFsSW1hZ2UsXG4gIGhhc0ZvY2FsUG9pbnQsXG4gIGltYWdlUmVzaXplQ29uZmlnLFxufToge1xuICBkaW1lbnNpb25zOiBQcm9iZWRJbWFnZVNpemVcbiAgaGFzRm9jYWxQb2ludD86IGJvb2xlYW5cbiAgaW1hZ2VSZXNpemVDb25maWc6IEltYWdlU2l6ZVxufSk6ICdvbWl0JyB8ICdyZXNpemUnIHwgJ3Jlc2l6ZVdpdGhGb2NhbFBvaW50JyA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaXQsXG4gICAgaGVpZ2h0OiB0YXJnZXRIZWlnaHQsXG4gICAgd2lkdGg6IHRhcmdldFdpZHRoLFxuICAgIHdpdGhvdXRFbmxhcmdlbWVudCxcbiAgICB3aXRob3V0UmVkdWN0aW9uLFxuICB9ID0gaW1hZ2VSZXNpemVDb25maWdcblxuICAvLyBwcmV2ZW50IHVwc2NhbGluZyBieSBkZWZhdWx0IHdoZW4geCBhbmQgeSBhcmUgYm90aCBzbWFsbGVyIHRoYW4gdGFyZ2V0IGltYWdlIHNpemVcbiAgaWYgKHRhcmdldEhlaWdodCAmJiB0YXJnZXRXaWR0aCkge1xuICAgIGNvbnN0IG9yaWdpbmFsSW1hZ2VJc1NtYWxsZXJYQW5kWSA9XG4gICAgICBvcmlnaW5hbEltYWdlLndpZHRoIDwgdGFyZ2V0V2lkdGggJiYgb3JpZ2luYWxJbWFnZS5oZWlnaHQgPCB0YXJnZXRIZWlnaHRcbiAgICBpZiAod2l0aG91dEVubGFyZ2VtZW50ID09PSB1bmRlZmluZWQgJiYgb3JpZ2luYWxJbWFnZUlzU21hbGxlclhBbmRZKSB7XG4gICAgICByZXR1cm4gJ29taXQnIC8vIHByZXZlbnQgaW1hZ2Ugc2l6ZSBmcm9tIGJlaW5nIGVubGFyZ2VkXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxJbWFnZUlzU21hbGxlclhPclkgPVxuICAgIG9yaWdpbmFsSW1hZ2Uud2lkdGggPCB0YXJnZXRXaWR0aCB8fCBvcmlnaW5hbEltYWdlLmhlaWdodCA8IHRhcmdldEhlaWdodFxuICBpZiAoZml0ID09PSAnY29udGFpbicgfHwgZml0ID09PSAnaW5zaWRlJykgcmV0dXJuICdyZXNpemUnXG4gIGlmICghaXNOdW1iZXIodGFyZ2V0SGVpZ2h0KSAmJiAhaXNOdW1iZXIodGFyZ2V0V2lkdGgpKSByZXR1cm4gJ3Jlc2l6ZSdcblxuICBjb25zdCB0YXJnZXRBc3BlY3RSYXRpbyA9IHRhcmdldFdpZHRoIC8gdGFyZ2V0SGVpZ2h0XG4gIGNvbnN0IG9yaWdpbmFsQXNwZWN0UmF0aW8gPSBvcmlnaW5hbEltYWdlLndpZHRoIC8gb3JpZ2luYWxJbWFnZS5oZWlnaHRcbiAgaWYgKG9yaWdpbmFsQXNwZWN0UmF0aW8gPT09IHRhcmdldEFzcGVjdFJhdGlvKSByZXR1cm4gJ3Jlc2l6ZSdcblxuICBpZiAod2l0aG91dEVubGFyZ2VtZW50ICYmIG9yaWdpbmFsSW1hZ2VJc1NtYWxsZXJYT3JZKSByZXR1cm4gJ3Jlc2l6ZSdcbiAgaWYgKHdpdGhvdXRSZWR1Y3Rpb24gJiYgIW9yaWdpbmFsSW1hZ2VJc1NtYWxsZXJYT3JZKSByZXR1cm4gJ3Jlc2l6ZSdcblxuICByZXR1cm4gaGFzRm9jYWxQb2ludCA/ICdyZXNpemVXaXRoRm9jYWxQb2ludCcgOiAncmVzaXplJ1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbWFnZSBzaG91bGQgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHNoYXJwIHdpdGhvdXQgcGF5bG9hZCBhZGp1c3RpbmcgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gcmVzaXplQ29uZmlnIC0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGFuZCByZXNpemUgb3B0aW9uc1xuICogQHBhcmFtIG9yaWdpbmFsIC0gdGhlIG9yaWdpbmFsIGltYWdlIHNpemVcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGltYWdlIHNob3VsZCBwYXNzZWQgZGlyZWN0bHkgdG8gc2hhcnBcbiAqL1xuY29uc3QgYXBwbHlQYXlsb2FkQWRqdXN0bWVudHMgPSAoXG4gIHsgZml0LCBoZWlnaHQsIHdpZHRoLCB3aXRob3V0RW5sYXJnZW1lbnQsIHdpdGhvdXRSZWR1Y3Rpb24gfTogSW1hZ2VTaXplLFxuICBvcmlnaW5hbDogUHJvYmVkSW1hZ2VTaXplLFxuKSA9PiB7XG4gIGlmIChmaXQgPT09ICdjb250YWluJyB8fCBmaXQgPT09ICdpbnNpZGUnKSByZXR1cm4gZmFsc2VcbiAgaWYgKCFpc051bWJlcihoZWlnaHQpICYmICFpc051bWJlcih3aWR0aCkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHRhcmdldEFzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHRcbiAgY29uc3Qgb3JpZ2luYWxBc3BlY3RSYXRpbyA9IG9yaWdpbmFsLndpZHRoIC8gb3JpZ2luYWwuaGVpZ2h0XG4gIGlmIChvcmlnaW5hbEFzcGVjdFJhdGlvID09PSB0YXJnZXRBc3BlY3RSYXRpbykgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgc2tpcEVubGFyZ2VtZW50ID0gd2l0aG91dEVubGFyZ2VtZW50ICYmIChvcmlnaW5hbC5oZWlnaHQgPCBoZWlnaHQgfHwgb3JpZ2luYWwud2lkdGggPCB3aWR0aClcbiAgY29uc3Qgc2tpcFJlZHVjdGlvbiA9IHdpdGhvdXRSZWR1Y3Rpb24gJiYgKG9yaWdpbmFsLmhlaWdodCA+IGhlaWdodCB8fCBvcmlnaW5hbC53aWR0aCA+IHdpZHRoKVxuICBpZiAoc2tpcEVubGFyZ2VtZW50IHx8IHNraXBSZWR1Y3Rpb24pIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU2FuaXRpemUgdGhlIHJlc2l6ZSBjb25maWcuIElmIHRoZSByZXNpemUgY29uZmlnIGhhcyB0aGUgYHdpdGhvdXRSZWR1Y3Rpb25gXG4gKiBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZSwgdGhlIGBmaXRgIGFuZCBgcG9zaXRpb25gIHByb3BlcnRpZXMgd2lsbCBiZSBzZXQgdG8gYGNvbnRhaW5gXG4gKiBhbmQgYHRvcCBsZWZ0YCByZXNwZWN0aXZlbHkuXG4gKlxuICogQHBhcmFtIHJlc2l6ZUNvbmZpZyAtIHRoZSByZXNpemUgY29uZmlnXG4gKiBAcmV0dXJucyBhIHNhbml0aXplZCByZXNpemUgY29uZmlnXG4gKi9cbmNvbnN0IHNhbml0aXplUmVzaXplQ29uZmlnID0gKHJlc2l6ZUNvbmZpZzogSW1hZ2VTaXplKTogSW1hZ2VTaXplID0+IHtcbiAgaWYgKHJlc2l6ZUNvbmZpZy53aXRob3V0UmVkdWN0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc2l6ZUNvbmZpZyxcbiAgICAgIC8vIFdoeSBmaXQgYGNvbnRhaW5gIHNob3VsZCBhbHNvIGJlIHNldCB0byBodHRwczovL2dpdGh1Yi5jb20vbG92ZWxsL3NoYXJwL2lzc3Vlcy8zNTk1XG4gICAgICBmaXQ6IHJlc2l6ZUNvbmZpZz8uZml0IHx8ICdjb250YWluJyxcbiAgICAgIHBvc2l0aW9uOiByZXNpemVDb25maWc/LnBvc2l0aW9uIHx8ICdsZWZ0IHRvcCcsXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNpemVDb25maWdcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGV4dHJhY3QgaGVpZ2h0IGZyb20gaW1hZ2VzLCBhbmltYXRlZCBvciBub3QuXG4gKlxuICogQHBhcmFtIHNoYXJwTWV0YWRhdGEgLSB0aGUgc2hhcnAgbWV0YWRhdGFcbiAqIEByZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RIZWlnaHRGcm9tSW1hZ2Uoc2hhcnBNZXRhZGF0YTogU2hhcnBNZXRhZGF0YSk6IG51bWJlciB7XG4gIGlmIChzaGFycE1ldGFkYXRhPy5wYWdlcykge1xuICAgIHJldHVybiBzaGFycE1ldGFkYXRhLmhlaWdodCAvIHNoYXJwTWV0YWRhdGEucGFnZXNcbiAgfVxuICByZXR1cm4gc2hhcnBNZXRhZGF0YS5oZWlnaHRcbn1cblxuLyoqXG4gKiBGb3IgdGhlIHByb3ZpZGVkIGltYWdlIHNpemVzLCBoYW5kbGUgdGhlIHJlc2l6aW5nIGFuZCB0aGUgdHJhbnNmb3Jtc1xuICogKGZvcm1hdCwgdHJpbSwgZXRjLikgb2YgZWFjaCByZXF1ZXN0ZWQgaW1hZ2Ugc2l6ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2JqZWN0LlxuICogVGhpcyBvbmx5IGhhbmRsZXMgdGhlIGltYWdlIHNpemVzLiBUaGUgdHJhbnNmb3JtcyBvZiB0aGUgb3JpZ2luYWwgaW1hZ2VcbiAqIGFyZSBoYW5kbGVkIGluIHtAbGluayAuL2dlbmVyYXRlRmlsZURhdGEudHN9LlxuICpcbiAqIFRoZSBpbWFnZSB3aWxsIGJlIHJlc2l6ZWQgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZFxuICogcmVzaXplIGNvbmZpZy4gSWYgbm8gaW1hZ2Ugc2l6ZXMgYXJlIHJlcXVlc3RlZCwgdGhlIHJlc29sdmVkIGRhdGEgd2lsbCBiZSBlbXB0eS5cbiAqIEZvciBldmVyeSBpbWFnZSB0aGF0IGRvZXMgbm90IG5lZWQgdG8gYmUgcmVzaXplZCwgYSByZXN1bHQgb2JqZWN0IHdpdGggYG51bGxgXG4gKiBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHJlc2l6ZUNvbmZpZyAtIHRoZSByZXNpemUgY29uZmlnXG4gKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSByZXNpemUgb3BlcmF0aW9uKHMpXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHJlc2l6ZUFuZFRyYW5zZm9ybUltYWdlU2l6ZXMoe1xuICBjb25maWcsXG4gIGRpbWVuc2lvbnMsXG4gIGZpbGUsXG4gIG1pbWVUeXBlLFxuICByZXEsXG4gIHNhdmVkRmlsZW5hbWUsXG4gIHN0YXRpY1BhdGgsXG4gIHVwbG9hZEVkaXRzLFxufTogUmVzaXplQXJncyk6IFByb21pc2U8SW1hZ2VTaXplc1Jlc3VsdD4ge1xuICBjb25zdCB7IGZvY2FsUG9pbnQ6IGZvY2FsUG9pbnRFbmFibGVkID0gdHJ1ZSwgaW1hZ2VTaXplcyB9ID0gY29uZmlnLnVwbG9hZFxuXG4gIC8vIEZvY2FsIHBvaW50IGFkanVzdG1lbnRzXG4gIGNvbnN0IGluY29taW5nRm9jYWxQb2ludCA9IHVwbG9hZEVkaXRzPy5mb2NhbFBvaW50XG4gICAgPyB7XG4gICAgICAgIHg6IGlzTnVtYmVyKHVwbG9hZEVkaXRzLmZvY2FsUG9pbnQueCkgPyBNYXRoLnJvdW5kKHVwbG9hZEVkaXRzLmZvY2FsUG9pbnQueCkgOiA1MCxcbiAgICAgICAgeTogaXNOdW1iZXIodXBsb2FkRWRpdHMuZm9jYWxQb2ludC55KSA/IE1hdGgucm91bmQodXBsb2FkRWRpdHMuZm9jYWxQb2ludC55KSA6IDUwLFxuICAgICAgfVxuICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZGVmYXVsdFJlc3VsdDogSW1hZ2VTaXplc1Jlc3VsdCA9IHtcbiAgICAuLi4oZm9jYWxQb2ludEVuYWJsZWQgJiYgaW5jb21pbmdGb2NhbFBvaW50ICYmIHsgZm9jYWxQb2ludDogaW5jb21pbmdGb2NhbFBvaW50IH0pLFxuICAgIHNpemVEYXRhOiB7fSxcbiAgICBzaXplc1RvU2F2ZTogW10sXG4gIH1cblxuICAvLyBOb3RoaW5nIHRvIHJlc2l6ZSBoZXJlIHNvIHJldHVybiBhcyBlYXJseSBhcyBwb3NzaWJsZVxuICBpZiAoIWltYWdlU2l6ZXMpIHJldHVybiBkZWZhdWx0UmVzdWx0XG5cbiAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBmaWxlIGlzIGFuaW1hdGVkXG4gIGNvbnN0IGZpbGVJc0FuaW1hdGVkVHlwZSA9IFsnaW1hZ2UvYXZpZicsICdpbWFnZS9naWYnLCAnaW1hZ2Uvd2VicCddLmluY2x1ZGVzKGZpbGUubWltZXR5cGUpXG4gIGNvbnN0IHNoYXJwT3B0aW9uczogU2hhcnBPcHRpb25zID0ge31cblxuICBpZiAoZmlsZUlzQW5pbWF0ZWRUeXBlKSBzaGFycE9wdGlvbnMuYW5pbWF0ZWQgPSB0cnVlXG5cbiAgY29uc3Qgc2hhcnBCYXNlOiBTaGFycCB8IHVuZGVmaW5lZCA9IHNoYXJwKGZpbGUudGVtcEZpbGVQYXRoIHx8IGZpbGUuZGF0YSwgc2hhcnBPcHRpb25zKS5yb3RhdGUoKSAvLyBwYXNzIHJvdGF0ZSgpIHRvIGF1dG8tcm90YXRlIGJhc2VkIG9uIEVYSUYgZGF0YS4gaHR0cHM6Ly9naXRodWIuY29tL3BheWxvYWRjbXMvcGF5bG9hZC9wdWxsLzMwODFcbiAgY29uc3Qgb3JpZ2luYWxJbWFnZU1ldGEgPSBhd2FpdCBzaGFycEJhc2UubWV0YWRhdGEoKVxuXG4gIGNvbnN0IHJlc2l6ZUltYWdlTWV0YSA9IHtcbiAgICBoZWlnaHQ6IGV4dHJhY3RIZWlnaHRGcm9tSW1hZ2Uob3JpZ2luYWxJbWFnZU1ldGEpLFxuICAgIHdpZHRoOiBvcmlnaW5hbEltYWdlTWV0YS53aWR0aCxcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdHM6IEltYWdlU2l6ZXNSZXN1bHRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGltYWdlU2l6ZXMubWFwKGFzeW5jIChpbWFnZVJlc2l6ZUNvbmZpZyk6IFByb21pc2U8SW1hZ2VTaXplc1Jlc3VsdD4gPT4ge1xuICAgICAgaW1hZ2VSZXNpemVDb25maWcgPSBzYW5pdGl6ZVJlc2l6ZUNvbmZpZyhpbWFnZVJlc2l6ZUNvbmZpZylcblxuICAgICAgY29uc3QgcmVzaXplQWN0aW9uID0gZ2V0SW1hZ2VSZXNpemVBY3Rpb24oe1xuICAgICAgICBkaW1lbnNpb25zLFxuICAgICAgICBoYXNGb2NhbFBvaW50OiBCb29sZWFuKGluY29taW5nRm9jYWxQb2ludCksXG4gICAgICAgIGltYWdlUmVzaXplQ29uZmlnLFxuICAgICAgfSlcbiAgICAgIGlmIChyZXNpemVBY3Rpb24gPT09ICdvbWl0JykgcmV0dXJuIGNyZWF0ZVJlc3VsdCh7IG5hbWU6IGltYWdlUmVzaXplQ29uZmlnLm5hbWUgfSlcblxuICAgICAgY29uc3QgaW1hZ2VUb1Jlc2l6ZSA9IHNoYXJwQmFzZS5jbG9uZSgpXG4gICAgICBsZXQgcmVzaXplZCA9IGltYWdlVG9SZXNpemVcblxuICAgICAgaWYgKHJlc2l6ZUFjdGlvbiA9PT0gJ3Jlc2l6ZVdpdGhGb2NhbFBvaW50Jykge1xuICAgICAgICBsZXQgeyBoZWlnaHQ6IHJlc2l6ZUhlaWdodCwgd2lkdGg6IHJlc2l6ZVdpZHRoIH0gPSBpbWFnZVJlc2l6ZUNvbmZpZ1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQXNwZWN0UmF0aW8gPSBkaW1lbnNpb25zLndpZHRoIC8gZGltZW5zaW9ucy5oZWlnaHRcblxuICAgICAgICAvLyBDYWxjdWxhdGUgcmVzaXplV2lkdGggYmFzZWQgb24gb3JpZ2luYWwgYXNwZWN0IHJhdGlvIGlmIGl0J3MgdW5kZWZpbmVkXG4gICAgICAgIGlmIChyZXNpemVIZWlnaHQgJiYgIXJlc2l6ZVdpZHRoKSB7XG4gICAgICAgICAgcmVzaXplV2lkdGggPSBNYXRoLnJvdW5kKHJlc2l6ZUhlaWdodCAqIG9yaWdpbmFsQXNwZWN0UmF0aW8pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgcmVzaXplSGVpZ2h0IGJhc2VkIG9uIG9yaWdpbmFsIGFzcGVjdCByYXRpbyBpZiBpdCdzIHVuZGVmaW5lZFxuICAgICAgICBpZiAocmVzaXplV2lkdGggJiYgIXJlc2l6ZUhlaWdodCkge1xuICAgICAgICAgIHJlc2l6ZUhlaWdodCA9IE1hdGgucm91bmQocmVzaXplV2lkdGggLyBvcmlnaW5hbEFzcGVjdFJhdGlvKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNpemVIZWlnaHQpIHJlc2l6ZUhlaWdodCA9IHJlc2l6ZUltYWdlTWV0YS5oZWlnaHRcbiAgICAgICAgaWYgKCFyZXNpemVXaWR0aCkgcmVzaXplV2lkdGggPSByZXNpemVJbWFnZU1ldGEud2lkdGhcblxuICAgICAgICBjb25zdCByZXNpemVBc3BlY3RSYXRpbyA9IHJlc2l6ZVdpZHRoIC8gcmVzaXplSGVpZ2h0XG4gICAgICAgIGNvbnN0IHByaW9yaXRpemVIZWlnaHQgPSByZXNpemVBc3BlY3RSYXRpbyA8IG9yaWdpbmFsQXNwZWN0UmF0aW9cbiAgICAgICAgLy8gU2NhbGVzIHRoZSBpbWFnZSBiZWZvcmUgZXh0cmFjdGluZyBmcm9tIGl0XG4gICAgICAgIHJlc2l6ZWQgPSBpbWFnZVRvUmVzaXplLnJlc2l6ZSh7XG4gICAgICAgICAgaGVpZ2h0OiBwcmlvcml0aXplSGVpZ2h0ID8gcmVzaXplSGVpZ2h0IDogdW5kZWZpbmVkLFxuICAgICAgICAgIHdpZHRoOiBwcmlvcml0aXplSGVpZ2h0ID8gdW5kZWZpbmVkIDogcmVzaXplV2lkdGgsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gbXVzdCByZWFkIGZyb20gYnVmZmVyLCByZXNpemUubWV0YWRhdGEgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIGltYWdlIG1ldGFkYXRhXG4gICAgICAgIGNvbnN0IHsgaW5mbyB9ID0gYXdhaXQgcmVzaXplZC50b0J1ZmZlcih7IHJlc29sdmVXaXRoT2JqZWN0OiB0cnVlIH0pXG4gICAgICAgIHJlc2l6ZUltYWdlTWV0YS5oZWlnaHQgPSBleHRyYWN0SGVpZ2h0RnJvbUltYWdlKHtcbiAgICAgICAgICAuLi5vcmlnaW5hbEltYWdlTWV0YSxcbiAgICAgICAgICBoZWlnaHQ6IGluZm8uaGVpZ2h0LFxuICAgICAgICB9KVxuICAgICAgICByZXNpemVJbWFnZU1ldGEud2lkdGggPSBpbmZvLndpZHRoXG5cbiAgICAgICAgY29uc3QgaGFsZlJlc2l6ZVggPSByZXNpemVXaWR0aCAvIDJcbiAgICAgICAgY29uc3QgeEZvY2FsQ2VudGVyID0gcmVzaXplSW1hZ2VNZXRhLndpZHRoICogKGluY29taW5nRm9jYWxQb2ludC54IC8gMTAwKVxuICAgICAgICBjb25zdCBjYWxjdWxhdGVkUmlnaHRQaXhlbEJvdW5kID0geEZvY2FsQ2VudGVyICsgaGFsZlJlc2l6ZVhcbiAgICAgICAgbGV0IGxlZnRCb3VuZCA9IHhGb2NhbENlbnRlciAtIGhhbGZSZXNpemVYXG5cbiAgICAgICAgLy8gaWYgdGhlIHJpZ2h0IGJvdW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW1hZ2Ugd2lkdGgsIGFkanVzdCB0aGUgbGVmdCBib3VuZFxuICAgICAgICAvLyBrZWVwaW5nIGZvY3VzIG9uIHRoZSByaWdodFxuICAgICAgICBpZiAoY2FsY3VsYXRlZFJpZ2h0UGl4ZWxCb3VuZCA+IHJlc2l6ZUltYWdlTWV0YS53aWR0aCkge1xuICAgICAgICAgIGxlZnRCb3VuZCA9IHJlc2l6ZUltYWdlTWV0YS53aWR0aCAtIHJlc2l6ZVdpZHRoXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGUgbGVmdCBib3VuZCBpcyBsZXNzIHRoYW4gMCwgYWRqdXN0IHRoZSBsZWZ0IGJvdW5kIHRvIDBcbiAgICAgICAgLy8ga2VlcGluZyB0aGUgZm9jdXMgb24gdGhlIGxlZnRcbiAgICAgICAgaWYgKGxlZnRCb3VuZCA8IDApIGxlZnRCb3VuZCA9IDBcblxuICAgICAgICBjb25zdCBoYWxmUmVzaXplWSA9IHJlc2l6ZUhlaWdodCAvIDJcbiAgICAgICAgY29uc3QgeUZvY2FsQ2VudGVyID0gcmVzaXplSW1hZ2VNZXRhLmhlaWdodCAqIChpbmNvbWluZ0ZvY2FsUG9pbnQueSAvIDEwMClcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZEJvdHRvbVBpeGVsQm91bmQgPSB5Rm9jYWxDZW50ZXIgKyBoYWxmUmVzaXplWVxuICAgICAgICBsZXQgdG9wQm91bmQgPSB5Rm9jYWxDZW50ZXIgLSBoYWxmUmVzaXplWVxuXG4gICAgICAgIC8vIGlmIHRoZSBib3R0b20gYm91bmQgaXMgZ3JlYXRlciB0aGFuIHRoZSBpbWFnZSBoZWlnaHQsIGFkanVzdCB0aGUgdG9wIGJvdW5kXG4gICAgICAgIC8vIGtlZXBpbmcgdGhlIGltYWdlIGFzIGZhciByaWdodCBhcyBwb3NzaWJsZVxuICAgICAgICBpZiAoY2FsY3VsYXRlZEJvdHRvbVBpeGVsQm91bmQgPiByZXNpemVJbWFnZU1ldGEuaGVpZ2h0KSB7XG4gICAgICAgICAgdG9wQm91bmQgPSByZXNpemVJbWFnZU1ldGEuaGVpZ2h0IC0gcmVzaXplSGVpZ2h0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGUgdG9wIGJvdW5kIGlzIGxlc3MgdGhhbiAwLCBhZGp1c3QgdGhlIHRvcCBib3VuZCB0byAwXG4gICAgICAgIC8vIGtlZXBpbmcgdGhlIGltYWdlIGZvY3VzIG5lYXIgdGhlIHRvcFxuICAgICAgICBpZiAodG9wQm91bmQgPCAwKSB0b3BCb3VuZCA9IDBcblxuICAgICAgICByZXNpemVkID0gcmVzaXplZC5leHRyYWN0KHtcbiAgICAgICAgICBoZWlnaHQ6IHJlc2l6ZUhlaWdodCxcbiAgICAgICAgICBsZWZ0OiBNYXRoLmZsb29yKGxlZnRCb3VuZCksXG4gICAgICAgICAgdG9wOiBNYXRoLmZsb29yKHRvcEJvdW5kKSxcbiAgICAgICAgICB3aWR0aDogcmVzaXplV2lkdGgsXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNpemVkID0gaW1hZ2VUb1Jlc2l6ZS5yZXNpemUoaW1hZ2VSZXNpemVDb25maWcpXG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZVJlc2l6ZUNvbmZpZy5mb3JtYXRPcHRpb25zKSB7XG4gICAgICAgIHJlc2l6ZWQgPSByZXNpemVkLnRvRm9ybWF0KFxuICAgICAgICAgIGltYWdlUmVzaXplQ29uZmlnLmZvcm1hdE9wdGlvbnMuZm9ybWF0LFxuICAgICAgICAgIGltYWdlUmVzaXplQ29uZmlnLmZvcm1hdE9wdGlvbnMub3B0aW9ucyxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoaW1hZ2VSZXNpemVDb25maWcudHJpbU9wdGlvbnMpIHtcbiAgICAgICAgcmVzaXplZCA9IHJlc2l6ZWQudHJpbShpbWFnZVJlc2l6ZUNvbmZpZy50cmltT3B0aW9ucylcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkYXRhOiBidWZmZXJEYXRhLCBpbmZvOiBidWZmZXJJbmZvIH0gPSBhd2FpdCByZXNpemVkLnRvQnVmZmVyKHtcbiAgICAgICAgcmVzb2x2ZVdpdGhPYmplY3Q6IHRydWUsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbWFnZSA9IGdldFNhbml0aXplZEltYWdlRGF0YShzYXZlZEZpbGVuYW1lKVxuXG4gICAgICBpZiAocmVxLnBheWxvYWRVcGxvYWRTaXplcykge1xuICAgICAgICByZXEucGF5bG9hZFVwbG9hZFNpemVzW2ltYWdlUmVzaXplQ29uZmlnLm5hbWVdID0gYnVmZmVyRGF0YVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtaW1lSW5mbyA9IGF3YWl0IGZyb21CdWZmZXIoYnVmZmVyRGF0YSlcblxuICAgICAgY29uc3QgaW1hZ2VOYW1lV2l0aERpbWVuc2lvbnMgPSBjcmVhdGVJbWFnZU5hbWUoe1xuICAgICAgICBleHRlbnNpb246IG1pbWVJbmZvPy5leHQgfHwgc2FuaXRpemVkSW1hZ2UuZXh0LFxuICAgICAgICBoZWlnaHQ6IGV4dHJhY3RIZWlnaHRGcm9tSW1hZ2Uoe1xuICAgICAgICAgIC4uLm9yaWdpbmFsSW1hZ2VNZXRhLFxuICAgICAgICAgIGhlaWdodDogYnVmZmVySW5mby5oZWlnaHQsXG4gICAgICAgIH0pLFxuICAgICAgICBvdXRwdXRJbWFnZU5hbWU6IHNhbml0aXplZEltYWdlLm5hbWUsXG4gICAgICAgIHdpZHRoOiBidWZmZXJJbmZvLndpZHRoLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgaW1hZ2VQYXRoID0gYCR7c3RhdGljUGF0aH0vJHtpbWFnZU5hbWVXaXRoRGltZW5zaW9uc31gXG5cbiAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKGltYWdlUGF0aCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKGltYWdlUGF0aClcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIHVubGluayBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGhlaWdodCwgc2l6ZSwgd2lkdGggfSA9IGJ1ZmZlckluZm9cbiAgICAgIHJldHVybiBjcmVhdGVSZXN1bHQoe1xuICAgICAgICBuYW1lOiBpbWFnZVJlc2l6ZUNvbmZpZy5uYW1lLFxuICAgICAgICBmaWxlbmFtZTogaW1hZ2VOYW1lV2l0aERpbWVuc2lvbnMsXG4gICAgICAgIGZpbGVzaXplOiBzaXplLFxuICAgICAgICBoZWlnaHQ6XG4gICAgICAgICAgZmlsZUlzQW5pbWF0ZWRUeXBlICYmIG9yaWdpbmFsSW1hZ2VNZXRhLnBhZ2VzID8gaGVpZ2h0IC8gb3JpZ2luYWxJbWFnZU1ldGEucGFnZXMgOiBoZWlnaHQsXG4gICAgICAgIG1pbWVUeXBlOiBtaW1lSW5mbz8ubWltZSB8fCBtaW1lVHlwZSxcbiAgICAgICAgc2l6ZXNUb1NhdmU6IFt7IGJ1ZmZlcjogYnVmZmVyRGF0YSwgcGF0aDogaW1hZ2VQYXRoIH1dLFxuICAgICAgICB3aWR0aCxcbiAgICAgIH0pXG4gICAgfSksXG4gIClcblxuICByZXR1cm4gcmVzdWx0cy5yZWR1Y2UoXG4gICAgKGFjYywgcmVzdWx0KSA9PiB7XG4gICAgICBPYmplY3QuYXNzaWduKGFjYy5zaXplRGF0YSwgcmVzdWx0LnNpemVEYXRhKVxuICAgICAgYWNjLnNpemVzVG9TYXZlLnB1c2goLi4ucmVzdWx0LnNpemVzVG9TYXZlKVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sXG4gICAgeyAuLi5kZWZhdWx0UmVzdWx0IH0sXG4gIClcbn1cbiJdLCJuYW1lcyI6WyJyZXNpemVBbmRUcmFuc2Zvcm1JbWFnZVNpemVzIiwiZ2V0U2FuaXRpemVkSW1hZ2VEYXRhIiwic291cmNlSW1hZ2UiLCJleHRlbnNpb24iLCJzcGxpdCIsInBvcCIsIm5hbWUiLCJzYW5pdGl6ZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiZXh0IiwiY3JlYXRlSW1hZ2VOYW1lIiwiaGVpZ2h0Iiwib3V0cHV0SW1hZ2VOYW1lIiwid2lkdGgiLCJjcmVhdGVSZXN1bHQiLCJmaWxlbmFtZSIsImZpbGVzaXplIiwibWltZVR5cGUiLCJzaXplc1RvU2F2ZSIsInNpemVEYXRhIiwiZ2V0SW1hZ2VSZXNpemVBY3Rpb24iLCJkaW1lbnNpb25zIiwib3JpZ2luYWxJbWFnZSIsImhhc0ZvY2FsUG9pbnQiLCJpbWFnZVJlc2l6ZUNvbmZpZyIsImZpdCIsInRhcmdldEhlaWdodCIsInRhcmdldFdpZHRoIiwid2l0aG91dEVubGFyZ2VtZW50Iiwid2l0aG91dFJlZHVjdGlvbiIsIm9yaWdpbmFsSW1hZ2VJc1NtYWxsZXJYQW5kWSIsInVuZGVmaW5lZCIsIm9yaWdpbmFsSW1hZ2VJc1NtYWxsZXJYT3JZIiwiaXNOdW1iZXIiLCJ0YXJnZXRBc3BlY3RSYXRpbyIsIm9yaWdpbmFsQXNwZWN0UmF0aW8iLCJhcHBseVBheWxvYWRBZGp1c3RtZW50cyIsIm9yaWdpbmFsIiwic2tpcEVubGFyZ2VtZW50Iiwic2tpcFJlZHVjdGlvbiIsInNhbml0aXplUmVzaXplQ29uZmlnIiwicmVzaXplQ29uZmlnIiwicG9zaXRpb24iLCJleHRyYWN0SGVpZ2h0RnJvbUltYWdlIiwic2hhcnBNZXRhZGF0YSIsInBhZ2VzIiwiY29uZmlnIiwiZmlsZSIsInJlcSIsInNhdmVkRmlsZW5hbWUiLCJzdGF0aWNQYXRoIiwidXBsb2FkRWRpdHMiLCJmb2NhbFBvaW50IiwiZm9jYWxQb2ludEVuYWJsZWQiLCJpbWFnZVNpemVzIiwidXBsb2FkIiwiaW5jb21pbmdGb2NhbFBvaW50IiwieCIsIk1hdGgiLCJyb3VuZCIsInkiLCJkZWZhdWx0UmVzdWx0IiwiZmlsZUlzQW5pbWF0ZWRUeXBlIiwiaW5jbHVkZXMiLCJtaW1ldHlwZSIsInNoYXJwT3B0aW9ucyIsImFuaW1hdGVkIiwic2hhcnBCYXNlIiwic2hhcnAiLCJ0ZW1wRmlsZVBhdGgiLCJkYXRhIiwicm90YXRlIiwib3JpZ2luYWxJbWFnZU1ldGEiLCJtZXRhZGF0YSIsInJlc2l6ZUltYWdlTWV0YSIsInJlc3VsdHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicmVzaXplQWN0aW9uIiwiQm9vbGVhbiIsImltYWdlVG9SZXNpemUiLCJjbG9uZSIsInJlc2l6ZWQiLCJyZXNpemVIZWlnaHQiLCJyZXNpemVXaWR0aCIsInJlc2l6ZUFzcGVjdFJhdGlvIiwicHJpb3JpdGl6ZUhlaWdodCIsInJlc2l6ZSIsImluZm8iLCJ0b0J1ZmZlciIsInJlc29sdmVXaXRoT2JqZWN0IiwiaGFsZlJlc2l6ZVgiLCJ4Rm9jYWxDZW50ZXIiLCJjYWxjdWxhdGVkUmlnaHRQaXhlbEJvdW5kIiwibGVmdEJvdW5kIiwiaGFsZlJlc2l6ZVkiLCJ5Rm9jYWxDZW50ZXIiLCJjYWxjdWxhdGVkQm90dG9tUGl4ZWxCb3VuZCIsInRvcEJvdW5kIiwiZXh0cmFjdCIsImxlZnQiLCJmbG9vciIsInRvcCIsImZvcm1hdE9wdGlvbnMiLCJ0b0Zvcm1hdCIsImZvcm1hdCIsIm9wdGlvbnMiLCJ0cmltT3B0aW9ucyIsInRyaW0iLCJidWZmZXJEYXRhIiwiYnVmZmVySW5mbyIsInNhbml0aXplZEltYWdlIiwicGF5bG9hZFVwbG9hZFNpemVzIiwibWltZUluZm8iLCJmcm9tQnVmZmVyIiwiaW1hZ2VOYW1lV2l0aERpbWVuc2lvbnMiLCJpbWFnZVBhdGgiLCJmaWxlRXhpc3RzIiwiZnMiLCJ1bmxpbmtTeW5jIiwic2l6ZSIsIm1pbWUiLCJidWZmZXIiLCJwYXRoIiwicmVkdWNlIiwiYWNjIiwicmVzdWx0IiwiT2JqZWN0IiwiYXNzaWduIiwicHVzaCJdLCJyYW5nZU1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IiwibWFwcGluZ3MiOiI7Ozs7K0JBeVBBOzs7Ozs7Ozs7Ozs7O0NBYUMsR0FDRDs7O2VBQThCQTs7OzBCQXBRSDsyREFDWjt5RUFDTTs4REFDSDswQkFhTzttRUFDRjs7Ozs7O0FBeUJ2Qjs7Ozs7Q0FLQyxHQUNELE1BQU1DLHdCQUF3QixDQUFDQztJQUM3QixNQUFNQyxZQUFZRCxZQUFZRSxLQUFLLENBQUMsS0FBS0MsR0FBRztJQUM1QyxNQUFNQyxPQUFPQyxJQUFBQSx5QkFBUSxFQUFDTCxZQUFZTSxTQUFTLENBQUMsR0FBR04sWUFBWU8sV0FBVyxD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
@@ -114,16 +114,22 @@ export type FileToSave = {
114
114
  buffer: Buffer;
115
115
  path: string;
116
116
  };
117
+ type Crop = {
118
+ height: number;
119
+ unit: '%' | 'px';
120
+ width: number;
121
+ x: number;
122
+ y: number;
123
+ };
124
+ type FocalPoint = {
125
+ x: number;
126
+ y: number;
127
+ };
117
128
  export type UploadEdits = {
118
- crop?: {
119
- height?: number;
120
- width?: number;
121
- x?: number;
122
- y?: number;
123
- };
124
- focalPoint?: {
125
- x?: number;
126
- y?: number;
127
- };
129
+ crop?: Crop;
130
+ focalPoint?: FocalPoint;
131
+ heightInPixels?: number;
132
+ widthInPixels?: number;
128
133
  };
134
+ export {};
129
135
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/uploads/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/uploads/types.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,KAAK,WAAW,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAEjD,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,OAAO,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CAC3C,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEjE,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,GAAG;IAClE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,wBAAwB,CAAA;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,sBAAsB,CAAA;IACpC;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAA;CACzD,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KAAK,KAAK,GAAG,IAAI,GAAG,MAAM,CAAA;AAEjG,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAA;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtF,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6FAA6F;IAC7F,aAAa,CAAC,EAAE,wBAAwB,CAAA;IACxC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAA;IAChB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAA;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,wBAAwB,CAAA;IACxC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAA;IAChB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1F,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,GAAG,GAAG,IAAI,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "2.24.0",
3
+ "version": "2.24.1",
4
4
  "description": "Node, React and MongoDB Headless CMS and Application Framework",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
package/types.d.ts CHANGED
@@ -5,7 +5,7 @@ export type { CellComponentProps } from './dist/admin/components/views/collectio
5
5
  export { FileData, ImageSize, IncomingUploadType } from './dist/uploads/types';
6
6
  export type { CustomPublishButtonProps, CustomPublishButtonType, CustomSaveButtonProps, CustomSaveDraftButtonProps, } from './dist/admin/components/elements/types';
7
7
  export type { RowLabel } from './dist/admin/components/forms/RowLabel/types';
8
- export type { AfterChangeHook as CollectionAfterChangeHook, AfterDeleteHook as CollectionAfterDeleteHook, AfterForgotPasswordHook as CollectionAfterForgotPasswordHook, AfterLoginHook as CollectionAfterLoginHook, AfterOperationHook as CollectionAfterOperationHook, AfterReadHook as CollectionAfterReadHook, BeforeChangeHook as CollectionBeforeChangeHook, BeforeDeleteHook as CollectionBeforeDeleteHook, BeforeDuplicate, BeforeLoginHook as CollectionBeforeLoginHook, BeforeOperationHook as CollectionBeforeOperationHook, BeforeReadHook as CollectionBeforeReadHook, BeforeValidateHook as CollectionBeforeValidateHook, Collection, CollectionConfig, MeHook as CollectionMeHook, RefreshHook as CollectionRefreshHook, SanitizedCollectionConfig, TypeWithID, } from './dist/collections/config/types';
8
+ export type { AfterChangeHook as CollectionAfterChangeHook, AfterDeleteHook as CollectionAfterDeleteHook, AfterForgotPasswordHook as CollectionAfterForgotPasswordHook, AfterLoginHook as CollectionAfterLoginHook, AfterLogoutHook, AfterLogoutHook as CollectionAfterLogoutHook, AfterMeHook, AfterMeHook as CollectionAfterMeHook, AfterOperationHook as CollectionAfterOperationHook, AfterReadHook as CollectionAfterReadHook, AfterRefreshHook, AfterRefreshHook as CollectionAfterRefreshHook, BeforeChangeHook as CollectionBeforeChangeHook, BeforeDeleteHook as CollectionBeforeDeleteHook, BeforeDuplicate, BeforeLoginHook as CollectionBeforeLoginHook, BeforeOperationHook as CollectionBeforeOperationHook, BeforeReadHook as CollectionBeforeReadHook, BeforeValidateHook as CollectionBeforeValidateHook, Collection, CollectionConfig, MeHook as CollectionMeHook, RefreshHook as CollectionRefreshHook, SanitizedCollectionConfig, TypeWithID, } from './dist/collections/config/types';
9
9
  export type { Access, AccessArgs } from './dist/config/types';
10
10
  export type { ArrayField, Block, BlockField, CheckboxField, CodeField, CollapsibleField, Condition, DateField, EmailField, Field, FieldAccess, FieldAffectingData, FieldBase, FieldHook, FieldHookArgs, FieldPresentationalOnly, FieldWithMany, FieldWithMaxDepth, FieldWithPath, FieldWithSubFields, FilterOptions, FilterOptionsProps, GroupField, HookName, JSONField, Labels, NamedTab, NonPresentationalField, NumberField, Option, OptionObject, PointField, PolymorphicRelationshipField, RadioField, RelationshipField, RelationshipValue, RichTextField, RowAdmin, RowField, SelectField, SingleRelationshipField, Tab, TabAsField, TabsAdmin, TabsField, TextField, TextareaField, UIField, UnnamedTab, UploadField, Validate, ValidateOptions, ValueWithRelation, } from './dist/fields/config/types';
11
11
  export { fieldAffectsData, fieldHasMaxDepth, fieldHasSubFields, fieldIsArrayType, fieldIsBlockType, fieldIsGroupType, fieldIsLocalized, fieldIsPresentationalOnly, fieldSupportsMany, optionIsObject, optionIsValue, optionsAreObjects, tabHasName, valueIsValueWithRelation, } from './dist/fields/config/types';
package/types.js CHANGED
@@ -82,4 +82,4 @@ function _export_star(from, to) {
82
82
  return from;
83
83
  }
84
84
 
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHBvcnRzL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vLi4vdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgQ3JlYXRlRm9ybURhdGEsXG4gIERhdGEsXG4gIEZpZWxkcyxcbiAgRm9ybUZpZWxkLFxuICBGb3JtRmllbGRzQ29udGV4dCxcbn0gZnJvbSAnLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Gb3JtL3R5cGVzJ1xuXG5leHBvcnQgdHlwZSB7XG4gIFJpY2hUZXh0QWRhcHRlcixcbiAgUmljaFRleHRGaWVsZFByb3BzLFxufSBmcm9tICcuLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL1JpY2hUZXh0L3R5cGVzJ1xuXG5leHBvcnQgdHlwZSB7IENlbGxDb21wb25lbnRQcm9wcyB9IGZyb20gJy4uL2FkbWluL2NvbXBvbmVudHMvdmlld3MvY29sbGVjdGlvbnMvTGlzdC9DZWxsL3R5cGVzJ1xuXG5leHBvcnQgeyBGaWxlRGF0YSwgSW1hZ2VTaXplLCBJbmNvbWluZ1VwbG9hZFR5cGUgfSBmcm9tICcuLi91cGxvYWRzL3R5cGVzJ1xuXG5leHBvcnQgdHlwZSB7XG4gIEN1c3RvbVB1Ymxpc2hCdXR0b25Qcm9wcyxcbiAgQ3VzdG9tUHVibGlzaEJ1dHRvblR5cGUsXG4gIEN1c3RvbVNhdmVCdXR0b25Qcm9wcyxcbiAgQ3VzdG9tU2F2ZURyYWZ0QnV0dG9uUHJvcHMsXG59IGZyb20gJy4vLi4vYWRtaW4vY29tcG9uZW50cy9lbGVtZW50cy90eXBlcydcblxuZXhwb3J0IHR5cGUgeyBSb3dMYWJlbCB9IGZyb20gJy4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Sb3dMYWJlbC90eXBlcydcblxuZXhwb3J0IHR5cGUge1xuICBBZnRlckNoYW5nZUhvb2sgYXMgQ29sbGVjdGlvbkFmdGVyQ2hhbmdlSG9vayxcbiAgQWZ0ZXJEZWxldGVIb29rIGFzIENvbGxlY3Rpb25BZnRlckRlbGV0ZUhvb2ssXG4gIEFmdGVyRm9yZ290UGFzc3dvcmRIb29rIGFzIENvbGxlY3Rpb25BZnRlckZvcmdvdFBhc3N3b3JkSG9vayxcbiAgQWZ0ZXJMb2dpbkhvb2sgYXMgQ29sbGVjdGlvbkFmdGVyTG9naW5Ib29rLFxuICBBZnRlck9wZXJhdGlvbkhvb2sgYXMgQ29sbGVjdGlvbkFmdGVyT3BlcmF0aW9uSG9vayxcbiAgQWZ0ZXJSZWFkSG9vayBhcyBDb2xsZWN0aW9uQWZ0ZXJSZWFkSG9vayxcbiAgQmVmb3JlQ2hhbmdlSG9vayBhcyBDb2xsZWN0aW9uQmVmb3JlQ2hhbmdlSG9vayxcbiAgQmVmb3JlRGVsZXRlSG9vayBhcyBDb2xsZWN0aW9uQmVmb3JlRGVsZXRlSG9vayxcbiAgQmVmb3JlRHVwbGljYXRlLFxuICBCZWZvcmVMb2dpbkhvb2sgYXMgQ29sbGVjdGlvbkJlZm9yZUxvZ2luSG9vayxcbiAgQmVmb3JlT3BlcmF0aW9uSG9vayBhcyBDb2xsZWN0aW9uQmVmb3JlT3BlcmF0aW9uSG9vayxcbiAgQmVmb3JlUmVhZEhvb2sgYXMgQ29sbGVjdGlvbkJlZm9yZVJlYWRIb29rLFxuICBCZWZvcmVWYWxpZGF0ZUhvb2sgYXMgQ29sbGVjdGlvbkJlZm9yZVZhbGlkYXRlSG9vayxcbiAgQ29sbGVjdGlvbixcbiAgQ29sbGVjdGlvbkNvbmZpZyxcbiAgTWVIb29rIGFzIENvbGxlY3Rpb25NZUhvb2ssXG4gIFJlZnJlc2hIb29rIGFzIENvbGxlY3Rpb25SZWZyZXNoSG9vayxcbiAgU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyxcbiAgVHlwZVdpdGhJRCxcbn0gZnJvbSAnLi8uLi9jb2xsZWN0aW9ucy9jb25maWcvdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHsgQWNjZXNzLCBBY2Nlc3NBcmdzIH0gZnJvbSAnLi8uLi9jb25maWcvdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgQXJyYXlGaWVsZCxcbiAgQmxvY2ssXG4gIEJsb2NrRmllbGQsXG4gIENoZWNrYm94RmllbGQsXG4gIENvZGVGaWVsZCxcbiAgQ29sbGFwc2libGVGaWVsZCxcbiAgQ29uZGl0aW9uLFxuICBEYXRlRmllbGQsXG4gIEVtYWlsRmllbGQsXG4gIEZpZWxkLFxuICBGaWVsZEFjY2VzcyxcbiAgRmllbGRBZmZlY3RpbmdEYXRhLFxuICBGaWVsZEJhc2UsXG4gIEZpZWxkSG9vayxcbiAgRmllbGRIb29rQXJncyxcbiAgRmllbGRQcmVzZW50YXRpb25hbE9ubHksXG4gIEZpZWxkV2l0aE1hbnksXG4gIEZpZWxkV2l0aE1heERlcHRoLFxuICBGaWVsZFdpdGhQYXRoLFxuICBGaWVsZFdpdGhTdWJGaWVsZHMsXG4gIEZpbHRlck9wdGlvbnMsXG4gIEZpbHRlck9wdGlvbnNQcm9wcyxcbiAgR3JvdXBGaWVsZCxcbiAgSG9va05hbWUsXG4gIEpTT05GaWVsZCxcbiAgTGFiZWxzLFxuICBOYW1lZFRhYixcbiAgTm9uUHJlc2VudGF0aW9uYWxGaWVsZCxcbiAgTnVtYmVyRmllbGQsXG4gIE9wdGlvbixcbiAgT3B0aW9uT2JqZWN0LFxuICBQb2ludEZpZWxkLFxuICBQb2x5bW9ycGhpY1JlbGF0aW9uc2hpcEZpZWxkLFxuICBSYWRpb0ZpZWxkLFxuICBSZWxhdGlvbnNoaXBGaWVsZCxcbiAgUmVsYXRpb25zaGlwVmFsdWUsXG4gIFJpY2hUZXh0RmllbGQsXG4gIFJvd0FkbWluLFxuICBSb3dGaWVsZCxcbiAgU2VsZWN0RmllbGQsXG4gIFNpbmdsZVJlbGF0aW9uc2hpcEZpZWxkLFxuICBUYWIsXG4gIFRhYkFzRmllbGQsXG4gIFRhYnNBZG1pbixcbiAgVGFic0ZpZWxkLFxuICBUZXh0RmllbGQsXG4gIFRleHRhcmVhRmllbGQsXG4gIFVJRmllbGQsXG4gIFVubmFtZWRUYWIsXG4gIFVwbG9hZEZpZWxkLFxuICBWYWxpZGF0ZSxcbiAgVmFsaWRhdGVPcHRpb25zLFxuICBWYWx1ZVdpdGhSZWxhdGlvbixcbn0gZnJvbSAnLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuXG5leHBvcnQge1xuICBmaWVsZEFmZmVjdHNEYXRhLFxuICBmaWVsZEhhc01heERlcHRoLFxuICBmaWVsZEhhc1N1YkZpZWxkcyxcbiAgZmllbGRJc0FycmF5VHlwZSxcbiAgZmllbGRJc0Jsb2NrVHlwZSxcbiAgZmllbGRJc0dyb3VwVHlwZSxcbiAgZmllbGRJc0xvY2FsaXplZCxcbiAgZmllbGRJc1ByZXNlbnRhdGlvbmFsT25seSxcbiAgZmllbGRTdXBwb3J0c01hbnksXG4gIG9wdGlvbklzT2JqZWN0LFxuICBvcHRpb25Jc1ZhbHVlLFxuICBvcHRpb25zQXJlT2JqZWN0cyxcbiAgdGFiSGFzTmFtZSxcbiAgdmFsdWVJc1ZhbHVlV2l0aFJlbGF0aW9uLFxufSBmcm9tICcuLy4uL2ZpZWxkcy9jb25maWcvdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgQWZ0ZXJDaGFuZ2VIb29rIGFzIEdsb2JhbEFmdGVyQ2hhbmdlSG9vayxcbiAgQWZ0ZXJSZWFkSG9vayBhcyBHbG9iYWxBZnRlclJlYWRIb29rLFxuICBCZWZvcmVDaGFuZ2VIb29rIGFzIEdsb2JhbEJlZm9yZUNoYW5nZUhvb2ssXG4gIEJlZm9yZVJlYWRIb29rIGFzIEdsb2JhbEJlZm9yZVJlYWRIb29rLFxuICBCZWZvcmVWYWxpZGF0ZUhvb2sgYXMgR2xvYmFsQmVmb3JlVmFsaWRhdGVIb29rLFxuICBHbG9iYWxDb25maWcsXG4gIFNhbml0aXplZEdsb2JhbENvbmZpZyxcbn0gZnJvbSAnLi8uLi9nbG9iYWxzL2NvbmZpZy90eXBlcydcblxuZXhwb3J0IHsgdmFsaWRPcGVyYXRvcnMgfSBmcm9tICcuLy4uL3R5cGVzL2NvbnN0YW50cydcbiJdLCJuYW1lcyI6WyJGaWxlRGF0YSIsIkltYWdlU2l6ZSIsIkluY29taW5nVXBsb2FkVHlwZSIsImZpZWxkQWZmZWN0c0RhdGEiLCJmaWVsZEhhc01heERlcHRoIiwiZmllbGRIYXNTdWJGaWVsZHMiLCJmaWVsZElzQXJyYXlUeXBlIiwiZmllbGRJc0Jsb2NrVHlwZSIsImZpZWxkSXNHcm91cFR5cGUiLCJmaWVsZElzTG9jYWxpemVkIiwiZmllbGRJc1ByZXNlbnRhdGlvbmFsT25seSIsImZpZWxkU3VwcG9ydHNNYW55Iiwib3B0aW9uSXNPYmplY3QiLCJvcHRpb25Jc1ZhbHVlIiwib3B0aW9uc0FyZU9iamVjdHMiLCJ0YWJIYXNOYW1lIiwidmFsaWRPcGVyYXRvcnMiLCJ2YWx1ZUlzVmFsdWVXaXRoUmVsYXRpb24iXSwicmFuZ2VNYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQWlCU0EsUUFBUTtlQUFSQSxlQUFROztJQUFFQyxTQUFTO2VBQVRBLGdCQUFTOztJQUFFQyxrQkFBa0I7ZUFBbEJBLHlCQUFrQjs7SUE0RjlDQyxnQkFBZ0I7ZUFBaEJBLHdCQUFnQjs7SUFDaEJDLGdCQUFnQjtlQUFoQkEsd0JBQWdCOztJQUNoQkMsaUJBQWlCO2VBQWpCQSx5QkFBaUI7O0lBQ2pCQyxnQkFBZ0I7ZUFBaEJBLHdCQUFnQjs7SUFDaEJDLGdCQUFnQjtlQUFoQkEsd0JBQWdCOztJQUNoQkMsZ0JBQWdCO2VBQWhCQSx3QkFBZ0I7O0lBQ2hCQyxnQkFBZ0I7ZUFBaEJBLHdCQUFnQjs7SUFDaEJDLHlCQUF5QjtlQUF6QkEsaUNBQXlCOztJQUN6QkMsaUJBQWlCO2VBQWpCQSx5QkFBaUI7O0lBQ2pCQyxjQUFjO2VBQWRBLHNCQUFjOztJQUNkQyxhQUFhO2VBQWJBLHFCQUFhOztJQUNiQyxpQkFBaUI7ZUFBakJBLHlCQUFpQjs7SUFDakJDLFVBQVU7ZUFBVkEsa0JBQVU7O0lBY0hDLGNBQWM7ZUFBZEEseUJBQWM7O0lBYnJCQyx3QkFBd0I7ZUFBeEJBLGdDQUF3Qjs7O3FCQTFIWjt1QkFpQjBDO3dCQTBHakQ7MkJBWXdCIn0=
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHBvcnRzL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vLi4vdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgQ3JlYXRlRm9ybURhdGEsXG4gIERhdGEsXG4gIEZpZWxkcyxcbiAgRm9ybUZpZWxkLFxuICBGb3JtRmllbGRzQ29udGV4dCxcbn0gZnJvbSAnLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Gb3JtL3R5cGVzJ1xuXG5leHBvcnQgdHlwZSB7XG4gIFJpY2hUZXh0QWRhcHRlcixcbiAgUmljaFRleHRGaWVsZFByb3BzLFxufSBmcm9tICcuLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL1JpY2hUZXh0L3R5cGVzJ1xuXG5leHBvcnQgdHlwZSB7IENlbGxDb21wb25lbnRQcm9wcyB9IGZyb20gJy4uL2FkbWluL2NvbXBvbmVudHMvdmlld3MvY29sbGVjdGlvbnMvTGlzdC9DZWxsL3R5cGVzJ1xuXG5leHBvcnQgeyBGaWxlRGF0YSwgSW1hZ2VTaXplLCBJbmNvbWluZ1VwbG9hZFR5cGUgfSBmcm9tICcuLi91cGxvYWRzL3R5cGVzJ1xuXG5leHBvcnQgdHlwZSB7XG4gIEN1c3RvbVB1Ymxpc2hCdXR0b25Qcm9wcyxcbiAgQ3VzdG9tUHVibGlzaEJ1dHRvblR5cGUsXG4gIEN1c3RvbVNhdmVCdXR0b25Qcm9wcyxcbiAgQ3VzdG9tU2F2ZURyYWZ0QnV0dG9uUHJvcHMsXG59IGZyb20gJy4vLi4vYWRtaW4vY29tcG9uZW50cy9lbGVtZW50cy90eXBlcydcblxuZXhwb3J0IHR5cGUgeyBSb3dMYWJlbCB9IGZyb20gJy4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Sb3dMYWJlbC90eXBlcydcblxuZXhwb3J0IHR5cGUge1xuICBBZnRlckNoYW5nZUhvb2sgYXMgQ29sbGVjdGlvbkFmdGVyQ2hhbmdlSG9vayxcbiAgQWZ0ZXJEZWxldGVIb29rIGFzIENvbGxlY3Rpb25BZnRlckRlbGV0ZUhvb2ssXG4gIEFmdGVyRm9yZ290UGFzc3dvcmRIb29rIGFzIENvbGxlY3Rpb25BZnRlckZvcmdvdFBhc3N3b3JkSG9vayxcbiAgQWZ0ZXJMb2dpbkhvb2sgYXMgQ29sbGVjdGlvbkFmdGVyTG9naW5Ib29rLFxuICBBZnRlckxvZ291dEhvb2ssXG4gIEFmdGVyTG9nb3V0SG9vayBhcyBDb2xsZWN0aW9uQWZ0ZXJMb2dvdXRIb29rLFxuICBBZnRlck1lSG9vayxcbiAgQWZ0ZXJNZUhvb2sgYXMgQ29sbGVjdGlvbkFmdGVyTWVIb29rLFxuICBBZnRlck9wZXJhdGlvbkhvb2sgYXMgQ29sbGVjdGlvbkFmdGVyT3BlcmF0aW9uSG9vayxcbiAgQWZ0ZXJSZWFkSG9vayBhcyBDb2xsZWN0aW9uQWZ0ZXJSZWFkSG9vayxcbiAgQWZ0ZXJSZWZyZXNoSG9vayxcbiAgQWZ0ZXJSZWZyZXNoSG9vayBhcyBDb2xsZWN0aW9uQWZ0ZXJSZWZyZXNoSG9vayxcbiAgQmVmb3JlQ2hhbmdlSG9vayBhcyBDb2xsZWN0aW9uQmVmb3JlQ2hhbmdlSG9vayxcbiAgQmVmb3JlRGVsZXRlSG9vayBhcyBDb2xsZWN0aW9uQmVmb3JlRGVsZXRlSG9vayxcbiAgQmVmb3JlRHVwbGljYXRlLFxuICBCZWZvcmVMb2dpbkhvb2sgYXMgQ29sbGVjdGlvbkJlZm9yZUxvZ2luSG9vayxcbiAgQmVmb3JlT3BlcmF0aW9uSG9vayBhcyBDb2xsZWN0aW9uQmVmb3JlT3BlcmF0aW9uSG9vayxcbiAgQmVmb3JlUmVhZEhvb2sgYXMgQ29sbGVjdGlvbkJlZm9yZVJlYWRIb29rLFxuICBCZWZvcmVWYWxpZGF0ZUhvb2sgYXMgQ29sbGVjdGlvbkJlZm9yZVZhbGlkYXRlSG9vayxcbiAgQ29sbGVjdGlvbixcbiAgQ29sbGVjdGlvbkNvbmZpZyxcbiAgTWVIb29rIGFzIENvbGxlY3Rpb25NZUhvb2ssXG4gIFJlZnJlc2hIb29rIGFzIENvbGxlY3Rpb25SZWZyZXNoSG9vayxcbiAgU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyxcbiAgVHlwZVdpdGhJRCxcbn0gZnJvbSAnLi8uLi9jb2xsZWN0aW9ucy9jb25maWcvdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHsgQWNjZXNzLCBBY2Nlc3NBcmdzIH0gZnJvbSAnLi8uLi9jb25maWcvdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgQXJyYXlGaWVsZCxcbiAgQmxvY2ssXG4gIEJsb2NrRmllbGQsXG4gIENoZWNrYm94RmllbGQsXG4gIENvZGVGaWVsZCxcbiAgQ29sbGFwc2libGVGaWVsZCxcbiAgQ29uZGl0aW9uLFxuICBEYXRlRmllbGQsXG4gIEVtYWlsRmllbGQsXG4gIEZpZWxkLFxuICBGaWVsZEFjY2VzcyxcbiAgRmllbGRBZmZlY3RpbmdEYXRhLFxuICBGaWVsZEJhc2UsXG4gIEZpZWxkSG9vayxcbiAgRmllbGRIb29rQXJncyxcbiAgRmllbGRQcmVzZW50YXRpb25hbE9ubHksXG4gIEZpZWxkV2l0aE1hbnksXG4gIEZpZWxkV2l0aE1heERlcHRoLFxuICBGaWVsZFdpdGhQYXRoLFxuICBGaWVsZFdpdGhTdWJGaWVsZHMsXG4gIEZpbHRlck9wdGlvbnMsXG4gIEZpbHRlck9wdGlvbnNQcm9wcyxcbiAgR3JvdXBGaWVsZCxcbiAgSG9va05hbWUsXG4gIEpTT05GaWVsZCxcbiAgTGFiZWxzLFxuICBOYW1lZFRhYixcbiAgTm9uUHJlc2VudGF0aW9uYWxGaWVsZCxcbiAgTnVtYmVyRmllbGQsXG4gIE9wdGlvbixcbiAgT3B0aW9uT2JqZWN0LFxuICBQb2ludEZpZWxkLFxuICBQb2x5bW9ycGhpY1JlbGF0aW9uc2hpcEZpZWxkLFxuICBSYWRpb0ZpZWxkLFxuICBSZWxhdGlvbnNoaXBGaWVsZCxcbiAgUmVsYXRpb25zaGlwVmFsdWUsXG4gIFJpY2hUZXh0RmllbGQsXG4gIFJvd0FkbWluLFxuICBSb3dGaWVsZCxcbiAgU2VsZWN0RmllbGQsXG4gIFNpbmdsZVJlbGF0aW9uc2hpcEZpZWxkLFxuICBUYWIsXG4gIFRhYkFzRmllbGQsXG4gIFRhYnNBZG1pbixcbiAgVGFic0ZpZWxkLFxuICBUZXh0RmllbGQsXG4gIFRleHRhcmVhRmllbGQsXG4gIFVJRmllbGQsXG4gIFVubmFtZWRUYWIsXG4gIFVwbG9hZEZpZWxkLFxuICBWYWxpZGF0ZSxcbiAgVmFsaWRhdGVPcHRpb25zLFxuICBWYWx1ZVdpdGhSZWxhdGlvbixcbn0gZnJvbSAnLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuXG5leHBvcnQge1xuICBmaWVsZEFmZmVjdHNEYXRhLFxuICBmaWVsZEhhc01heERlcHRoLFxuICBmaWVsZEhhc1N1YkZpZWxkcyxcbiAgZmllbGRJc0FycmF5VHlwZSxcbiAgZmllbGRJc0Jsb2NrVHlwZSxcbiAgZmllbGRJc0dyb3VwVHlwZSxcbiAgZmllbGRJc0xvY2FsaXplZCxcbiAgZmllbGRJc1ByZXNlbnRhdGlvbmFsT25seSxcbiAgZmllbGRTdXBwb3J0c01hbnksXG4gIG9wdGlvbklzT2JqZWN0LFxuICBvcHRpb25Jc1ZhbHVlLFxuICBvcHRpb25zQXJlT2JqZWN0cyxcbiAgdGFiSGFzTmFtZSxcbiAgdmFsdWVJc1ZhbHVlV2l0aFJlbGF0aW9uLFxufSBmcm9tICcuLy4uL2ZpZWxkcy9jb25maWcvdHlwZXMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgQWZ0ZXJDaGFuZ2VIb29rIGFzIEdsb2JhbEFmdGVyQ2hhbmdlSG9vayxcbiAgQWZ0ZXJSZWFkSG9vayBhcyBHbG9iYWxBZnRlclJlYWRIb29rLFxuICBCZWZvcmVDaGFuZ2VIb29rIGFzIEdsb2JhbEJlZm9yZUNoYW5nZUhvb2ssXG4gIEJlZm9yZVJlYWRIb29rIGFzIEdsb2JhbEJlZm9yZVJlYWRIb29rLFxuICBCZWZvcmVWYWxpZGF0ZUhvb2sgYXMgR2xvYmFsQmVmb3JlVmFsaWRhdGVIb29rLFxuICBHbG9iYWxDb25maWcsXG4gIFNhbml0aXplZEdsb2JhbENvbmZpZyxcbn0gZnJvbSAnLi8uLi9nbG9iYWxzL2NvbmZpZy90eXBlcydcblxuZXhwb3J0IHsgdmFsaWRPcGVyYXRvcnMgfSBmcm9tICcuLy4uL3R5cGVzL2NvbnN0YW50cydcbiJdLCJuYW1lcyI6WyJGaWxlRGF0YSIsIkltYWdlU2l6ZSIsIkluY29taW5nVXBsb2FkVHlwZSIsImZpZWxkQWZmZWN0c0RhdGEiLCJmaWVsZEhhc01heERlcHRoIiwiZmllbGRIYXNTdWJGaWVsZHMiLCJmaWVsZElzQXJyYXlUeXBlIiwiZmllbGRJc0Jsb2NrVHlwZSIsImZpZWxkSXNHcm91cFR5cGUiLCJmaWVsZElzTG9jYWxpemVkIiwiZmllbGRJc1ByZXNlbnRhdGlvbmFsT25seSIsImZpZWxkU3VwcG9ydHNNYW55Iiwib3B0aW9uSXNPYmplY3QiLCJvcHRpb25Jc1ZhbHVlIiwib3B0aW9uc0FyZU9iamVjdHMiLCJ0YWJIYXNOYW1lIiwidmFsaWRPcGVyYXRvcnMiLCJ2YWx1ZUlzVmFsdWVXaXRoUmVsYXRpb24iXSwicmFuZ2VNYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQWlCU0EsUUFBUTtlQUFSQSxlQUFROztJQUFFQyxTQUFTO2VBQVRBLGdCQUFTOztJQUFFQyxrQkFBa0I7ZUFBbEJBLHlCQUFrQjs7SUFrRzlDQyxnQkFBZ0I7ZUFBaEJBLHdCQUFnQjs7SUFDaEJDLGdCQUFnQjtlQUFoQkEsd0JBQWdCOztJQUNoQkMsaUJBQWlCO2VBQWpCQSx5QkFBaUI7O0lBQ2pCQyxnQkFBZ0I7ZUFBaEJBLHdCQUFnQjs7SUFDaEJDLGdCQUFnQjtlQUFoQkEsd0JBQWdCOztJQUNoQkMsZ0JBQWdCO2VBQWhCQSx3QkFBZ0I7O0lBQ2hCQyxnQkFBZ0I7ZUFBaEJBLHdCQUFnQjs7SUFDaEJDLHlCQUF5QjtlQUF6QkEsaUNBQXlCOztJQUN6QkMsaUJBQWlCO2VBQWpCQSx5QkFBaUI7O0lBQ2pCQyxjQUFjO2VBQWRBLHNCQUFjOztJQUNkQyxhQUFhO2VBQWJBLHFCQUFhOztJQUNiQyxpQkFBaUI7ZUFBakJBLHlCQUFpQjs7SUFDakJDLFVBQVU7ZUFBVkEsa0JBQVU7O0lBY0hDLGNBQWM7ZUFBZEEseUJBQWM7O0lBYnJCQyx3QkFBd0I7ZUFBeEJBLGdDQUF3Qjs7O3FCQWhJWjt1QkFpQjBDO3dCQWdIakQ7MkJBWXdCIn0=