machines/products/poly-mech/media.js
2025-12-25 12:45:23 +01:00

152 lines
23 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.compileProductAssets = exports.productGallery = void 0;
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
const path = require("path");
const pMap = require("p-map");
const fs_1 = require("@plastichub/osr-cli-commons/fs");
const glob_1 = require("@plastichub/osr-cli-commons/glob");
const exists_1 = require("@plastichub/fs/exists");
const read_1 = require("@plastichub/fs/read");
const debug_1 = require("@plastichub/core/debug");
const ExifReader = require("exifreader");
const translate_1 = require("@plastichub/osr-i18n/lib/translate");
const images_1 = require("@plastichub/osr-media/lib/media/images");
const config_1 = require("./config");
const logger = (0, debug_1.logger)('ph-site');
const IMAGES_GLOB = '*.+(JPG|jpg|png|PNG|gif)';
const productGallery = async (grunt, assetPath, product, lang, dstLanguage) => {
product = '' + product;
const root = (0, fs_1.resolve)((0, config_1.PRODUCT_ROOT)());
const productConfig = (0, read_1.sync)((0, config_1.PRODUCT_CONFIG)(product), "json");
if (!productConfig) {
logger.error('Product config not found !' + product);
return;
}
const mediaPath = `${root}/${product}/${assetPath}/`;
if (!(0, exists_1.sync)(mediaPath)) {
return [];
}
const galleryFiles = (0, glob_1.files)(mediaPath, IMAGES_GLOB, {
cwd: mediaPath,
absolute: false
});
if (!galleryFiles) {
return;
}
const removeBufferValues = (obj) => {
for (const key in obj) {
const val = obj[key];
if (Buffer.isBuffer(val)) {
}
if (Buffer.isBuffer(val)) {
delete obj[key];
}
else if (typeof val === 'object') {
removeBufferValues(val);
}
}
return obj;
};
const removeArrayValues = (obj) => {
for (const key in obj) {
if (key == 'id') {
delete obj[key];
}
if (Array.isArray(obj[key]) || Buffer.isBuffer(obj[key])) {
delete obj[key];
}
else if (typeof obj[key] === 'object') {
removeArrayValues(obj[key]);
}
}
return obj;
};
const removeEmptyObjects = (obj) => {
for (const key in obj) {
if (typeof obj[key] === 'object' ||
(key == 'value' && typeof obj[key] === 'number' && obj[key] === 0 ||
key == 'base64')) {
obj[key] = removeEmptyObjects(obj[key]);
if (Object.keys(obj[key]).length === 0) {
delete obj[key];
}
}
}
return obj;
};
const removeArrays = (obj) => {
for (const key in obj) {
if (key == 'description' && typeof obj[key] === 'string' && obj[key].split(',').length > 2) {
try {
if (Buffer.isBuffer(Buffer.from(obj[key].split(','))))
delete obj[key];
}
catch (e) {
}
}
else if (typeof obj[key] === 'object') {
removeArrays(obj[key]);
}
}
return obj;
};
return await pMap(galleryFiles, async (file) => {
const parts = path.parse(file);
const filePath = path.join(mediaPath, file);
let imageMeta = await (0, images_1.meta)(filePath);
const exifRaw = await ExifReader.load(filePath);
const title = exifRaw?.title?.description || '';
const keywords = exifRaw?.['LastKeywordXMP']?.description || exifRaw?.iptc?.Keywords?.description || '';
const exifDescription = exifRaw?.['ImageDescription']?.description || '';
const width = exifRaw?.['Image Width']?.value;
const height = exifRaw?.['Image Height']?.value;
const lon = exifRaw?.['GPSLongitude']?.description;
const lat = exifRaw?.['GPSLatitude']?.description;
const description = exifDescription || exifRaw?.iptc?.['Caption/Abstract'].description || '';
imageMeta.exif = exifRaw;
imageMeta = removeBufferValues(imageMeta);
imageMeta = removeArrayValues(imageMeta);
imageMeta = removeArrays(imageMeta);
imageMeta = removeEmptyObjects(imageMeta);
delete imageMeta.xmp;
delete imageMeta.icc;
delete imageMeta.exif.icc;
delete imageMeta.exif.xmp;
delete imageMeta.exif.iptc;
const keywordsTranslated = await (0, translate_1.translateText)(keywords || '', lang, dstLanguage, {
store: (0, config_1.I18N_STORE)((0, config_1.OSR_ROOT)(), dstLanguage)
});
const assetUrl = (filePath) => `[[OSR_MACHINES_ASSETS_URL]]/[[product_relative]]/${assetPath}/${filePath}`;
const ret = {
name: path.parse(file).name,
url: assetUrl(file),
thumb: assetUrl(`/20/webp/${parts.name}.webp`),
responsive: assetUrl(`/webp/${parts.name}.webp`),
meta: imageMeta || "",
keywords: keywords.split(',').map((k) => k.trim()),
description,
alt: `${description} - ${keywordsTranslated || ''}`,
width,
height,
title
};
return ret;
});
};
exports.productGallery = productGallery;
const compileProductAssets = async (grunt, product_root, srcLang, dstLanguage) => {
logger.info('Resize Product Media Assets ', product_root);
await (0, images_1.resize)((0, images_1.getResizePatterns)(product_root, 'drawings'));
await (0, images_1.format)((0, images_1.getFormats)(product_root, 'drawings'), { png: false, cache: config_1.RETAIL_MEDIA_CACHE });
await (0, images_1.resize)((0, images_1.getResizePatterns)(product_root, 'renderings'));
await (0, images_1.format)((0, images_1.getFormats)(product_root, 'renderings'), { png: false, cache: config_1.RETAIL_MEDIA_CACHE });
await (0, images_1.resize)((0, images_1.getResizePatterns)(product_root, 'renderings/20'));
await (0, images_1.format)((0, images_1.getFormats)(product_root, 'renderings/20'), { png: false, cache: config_1.RETAIL_MEDIA_CACHE });
await (0, images_1.resize)((0, images_1.getResizePatterns)(product_root, 'media/gallery'));
await (0, images_1.format)((0, images_1.getFormats)(product_root, 'media/gallery'), { png: false, cache: config_1.RETAIL_MEDIA_CACHE });
await (0, images_1.resize)((0, images_1.getResizePatterns)(product_root, 'media/gallery/20'));
await (0, images_1.format)((0, images_1.getFormats)(product_root, 'media/gallery/20'), { png: false, cache: config_1.RETAIL_MEDIA_CACHE });
};
exports.compileProductAssets = compileProductAssets;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YXNrcy9tZWRpYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLEdBQUcsR0FBRyxDQUFBO0FBQ2pELDZCQUE0QjtBQUM1Qiw4QkFBNkI7QUFDN0IsdURBQXdEO0FBQ3hELDJEQUF3RDtBQUV4RCxrREFBc0Q7QUFDdEQsOENBQWtEO0FBRWxELGtEQUEwRDtBQUMxRCx5Q0FBd0M7QUFFeEMsa0VBQWtFO0FBQ2xFLG1FQUE0RztBQUU1RyxxQ0FLaUI7QUFHakIsTUFBTSxNQUFNLEdBQUcsSUFBQSxjQUFPLEVBQUMsU0FBUyxDQUFDLENBQUE7QUFDakMsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLENBQUE7QUFFdkMsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQTJCLEVBQUU7SUFDNUcsT0FBTyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBQSxZQUFPLEVBQUMsSUFBQSxxQkFBWSxHQUFFLENBQUMsQ0FBQTtJQUNwQyxNQUFNLGFBQWEsR0FBUSxJQUFBLFdBQUksRUFBQyxJQUFBLHVCQUFjLEVBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDaEUsSUFBSSxDQUFDLGFBQWEsRUFBRTtRQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixHQUFHLE9BQU8sQ0FBQyxDQUFBO1FBQ3BELE9BQU07S0FDUDtJQUNELE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxJQUFJLE9BQU8sSUFBSSxTQUFTLEdBQUcsQ0FBQTtJQUNwRCxJQUFJLENBQUMsSUFBQSxhQUFNLEVBQUMsU0FBUyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxFQUFFLENBQUE7S0FDVjtJQUVELE1BQU0sWUFBWSxHQUFHLElBQUEsWUFBSyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUU7UUFDakQsR0FBRyxFQUFFLFNBQVM7UUFDZCxRQUFRLEVBQUUsS0FBSztLQUNoQixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ2pCLE9BQU07S0FDUDtJQUNELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFRLEVBQU8sRUFBRTtRQUMzQyxLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtZQUNyQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDcEIsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2FBQ3pCO1lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqQjtpQkFBTSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtnQkFDbEMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFBO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQVEsRUFBTyxFQUFFO1FBQzFDLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ3JCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDZixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTthQUNoQjtZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN4RCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqQjtpQkFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDdkMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDN0I7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFBO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQVEsRUFBTyxFQUFFO1FBQzNDLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ3JCLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtnQkFDOUIsQ0FBQyxHQUFHLElBQUksT0FBTyxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFDL0QsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUNsQjtnQkFDQSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN0QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDakI7YUFDRjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUE7SUFDRCxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVEsRUFBTyxFQUFFO1FBQ3JDLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ3JCLElBQUksR0FBRyxJQUFJLGFBQWEsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMxRixJQUFJO29CQUNGLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDbkQsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7aUJBQ2xCO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO2lCQUVYO2FBQ0Y7aUJBQU0sSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLEVBQUU7Z0JBQ3ZDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN4QjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUE7SUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMzQyxJQUFJLFNBQVMsR0FBUSxNQUFNLElBQUEsYUFBSSxFQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sT0FBTyxHQUFRLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUE7UUFDL0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxXQUFXLElBQUksT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQTtRQUN2RyxNQUFNLGVBQWUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUE7UUFDeEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxDQUFBO1FBQzdDLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssQ0FBQTtRQUMvQyxNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxXQUFXLENBQUE7UUFDbEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsV0FBVyxDQUFBO1FBQ2pELE1BQU0sV0FBVyxHQUFHLGVBQWUsSUFBSSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFBO1FBQzVGLFNBQVMsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBQ3hCLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN6QyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDeEMsU0FBUyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNuQyxTQUFTLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDekMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFBO1FBQ3BCLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQTtRQUNwQixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBO1FBQ3pCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUE7UUFDekIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtRQUMxQixNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBQSx5QkFBYSxFQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBQztZQUMvRSxLQUFLLEVBQUUsSUFBQSxtQkFBVSxFQUFDLElBQUEsaUJBQVEsR0FBRSxFQUFFLFdBQVcsQ0FBQztTQUMzQyxDQUFDLENBQUE7UUFDRixNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsb0RBQW9ELFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQTtRQUMxRyxNQUFNLEdBQUcsR0FDVDtZQUNFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUk7WUFDM0IsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQztZQUM5QyxVQUFVLEVBQUUsUUFBUSxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDO1lBQ2hELElBQUksRUFBRSxTQUFTLElBQUksRUFBRTtZQUNyQixRQUFRLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRCxXQUFXO1lBQ1gsR0FBRyxFQUFFLEdBQUcsV0FBVyxNQUFNLGtCQUFrQixJQUFJLEVBQUUsRUFBRTtZQUNuRCxLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUs7U0FDTixDQUFBO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQXhIWSxRQUFBLGNBQWMsa0JBd0gxQjtBQUNNLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFO0lBQ3RGLE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFMUQsTUFBTSxJQUFBLGVBQU0sRUFBQyxJQUFBLDBCQUFpQixFQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBQ3pELE1BQU0sSUFBQSxlQUFNLEVBQUMsSUFBQSxtQkFBVSxFQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDJCQUFrQixFQUFFLENBQUMsQ0FBQTtJQUU3RixNQUFNLElBQUEsZUFBTSxFQUFDLElBQUEsMEJBQWlCLEVBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUE7SUFDM0QsTUFBTSxJQUFBLGVBQU0sRUFBQyxJQUFBLG1CQUFVLEVBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsMkJBQWtCLEVBQUUsQ0FBQyxDQUFBO0lBRS9GLE1BQU0sSUFBQSxlQUFNLEVBQUMsSUFBQSwwQkFBaUIsRUFBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQTtJQUM5RCxNQUFNLElBQUEsZUFBTSxFQUFDLElBQUEsbUJBQVUsRUFBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSwyQkFBa0IsRUFBRSxDQUFDLENBQUE7SUFFbEcsTUFBTSxJQUFBLGVBQU0sRUFBQyxJQUFBLDBCQUFpQixFQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFBO0lBQzlELE1BQU0sSUFBQSxlQUFNLEVBQUMsSUFBQSxtQkFBVSxFQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDJCQUFrQixFQUFFLENBQUMsQ0FBQTtJQUNsRyxNQUFNLElBQUEsZUFBTSxFQUFDLElBQUEsMEJBQWlCLEVBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQTtJQUNqRSxNQUFNLElBQUEsZUFBTSxFQUFDLElBQUEsbUJBQVUsRUFBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDJCQUFrQixFQUFFLENBQUMsQ0FBQTtBQUN2RyxDQUFDLENBQUE7QUFoQlksUUFBQSxvQkFBb0Isd0JBZ0JoQyIsInNvdXJjZXNDb250ZW50IjpbInByb2Nlc3MuZW52WydOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEJ10gPSAnMCdcclxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgKiBhcyBwTWFwIGZyb20gJ3AtbWFwJ1xyXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnQHBsYXN0aWNodWIvb3NyLWNsaS1jb21tb25zL2ZzJ1xyXG5pbXBvcnQgeyBmaWxlcyB9IGZyb20gJ0BwbGFzdGljaHViL29zci1jbGktY29tbW9ucy9nbG9iJ1xyXG5cclxuaW1wb3J0IHsgc3luYyBhcyBleGlzdHMgfSBmcm9tICdAcGxhc3RpY2h1Yi9mcy9leGlzdHMnXHJcbmltcG9ydCB7IHN5bmMgYXMgcmVhZCB9IGZyb20gJ0BwbGFzdGljaHViL2ZzL3JlYWQnXHJcblxyXG5pbXBvcnQgeyBsb2dnZXIgYXMgX2xvZ2dlciB9IGZyb20gJ0BwbGFzdGljaHViL2NvcmUvZGVidWcnXHJcbmltcG9ydCAqIGFzIEV4aWZSZWFkZXIgZnJvbSAnZXhpZnJlYWRlcidcclxuXHJcbmltcG9ydCB7IHRyYW5zbGF0ZVRleHQgfSBmcm9tICdAcGxhc3RpY2h1Yi9vc3ItaTE4bi9saWIvdHJhbnNsYXRlJ1xyXG5pbXBvcnQgeyByZXNpemUsIGdldFJlc2l6ZVBhdHRlcm5zLCBmb3JtYXQsIGdldEZvcm1hdHMsIG1ldGEgfSBmcm9tICdAcGxhc3RpY2h1Yi9vc3ItbWVkaWEvbGliL21lZGlhL2ltYWdlcydcclxuXHJcbmltcG9ydCB7XHJcbiAgSTE4Tl9TVE9SRSxcclxuICBcclxuICBPU1JfUk9PVCwgUFJPRFVDVF9DT05GSUcsIFBST0RVQ1RfUk9PVCwgXHJcbiAgUkVUQUlMX01FRElBX0NBQ0hFXHJcbn0gZnJvbSAnLi9jb25maWcnXHJcbmltcG9ydCB7IEdhbGxlcnlJbWFnZSB9IGZyb20gJy4vaW1hZ2VzJ1xyXG5cclxuY29uc3QgbG9nZ2VyID0gX2xvZ2dlcigncGgtc2l0ZScpXHJcbmNvbnN0IElNQUdFU19HTE9CID0gJyouKyhKUEd8anBnfHBuZ3xQTkd8Z2lmKSdcclxuXHJcbmV4cG9ydCBjb25zdCBwcm9kdWN0R2FsbGVyeSA9IGFzeW5jIChncnVudCwgYXNzZXRQYXRoLCBwcm9kdWN0LCBsYW5nLCBkc3RMYW5ndWFnZSk6IFByb21pc2U8R2FsbGVyeUltYWdlW10+ID0+IHtcclxuICBwcm9kdWN0ID0gJycgKyBwcm9kdWN0XHJcbiAgY29uc3Qgcm9vdCA9IHJlc29sdmUoUFJPRFVDVF9ST09UKCkpXHJcbiAgY29uc3QgcHJvZHVjdENvbmZpZzogYW55ID0gcmVhZChQUk9EVUNUX0NPTkZJRyhwcm9kdWN0KSwgXCJqc29uXCIpXHJcbiAgaWYgKCFwcm9kdWN0Q29uZmlnKSB7XHJcbiAgICBsb2dnZXIuZXJyb3IoJ1Byb2R1Y3QgY29uZmlnIG5vdCBmb3VuZCAhJyArIHByb2R1Y3QpXHJcbiAgICByZXR1cm5cclxuICB9XHJcbiAgY29uc3QgbWVkaWFQYXRoID0gYCR7cm9vdH0vJHtwcm9kdWN0fS8ke2Fzc2V0UGF0aH0vYFxyXG4gIGlmICghZXhpc3RzKG1lZGlhUGF0aCkpIHtcclxuICAgIHJldHVybiBbXVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZ2FsbGVyeUZpbGVzID0gZmlsZXMobWVkaWFQYXRoLCBJTUFHRVNfR0xPQiwge1xyXG4gICAgY3dkOiBtZWRpYVBhdGgsXHJcbiAgICBhYnNvbHV0ZTogZmFsc2VcclxuICB9KVxyXG5cclxuICBpZiAoIWdhbGxlcnlGaWxlcykge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG4gIGNvbnN0IHJlbW92ZUJ1ZmZlclZhbHVlcyA9IChvYmo6IGFueSk6IGFueSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgY29uc3QgdmFsID0gb2JqW2tleV1cclxuICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XHJcbiAgICAgICAgZGVsZXRlIG9ialtrZXldO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmVtb3ZlQnVmZmVyVmFsdWVzKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG4gIGNvbnN0IHJlbW92ZUFycmF5VmFsdWVzID0gKG9iajogYW55KTogYW55ID0+IHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICBpZiAoa2V5ID09ICdpZCcpIHtcclxuICAgICAgICBkZWxldGUgb2JqW2tleV1cclxuICAgICAgfVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpba2V5XSkgfHwgQnVmZmVyLmlzQnVmZmVyKG9ialtrZXldKSkge1xyXG4gICAgICAgIGRlbGV0ZSBvYmpba2V5XTtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmVtb3ZlQXJyYXlWYWx1ZXMob2JqW2tleV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVtb3ZlRW1wdHlPYmplY3RzID0gKG9iajogYW55KTogYW55ID0+IHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyB8fFxyXG4gICAgICAgIChrZXkgPT0gJ3ZhbHVlJyAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdudW1iZXInICYmIG9ialtrZXldID09PSAwIHx8XHJcbiAgICAgICAgICBrZXkgPT0gJ2Jhc2U2NCcpXHJcbiAgICAgICkge1xyXG4gICAgICAgIG9ialtrZXldID0gcmVtb3ZlRW1wdHlPYmplY3RzKG9ialtrZXldKTtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMob2JqW2tleV0pLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgZGVsZXRlIG9ialtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcbiAgY29uc3QgcmVtb3ZlQXJyYXlzID0gKG9iajogYW55KTogYW55ID0+IHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICBpZiAoa2V5ID09ICdkZXNjcmlwdGlvbicgJiYgdHlwZW9mIG9ialtrZXldID09PSAnc3RyaW5nJyAmJiBvYmpba2V5XS5zcGxpdCgnLCcpLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIuZnJvbShvYmpba2V5XS5zcGxpdCgnLCcpKSkpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpba2V5XVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZW1vdmVBcnJheXMob2JqW2tleV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuICByZXR1cm4gYXdhaXQgcE1hcChnYWxsZXJ5RmlsZXMsIGFzeW5jIChmaWxlOiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5wYXJzZShmaWxlKVxyXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obWVkaWFQYXRoLCBmaWxlKVxyXG4gICAgbGV0IGltYWdlTWV0YTogYW55ID0gYXdhaXQgbWV0YShmaWxlUGF0aClcclxuICAgIGNvbnN0IGV4aWZSYXc6IGFueSA9IGF3YWl0IEV4aWZSZWFkZXIubG9hZChmaWxlUGF0aClcclxuICAgIGNvbnN0IHRpdGxlID0gZXhpZlJhdz8udGl0bGU/LmRlc2NyaXB0aW9uIHx8ICcnXHJcbiAgICBjb25zdCBrZXl3b3JkcyA9IGV4aWZSYXc/LlsnTGFzdEtleXdvcmRYTVAnXT8uZGVzY3JpcHRpb24gfHwgZXhpZlJhdz8uaXB0Yz8uS2V5d29yZHM/LmRlc2NyaXB0aW9uIHx8ICcnXHJcbiAgICBjb25zdCBleGlmRGVzY3JpcHRpb24gPSBleGlmUmF3Py5bJ0ltYWdlRGVzY3JpcHRpb24nXT8uZGVzY3JpcHRpb24gfHwgJydcclxuICAgIGNvbnN0IHdpZHRoID0gZXhpZlJhdz8uWydJbWFnZSBXaWR0aCddPy52YWx1ZVxyXG4gICAgY29uc3QgaGVpZ2h0ID0gZXhpZlJhdz8uWydJbWFnZSBIZWlnaHQnXT8udmFsdWVcclxuICAgIGNvbnN0IGxvbiA9IGV4aWZSYXc/LlsnR1BTTG9uZ2l0dWRlJ10/LmRlc2NyaXB0aW9uXHJcbiAgICBjb25zdCBsYXQgPSBleGlmUmF3Py5bJ0dQU0xhdGl0dWRlJ10/LmRlc2NyaXB0aW9uXHJcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGV4aWZEZXNjcmlwdGlvbiB8fCBleGlmUmF3Py5pcHRjPy5bJ0NhcHRpb24vQWJzdHJhY3QnXS5kZXNjcmlwdGlvbiB8fCAnJ1xyXG4gICAgaW1hZ2VNZXRhLmV4aWYgPSBleGlmUmF3XHJcbiAgICBpbWFnZU1ldGEgPSByZW1vdmVCdWZmZXJWYWx1ZXMoaW1hZ2VNZXRhKVxyXG4gICAgaW1hZ2VNZXRhID0gcmVtb3ZlQXJyYXlWYWx1ZXMoaW1hZ2VNZXRhKVxyXG4gICAgaW1hZ2VNZXRhID0gcmVtb3ZlQXJyYXlzKGltYWdlTWV0YSlcclxuICAgIGltYWdlTWV0YSA9IHJlbW92ZUVtcHR5T2JqZWN0cyhpbWFnZU1ldGEpXHJcbiAgICBkZWxldGUgaW1hZ2VNZXRhLnhtcFxyXG4gICAgZGVsZXRlIGltYWdlTWV0YS5pY2NcclxuICAgIGRlbGV0ZSBpbWFnZU1ldGEuZXhpZi5pY2NcclxuICAgIGRlbGV0ZSBpbWFnZU1ldGEuZXhpZi54bXBcclxuICAgIGRlbGV0ZSBpbWFnZU1ldGEuZXhpZi5pcHRjXHJcbiAgICBjb25zdCBrZXl3b3Jkc1RyYW5zbGF0ZWQgPSBhd2FpdCB0cmFuc2xhdGVUZXh0KGtleXdvcmRzIHx8ICcnLCBsYW5nLCBkc3RMYW5ndWFnZSx7XHJcbiAgICAgIHN0b3JlOiBJMThOX1NUT1JFKE9TUl9ST09UKCksIGRzdExhbmd1YWdlKVxyXG4gICAgfSlcclxuICAgIGNvbnN0IGFzc2V0VXJsID0gKGZpbGVQYXRoKSA9PiBgW1tPU1JfTUFDSElORVNfQVNTRVRTX1VSTF1dL1tbcHJvZHVjdF9yZWxhdGl2ZV1dLyR7YXNzZXRQYXRofS8ke2ZpbGVQYXRofWBcclxuICAgIGNvbnN0IHJldDogR2FsbGVyeUltYWdlID1cclxuICAgIHtcclxuICAgICAgbmFtZTogcGF0aC5wYXJzZShmaWxlKS5uYW1lLFxyXG4gICAgICB1cmw6IGFzc2V0VXJsKGZpbGUpLFxyXG4gICAgICB0aHVtYjogYXNzZXRVcmwoYC8yMC93ZWJwLyR7cGFydHMubmFtZX0ud2VicGApLFxyXG4gICAgICByZXNwb25zaXZlOiBhc3NldFVybChgL3dlYnAvJHtwYXJ0cy5uYW1lfS53ZWJwYCksXHJcbiAgICAgIG1ldGE6IGltYWdlTWV0YSB8fCBcIlwiLFxyXG4gICAgICBrZXl3b3Jkczoga2V5d29yZHMuc3BsaXQoJywnKS5tYXAoKGspID0+IGsudHJpbSgpKSxcclxuICAgICAgZGVzY3JpcHRpb24sXHJcbiAgICAgIGFsdDogYCR7ZGVzY3JpcHRpb259IC0gJHtrZXl3b3Jkc1RyYW5zbGF0ZWQgfHwgJyd9YCxcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodCxcclxuICAgICAgdGl0bGVcclxuICAgIH1cclxuICAgIHJldHVybiByZXRcclxuICB9KVxyXG59XHJcbmV4cG9ydCBjb25zdCBjb21waWxlUHJvZHVjdEFzc2V0cyA9IGFzeW5jIChncnVudCwgcHJvZHVjdF9yb290LCBzcmNMYW5nLCBkc3RMYW5ndWFnZSkgPT4ge1xyXG4gIGxvZ2dlci5pbmZvKCdSZXNpemUgUHJvZHVjdCBNZWRpYSBBc3NldHMgJywgcHJvZHVjdF9yb290KTtcclxuICBcclxuICBhd2FpdCByZXNpemUoZ2V0UmVzaXplUGF0dGVybnMocHJvZHVjdF9yb290LCAnZHJhd2luZ3MnKSlcclxuICBhd2FpdCBmb3JtYXQoZ2V0Rm9ybWF0cyhwcm9kdWN0X3Jvb3QsICdkcmF3aW5ncycpLCB7IHBuZzogZmFsc2UsIGNhY2hlOiBSRVRBSUxfTUVESUFfQ0FDSEUgfSlcclxuICBcclxuICBhd2FpdCByZXNpemUoZ2V0UmVzaXplUGF0dGVybnMocHJvZHVjdF9yb290LCAncmVuZGVyaW5ncycpKVxyXG4gIGF3YWl0IGZvcm1hdChnZXRGb3JtYXRzKHByb2R1Y3Rfcm9vdCwgJ3JlbmRlcmluZ3MnKSwgeyBwbmc6IGZhbHNlLCBjYWNoZTogUkVUQUlMX01FRElBX0NBQ0hFIH0pXHJcbiAgXHJcbiAgYXdhaXQgcmVzaXplKGdldFJlc2l6ZVBhdHRlcm5zKHByb2R1Y3Rfcm9vdCwgJ3JlbmRlcmluZ3MvMjAnKSlcclxuICBhd2FpdCBmb3JtYXQoZ2V0Rm9ybWF0cyhwcm9kdWN0X3Jvb3QsICdyZW5kZXJpbmdzLzIwJyksIHsgcG5nOiBmYWxzZSwgY2FjaGU6IFJFVEFJTF9NRURJQV9DQUNIRSB9KVxyXG5cclxuICBhd2FpdCByZXNpemUoZ2V0UmVzaXplUGF0dGVybnMocHJvZHVjdF9yb290LCAnbWVkaWEvZ2FsbGVyeScpKSAgXHJcbiAgYXdhaXQgZm9ybWF0KGdldEZvcm1hdHMocHJvZHVjdF9yb290LCAnbWVkaWEvZ2FsbGVyeScpLCB7IHBuZzogZmFsc2UsIGNhY2hlOiBSRVRBSUxfTUVESUFfQ0FDSEUgfSlcclxuICBhd2FpdCByZXNpemUoZ2V0UmVzaXplUGF0dGVybnMocHJvZHVjdF9yb290LCAnbWVkaWEvZ2FsbGVyeS8yMCcpKVxyXG4gIGF3YWl0IGZvcm1hdChnZXRGb3JtYXRzKHByb2R1Y3Rfcm9vdCwgJ21lZGlhL2dhbGxlcnkvMjAnKSwgeyBwbmc6IGZhbHNlLCBjYWNoZTogUkVUQUlMX01FRElBX0NBQ0hFIH0pXHJcbn1cclxuIl19