UNPKG

@vendasta/store

Version:

Components and data for Store

495 lines 44 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @record */ export function SalesPackage() { } if (false) { /** @type {?} */ SalesPackage.prototype.formattedPrices; /** @type {?} */ SalesPackage.prototype.packageId; /** @type {?} */ SalesPackage.prototype.name; /** @type {?} */ SalesPackage.prototype.icon; /** @type {?} */ SalesPackage.prototype.productIds; /** @type {?} */ SalesPackage.prototype.products; /** @type {?} */ SalesPackage.prototype.addonsWithNoParent; /** @type {?} */ SalesPackage.prototype.totalAddons; /** @type {?|undefined} */ SalesPackage.prototype.activationStatus; } /** * @record */ export function SalesProduct() { } if (false) { /** @type {?} */ SalesProduct.prototype.formattedPrices; /** @type {?} */ SalesProduct.prototype.productId; /** @type {?} */ SalesProduct.prototype.name; /** @type {?} */ SalesProduct.prototype.icon; /** @type {?} */ SalesProduct.prototype.tagline; /** @type {?|undefined} */ SalesProduct.prototype.activationStatus; /** @type {?|undefined} */ SalesProduct.prototype.editionId; /** @type {?|undefined} */ SalesProduct.prototype.editionName; /** @type {?} */ SalesProduct.prototype.addons; } /** * @record */ export function SalesAddon() { } if (false) { /** @type {?} */ SalesAddon.prototype.parentId; /** @type {?} */ SalesAddon.prototype.addonId; /** @type {?} */ SalesAddon.prototype.name; /** @type {?} */ SalesAddon.prototype.icon; /** @type {?} */ SalesAddon.prototype.tagline; /** @type {?} */ SalesAddon.prototype.parentName; /** @type {?} */ SalesAddon.prototype.parentIcon; /** @type {?} */ SalesAddon.prototype.multipleActivations; /** @type {?|undefined} */ SalesAddon.prototype.activationStatus; } /** * @record */ export function PackageItemActivationStatus() { } if (false) { /** @type {?} */ PackageItemActivationStatus.prototype.packageItemId; /** @type {?} */ PackageItemActivationStatus.prototype.status; } /** @enum {number} */ const ActivationStatus = { SUCCESS: 0, WARNING: 1, ERROR: 2, }; export { ActivationStatus }; ActivationStatus[ActivationStatus.SUCCESS] = 'SUCCESS'; ActivationStatus[ActivationStatus.WARNING] = 'WARNING'; ActivationStatus[ActivationStatus.ERROR] = 'ERROR'; /** * @record */ export function StatusNotificationItem() { } if (false) { /** @type {?} */ StatusNotificationItem.prototype.icon; /** @type {?} */ StatusNotificationItem.prototype.text; /** @type {?} */ StatusNotificationItem.prototype.status; } /** * @param {?} packages * @param {?} products * @param {?} addons * @return {?} */ export function buildSalesPackages(packages, products, addons) { if (!packages || packages.length < 1) { return []; } return packages.map(pkg => buildSalesPackageFromPackage(pkg, products, addons)); } /** * @param {?} pkg * @param {?} products * @param {?} addons * @return {?} */ function buildSalesPackageFromPackage(pkg, products, addons) { if (!pkg) { return null; } /** @type {?} */ const salesProducts = buildSalesProducts(pkg, products, addons); // Addons can be in a package even if the parent product is not, this will create salesAddons with no parent /** @type {?} */ const addonsWithNoParent = buildSalesAddonsWithNoParent(pkg, products, addons); return createSalesPackage(pkg, salesProducts, addonsWithNoParent); } /** * @param {?} pkg * @param {?} products * @param {?} addons * @return {?} */ export function buildSalesProducts(pkg, products, addons) { if (!(products && products.length && pkg.products && pkg.products.length)) { return []; } /** @type {?} */ const productMap = new Map(); products.forEach(product => productMap.set(product.productId, product)); return pkg.products .map(productId => { /** @type {?} */ const productMatch = productMap.get(productId); /** @type {?} */ const addonsInPackage = coerceAddonsForAddonKeys(addons, pkg.addon_keys); return productMatch ? buildSalesProductFromProduct(productMatch, addonsInPackage) : null; }) .filter(productItem => productItem); } /** * @param {?} addons * @param {?} addonKeys * @return {?} */ export function coerceAddonsForAddonKeys(addons, addonKeys) { if (!addons || addons.length === 0 || !addonKeys || addonKeys.length === 0) { return []; } return addons.reduce((addonsArray, addon) => { /** @type {?} */ const key = addonKeys.find(k => k.addonId === addon.addonId); if (key) { /** @type {?} */ const quantity = key.quantity || 1; for (let i = 0; i < quantity; i++) { addonsArray.push(addon); } } return addonsArray; }, []); } /** * @param {?} pkg * @param {?} products * @param {?} addons * @return {?} */ export function buildSalesAddonsWithNoParent(pkg, products, addons) { if (!addons || addons.length < 1 || !pkg.addon_keys) { return []; } /** @type {?} */ const productMap = new Map(); products.forEach(product => productMap.set(product.productId, product)); /** @type {?} */ const addonsMap = new Map(); addons.forEach(addon => addonsMap.set(addon.addonId, addon)); /** @type {?} */ const addonsWithNoParent = pkg.addon_keys.reduce((addonArray, addonKey) => { if (pkg.products && pkg.products.some(productId => productId === addonKey.appId)) { return addonArray || []; } /** @type {?} */ const parentProduct = productMap.get(addonKey.appId); /** @type {?} */ const parentName = parentProduct ? parentProduct.name : null; /** @type {?} */ const parentIcon = parentProduct ? parentProduct.iconUrl : null; /** @type {?} */ const quantity = addonKey.quantity || 1; /** @type {?} */ const addon = addonsMap.get(addonKey.addonId); for (let i = 0; i < quantity; i++) { addonArray.push(createSalesAddon(addon, parentName, parentIcon)); } return addonArray; }, []); return addonsWithNoParent; } /** * @param {?} product * @param {?} addons * @return {?} */ export function buildSalesProductFromProduct(product, addons) { if (!product) { return null; } if (!addons || addons.length < 1) { return createSalesProduct(product, null); } /** @type {?} */ const productAddons = addons.filter(addon => addon.appId === product.productId); /** @type {?} */ const salesAddons = createSalesAddons(productAddons); return createSalesProduct(product, salesAddons); } /** * @param {?} pkg * @param {?} salesProducts * @param {?} addonsWithNoParent * @return {?} */ function createSalesPackage(pkg, salesProducts, addonsWithNoParent) { /** @type {?} */ let totalAddons = 0; for (const key of pkg.addon_keys || []) { totalAddons += key.quantity || 1; } return { formattedPrices: pkg.formattedPricingList.join(', '), packageId: pkg.solution_id, name: pkg.name, icon: pkg.icon, productIds: pkg.products, products: salesProducts || [], addonsWithNoParent: addonsWithNoParent || [], totalAddons: totalAddons }; } /** * @param {?} product * @param {?} salesAddons * @return {?} */ function createSalesProduct(product, salesAddons) { return { formattedPrices: product.formattedPricingList.join(', '), productId: product.productId, name: product.name, tagline: product.tagline || '', icon: product.iconUrl, addons: salesAddons || [], editionId: product.editionId, editionName: product.editionName, }; } /** * @param {?} addons * @return {?} */ function createSalesAddons(addons) { return addons.map(addon => createSalesAddon(addon)); } /** * @param {?} addon * @param {?=} parentName * @param {?=} parentIcon * @return {?} */ function createSalesAddon(addon, parentName, parentIcon) { return { parentId: addon.appId, addonId: addon.addonId, name: addon.title, tagline: addon.tagline || '', icon: addon.icon || '', multipleActivations: addon.multipleActivations, parentIcon: parentIcon || '', parentName: parentName || '' }; } /** * @param {?} pkg * @param {?} products * @param {?} addons * @param {?} activationStatus * @return {?} */ function createSalesPackageWithStatus(pkg, products, addons, activationStatus) { return { formattedPrices: pkg.formattedPrices, packageId: pkg.packageId, name: pkg.name, icon: pkg.icon, productIds: pkg.productIds, products: products || [], addonsWithNoParent: addons || [], activationStatus: activationStatus || null, totalAddons: pkg.totalAddons }; } /** * @param {?} product * @param {?} addons * @param {?} activationStatus * @return {?} */ function createSalesProductWithStatus(product, addons, activationStatus) { return { formattedPrices: product.formattedPrices, productId: product.productId, name: product.name, editionId: product.editionId, editionName: product.editionName, tagline: product.tagline, icon: product.icon, addons: addons || [], activationStatus: activationStatus || null }; } /** * @param {?} addon * @param {?} activationStatus * @return {?} */ function createSalesAddonWithStatus(addon, activationStatus) { return { parentId: addon.parentId, addonId: addon.addonId, name: addon.name, tagline: addon.tagline, icon: addon.icon, parentIcon: addon.parentIcon, parentName: addon.parentName, multipleActivations: addon.multipleActivations, activationStatus: activationStatus || null }; } /** * @param {?} salesPackages * @param {?} statuses * @return {?} */ export function addStatusesToSalesPackages(salesPackages, statuses) { if (!statuses || statuses.length === 0) { return salesPackages; } return salesPackages.map(salesPackage => { /** @type {?} */ const newProducts = salesPackage.products.map(product => addStatusesToSalesProduct(product, statuses)); /** @type {?} */ const newAddonsWithNoParent = salesPackage.addonsWithNoParent.map(addon => { /** @type {?} */ const status = findStatus(statuses, addon.addonId, addon.multipleActivations); return addStatusesToSalesAddon(addon, status); }); /** @type {?} */ const productStatuses = newProducts .map(product => product.activationStatus.status); /** @type {?} */ const addonStatuses = newProducts .map(product => product.addons ? product.addons.map(addon => addon.activationStatus.status) : []) .reduce((statusList, reducedList) => reducedList.concat(statusList), []); /** @type {?} */ const addonsWithNoParentStatuses = newAddonsWithNoParent .map(addon => addon.activationStatus ? addon.activationStatus.status : null); /** @type {?} */ const allStatuses = [...productStatuses, ...addonStatuses, ...addonsWithNoParentStatuses]; /** @type {?} */ const packageStatus = convertNumberToActivationStatus(Math.max(...allStatuses)); /** @type {?} */ const statusNotification = createStatusNotificationItemForPackage(packageStatus); return createSalesPackageWithStatus(salesPackage, newProducts, newAddonsWithNoParent, statusNotification); }); } /** * @param {?} product * @param {?} statuses * @return {?} */ export function addStatusesToSalesProduct(product, statuses) { /** @type {?} */ const productStatus = findStatus(statuses, product.productId, false); /** @type {?} */ const statusNotification = createStatusNotificationItemForPackageItem(productStatus); if (!product.addons) { return createSalesProductWithStatus(product, null, statusNotification); } /** @type {?} */ const newSalesAddons = product.addons.map(addon => { /** @type {?} */ const addonStatus = findStatus(statuses, addon.addonId, addon.multipleActivations); return addStatusesToSalesAddon(addon, addonStatus); }); return createSalesProductWithStatus(product, newSalesAddons, statusNotification); } /** * @param {?} addon * @param {?} status * @return {?} */ function addStatusesToSalesAddon(addon, status) { /** @type {?} */ const addonStatusNotification = createStatusNotificationItemForPackageItem(status); return createSalesAddonWithStatus(addon, addonStatusNotification); } /** * @param {?} statuses * @param {?} id * @param {?} removeIndex * @return {?} */ function findStatus(statuses, id, removeIndex) { if (!statuses || statuses.length <= 0) { return null; } /** @type {?} */ const statusIndex = statuses.findIndex(s => { return s.packageItemId === id; }); if (statusIndex < 0) { return null; } /** @type {?} */ const status = statuses[statusIndex].status; if (removeIndex) { statuses.splice(statusIndex, 1); } return status; } /** * @param {?} status * @return {?} */ function createStatusNotificationItemForPackageItem(status) { switch (status) { case ActivationStatus.SUCCESS: return { icon: 'check_circle', status: status, text: 'Activated' }; case ActivationStatus.WARNING: return { icon: 'warning', status: status, text: 'Already Activated' }; default: return { icon: 'error', status: status, text: 'Activation Errors' }; } } /** * @param {?} status * @return {?} */ function createStatusNotificationItemForPackage(status) { switch (status) { case ActivationStatus.SUCCESS: return { icon: 'check_circle', status: status, text: 'Activated' }; case ActivationStatus.WARNING: return { icon: 'warning', status: status, text: 'Activation Warnings' }; default: return { icon: 'error', status: status, text: 'Activation Errors Occured' }; } } /** * @param {?} number * @return {?} */ function convertNumberToActivationStatus(number) { switch (number) { case 0: return ActivationStatus.SUCCESS; case 1: return ActivationStatus.WARNING; default: return ActivationStatus.ERROR; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FsZXMtcGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B2ZW5kYXN0YS9zdG9yZS8iLCJzb3VyY2VzIjpbImxpYi9wYWNrYWdlLWRyb3Bkb3duL3NhbGVzLXBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBLGtDQVVDOzs7SUFUQyx1Q0FBd0I7O0lBQ3hCLGlDQUFrQjs7SUFDbEIsNEJBQWE7O0lBQ2IsNEJBQWE7O0lBQ2Isa0NBQXFCOztJQUNyQixnQ0FBeUI7O0lBQ3pCLDBDQUFpQzs7SUFDakMsbUNBQW9COztJQUNwQix3Q0FBMEM7Ozs7O0FBRzVDLGtDQVVDOzs7SUFUQyx1Q0FBd0I7O0lBQ3hCLGlDQUFrQjs7SUFDbEIsNEJBQWE7O0lBQ2IsNEJBQWE7O0lBQ2IsK0JBQWdCOztJQUNoQix3Q0FBMEM7O0lBQzFDLGlDQUFtQjs7SUFDbkIsbUNBQXFCOztJQUNyQiw4QkFBcUI7Ozs7O0FBR3ZCLGdDQVVDOzs7SUFUQyw4QkFBaUI7O0lBQ2pCLDZCQUFnQjs7SUFDaEIsMEJBQWE7O0lBQ2IsMEJBQWE7O0lBQ2IsNkJBQWdCOztJQUNoQixnQ0FBbUI7O0lBQ25CLGdDQUFtQjs7SUFDbkIseUNBQTZCOztJQUM3QixzQ0FBMEM7Ozs7O0FBRzVDLGlEQUdDOzs7SUFGQyxvREFBc0I7O0lBQ3RCLDZDQUF5Qjs7OztJQUl6QixVQUFXO0lBQ1gsVUFBVztJQUNYLFFBQVM7Ozs7Ozs7OztBQUdYLDRDQUlDOzs7SUFIQyxzQ0FBYTs7SUFDYixzQ0FBYTs7SUFDYix3Q0FBd0I7Ozs7Ozs7O0FBRzFCLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxRQUFtQixFQUFFLFFBQW1CLEVBQUUsTUFBZTtJQUMxRixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3BDLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFDRCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyw0QkFB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QUFnQixDQUFDLEtBQUssQ0FBQztLQUNqQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9kdWN0LCBQYWNrYWdlIH0gZnJvbSAnLi4vJztcbmltcG9ydCB7IEFkZG9uLCBBZGRvbktleSB9IGZyb20gJ0B2ZW5kYXN0YS9jb3JlL21hcmtldHBsYWNlLXBhY2thZ2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBTYWxlc1BhY2thZ2Uge1xuICBmb3JtYXR0ZWRQcmljZXM6IHN0cmluZztcbiAgcGFja2FnZUlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaWNvbjogc3RyaW5nO1xuICBwcm9kdWN0SWRzOiBzdHJpbmdbXTtcbiAgcHJvZHVjdHM6IFNhbGVzUHJvZHVjdFtdO1xuICBhZGRvbnNXaXRoTm9QYXJlbnQ6IFNhbGVzQWRkb25bXTtcbiAgdG90YWxBZGRvbnM6IG51bWJlcjtcbiAgYWN0aXZhdGlvblN0YXR1cz86IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FsZXNQcm9kdWN0IHtcbiAgZm9ybWF0dGVkUHJpY2VzOiBzdHJpbmc7XG4gIHByb2R1Y3RJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgdGFnbGluZTogc3RyaW5nO1xuICBhY3RpdmF0aW9uU3RhdHVzPzogU3RhdHVzTm90aWZpY2F0aW9uSXRlbTtcbiAgZWRpdGlvbklkPzogc3RyaW5nO1xuICBlZGl0aW9uTmFtZT86IHN0cmluZztcbiAgYWRkb25zOiBTYWxlc0FkZG9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FsZXNBZGRvbiB7XG4gIHBhcmVudElkOiBzdHJpbmc7XG4gIGFkZG9uSWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIHRhZ2xpbmU6IHN0cmluZztcbiAgcGFyZW50TmFtZTogc3RyaW5nO1xuICBwYXJlbnRJY29uOiBzdHJpbmc7XG4gIG11bHRpcGxlQWN0aXZhdGlvbnM6IGJvb2xlYW47XG4gIGFjdGl2YXRpb25TdGF0dXM/OiBTdGF0dXNOb3RpZmljYXRpb25JdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1cyB7XG4gIHBhY2thZ2VJdGVtSWQ6IHN0cmluZztcbiAgc3RhdHVzOiBBY3RpdmF0aW9uU3RhdHVzO1xufVxuXG5leHBvcnQgZW51bSBBY3RpdmF0aW9uU3RhdHVzIHtcbiAgU1VDQ0VTUyA9IDAsXG4gIFdBUk5JTkcgPSAxLFxuICBFUlJPUiA9IDJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgaWNvbjogc3RyaW5nLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHN0YXR1czogQWN0aXZhdGlvblN0YXR1c1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc1BhY2thZ2VzKHBhY2thZ2VzOiBQYWNrYWdlW10sIHByb2R1Y3RzOiBQcm9kdWN0W10sIGFkZG9uczogQWRkb25bXSk6IFNhbGVzUGFja2FnZVtdIHtcbiAgaWYgKCFwYWNrYWdlcyB8fCBwYWNrYWdlcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBwYWNrYWdlcy5tYXAocGtnID0+IGJ1aWxkU2FsZXNQYWNrYWdlRnJvbVBhY2thZ2UocGtnLCBwcm9kdWN0cywgYWRkb25zKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2FsZXNQYWNrYWdlRnJvbVBhY2thZ2UocGtnOiBQYWNrYWdlLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1BhY2thZ2Uge1xuICBpZiAoIXBrZykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc2FsZXNQcm9kdWN0cyA9IGJ1aWxkU2FsZXNQcm9kdWN0cyhwa2csIHByb2R1Y3RzLCBhZGRvbnMpO1xuICAvLyBBZGRvbnMgY2FuIGJlIGluIGEgcGFja2FnZSBldmVuIGlmIHRoZSBwYXJlbnQgcHJvZHVjdCBpcyBub3QsIHRoaXMgd2lsbCBjcmVhdGUgc2FsZXNBZGRvbnMgd2l0aCBubyBwYXJlbnRcbiAgY29uc3QgYWRkb25zV2l0aE5vUGFyZW50OiBTYWxlc0FkZG9uW10gPSBidWlsZFNhbGVzQWRkb25zV2l0aE5vUGFyZW50KHBrZywgcHJvZHVjdHMsIGFkZG9ucyk7XG5cbiAgcmV0dXJuIGNyZWF0ZVNhbGVzUGFja2FnZShwa2csIHNhbGVzUHJvZHVjdHMsIGFkZG9uc1dpdGhOb1BhcmVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNhbGVzUHJvZHVjdHMocGtnOiBQYWNrYWdlLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1Byb2R1Y3RbXSB7XG4gIGlmICghKHByb2R1Y3RzICYmIHByb2R1Y3RzLmxlbmd0aCAmJiBwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLmxlbmd0aCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcHJvZHVjdE1hcDogTWFwPHN0cmluZywgUHJvZHVjdD4gPSBuZXcgTWFwPHN0cmluZywgUHJvZHVjdD4oKTtcbiAgcHJvZHVjdHMuZm9yRWFjaChwcm9kdWN0ID0+IHByb2R1Y3RNYXAuc2V0KHByb2R1Y3QucHJvZHVjdElkLCBwcm9kdWN0KSk7XG4gIHJldHVybiBwa2cucHJvZHVjdHNcbiAgICAubWFwKHByb2R1Y3RJZCA9PiB7XG4gICAgICBjb25zdCBwcm9kdWN0TWF0Y2g6IFByb2R1Y3QgPSBwcm9kdWN0TWFwLmdldChwcm9kdWN0SWQpO1xuICAgICAgY29uc3QgYWRkb25zSW5QYWNrYWdlID0gY29lcmNlQWRkb25zRm9yQWRkb25LZXlzKGFkZG9ucywgcGtnLmFkZG9uX2tleXMpO1xuICAgICAgcmV0dXJuIHByb2R1Y3RNYXRjaCA/IGJ1aWxkU2FsZXNQcm9kdWN0RnJvbVByb2R1Y3QocHJvZHVjdE1hdGNoLCBhZGRvbnNJblBhY2thZ2UpIDogbnVsbDtcbiAgICB9KVxuICAgIC5maWx0ZXIocHJvZHVjdEl0ZW0gPT4gcHJvZHVjdEl0ZW0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlQWRkb25zRm9yQWRkb25LZXlzKGFkZG9uczogQWRkb25bXSwgYWRkb25LZXlzOiBBZGRvbktleVtdKTogQWRkb25bXSB7XG4gIGlmICghYWRkb25zIHx8IGFkZG9ucy5sZW5ndGggPT09IDAgfHwgIWFkZG9uS2V5cyB8fCBhZGRvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIGFkZG9ucy5yZWR1Y2UoKGFkZG9uc0FycmF5LCBhZGRvbikgPT4ge1xuICAgIGNvbnN0IGtleSA9IGFkZG9uS2V5cy5maW5kKGsgPT4gay5hZGRvbklkID09PSBhZGRvbi5hZGRvbklkKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBjb25zdCBxdWFudGl0eSA9IGtleS5xdWFudGl0eSB8fCAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFudGl0eTsgaSsrKSB7XG4gICAgICAgIGFkZG9uc0FycmF5LnB1c2goYWRkb24pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZGRvbnNBcnJheTtcbiAgfSwgW10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc0FkZG9uc1dpdGhOb1BhcmVudChwa2c6IFBhY2thZ2UsIHByb2R1Y3RzOiBQcm9kdWN0W10sIGFkZG9uczogQWRkb25bXSk6IFNhbGVzQWRkb25bXSB7XG4gIGlmICghYWRkb25zIHx8IGFkZG9ucy5sZW5ndGggPCAxIHx8ICFwa2cuYWRkb25fa2V5cykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9kdWN0TWFwOiBNYXA8c3RyaW5nLCBQcm9kdWN0PiA9IG5ldyBNYXA8c3RyaW5nLCBQcm9kdWN0PigpO1xuICBwcm9kdWN0cy5mb3JFYWNoKHByb2R1Y3QgPT4gcHJvZHVjdE1hcC5zZXQocHJvZHVjdC5wcm9kdWN0SWQsIHByb2R1Y3QpKTtcbiAgY29uc3QgYWRkb25zTWFwOiBNYXA8c3RyaW5nLCBBZGRvbj4gPSBuZXcgTWFwPHN0cmluZywgQWRkb24+KCk7XG4gIGFkZG9ucy5mb3JFYWNoKGFkZG9uID0+IGFkZG9uc01hcC5zZXQoYWRkb24uYWRkb25JZCwgYWRkb24pKTtcblxuICBjb25zdCBhZGRvbnNXaXRoTm9QYXJlbnQgPSBwa2cuYWRkb25fa2V5cy5yZWR1Y2U8U2FsZXNBZGRvbltdPigoYWRkb25BcnJheTogU2FsZXNBZGRvbltdLCBhZGRvbktleTogQWRkb25LZXkpOiBTYWxlc0FkZG9uW10gPT4ge1xuICAgIGlmIChwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLnNvbWUocHJvZHVjdElkID0+IHByb2R1Y3RJZCA9PT0gYWRkb25LZXkuYXBwSWQpKSB7XG4gICAgICByZXR1cm4gYWRkb25BcnJheSB8fCBbXTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UHJvZHVjdCA9IHByb2R1Y3RNYXAuZ2V0KGFkZG9uS2V5LmFwcElkKTtcbiAgICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50UHJvZHVjdCA/IHBhcmVudFByb2R1Y3QubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcGFyZW50SWNvbiA9IHBhcmVudFByb2R1Y3QgPyBwYXJlbnRQcm9kdWN0Lmljb25VcmwgOiBudWxsO1xuICAgIGNvbnN0IHF1YW50aXR5ID0gYWRkb25LZXkucXVhbnRpdHkgfHwgMTtcbiAgICBjb25zdCBhZGRvbjogQWRkb24gPSBhZGRvbnNNYXAuZ2V0KGFkZG9uS2V5LmFkZG9uSWQpOyAvLyBjb3VsZCBiZSB1bmRlZmluZWRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXR5OyBpKyspIHtcbiAgICAgIGFkZG9uQXJyYXkucHVzaChjcmVhdGVTYWxlc0FkZG9uKGFkZG9uLCBwYXJlbnROYW1lLCBwYXJlbnRJY29uKSk7XG4gICAgfVxuICAgIHJldHVybiBhZGRvbkFycmF5O1xuICB9LCBbXSk7XG4gIHJldHVybiBhZGRvbnNXaXRoTm9QYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNhbGVzUHJvZHVjdEZyb21Qcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QsIGFkZG9uczogQWRkb25bXSk6IFNhbGVzUHJvZHVjdCB7XG4gIGlmICghcHJvZHVjdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghYWRkb25zIHx8IGFkZG9ucy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVNhbGVzUHJvZHVjdChwcm9kdWN0LCBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IHByb2R1Y3RBZGRvbnMgPSBhZGRvbnMuZmlsdGVyKGFkZG9uID0+IGFkZG9uLmFwcElkID09PSBwcm9kdWN0LnByb2R1Y3RJZCk7XG4gIGNvbnN0IHNhbGVzQWRkb25zID0gY3JlYXRlU2FsZXNBZGRvbnMocHJvZHVjdEFkZG9ucyk7XG4gIHJldHVybiBjcmVhdGVTYWxlc1Byb2R1Y3QocHJvZHVjdCwgc2FsZXNBZGRvbnMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc1BhY2thZ2UocGtnOiBQYWNrYWdlLCBzYWxlc1Byb2R1Y3RzOiBTYWxlc1Byb2R1Y3RbXSwgYWRkb25zV2l0aE5vUGFyZW50OiBTYWxlc0FkZG9uW10pOiBTYWxlc1BhY2thZ2Uge1xuICBsZXQgdG90YWxBZGRvbnMgPSAwO1xuICBmb3IgKGNvbnN0IGtleSBvZiBwa2cuYWRkb25fa2V5cyB8fCBbXSkge1xuICAgIHRvdGFsQWRkb25zICs9IGtleS5xdWFudGl0eSB8fCAxO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXR0ZWRQcmljZXM6IHBrZy5mb3JtYXR0ZWRQcmljaW5nTGlzdC5qb2luKCcsICcpLFxuICAgIHBhY2thZ2VJZDogcGtnLnNvbHV0aW9uX2lkLFxuICAgIG5hbWU6IHBrZy5uYW1lLFxuICAgIGljb246IHBrZy5pY29uLFxuICAgIHByb2R1Y3RJZHM6IHBrZy5wcm9kdWN0cyxcbiAgICBwcm9kdWN0czogc2FsZXNQcm9kdWN0cyB8fCBbXSxcbiAgICBhZGRvbnNXaXRoTm9QYXJlbnQ6IGFkZG9uc1dpdGhOb1BhcmVudCB8fCBbXSxcbiAgICB0b3RhbEFkZG9uczogdG90YWxBZGRvbnNcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc1Byb2R1Y3QocHJvZHVjdDogUHJvZHVjdCwgc2FsZXNBZGRvbnM6IFNhbGVzQWRkb25bXSk6IFNhbGVzUHJvZHVjdCB7XG4gIHJldHVybiB7XG4gICAgZm9ybWF0dGVkUHJpY2VzOiBwcm9kdWN0LmZvcm1hdHRlZFByaWNpbmdMaXN0LmpvaW4oJywgJyksXG4gICAgcHJvZHVjdElkOiBwcm9kdWN0LnByb2R1Y3RJZCxcbiAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgdGFnbGluZTogcHJvZHVjdC50YWdsaW5lIHx8ICcnLFxuICAgIGljb246IHByb2R1Y3QuaWNvblVybCxcbiAgICBhZGRvbnM6IHNhbGVzQWRkb25zIHx8IFtdLFxuICAgIGVkaXRpb25JZDogcHJvZHVjdC5lZGl0aW9uSWQsXG4gICAgZWRpdGlvbk5hbWU6IHByb2R1Y3QuZWRpdGlvbk5hbWUsXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNBZGRvbnMoYWRkb25zOiBBZGRvbltdKTogU2FsZXNBZGRvbltdIHtcbiAgcmV0dXJuIGFkZG9ucy5tYXAoYWRkb24gPT4gY3JlYXRlU2FsZXNBZGRvbihhZGRvbikpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc0FkZG9uKGFkZG9uOiBBZGRvbiwgcGFyZW50TmFtZT86IHN0cmluZywgcGFyZW50SWNvbj86IHN0cmluZyk6IFNhbGVzQWRkb24ge1xuICByZXR1cm4ge1xuICAgIHBhcmVudElkOiBhZGRvbi5hcHBJZCxcbiAgICBhZGRvbklkOiBhZGRvbi5hZGRvbklkLFxuICAgIG5hbWU6IGFkZG9uLnRpdGxlLFxuICAgIHRhZ2xpbmU6IGFkZG9uLnRhZ2xpbmUgfHwgJycsXG4gICAgaWNvbjogYWRkb24uaWNvbiB8fCAnJyxcbiAgICBtdWx0aXBsZUFjdGl2YXRpb25zOiBhZGRvbi5tdWx0aXBsZUFjdGl2YXRpb25zLFxuICAgIHBhcmVudEljb246IHBhcmVudEljb24gfHwgJycsXG4gICAgcGFyZW50TmFtZTogcGFyZW50TmFtZSB8fCAnJ1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbGVzUGFja2FnZVdpdGhTdGF0dXMocGtnOiBTYWxlc1BhY2thZ2UsIHByb2R1Y3RzOiBTYWxlc1Byb2R1Y3RbXSwgYWRkb25zOiBTYWxlc0FkZG9uW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TdGF0dXM6IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW0pOiBTYWxlc1BhY2thZ2Uge1xuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0dGVkUHJpY2VzOiBwa2cuZm9ybWF0dGVkUHJpY2VzLFxuICAgIHBhY2thZ2VJZDogcGtnLnBhY2thZ2VJZCxcbiAgICBuYW1lOiBwa2cubmFtZSxcbiAgICBpY29uOiBwa2cuaWNvbixcbiAgICBwcm9kdWN0SWRzOiBwa2cucHJvZHVjdElkcyxcbiAgICBwcm9kdWN0czogcHJvZHVjdHMgfHwgW10sXG4gICAgYWRkb25zV2l0aE5vUGFyZW50OiBhZGRvbnMgfHwgW10sXG4gICAgYWN0aXZhdGlvblN0YXR1czogYWN0aXZhdGlvblN0YXR1cyB8fCBudWxsLFxuICAgIHRvdGFsQWRkb25zOiBwa2cudG90YWxBZGRvbnNcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc1Byb2R1Y3RXaXRoU3RhdHVzKHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCwgYWRkb25zOiBTYWxlc0FkZG9uW10sIGFjdGl2YXRpb25TdGF0dXM6IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW0pOiBTYWxlc1Byb2R1Y3Qge1xuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlZFByaWNlczogcHJvZHVjdC5mb3JtYXR0ZWRQcmljZXMsXG4gICAgcHJvZHVjdElkOiBwcm9kdWN0LnByb2R1Y3RJZCxcbiAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgZWRpdGlvbklkOiBwcm9kdWN0LmVkaXRpb25JZCxcbiAgICBlZGl0aW9uTmFtZTogcHJvZHVjdC5lZGl0aW9uTmFtZSxcbiAgICB0YWdsaW5lOiBwcm9kdWN0LnRhZ2xpbmUsXG4gICAgaWNvbjogcHJvZHVjdC5pY29uLFxuICAgIGFkZG9uczogYWRkb25zIHx8IFtdLFxuICAgIGFjdGl2YXRpb25TdGF0dXM6IGFjdGl2YXRpb25TdGF0dXMgfHwgbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc0FkZG9uV2l0aFN0YXR1cyhhZGRvbjogU2FsZXNBZGRvbiwgYWN0aXZhdGlvblN0YXR1czogU3RhdHVzTm90aWZpY2F0aW9uSXRlbSk6IFNhbGVzQWRkb24ge1xuICByZXR1cm4ge1xuICAgIHBhcmVudElkOiBhZGRvbi5wYXJlbnRJZCxcbiAgICBhZGRvbklkOiBhZGRvbi5hZGRvbklkLFxuICAgIG5hbWU6IGFkZG9uLm5hbWUsXG4gICAgdGFnbGluZTogYWRkb24udGFnbGluZSxcbiAgICBpY29uOiBhZGRvbi5pY29uLFxuICAgIHBhcmVudEljb246IGFkZG9uLnBhcmVudEljb24sXG4gICAgcGFyZW50TmFtZTogYWRkb24ucGFyZW50TmFtZSxcbiAgICBtdWx0aXBsZUFjdGl2YXRpb25zOiBhZGRvbi5tdWx0aXBsZUFjdGl2YXRpb25zLFxuICAgIGFjdGl2YXRpb25TdGF0dXM6IGFjdGl2YXRpb25TdGF0dXMgfHwgbnVsbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTdGF0dXNlc1RvU2FsZXNQYWNrYWdlcyhzYWxlc1BhY2thZ2VzOiBTYWxlc1BhY2thZ2VbXSwgc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdKTogU2FsZXNQYWNrYWdlW10ge1xuICBpZiAoIXN0YXR1c2VzIHx8IHN0YXR1c2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBzYWxlc1BhY2thZ2VzO1xuICB9XG5cbiAgcmV0dXJuIHNhbGVzUGFja2FnZXMubWFwKHNhbGVzUGFja2FnZSA9PiB7XG4gICAgY29uc3QgbmV3UHJvZHVjdHMgPSBzYWxlc1BhY2thZ2UucHJvZHVjdHMubWFwKHByb2R1Y3QgPT4gYWRkU3RhdHVzZXNUb1NhbGVzUHJvZHVjdChwcm9kdWN0LCBzdGF0dXNlcykpO1xuXG4gICAgY29uc3QgbmV3QWRkb25zV2l0aE5vUGFyZW50ID0gc2FsZXNQYWNrYWdlLmFkZG9uc1dpdGhOb1BhcmVudC5tYXAoYWRkb24gPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gZmluZFN0YXR1cyhzdGF0dXNlcywgYWRkb24uYWRkb25JZCwgYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyk7XG4gICAgICByZXR1cm4gYWRkU3RhdHVzZXNUb1NhbGVzQWRkb24oYWRkb24sIHN0YXR1cylcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb2R1Y3RTdGF0dXNlcyA9IG5ld1Byb2R1Y3RzXG4gICAgICAubWFwKHByb2R1Y3QgPT4gcHJvZHVjdC5hY3RpdmF0aW9uU3RhdHVzLnN0YXR1cyk7XG4gICAgY29uc3QgYWRkb25TdGF0dXNlcyA9IG5ld1Byb2R1Y3RzXG4gICAgICAubWFwKHByb2R1Y3QgPT4gcHJvZHVjdC5hZGRvbnMgPyBwcm9kdWN0LmFkZG9ucy5tYXAoYWRkb24gPT4gYWRkb24uYWN0aXZhdGlvblN0YXR1cy5zdGF0dXMpIDogW10pXG4gICAgICAucmVkdWNlKChzdGF0dXNMaXN0LCByZWR1Y2VkTGlzdCkgPT4gcmVkdWNlZExpc3QuY29uY2F0KHN0YXR1c0xpc3QpLCBbXSk7XG4gICAgY29uc3QgYWRkb25zV2l0aE5vUGFyZW50U3RhdHVzZXMgPSBuZXdBZGRvbnNXaXRoTm9QYXJlbnRcbiAgICAgIC5tYXAoYWRkb24gPT4gYWRkb24uYWN0aXZhdGlvblN0YXR1cyA/IGFkZG9uLmFjdGl2YXRpb25TdGF0dXMuc3RhdHVzIDogbnVsbCk7XG4gICAgY29uc3QgYWxsU3RhdHVzZXMgPSBbLi4ucHJvZHVjdFN0YXR1c2VzLCAuLi5hZGRvblN0YXR1c2VzLCAuLi5hZGRvbnNXaXRoTm9QYXJlbnRTdGF0dXNlc107XG5cbiAgICBjb25zdCBwYWNrYWdlU3RhdHVzID0gY29udmVydE51bWJlclRvQWN0aXZhdGlvblN0YXR1cyhNYXRoLm1heCguLi5hbGxTdGF0dXNlcykpO1xuICAgIGNvbnN0IHN0YXR1c05vdGlmaWNhdGlvbiA9IGNyZWF0ZVN0YXR1c05vdGlmaWNhdGlvbkl0ZW1Gb3JQYWNrYWdlKHBhY2thZ2VTdGF0dXMpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZVNhbGVzUGFja2FnZVdpdGhTdGF0dXMoc2FsZXNQYWNrYWdlLCBuZXdQcm9kdWN0cywgbmV3QWRkb25zV2l0aE5vUGFyZW50LCBzdGF0dXNOb3RpZmljYXRpb24pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QocHJvZHVjdDogU2FsZXNQcm9kdWN0LCBzdGF0dXNlczogUGFja2FnZUl0ZW1BY3RpdmF0aW9uU3RhdHVzW10pOiBTYWxlc1Byb2R1Y3Qge1xuICBjb25zdCBwcm9kdWN0U3RhdHVzID0gZmluZFN0YXR1cyhzdGF0dXNlcywgcHJvZHVjdC5wcm9kdWN0SWQsIGZhbHNlKTtcbiAgY29uc3Qgc3RhdHVzTm90aWZpY2F0aW9uID0gY3JlYXRlU3RhdHVzTm90aWZpY2F0aW9uSXRlbUZvclBhY2thZ2VJdGVtKHByb2R1Y3RTdGF0dXMpO1xuICBpZiAoIXByb2R1Y3QuYWRkb25zKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVNhbGVzUHJvZHVjdFdpdGhTdGF0dXMocHJvZHVjdCwgbnVsbCwgc3RhdHVzTm90aWZpY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgbmV3U2FsZXNBZGRvbnMgPSBwcm9kdWN0LmFkZG9ucy5tYXAoYWRkb24gPT4ge1xuICAgIGNvbnN0IGFkZG9uU3RhdHVzID0gZmluZFN0YXR1cyhzdGF0dXNlcywgYWRkb24uYWRkb25JZCwgYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyk7XG4gICAgcmV0dXJuIGFkZFN0YXR1c2VzVG9TYWxlc0FkZG9uKGFkZG9uLCBhZGRvblN0YXR1cylcbiAgfSk7XG5cbiAgcmV0dXJuIGNyZWF0ZVNhbGVzUHJvZHVjdFdpdGhTdGF0dXMocHJvZHVjdCwgbmV3U2FsZXNBZGRvbnMsIHN0YXR1c05vdGlmaWNhdGlvbik7XG59XG5cbmZ1bmN0aW9uIGFkZFN0YXR1c2VzVG9TYWxlc0FkZG9uKGFkZG9uOiBTYWxlc0FkZG9uLCBzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTYWxlc0FkZG9uIHtcbiAgY29uc3QgYWRkb25TdGF0dXNOb3RpZmljYXRpb24gPSBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZUl0ZW0oc3RhdHVzKTtcbiAgcmV0dXJuIGNyZWF0ZVNhbGVzQWRkb25XaXRoU3RhdHVzKGFkZG9uLCBhZGRvblN0YXR1c05vdGlmaWNhdGlvbik7XG59XG5cbmZ1bmN0aW9uIGZpbmRTdGF0dXMoc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdLCBpZDogc3RyaW5nLCByZW1vdmVJbmRleDogYm9vbGVhbik6IEFjdGl2YXRpb25TdGF0dXMge1xuICBpZiAoIXN0YXR1c2VzIHx8IHN0YXR1c2VzLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBzdGF0dXNJbmRleCA9IHN0YXR1c2VzLmZpbmRJbmRleChzID0+IHtcbiAgICByZXR1cm4gcy5wYWNrYWdlSXRlbUlkID09PSBpZDtcbiAgfSk7XG4gIGlmIChzdGF0dXNJbmRleCA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzdGF0dXMgPSBzdGF0dXNlc1tzdGF0dXNJbmRleF0uc3RhdHVzO1xuICBpZiAocmVtb3ZlSW5kZXgpIHtcbiAgICBzdGF0dXNlcy5zcGxpY2Uoc3RhdHVzSW5kZXgsIDEpO1xuICB9XG4gIHJldHVybiBzdGF0dXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXR1c05vdGlmaWNhdGlvbkl0ZW1Gb3JQYWNrYWdlSXRlbShzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIEFjdGl2YXRpb25TdGF0dXMuU1VDQ0VTUzpcbiAgICAgIHJldHVybiB7aWNvbjogJ2NoZWNrX2NpcmNsZScsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGVkJ307XG4gICAgY2FzZSBBY3RpdmF0aW9uU3RhdHVzLldBUk5JTkc6XG4gICAgICByZXR1cm4ge2ljb246ICd3YXJuaW5nJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdBbHJlYWR5IEFjdGl2YXRlZCd9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge2ljb246ICdlcnJvcicsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGlvbiBFcnJvcnMnfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZShzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIEFjdGl2YXRpb25TdGF0dXMuU1VDQ0VTUzpcbiAgICAgIHJldHVybiB7aWNvbjogJ2NoZWNrX2NpcmNsZScsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGVkJ307XG4gICAgY2FzZSBBY3RpdmF0aW9uU3RhdHVzLldBUk5JTkc6XG4gICAgICByZXR1cm4ge2ljb246ICd3YXJuaW5nJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdBY3RpdmF0aW9uIFdhcm5pbmdzJ307XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7aWNvbjogJ2Vycm9yJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdBY3RpdmF0aW9uIEVycm9ycyBPY2N1cmVkJ307XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydE51bWJlclRvQWN0aXZhdGlvblN0YXR1cyhudW1iZXI6IE51bWJlcik6IEFjdGl2YXRpb25TdGF0dXMge1xuICBzd2l0Y2ggKG51bWJlcikge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBBY3RpdmF0aW9uU3RhdHVzLlNVQ0NFU1M7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIEFjdGl2YXRpb25TdGF0dXMuV0FSTklORztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEFjdGl2YXRpb25TdGF0dXMuRVJST1I7XG4gIH1cbn1cbiJdfQ==