@vendasta/store
Version:
Components and data for Store
495 lines • 44 kB
JavaScript
/**
* @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FsZXMtcGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B2ZW5kYXN0YS9zdG9yZS8iLCJzb3VyY2VzIjpbImxpYi9wYWNrYWdlLWRyb3Bkb3duL3NhbGVzLXBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBLGtDQVVDOzs7SUFUQyx1Q0FBd0I7O0lBQ3hCLGlDQUFrQjs7SUFDbEIsNEJBQWE7O0lBQ2IsNEJBQWE7O0lBQ2Isa0NBQXFCOztJQUNyQixnQ0FBeUI7O0lBQ3pCLDBDQUFpQzs7SUFDakMsbUNBQW9COztJQUNwQix3Q0FBMEM7Ozs7O0FBRzVDLGtDQVVDOzs7SUFUQyx1Q0FBd0I7O0lBQ3hCLGlDQUFrQjs7SUFDbEIsNEJBQWE7O0lBQ2IsNEJBQWE7O0lBQ2IsK0JBQWdCOztJQUNoQix3Q0FBMEM7O0lBQzFDLGlDQUFtQjs7SUFDbkIsbUNBQXFCOztJQUNyQiw4QkFBcUI7Ozs7O0FBR3ZCLGdDQVVDOzs7SUFUQyw4QkFBaUI7O0lBQ2pCLDZCQUFnQjs7SUFDaEIsMEJBQWE7O0lBQ2IsMEJBQWE7O0lBQ2IsNkJBQWdCOztJQUNoQixnQ0FBbUI7O0lBQ25CLGdDQUFtQjs7SUFDbkIseUNBQTZCOztJQUM3QixzQ0FBMEM7Ozs7O0FBRzVDLGlEQUdDOzs7SUFGQyxvREFBc0I7O0lBQ3RCLDZDQUF5Qjs7OztJQUl6QixVQUFXO0lBQ1gsVUFBVztJQUNYLFFBQVM7Ozs7Ozs7OztBQUdYLDRDQUlDOzs7SUFIQyxzQ0FBYTs7SUFDYixzQ0FBYTs7SUFDYix3Q0FBd0I7Ozs7Ozs7O0FBRzFCLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxRQUFtQixFQUFFLFFBQW1CLEVBQUUsTUFBZTtJQUMxRixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3BDLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFDRCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDbEYsQ0FBQzs7Ozs7OztBQUVELFNBQVMsNEJBQTRCLENBQUMsR0FBWSxFQUFFLFFBQW1CLEVBQUUsTUFBZTtJQUN0RixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1IsT0FBTyxJQUFJLENBQUM7S0FDYjs7VUFFSyxhQUFhLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7OztVQUV6RCxrQkFBa0IsR0FBaUIsNEJBQTRCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFFNUYsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDcEUsQ0FBQzs7Ozs7OztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsUUFBbUIsRUFBRSxNQUFlO0lBQ25GLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN6RSxPQUFPLEVBQUUsQ0FBQztLQUNYOztVQUNLLFVBQVUsR0FBeUIsSUFBSSxHQUFHLEVBQW1CO0lBQ25FLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RSxPQUFPLEdBQUcsQ0FBQyxRQUFRO1NBQ2hCLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTs7Y0FDVCxZQUFZLEdBQVksVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7O2NBQ2pELGVBQWUsR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUN4RSxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0YsQ0FBQyxDQUFDO1NBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDeEMsQ0FBQzs7Ozs7O0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE1BQWUsRUFBRSxTQUFxQjtJQUM3RSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzFFLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUU7O2NBQ3BDLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzVELElBQUksR0FBRyxFQUFFOztrQkFDRCxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsSUFBSSxDQUFDO1lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7YUFDeEI7U0FDRjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNULENBQUM7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsNEJBQTRCLENBQUMsR0FBWSxFQUFFLFFBQW1CLEVBQUUsTUFBZTtJQUM3RixJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtRQUNuRCxPQUFPLEVBQUUsQ0FBQztLQUNYOztVQUNLLFVBQVUsR0FBeUIsSUFBSSxHQUFHLEVBQW1CO0lBQ25FLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQzs7VUFDbEUsU0FBUyxHQUF1QixJQUFJLEdBQUcsRUFBaUI7SUFDOUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDOztVQUV2RCxrQkFBa0IsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBZSxDQUFDLFVBQXdCLEVBQUUsUUFBa0IsRUFBZ0IsRUFBRTtRQUM1SCxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hGLE9BQU8sVUFBVSxJQUFJLEVBQUUsQ0FBQztTQUN6Qjs7Y0FDSyxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDOztjQUM5QyxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJOztjQUN0RCxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJOztjQUN6RCxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFDOztjQUNqQyxLQUFLLEdBQVUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3BELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbEU7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ04sT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDOzs7Ozs7QUFFRCxNQUFNLFVBQVUsNEJBQTRCLENBQUMsT0FBZ0IsRUFBRSxNQUFlO0lBQzVFLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDWixPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNoQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUMxQzs7VUFFSyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQzs7VUFDekUsV0FBVyxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztJQUNwRCxPQUFPLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNsRCxDQUFDOzs7Ozs7O0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsYUFBNkIsRUFBRSxrQkFBZ0M7O1FBQ25HLFdBQVcsR0FBRyxDQUFDO0lBQ25CLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUU7UUFDdEMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDO0tBQ2xDO0lBRUQsT0FBTztRQUNMLGVBQWUsRUFBRSxHQUFHLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNwRCxTQUFTLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDMUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxhQUFhLElBQUksRUFBRTtRQUM3QixrQkFBa0IsRUFBRSxrQkFBa0IsSUFBSSxFQUFFO1FBQzVDLFdBQVcsRUFBRSxXQUFXO0tBQ3pCLENBQUE7QUFDSCxDQUFDOzs7Ozs7QUFFRCxTQUFTLGtCQUFrQixDQUFDLE9BQWdCLEVBQUUsV0FBeUI7SUFDckUsT0FBTztRQUNMLGVBQWUsRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN4RCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUU7UUFDOUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3JCLE1BQU0sRUFBRSxXQUFXLElBQUksRUFBRTtRQUN6QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO0tBQ2pDLENBQUE7QUFDSCxDQUFDOzs7OztBQUVELFNBQVMsaUJBQWlCLENBQUMsTUFBZTtJQUN4QyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7Ozs7Ozs7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQVksRUFBRSxVQUFtQixFQUFFLFVBQW1CO0lBQzlFLE9BQU87UUFDTCxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDckIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSztRQUNqQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFO1FBQzVCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUU7UUFDdEIsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtRQUM5QyxVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUU7UUFDNUIsVUFBVSxFQUFFLFVBQVUsSUFBSSxFQUFFO0tBQzdCLENBQUE7QUFDSCxDQUFDOzs7Ozs7OztBQUVELFNBQVMsNEJBQTRCLENBQUMsR0FBaUIsRUFBRSxRQUF3QixFQUFFLE1BQW9CLEVBQ2pFLGdCQUF3QztJQUU1RSxPQUFPO1FBQ0wsZUFBZSxFQUFFLEdBQUcsQ0FBQyxlQUFlO1FBQ3BDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztRQUN4QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDZCxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDMUIsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFO1FBQ3hCLGtCQUFrQixFQUFFLE1BQU0sSUFBSSxFQUFFO1FBQ2hDLGdCQUFnQixFQUFFLGdCQUFnQixJQUFJLElBQUk7UUFDMUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO0tBQzdCLENBQUE7QUFDSCxDQUFDOzs7Ozs7O0FBRUQsU0FBUyw0QkFBNEIsQ0FBQyxPQUFxQixFQUFFLE1BQW9CLEVBQUUsZ0JBQXdDO0lBQ3pILE9BQU87UUFDTCxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7UUFDeEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxFQUFFO1FBQ3BCLGdCQUFnQixFQUFFLGdCQUFnQixJQUFJLElBQUk7S0FDM0MsQ0FBQztBQUNKLENBQUM7Ozs7OztBQUVELFNBQVMsMEJBQTBCLENBQUMsS0FBaUIsRUFBRSxnQkFBd0M7SUFDN0YsT0FBTztRQUNMLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87UUFDdEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7UUFDaEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1FBQzVCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtRQUM1QixtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1FBQzlDLGdCQUFnQixFQUFFLGdCQUFnQixJQUFJLElBQUk7S0FDM0MsQ0FBQTtBQUNILENBQUM7Ozs7OztBQUVELE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxhQUE2QixFQUFFLFFBQXVDO0lBQy9HLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxhQUFhLENBQUM7S0FDdEI7SUFFRCxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUU7O2NBQ2hDLFdBQVcsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQzs7Y0FFaEcscUJBQXFCLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTs7a0JBQ2xFLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBQzdFLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQy9DLENBQUMsQ0FBQzs7Y0FFSSxlQUFlLEdBQUcsV0FBVzthQUNoQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDOztjQUM1QyxhQUFhLEdBQUcsV0FBVzthQUM5QixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ2hHLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDOztjQUNwRSwwQkFBMEIsR0FBRyxxQkFBcUI7YUFDckQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7O2NBQ3hFLFdBQVcsR0FBRyxDQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsMEJBQTBCLENBQUM7O2NBRW5GLGFBQWEsR0FBRywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7O2NBQ3pFLGtCQUFrQixHQUFHLHNDQUFzQyxDQUFDLGFBQWEsQ0FBQztRQUVoRixPQUFPLDRCQUE0QixDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUM1RyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7Ozs7OztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxPQUFxQixFQUFFLFFBQXVDOztVQUNoRyxhQUFhLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQzs7VUFDOUQsa0JBQWtCLEdBQUcsMENBQTBDLENBQUMsYUFBYSxDQUFDO0lBQ3BGLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ25CLE9BQU8sNEJBQTRCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0tBQ3ZFOztVQUVLLGNBQWMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTs7Y0FDMUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUM7UUFDbEYsT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDcEQsQ0FBQyxDQUFDO0lBRUYsT0FBTyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDbkYsQ0FBQzs7Ozs7O0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxLQUFpQixFQUFFLE1BQXdCOztVQUNwRSx1QkFBdUIsR0FBRywwQ0FBMEMsQ0FBQyxNQUFNLENBQUM7SUFDbEYsT0FBTywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztBQUNwRSxDQUFDOzs7Ozs7O0FBRUQsU0FBUyxVQUFVLENBQUMsUUFBdUMsRUFBRSxFQUFVLEVBQUUsV0FBb0I7SUFDM0YsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNyQyxPQUFPLElBQUksQ0FBQTtLQUNaOztVQUNLLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2I7O1VBQ0ssTUFBTSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNO0lBQzNDLElBQUksV0FBVyxFQUFFO1FBQ2YsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDakM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDOzs7OztBQUVELFNBQVMsMENBQTBDLENBQUMsTUFBd0I7SUFDMUUsUUFBUSxNQUFNLEVBQUU7UUFDZCxLQUFLLGdCQUFnQixDQUFDLE9BQU87WUFDM0IsT0FBTyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUM7UUFDbkUsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO1lBQzNCLE9BQU8sRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFDLENBQUM7UUFDdEU7WUFDRSxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBQyxDQUFDO0tBQ3JFO0FBQ0gsQ0FBQzs7Ozs7QUFFRCxTQUFTLHNDQUFzQyxDQUFDLE1BQXdCO0lBQ3RFLFFBQVEsTUFBTSxFQUFFO1FBQ2QsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO1lBQzNCLE9BQU8sRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBQyxDQUFDO1FBQ25FLEtBQUssZ0JBQWdCLENBQUMsT0FBTztZQUMzQixPQUFPLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBQyxDQUFDO1FBQ3hFO1lBQ0UsT0FBTyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsMkJBQTJCLEVBQUMsQ0FBQztLQUM3RTtBQUNILENBQUM7Ozs7O0FBRUQsU0FBUywrQkFBK0IsQ0FBQyxNQUFjO0lBQ3JELFFBQVEsTUFBTSxFQUFFO1FBQ2QsS0FBSyxDQUFDO1lBQ0osT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDbEMsS0FBSyxDQUFDO1lBQ0osT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDbEM7WUFDRSxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQztLQUNqQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9kdWN0LCBQYWNrYWdlIH0gZnJvbSAnLi4vJztcbmltcG9ydCB7IEFkZG9uLCBBZGRvbktleSB9IGZyb20gJ0B2ZW5kYXN0YS9jb3JlL21hcmtldHBsYWNlLXBhY2thZ2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBTYWxlc1BhY2thZ2Uge1xuICBmb3JtYXR0ZWRQcmljZXM6IHN0cmluZztcbiAgcGFja2FnZUlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaWNvbjogc3RyaW5nO1xuICBwcm9kdWN0SWRzOiBzdHJpbmdbXTtcbiAgcHJvZHVjdHM6IFNhbGVzUHJvZHVjdFtdO1xuICBhZGRvbnNXaXRoTm9QYXJlbnQ6IFNhbGVzQWRkb25bXTtcbiAgdG90YWxBZGRvbnM6IG51bWJlcjtcbiAgYWN0aXZhdGlvblN0YXR1cz86IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FsZXNQcm9kdWN0IHtcbiAgZm9ybWF0dGVkUHJpY2VzOiBzdHJpbmc7XG4gIHByb2R1Y3RJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgdGFnbGluZTogc3RyaW5nO1xuICBhY3RpdmF0aW9uU3RhdHVzPzogU3RhdHVzTm90aWZpY2F0aW9uSXRlbTtcbiAgZWRpdGlvbklkPzogc3RyaW5nO1xuICBlZGl0aW9uTmFtZT86IHN0cmluZztcbiAgYWRkb25zOiBTYWxlc0FkZG9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FsZXNBZGRvbiB7XG4gIHBhcmVudElkOiBzdHJpbmc7XG4gIGFkZG9uSWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIHRhZ2xpbmU6IHN0cmluZztcbiAgcGFyZW50TmFtZTogc3RyaW5nO1xuICBwYXJlbnRJY29uOiBzdHJpbmc7XG4gIG11bHRpcGxlQWN0aXZhdGlvbnM6IGJvb2xlYW47XG4gIGFjdGl2YXRpb25TdGF0dXM/OiBTdGF0dXNOb3RpZmljYXRpb25JdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1cyB7XG4gIHBhY2thZ2VJdGVtSWQ6IHN0cmluZztcbiAgc3RhdHVzOiBBY3RpdmF0aW9uU3RhdHVzO1xufVxuXG5leHBvcnQgZW51bSBBY3RpdmF0aW9uU3RhdHVzIHtcbiAgU1VDQ0VTUyA9IDAsXG4gIFdBUk5JTkcgPSAxLFxuICBFUlJPUiA9IDJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgaWNvbjogc3RyaW5nLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHN0YXR1czogQWN0aXZhdGlvblN0YXR1c1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc1BhY2thZ2VzKHBhY2thZ2VzOiBQYWNrYWdlW10sIHByb2R1Y3RzOiBQcm9kdWN0W10sIGFkZG9uczogQWRkb25bXSk6IFNhbGVzUGFja2FnZVtdIHtcbiAgaWYgKCFwYWNrYWdlcyB8fCBwYWNrYWdlcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBwYWNrYWdlcy5tYXAocGtnID0+IGJ1aWxkU2FsZXNQYWNrYWdlRnJvbVBhY2thZ2UocGtnLCBwcm9kdWN0cywgYWRkb25zKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2FsZXNQYWNrYWdlRnJvbVBhY2thZ2UocGtnOiBQYWNrYWdlLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1BhY2thZ2Uge1xuICBpZiAoIXBrZykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc2FsZXNQcm9kdWN0cyA9IGJ1aWxkU2FsZXNQcm9kdWN0cyhwa2csIHByb2R1Y3RzLCBhZGRvbnMpO1xuICAvLyBBZGRvbnMgY2FuIGJlIGluIGEgcGFja2FnZSBldmVuIGlmIHRoZSBwYXJlbnQgcHJvZHVjdCBpcyBub3QsIHRoaXMgd2lsbCBjcmVhdGUgc2FsZXNBZGRvbnMgd2l0aCBubyBwYXJlbnRcbiAgY29uc3QgYWRkb25zV2l0aE5vUGFyZW50OiBTYWxlc0FkZG9uW10gPSBidWlsZFNhbGVzQWRkb25zV2l0aE5vUGFyZW50KHBrZywgcHJvZHVjdHMsIGFkZG9ucyk7XG5cbiAgcmV0dXJuIGNyZWF0ZVNhbGVzUGFja2FnZShwa2csIHNhbGVzUHJvZHVjdHMsIGFkZG9uc1dpdGhOb1BhcmVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNhbGVzUHJvZHVjdHMocGtnOiBQYWNrYWdlLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1Byb2R1Y3RbXSB7XG4gIGlmICghKHByb2R1Y3RzICYmIHByb2R1Y3RzLmxlbmd0aCAmJiBwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLmxlbmd0aCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcHJvZHVjdE1hcDogTWFwPHN0cmluZywgUHJvZHVjdD4gPSBuZXcgTWFwPHN0cmluZywgUHJvZHVjdD4oKTtcbiAgcHJvZHVjdHMuZm9yRWFjaChwcm9kdWN0ID0+IHByb2R1Y3RNYXAuc2V0KHByb2R1Y3QucHJvZHVjdElkLCBwcm9kdWN0KSk7XG4gIHJldHVybiBwa2cucHJvZHVjdHNcbiAgICAubWFwKHByb2R1Y3RJZCA9PiB7XG4gICAgICBjb25zdCBwcm9kdWN0TWF0Y2g6IFByb2R1Y3QgPSBwcm9kdWN0TWFwLmdldChwcm9kdWN0SWQpO1xuICAgICAgY29uc3QgYWRkb25zSW5QYWNrYWdlID0gY29lcmNlQWRkb25zRm9yQWRkb25LZXlzKGFkZG9ucywgcGtnLmFkZG9uX2tleXMpO1xuICAgICAgcmV0dXJuIHByb2R1Y3RNYXRjaCA/IGJ1aWxkU2FsZXNQcm9kdWN0RnJvbVByb2R1Y3QocHJvZHVjdE1hdGNoLCBhZGRvbnNJblBhY2thZ2UpIDogbnVsbDtcbiAgICB9KVxuICAgIC5maWx0ZXIocHJvZHVjdEl0ZW0gPT4gcHJvZHVjdEl0ZW0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlQWRkb25zRm9yQWRkb25LZXlzKGFkZG9uczogQWRkb25bXSwgYWRkb25LZXlzOiBBZGRvbktleVtdKTogQWRkb25bXSB7XG4gIGlmICghYWRkb25zIHx8IGFkZG9ucy5sZW5ndGggPT09IDAgfHwgIWFkZG9uS2V5cyB8fCBhZGRvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIGFkZG9ucy5yZWR1Y2UoKGFkZG9uc0FycmF5LCBhZGRvbikgPT4ge1xuICAgIGNvbnN0IGtleSA9IGFkZG9uS2V5cy5maW5kKGsgPT4gay5hZGRvbklkID09PSBhZGRvbi5hZGRvbklkKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBjb25zdCBxdWFudGl0eSA9IGtleS5xdWFudGl0eSB8fCAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFudGl0eTsgaSsrKSB7XG4gICAgICAgIGFkZG9uc0FycmF5LnB1c2goYWRkb24pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZGRvbnNBcnJheTtcbiAgfSwgW10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc0FkZG9uc1dpdGhOb1BhcmVudChwa2c6IFBhY2thZ2UsIHByb2R1Y3RzOiBQcm9kdWN0W10sIGFkZG9uczogQWRkb25bXSk6IFNhbGVzQWRkb25bXSB7XG4gIGlmICghYWRkb25zIHx8IGFkZG9ucy5sZW5ndGggPCAxIHx8ICFwa2cuYWRkb25fa2V5cykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9kdWN0TWFwOiBNYXA8c3RyaW5nLCBQcm9kdWN0PiA9IG5ldyBNYXA8c3RyaW5nLCBQcm9kdWN0PigpO1xuICBwcm9kdWN0cy5mb3JFYWNoKHByb2R1Y3QgPT4gcHJvZHVjdE1hcC5zZXQocHJvZHVjdC5wcm9kdWN0SWQsIHByb2R1Y3QpKTtcbiAgY29uc3QgYWRkb25zTWFwOiBNYXA8c3RyaW5nLCBBZGRvbj4gPSBuZXcgTWFwPHN0cmluZywgQWRkb24+KCk7XG4gIGFkZG9ucy5mb3JFYWNoKGFkZG9uID0+IGFkZG9uc01hcC5zZXQoYWRkb24uYWRkb25JZCwgYWRkb24pKTtcblxuICBjb25zdCBhZGRvbnNXaXRoTm9QYXJlbnQgPSBwa2cuYWRkb25fa2V5cy5yZWR1Y2U8U2FsZXNBZGRvbltdPigoYWRkb25BcnJheTogU2FsZXNBZGRvbltdLCBhZGRvbktleTogQWRkb25LZXkpOiBTYWxlc0FkZG9uW10gPT4ge1xuICAgIGlmIChwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLnNvbWUocHJvZHVjdElkID0+IHByb2R1Y3RJZCA9PT0gYWRkb25LZXkuYXBwSWQpKSB7XG4gICAgICByZXR1cm4gYWRkb25BcnJheSB8fCBbXTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UHJvZHVjdCA9IHByb2R1Y3RNYXAuZ2V0KGFkZG9uS2V5LmFwcElkKTtcbiAgICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50UHJvZHVjdCA/IHBhcmVudFByb2R1Y3QubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcGFyZW50SWNvbiA9IHBhcmVudFByb2R1Y3QgPyBwYXJlbnRQcm9kdWN0Lmljb25VcmwgOiBudWxsO1xuICAgIGNvbnN0IHF1YW50aXR5ID0gYWRkb25LZXkucXVhbnRpdHkgfHwgMTtcbiAgICBjb25zdCBhZGRvbjogQWRkb24gPSBhZGRvbnNNYXAuZ2V0KGFkZG9uS2V5LmFkZG9uSWQpOyAvLyBjb3VsZCBiZSB1bmRlZmluZWRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXR5OyBpKyspIHtcbiAgICAgIGFkZG9uQXJyYXkucHVzaChjcmVhdGVTYWxlc0FkZG9uKGFkZG9uLCBwYXJlbnROYW1lLCBwYXJlbnRJY29uKSk7XG4gICAgfVxuICAgIHJldHVybiBhZGRvbkFycmF5O1xuICB9LCBbXSk7XG4gIHJldHVybiBhZGRvbnNXaXRoTm9QYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNhbGVzUHJvZHVjdEZyb21Qcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QsIGFkZG9uczogQWRkb25bXSk6IFNhbGVzUHJvZHVjdCB7XG4gIGlmICghcHJvZHVjdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghYWRkb25zIHx8IGFkZG9ucy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVNhbGVzUHJvZHVjdChwcm9kdWN0LCBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IHByb2R1Y3RBZGRvbnMgPSBhZGRvbnMuZmlsdGVyKGFkZG9uID0+IGFkZG9uLmFwcElkID09PSBwcm9kdWN0LnByb2R1Y3RJZCk7XG4gIGNvbnN0IHNhbGVzQWRkb25zID0gY3JlYXRlU2FsZXNBZGRvbnMocHJvZHVjdEFkZG9ucyk7XG4gIHJldHVybiBjcmVhdGVTYWxlc1Byb2R1Y3QocHJvZHVjdCwgc2FsZXNBZGRvbnMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc1BhY2thZ2UocGtnOiBQYWNrYWdlLCBzYWxlc1Byb2R1Y3RzOiBTYWxlc1Byb2R1Y3RbXSwgYWRkb25zV2l0aE5vUGFyZW50OiBTYWxlc0FkZG9uW10pOiBTYWxlc1BhY2thZ2Uge1xuICBsZXQgdG90YWxBZGRvbnMgPSAwO1xuICBmb3IgKGNvbnN0IGtleSBvZiBwa2cuYWRkb25fa2V5cyB8fCBbXSkge1xuICAgIHRvdGFsQWRkb25zICs9IGtleS5xdWFudGl0eSB8fCAxO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXR0ZWRQcmljZXM6IHBrZy5mb3JtYXR0ZWRQcmljaW5nTGlzdC5qb2luKCcsICcpLFxuICAgIHBhY2thZ2VJZDogcGtnLnNvbHV0aW9uX2lkLFxuICAgIG5hbWU6IHBrZy5uYW1lLFxuICAgIGljb246IHBrZy5pY29uLFxuICAgIHByb2R1Y3RJZHM6IHBrZy5wcm9kdWN0cyxcbiAgICBwcm9kdWN0czogc2FsZXNQcm9kdWN0cyB8fCBbXSxcbiAgICBhZGRvbnNXaXRoTm9QYXJlbnQ6IGFkZG9uc1dpdGhOb1BhcmVudCB8fCBbXSxcbiAgICB0b3RhbEFkZG9uczogdG90YWxBZGRvbnNcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc1Byb2R1Y3QocHJvZHVjdDogUHJvZHVjdCwgc2FsZXNBZGRvbnM6IFNhbGVzQWRkb25bXSk6IFNhbGVzUHJvZHVjdCB7XG4gIHJldHVybiB7XG4gICAgZm9ybWF0dGVkUHJpY2VzOiBwcm9kdWN0LmZvcm1hdHRlZFByaWNpbmdMaXN0LmpvaW4oJywgJyksXG4gICAgcHJvZHVjdElkOiBwcm9kdWN0LnByb2R1Y3RJZCxcbiAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgdGFnbGluZTogcHJvZHVjdC50YWdsaW5lIHx8ICcnLFxuICAgIGljb246IHByb2R1Y3QuaWNvblVybCxcbiAgICBhZGRvbnM6IHNhbGVzQWRkb25zIHx8IFtdLFxuICAgIGVkaXRpb25JZDogcHJvZHVjdC5lZGl0aW9uSWQsXG4gICAgZWRpdGlvbk5hbWU6IHByb2R1Y3QuZWRpdGlvbk5hbWUsXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNBZGRvbnMoYWRkb25zOiBBZGRvbltdKTogU2FsZXNBZGRvbltdIHtcbiAgcmV0dXJuIGFkZG9ucy5tYXAoYWRkb24gPT4gY3JlYXRlU2FsZXNBZGRvbihhZGRvbikpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc0FkZG9uKGFkZG9uOiBBZGRvbiwgcGFyZW50TmFtZT86IHN0cmluZywgcGFyZW50SWNvbj86IHN0cmluZyk6IFNhbGVzQWRkb24ge1xuICByZXR1cm4ge1xuICAgIHBhcmVudElkOiBhZGRvbi5hcHBJZCxcbiAgICBhZGRvbklkOiBhZGRvbi5hZGRvbklkLFxuICAgIG5hbWU6IGFkZG9uLnRpdGxlLFxuICAgIHRhZ2xpbmU6IGFkZG9uLnRhZ2xpbmUgfHwgJycsXG4gICAgaWNvbjogYWRkb24uaWNvbiB8fCAnJyxcbiAgICBtdWx0aXBsZUFjdGl2YXRpb25zOiBhZGRvbi5tdWx0aXBsZUFjdGl2YXRpb25zLFxuICAgIHBhcmVudEljb246IHBhcmVudEljb24gfHwgJycsXG4gICAgcGFyZW50TmFtZTogcGFyZW50TmFtZSB8fCAnJ1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbGVzUGFja2FnZVdpdGhTdGF0dXMocGtnOiBTYWxlc1BhY2thZ2UsIHByb2R1Y3RzOiBTYWxlc1Byb2R1Y3RbXSwgYWRkb25zOiBTYWxlc0FkZG9uW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TdGF0dXM6IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW0pOiBTYWxlc1BhY2thZ2Uge1xuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0dGVkUHJpY2VzOiBwa2cuZm9ybWF0dGVkUHJpY2VzLFxuICAgIHBhY2thZ2VJZDogcGtnLnBhY2thZ2VJZCxcbiAgICBuYW1lOiBwa2cubmFtZSxcbiAgICBpY29uOiBwa2cuaWNvbixcbiAgICBwcm9kdWN0SWRzOiBwa2cucHJvZHVjdElkcyxcbiAgICBwcm9kdWN0czogcHJvZHVjdHMgfHwgW10sXG4gICAgYWRkb25zV2l0aE5vUGFyZW50OiBhZGRvbnMgfHwgW10sXG4gICAgYWN0aXZhdGlvblN0YXR1czogYWN0aXZhdGlvblN0YXR1cyB8fCBudWxsLFxuICAgIHRvdGFsQWRkb25zOiBwa2cudG90YWxBZGRvbnNcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc1Byb2R1Y3RXaXRoU3RhdHVzKHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCwgYWRkb25zOiBTYWxlc0FkZG9uW10sIGFjdGl2YXRpb25TdGF0dXM6IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW0pOiBTYWxlc1Byb2R1Y3Qge1xuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlZFByaWNlczogcHJvZHVjdC5mb3JtYXR0ZWRQcmljZXMsXG4gICAgcHJvZHVjdElkOiBwcm9kdWN0LnByb2R1Y3RJZCxcbiAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgZWRpdGlvbklkOiBwcm9kdWN0LmVkaXRpb25JZCxcbiAgICBlZGl0aW9uTmFtZTogcHJvZHVjdC5lZGl0aW9uTmFtZSxcbiAgICB0YWdsaW5lOiBwcm9kdWN0LnRhZ2xpbmUsXG4gICAgaWNvbjogcHJvZHVjdC5pY29uLFxuICAgIGFkZG9uczogYWRkb25zIHx8IFtdLFxuICAgIGFjdGl2YXRpb25TdGF0dXM6IGFjdGl2YXRpb25TdGF0dXMgfHwgbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc0FkZG9uV2l0aFN0YXR1cyhhZGRvbjogU2FsZXNBZGRvbiwgYWN0aXZhdGlvblN0YXR1czogU3RhdHVzTm90aWZpY2F0aW9uSXRlbSk6IFNhbGVzQWRkb24ge1xuICByZXR1cm4ge1xuICAgIHBhcmVudElkOiBhZGRvbi5wYXJlbnRJZCxcbiAgICBhZGRvbklkOiBhZGRvbi5hZGRvbklkLFxuICAgIG5hbWU6IGFkZG9uLm5hbWUsXG4gICAgdGFnbGluZTogYWRkb24udGFnbGluZSxcbiAgICBpY29uOiBhZGRvbi5pY29uLFxuICAgIHBhcmVudEljb246IGFkZG9uLnBhcmVudEljb24sXG4gICAgcGFyZW50TmFtZTogYWRkb24ucGFyZW50TmFtZSxcbiAgICBtdWx0aXBsZUFjdGl2YXRpb25zOiBhZGRvbi5tdWx0aXBsZUFjdGl2YXRpb25zLFxuICAgIGFjdGl2YXRpb25TdGF0dXM6IGFjdGl2YXRpb25TdGF0dXMgfHwgbnVsbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTdGF0dXNlc1RvU2FsZXNQYWNrYWdlcyhzYWxlc1BhY2thZ2VzOiBTYWxlc1BhY2thZ2VbXSwgc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdKTogU2FsZXNQYWNrYWdlW10ge1xuICBpZiAoIXN0YXR1c2VzIHx8IHN0YXR1c2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBzYWxlc1BhY2thZ2VzO1xuICB9XG5cbiAgcmV0dXJuIHNhbGVzUGFja2FnZXMubWFwKHNhbGVzUGFja2FnZSA9PiB7XG4gICAgY29uc3QgbmV3UHJvZHVjdHMgPSBzYWxlc1BhY2thZ2UucHJvZHVjdHMubWFwKHByb2R1Y3QgPT4gYWRkU3RhdHVzZXNUb1NhbGVzUHJvZHVjdChwcm9kdWN0LCBzdGF0dXNlcykpO1xuXG4gICAgY29uc3QgbmV3QWRkb25zV2l0aE5vUGFyZW50ID0gc2FsZXNQYWNrYWdlLmFkZG9uc1dpdGhOb1BhcmVudC5tYXAoYWRkb24gPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gZmluZFN0YXR1cyhzdGF0dXNlcywgYWRkb24uYWRkb25JZCwgYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyk7XG4gICAgICByZXR1cm4gYWRkU3RhdHVzZXNUb1NhbGVzQWRkb24oYWRkb24sIHN0YXR1cylcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb2R1Y3RTdGF0dXNlcyA9IG5ld1Byb2R1Y3RzXG4gICAgICAubWFwKHByb2R1Y3QgPT4gcHJvZHVjdC5hY3RpdmF0aW9uU3RhdHVzLnN0YXR1cyk7XG4gICAgY29uc3QgYWRkb25TdGF0dXNlcyA9IG5ld1Byb2R1Y3RzXG4gICAgICAubWFwKHByb2R1Y3QgPT4gcHJvZHVjdC5hZGRvbnMgPyBwcm9kdWN0LmFkZG9ucy5tYXAoYWRkb24gPT4gYWRkb24uYWN0aXZhdGlvblN0YXR1cy5zdGF0dXMpIDogW10pXG4gICAgICAucmVkdWNlKChzdGF0dXNMaXN0LCByZWR1Y2VkTGlzdCkgPT4gcmVkdWNlZExpc3QuY29uY2F0KHN0YXR1c0xpc3QpLCBbXSk7XG4gICAgY29uc3QgYWRkb25zV2l0aE5vUGFyZW50U3RhdHVzZXMgPSBuZXdBZGRvbnNXaXRoTm9QYXJlbnRcbiAgICAgIC5tYXAoYWRkb24gPT4gYWRkb24uYWN0aXZhdGlvblN0YXR1cyA/IGFkZG9uLmFjdGl2YXRpb25TdGF0dXMuc3RhdHVzIDogbnVsbCk7XG4gICAgY29uc3QgYWxsU3RhdHVzZXMgPSBbLi4ucHJvZHVjdFN0YXR1c2VzLCAuLi5hZGRvblN0YXR1c2VzLCAuLi5hZGRvbnNXaXRoTm9QYXJlbnRTdGF0dXNlc107XG5cbiAgICBjb25zdCBwYWNrYWdlU3RhdHVzID0gY29udmVydE51bWJlclRvQWN0aXZhdGlvblN0YXR1cyhNYXRoLm1heCguLi5hbGxTdGF0dXNlcykpO1xuICAgIGNvbnN0IHN0YXR1c05vdGlmaWNhdGlvbiA9IGNyZWF0ZVN0YXR1c05vdGlmaWNhdGlvbkl0ZW1Gb3JQYWNrYWdlKHBhY2thZ2VTdGF0dXMpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZVNhbGVzUGFja2FnZVdpdGhTdGF0dXMoc2FsZXNQYWNrYWdlLCBuZXdQcm9kdWN0cywgbmV3QWRkb25zV2l0aE5vUGFyZW50LCBzdGF0dXNOb3RpZmljYXRpb24pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QocHJvZHVjdDogU2FsZXNQcm9kdWN0LCBzdGF0dXNlczogUGFja2FnZUl0ZW1BY3RpdmF0aW9uU3RhdHVzW10pOiBTYWxlc1Byb2R1Y3Qge1xuICBjb25zdCBwcm9kdWN0U3RhdHVzID0gZmluZFN0YXR1cyhzdGF0dXNlcywgcHJvZHVjdC5wcm9kdWN0SWQsIGZhbHNlKTtcbiAgY29uc3Qgc3RhdHVzTm90aWZpY2F0aW9uID0gY3JlYXRlU3RhdHVzTm90aWZpY2F0aW9uSXRlbUZvclBhY2thZ2VJdGVtKHByb2R1Y3RTdGF0dXMpO1xuICBpZiAoIXByb2R1Y3QuYWRkb25zKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVNhbGVzUHJvZHVjdFdpdGhTdGF0dXMocHJvZHVjdCwgbnVsbCwgc3RhdHVzTm90aWZpY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgbmV3U2FsZXNBZGRvbnMgPSBwcm9kdWN0LmFkZG9ucy5tYXAoYWRkb24gPT4ge1xuICAgIGNvbnN0IGFkZG9uU3RhdHVzID0gZmluZFN0YXR1cyhzdGF0dXNlcywgYWRkb24uYWRkb25JZCwgYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyk7XG4gICAgcmV0dXJuIGFkZFN0YXR1c2VzVG9TYWxlc0FkZG9uKGFkZG9uLCBhZGRvblN0YXR1cylcbiAgfSk7XG5cbiAgcmV0dXJuIGNyZWF0ZVNhbGVzUHJvZHVjdFdpdGhTdGF0dXMocHJvZHVjdCwgbmV3U2FsZXNBZGRvbnMsIHN0YXR1c05vdGlmaWNhdGlvbik7XG59XG5cbmZ1bmN0aW9uIGFkZFN0YXR1c2VzVG9TYWxlc0FkZG9uKGFkZG9uOiBTYWxlc0FkZG9uLCBzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTYWxlc0FkZG9uIHtcbiAgY29uc3QgYWRkb25TdGF0dXNOb3RpZmljYXRpb24gPSBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZUl0ZW0oc3RhdHVzKTtcbiAgcmV0dXJuIGNyZWF0ZVNhbGVzQWRkb25XaXRoU3RhdHVzKGFkZG9uLCBhZGRvblN0YXR1c05vdGlmaWNhdGlvbik7XG59XG5cbmZ1bmN0aW9uIGZpbmRTdGF0dXMoc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdLCBpZDogc3RyaW5nLCByZW1vdmVJbmRleDogYm9vbGVhbik6IEFjdGl2YXRpb25TdGF0dXMge1xuICBpZiAoIXN0YXR1c2VzIHx8IHN0YXR1c2VzLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBzdGF0dXNJbmRleCA9IHN0YXR1c2VzLmZpbmRJbmRleChzID0+IHtcbiAgICByZXR1cm4gcy5wYWNrYWdlSXRlbUlkID09PSBpZDtcbiAgfSk7XG4gIGlmIChzdGF0dXNJbmRleCA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzdGF0dXMgPSBzdGF0dXNlc1tzdGF0dXNJbmRleF0uc3RhdHVzO1xuICBpZiAocmVtb3ZlSW5kZXgpIHtcbiAgICBzdGF0dXNlcy5zcGxpY2Uoc3RhdHVzSW5kZXgsIDEpO1xuICB9XG4gIHJldHVybiBzdGF0dXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXR1c05vdGlmaWNhdGlvbkl0ZW1Gb3JQYWNrYWdlSXRlbShzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIEFjdGl2YXRpb25TdGF0dXMuU1VDQ0VTUzpcbiAgICAgIHJldHVybiB7aWNvbjogJ2NoZWNrX2NpcmNsZScsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGVkJ307XG4gICAgY2FzZSBBY3RpdmF0aW9uU3RhdHVzLldBUk5JTkc6XG4gICAgICByZXR1cm4ge2ljb246ICd3YXJuaW5nJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdBbHJlYWR5IEFjdGl2YXRlZCd9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge2ljb246ICdlcnJvcicsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGlvbiBFcnJvcnMnfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZShzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIEFjdGl2YXRpb25TdGF0dXMuU1VDQ0VTUzpcbiAgICAgIHJldHVybiB7aWNvbjogJ2NoZWNrX2NpcmNsZScsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGVkJ307XG4gICAgY2FzZSBBY3RpdmF0aW9uU3RhdHVzLldBUk5JTkc6XG4gICAgICByZXR1cm4ge2ljb246ICd3YXJuaW5nJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdBY3RpdmF0aW9uIFdhcm5pbmdzJ307XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7aWNvbjogJ2Vycm9yJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdBY3RpdmF0aW9uIEVycm9ycyBPY2N1cmVkJ307XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydE51bWJlclRvQWN0aXZhdGlvblN0YXR1cyhudW1iZXI6IE51bWJlcik6IEFjdGl2YXRpb25TdGF0dXMge1xuICBzd2l0Y2ggKG51bWJlcikge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBBY3RpdmF0aW9uU3RhdHVzLlNVQ0NFU1M7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIEFjdGl2YXRpb25TdGF0dXMuV0FSTklORztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEFjdGl2YXRpb25TdGF0dXMuRVJST1I7XG4gIH1cbn1cbiJdfQ==