@clr/angular
Version:
Angular components for Clarity
179 lines • 20.8 kB
JavaScript
/*
* Copyright (c) 2016-2023 VMware, Inc. All Rights Reserved.
* This software is released under MIT license.
* The full license information can be found in LICENSE in the root directory of this project.
*/
import { ClrAlignment } from './enums/alignment.enum';
import { ClrViewportViolation } from './enums/viewport-violation.enum';
export const flipSides = position => {
return {
...position,
side: -1 * position.side,
};
};
// This could be used in more advanced positioning algorithms.
// flipAxisFlipSideAndNudgeContent(flipAxis, flipSide, nudge, nudgeForward?): ClrTransform {...}
// I would like to keep it for now.
export const flipAxis = position => {
return {
...position,
axis: position.axis === 0 ? 1 : 0,
};
};
export const nudgeContent = (position, forward) => {
const nextAlignment = position.content + (forward ? 0.5 : -0.5);
if (nextAlignment < 0 || nextAlignment > 1) {
return position;
}
else {
return {
...position,
content: nextAlignment,
};
}
};
export function flipSidesAndNudgeContent(flip, nudge, nudgeBack) {
return (position) => nudge(flip(position), nudgeBack);
}
export function align(position, anchor, content) {
let xDiff = anchor.left;
let yDiff = anchor.top;
// When ClrAxis is VERTICAL BEFORE = left, AFTER = right
// When ClrAxis is HORIZONTAL BEFORE is top, AFTER is bottom
switch (position.axis + position.side) {
case -1: {
// ClrAxis.VERTICAL + ClrSide.BEFORE
xDiff += alignHorizontal(position, anchor, content);
yDiff -= content.height; // pull content up to the top of the anchor
break;
}
case 1: {
// ClrAxis.VERTICAL + ClrSide.AFTER
xDiff += alignHorizontal(position, anchor, content);
yDiff += anchor.height; // push the content down to below the anchor
break;
}
case 0: {
// ClrAxis.HORIZONTAL + ClrSide.BEFORE
xDiff -= content.width; // pull the content left of the anchor
yDiff += alignVertical(position, anchor, content);
break;
}
case 2: {
// ClrAxis.HORIZONTAL + ClrSide.AFTER
xDiff += anchor.width; // push the content right of of the anchor
yDiff += alignVertical(position, anchor, content);
break;
}
default: {
break;
}
}
return { xOffset: xDiff, yOffset: yDiff };
}
function alignHorizontal(position, anchor, content) {
let horizontalOffset = 0;
// horizontal offset for the anchor position
switch (position.anchor /*calculate for the anchor alignment*/) {
case ClrAlignment.START: {
// nothing to calculate here
break;
}
case ClrAlignment.CENTER: {
horizontalOffset += anchor.width / 2; // push content over 1/2 anchor width
break;
}
case ClrAlignment.END: {
horizontalOffset += anchor.width; // push content over width of the anchor
break;
}
default: {
break;
}
}
// horizontal offsets for anchor alignment
switch (position.content // calculate for the content alignment
) {
case ClrAlignment.START: {
// Nothing to calculate here
break;
}
case ClrAlignment.CENTER: {
horizontalOffset -= content.width / 2; // pull content left by a value of 1/2 content width
break;
}
case ClrAlignment.END: {
// subtract the width of currentContent from horizontalOffset to pull it back
horizontalOffset -= content.width;
break;
}
default: {
break;
}
}
return horizontalOffset;
}
function alignVertical(position, anchor, content) {
// y axis offsets for anchor alignment
let verticalOffset = 0;
// Calculate y offset for anchor position
switch (position.anchor) {
case ClrAlignment.START: {
// nothing to calculate here
break;
}
case ClrAlignment.CENTER: {
verticalOffset += anchor.height / 2; // push content down to the middle of the anchor rect
break;
}
case ClrAlignment.END: {
verticalOffset += anchor.height; // push content down to the bottom of the anchor
break;
}
default: {
break;
}
}
// Calculate y offsets for content alignment
switch (position.content) {
case ClrAlignment.START: {
// aligned to the top of the content rect
break;
}
case ClrAlignment.CENTER: {
verticalOffset -= content.height / 2; // pull content back up to the middle of the content rect
break;
}
case ClrAlignment.END: {
verticalOffset -= content.height; // pull content back up to the bottom of the content rect
break;
}
default: {
break;
}
}
return verticalOffset;
}
export function testVisibility(offset, content) {
const violations = [];
const mockCoords = {
bottom: offset.yOffset + content.height,
left: offset.xOffset,
right: offset.xOffset + content.width,
top: offset.yOffset,
};
if (!(mockCoords.top >= 0)) {
violations.push(ClrViewportViolation.TOP);
}
if (!(mockCoords.left >= 0)) {
violations.push(ClrViewportViolation.LEFT);
}
if (!(mockCoords.bottom <= (window.innerHeight || document.documentElement.clientHeight))) {
violations.push(ClrViewportViolation.BOTTOM);
}
if (!(mockCoords.right <= (window.innerWidth || document.documentElement.clientWidth))) {
violations.push(ClrViewportViolation.RIGHT);
}
return violations;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb24tb3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvdXRpbHMvcG9wb3Zlci9wb3NpdGlvbi1vcGVyYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVF2RSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCLFFBQVEsQ0FBQyxFQUFFO0lBQ2hELE9BQU87UUFDTCxHQUFHLFFBQVE7UUFDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUk7S0FDekIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLDhEQUE4RDtBQUM5RCxnR0FBZ0c7QUFDaEcsbUNBQW1DO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBaUIsUUFBUSxDQUFDLEVBQUU7SUFDL0MsT0FBTztRQUNMLEdBQUcsUUFBUTtRQUNYLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQzlELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRSxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtRQUMxQyxPQUFPLFFBQVEsQ0FBQztLQUNqQjtTQUFNO1FBQ0wsT0FBTztZQUNMLEdBQUcs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LFVBQVUsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUU7UUFDdEYsVUFBVSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjMgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENsckFsaWdubWVudCB9IGZyb20gJy4vZW51bXMvYWxpZ25tZW50LmVudW0nO1xuaW1wb3J0IHsgQ2xyVmlld3BvcnRWaW9sYXRpb24gfSBmcm9tICcuL2VudW1zL3ZpZXdwb3J0LXZpb2xhdGlvbi5lbnVtJztcbmltcG9ydCB7IENsclBvcG92ZXJDb250ZW50T2Zmc2V0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvcG92ZXItY29udGVudC1vZmZzZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENsclBvcG92ZXJQb3NpdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9wb3BvdmVyLXBvc2l0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDbHJWaXNpYmlsaXR5Q29vcmRzIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3Zpc2liaWxpdHktY29vcmRzLmludGVyZmFjZSc7XG5cbi8vIFB1dCB0aGUgZm9yd2FyZCBhcmcgaGVyZSBidXQgaXQgaXMgb25seSBuZWVkZWQgd2hlbiBudWRnaW5nIGNvbnRlbnQgb3IgYW5jaG9ycy5cbmV4cG9ydCB0eXBlIENsclRyYW5zZm9ybSA9IChwb3NpdGlvbjogQ2xyUG9wb3ZlclBvc2l0aW9uLCBiYWNrPzogYm9vbGVhbikgPT4gQ2xyUG9wb3ZlclBvc2l0aW9uO1xuXG5leHBvcnQgY29uc3QgZmxpcFNpZGVzOiBDbHJUcmFuc2Zvcm0gPSBwb3NpdGlvbiA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4ucG9zaXRpb24sXG4gICAgc2lkZTogLTEgKiBwb3NpdGlvbi5zaWRlLFxuICB9O1xufTtcblxuLy8gVGhpcyBjb3VsZCBiZSB1c2VkIGluIG1vcmUgYWR2YW5jZWQgcG9zaXRpb25pbmcgYWxnb3JpdGhtcy5cbi8vIGZsaXBBeGlzRmxpcFNpZGVBbmROdWRnZUNvbnRlbnQoZmxpcEF4aXMsIGZsaXBTaWRlLCBudWRnZSwgbnVkZ2VGb3J3YXJkPyk6IENsclRyYW5zZm9ybSB7Li4ufVxuLy8gSSB3b3VsZCBsaWtlIHRvIGtlZXAgaXQgZm9yIG5vdy5cbmV4cG9ydCBjb25zdCBmbGlwQXhpczogQ2xyVHJhbnNmb3JtID0gcG9zaXRpb24gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnBvc2l0aW9uLFxuICAgIGF4aXM6IHBvc2l0aW9uLmF4aXMgPT09IDAgPyAxIDogMCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBudWRnZUNvbnRlbnQ6IENsclRyYW5zZm9ybSA9IChwb3NpdGlvbiwgZm9yd2FyZCkgPT4ge1xuICBjb25zdCBuZXh0QWxpZ25tZW50ID0gcG9zaXRpb24uY29udGVudCArIChmb3J3YXJkID8gMC41IDogLTAuNSk7XG4gIGlmIChuZXh0QWxpZ25tZW50IDwgMCB8fCBuZXh0QWxpZ25tZW50ID4gMSkge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucG9zaXRpb24sXG4gICAgICBjb250ZW50OiBuZXh0QWxpZ25tZW50LFxuICAgIH07XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGlwU2lkZXNBbmROdWRnZUNvbnRlbnQoZmxpcDogQ2xyVHJhbnNmb3JtLCBudWRnZTogQ2xyVHJhbnNmb3JtLCBudWRnZUJhY2s/OiBib29sZWFuKTogQ2xyVHJhbnNmb3JtIHtcbiAgcmV0dXJuIChwb3NpdGlvbjogQ2xyUG9wb3ZlclBvc2l0aW9uKTogQ2xyUG9wb3ZlclBvc2l0aW9uID0+IG51ZGdlKGZsaXAocG9zaXRpb24pLCBudWRnZUJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxpZ24ocG9zaXRpb246IENsclBvcG92ZXJQb3NpdGlvbiwgYW5jaG9yOiBDbGllbnRSZWN0LCBjb250ZW50OiBDbGllbnRSZWN0KTogQ2xyUG9wb3ZlckNvbnRlbnRPZmZzZXQge1xuICBsZXQgeERpZmYgPSBhbmNob3IubGVmdDtcbiAgbGV0IHlEaWZmID0gYW5jaG9yLnRvcDtcblxuICAvLyBXaGVuIENsckF4aXMgaXMgVkVSVElDQUwgQkVGT1JFID0gbGVmdCwgQUZURVIgPSByaWdodFxuICAvLyBXaGVuIENsckF4aXMgaXMgSE9SSVpPTlRBTCBCRUZPUkUgaXMgdG9wLCBBRlRFUiBpcyBib3R0b21cbiAgc3dpdGNoIChwb3NpdGlvbi5heGlzICsgcG9zaXRpb24uc2lkZSkge1xuICAgIGNhc2UgLTE6IHtcbiAgICAgIC8vIENsckF4aXMuVkVSVElDQUwgKyBDbHJTaWRlLkJFRk9SRVxuICAgICAgeERpZmYgKz0gYWxpZ25Ib3Jpem9udGFsKHBvc2l0aW9uLCBhbmNob3IsIGNvbnRlbnQpO1xuICAgICAgeURpZmYgLT0gY29udGVudC5oZWlnaHQ7IC8vIHB1bGwgY29udGVudCB1cCB0byB0aGUgdG9wIG9mIHRoZSBhbmNob3JcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIDE6IHtcbiAgICAgIC8vIENsckF4aXMuVkVSVElDQUwgKyBDbHJTaWRlLkFGVEVSXG4gICAgICB4RGlmZiArPSBhbGlnbkhvcml6b250YWwocG9zaXRpb24sIGFuY2hvciwgY29udGVudCk7XG4gICAgICB5RGlmZiArPSBhbmNob3IuaGVpZ2h0OyAvLyBwdXNoIHRoZSBjb250ZW50IGRvd24gdG8gYmVsb3cgdGhlIGFuY2hvclxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgMDoge1xuICAgICAgLy8gQ2xyQXhpcy5IT1JJWk9OVEFMICsgQ2xyU2lkZS5CRUZPUkVcbiAgICAgIHhEaWZmIC09IGNvbnRlbnQud2lkdGg7IC8vIHB1bGwgdGhlIGNvbnRlbnQgbGVmdCBvZiB0aGUgYW5jaG9yXG4gICAgICB5RGlmZiArPSBhbGlnblZlcnRpY2FsKHBvc2l0aW9uLCBhbmNob3IsIGNvbnRlbnQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgMjoge1xuICAgICAgLy8gQ2xyQXhpcy5IT1JJWk9OVEFMICsgQ2xyU2lkZS5BRlRFUlxuICAgICAgeERpZmYgKz0gYW5jaG9yLndpZHRoOyAvLyBwdXNoIHRoZSBjb250ZW50IHJpZ2h0IG9mIG9mIHRoZSBhbmNob3JcbiAgICAgIHlEaWZmICs9IGFsaWduVmVydGljYWwocG9zaXRpb24sIGFuY2hvciwgY29udGVudCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHhPZmZzZXQ6IHhEaWZmLCB5T2Zmc2V0OiB5RGlmZiB9O1xufVxuXG5mdW5jdGlvbiBhbGlnbkhvcml6b250YWwocG9zaXRpb246IENsclBvcG92ZXJQb3NpdGlvbiwgYW5jaG9yOiBDbGllbnRSZWN0LCBjb250ZW50OiBDbGllbnRSZWN0KTogbnVtYmVyIHtcbiAgbGV0IGhvcml6b250YWxPZmZzZXQgPSAwO1xuICAvLyBob3Jpem9udGFsIG9mZnNldCBmb3IgdGhlIGFuY2hvciBwb3NpdGlvblxuICBzd2l0Y2ggKHBvc2l0aW9uLmFuY2hvciAvKmNhbGN1bGF0ZSBmb3IgdGhlIGFuY2hvciBhbGlnbm1lbnQqLykge1xuICAgIGNhc2UgQ2xyQWxpZ25tZW50LlNUQVJUOiB7XG4gICAgICAvLyBub3RoaW5nIHRvIGNhbGN1bGF0ZSBoZXJlXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBDbHJBbGlnbm1lbnQuQ0VOVEVSOiB7XG4gICAgICBob3Jpem9udGFsT2Zmc2V0ICs9IGFuY2hvci53aWR0aCAvIDI7IC8vIHB1c2ggY29udGVudCBvdmVyIDEvMiBhbmNob3Igd2lkdGhcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5FTkQ6IHtcbiAgICAgIGhvcml6b250YWxPZmZzZXQgKz0gYW5jaG9yLndpZHRoOyAvLyAgcHVzaCBjb250ZW50IG92ZXIgd2lkdGggb2YgdGhlIGFuY2hvclxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhvcml6b250YWwgb2Zmc2V0cyBmb3IgYW5jaG9yIGFsaWdubWVudFxuICBzd2l0Y2ggKFxuICAgIHBvc2l0aW9uLmNvbnRlbnQgLy8gY2FsY3VsYXRlIGZvciB0aGUgY29udGVudCBhbGlnbm1lbnRcbiAgKSB7XG4gICAgY2FzZSBDbHJBbGlnbm1lbnQuU1RBUlQ6IHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gY2FsY3VsYXRlIGhlcmVcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5DRU5URVI6IHtcbiAgICAgIGhvcml6b250YWxPZmZzZXQgLT0gY29udGVudC53aWR0aCAvIDI7IC8vIHB1bGwgY29udGVudCBsZWZ0IGJ5IGEgdmFsdWUgb2YgMS8yIGNvbnRlbnQgd2lkdGhcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5FTkQ6IHtcbiAgICAgIC8vIHN1YnRyYWN0IHRoZSB3aWR0aCBvZiBjdXJyZW50Q29udGVudCBmcm9tIGhvcml6b250YWxPZmZzZXQgdG8gcHVsbCBpdCBiYWNrXG4gICAgICBob3Jpem9udGFsT2Zmc2V0IC09IGNvbnRlbnQud2lkdGg7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhvcml6b250YWxPZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGFsaWduVmVydGljYWwocG9zaXRpb246IENsclBvcG92ZXJQb3NpdGlvbiwgYW5jaG9yOiBDbGllbnRSZWN0LCBjb250ZW50OiBDbGllbnRSZWN0KTogbnVtYmVyIHtcbiAgLy8geSBheGlzIG9mZnNldHMgZm9yIGFuY2hvciBhbGlnbm1lbnRcbiAgbGV0IHZlcnRpY2FsT2Zmc2V0ID0gMDtcblxuICAvLyBDYWxjdWxhdGUgeSBvZmZzZXQgZm9yIGFuY2hvciBwb3NpdGlvblxuICBzd2l0Y2ggKHBvc2l0aW9uLmFuY2hvcikge1xuICAgIGNhc2UgQ2xyQWxpZ25tZW50LlNUQVJUOiB7XG4gICAgICAvLyBub3RoaW5nIHRvIGNhbGN1bGF0ZSBoZXJlXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBDbHJBbGlnbm1lbnQuQ0VOVEVSOiB7XG4gICAgICB2ZXJ0aWNhbE9mZnNldCArPSBhbmNob3IuaGVpZ2h0IC8gMjsgLy8gcHVzaCBjb250ZW50IGRvd24gdG8gdGhlIG1pZGRsZSBvZiB0aGUgYW5jaG9yIHJlY3RcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5FTkQ6IHtcbiAgICAgIHZlcnRpY2FsT2Zmc2V0ICs9IGFuY2hvci5oZWlnaHQ7IC8vIHB1c2ggY29udGVudCBkb3duIHRvIHRoZSBib3R0b20gb2YgdGhlIGFuY2hvclxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSB5IG9mZnNldHMgZm9yIGNvbnRlbnQgYWxpZ25tZW50XG4gIHN3aXRjaCAocG9zaXRpb24uY29udGVudCkge1xuICAgIGNhc2UgQ2xyQWxpZ25tZW50LlNUQVJUOiB7XG4gICAgICAvLyBhbGlnbmVkIHRvIHRoZSB0b3Agb2YgdGhlIGNvbnRlbnQgcmVjdFxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgQ2xyQWxpZ25tZW50LkNFTlRFUjoge1xuICAgICAgdmVydGljYWxPZmZzZXQgLT0gY29udGVudC5oZWlnaHQgLyAyOyAvLyBwdWxsIGNvbnRlbnQgYmFjayB1cCB0byB0aGUgbWlkZGxlIG9mIHRoZSBjb250ZW50IHJlY3RcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIENsckFsaWdubWVudC5FTkQ6IHtcbiAgICAgIHZlcnRpY2FsT2Zmc2V0IC09IGNvbnRlbnQuaGVpZ2h0OyAvLyBwdWxsIGNvbnRlbnQgYmFjayB1cCB0byB0aGUgYm90dG9tIG9mIHRoZSBjb250ZW50IHJlY3RcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZlcnRpY2FsT2Zmc2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdFZpc2liaWxpdHkob2Zmc2V0OiBDbHJQb3BvdmVyQ29udGVudE9mZnNldCwgY29udGVudDogQ2xpZW50UmVjdCk6IENsclZpZXdwb3J0VmlvbGF0aW9uW10ge1xuICBjb25zdCB2aW9sYXRpb25zOiBDbHJWaWV3cG9ydFZpb2xhdGlvbltdID0gW107XG4gIGNvbnN0IG1vY2tDb29yZHM6IENsclZpc2liaWxpdHlDb29yZHMgPSB7XG4gICAgYm90dG9tOiBvZmZzZXQueU9mZnNldCArIGNvbnRlbnQuaGVpZ2h0LFxuICAgIGxlZnQ6IG9mZnNldC54T2Zmc2V0LFxuICAgIHJpZ2h0OiBvZmZzZXQueE9mZnNldCArIGNvbnRlbnQud2lkdGgsXG4gICAgdG9wOiBvZmZzZXQueU9mZnNldCxcbiAgfTtcblxuICBpZiAoIShtb2NrQ29vcmRzLnRvcCA+PSAwKSkge1xuICAgIHZpb2xhdGlvbnMucHVzaChDbHJWaWV3cG9ydFZpb2xhdGlvbi5UT1ApO1xuICB9XG4gIGlmICghKG1vY2tDb29yZHMubGVmdCA+PSAwKSkge1xuICAgIHZpb2xhdGlvbnMucHVzaChDbHJWaWV3cG9ydFZpb2xhdGlvbi5MRUZUKTtcbiAgfVxuICBpZiAoIShtb2NrQ29vcmRzLmJvdHRvbSA8PSAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKSkge1xuICAgIHZpb2xhdGlvbnMucHVzaChDbHJWaWV3cG9ydFZpb2xhdGlvbi5CT1RUT00pO1xuICB9XG4gIGlmICghKG1vY2tDb29yZHMucmlnaHQgPD0gKHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpKSB7XG4gICAgdmlvbGF0aW9ucy5wdXNoKENsclZpZXdwb3J0VmlvbGF0aW9uLlJJR0hUKTtcbiAgfVxuXG4gIHJldHVybiB2aW9sYXRpb25zO1xufVxuIl19