testcafe
Version:
Automated browser testing for the modern web development stack.
439 lines • 66 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getParentExceptShadowRoot = exports.getTopSameDomainWindow = exports.findParent = exports.getParents = exports.closest = exports.getTagName = exports.getMapContainer = exports.getScrollbarSize = exports.isElementReadOnly = exports.isHammerheadAttr = exports.isElementFocusable = exports.isShadowRoot = exports.isShadowUIElement = exports.isDomElement = exports.isContentEditableElement = exports.isTextEditableElementAndEditingAllowed = exports.isTextEditableElement = exports.isTextEditableInput = exports.isDocument = exports.isHtmlElement = exports.isBodyElement = exports.isMapElement = exports.isSVGElement = exports.isOptionElement = exports.isCheckboxElement = exports.isColorInputElement = exports.isRadioButtonElement = exports.isSelectElement = exports.isLabelElement = exports.isFormElement = exports.isImgElement = exports.isAnchorElement = exports.isTextAreaElement = exports.isFileInput = exports.isButtonElement = exports.isInputElement = exports.isIframeElement = exports.isRenderedNode = exports.isTextNode = exports.isElementNode = exports.getSelectVisibleChildren = exports.getChildVisibleIndex = exports.getSelectParent = exports.isCrossDomainWindows = exports.getIframeByElement = exports.isElementInIframe = exports.isElementInDocument = exports.find = exports.findDocument = exports.getActiveElement = void 0;
exports.isDocumentElement = exports.getDocumentElement = exports.getImgMapName = exports.getNodeText = exports.isNodeEqual = exports.contains = exports.isShadowElement = exports.setElementValue = exports.getElementValue = exports.setTextAreaValue = exports.setInputValue = exports.getTextAreaValue = exports.getInputValue = exports.getChildNodesLength = exports.getChildrenLength = exports.getCommonAncestor = exports.isEditableFormElement = exports.findIframeByWindow = exports.isTopWindow = exports.isIFrameWindowInDOM = exports.remove = exports.getFocusableParent = exports.getElementDescription = exports.isTheSameNode = exports.getElementIndexInParent = exports.isOptionGroupElement = exports.isElementContainsNode = exports.isEditableElement = exports.blocksImplicitSubmission = exports.getTextareaPositionByLineAndOffset = exports.getTextareaLineNumberByPosition = exports.getTextareaIndentInLine = exports.containsElement = exports.getTabIndexAttributeIntValue = exports.getFocusableElements = void 0;
const hammerhead_1 = __importDefault(require("../deps/hammerhead"));
const arrayUtils = __importStar(require("./array"));
const browserUtils = hammerhead_1.default.utils.browser;
const nativeMethods = hammerhead_1.default.nativeMethods;
// NOTE: We have to retrieve styleUtils.get from hammerhead
// to avoid circular dependencies between domUtils and styleUtils
const getElementStyleProperty = hammerhead_1.default.utils.style.get;
exports.getActiveElement = hammerhead_1.default.utils.dom.getActiveElement;
exports.findDocument = hammerhead_1.default.utils.dom.findDocument;
exports.find = hammerhead_1.default.utils.dom.find;
exports.isElementInDocument = hammerhead_1.default.utils.dom.isElementInDocument;
exports.isElementInIframe = hammerhead_1.default.utils.dom.isElementInIframe;
exports.getIframeByElement = hammerhead_1.default.utils.dom.getIframeByElement;
exports.isCrossDomainWindows = hammerhead_1.default.utils.dom.isCrossDomainWindows;
exports.getSelectParent = hammerhead_1.default.utils.dom.getSelectParent;
exports.getChildVisibleIndex = hammerhead_1.default.utils.dom.getChildVisibleIndex;
exports.getSelectVisibleChildren = hammerhead_1.default.utils.dom.getSelectVisibleChildren;
exports.isElementNode = hammerhead_1.default.utils.dom.isElementNode;
exports.isTextNode = hammerhead_1.default.utils.dom.isTextNode;
exports.isRenderedNode = hammerhead_1.default.utils.dom.isRenderedNode;
exports.isIframeElement = hammerhead_1.default.utils.dom.isIframeElement;
exports.isInputElement = hammerhead_1.default.utils.dom.isInputElement;
exports.isButtonElement = hammerhead_1.default.utils.dom.isButtonElement;
exports.isFileInput = hammerhead_1.default.utils.dom.isFileInput;
exports.isTextAreaElement = hammerhead_1.default.utils.dom.isTextAreaElement;
exports.isAnchorElement = hammerhead_1.default.utils.dom.isAnchorElement;
exports.isImgElement = hammerhead_1.default.utils.dom.isImgElement;
exports.isFormElement = hammerhead_1.default.utils.dom.isFormElement;
exports.isLabelElement = hammerhead_1.default.utils.dom.isLabelElement;
exports.isSelectElement = hammerhead_1.default.utils.dom.isSelectElement;
exports.isRadioButtonElement = hammerhead_1.default.utils.dom.isRadioButtonElement;
exports.isColorInputElement = hammerhead_1.default.utils.dom.isColorInputElement;
exports.isCheckboxElement = hammerhead_1.default.utils.dom.isCheckboxElement;
exports.isOptionElement = hammerhead_1.default.utils.dom.isOptionElement;
exports.isSVGElement = hammerhead_1.default.utils.dom.isSVGElement;
exports.isMapElement = hammerhead_1.default.utils.dom.isMapElement;
exports.isBodyElement = hammerhead_1.default.utils.dom.isBodyElement;
exports.isHtmlElement = hammerhead_1.default.utils.dom.isHtmlElement;
exports.isDocument = hammerhead_1.default.utils.dom.isDocument;
exports.isTextEditableInput = hammerhead_1.default.utils.dom.isTextEditableInput;
exports.isTextEditableElement = hammerhead_1.default.utils.dom.isTextEditableElement;
exports.isTextEditableElementAndEditingAllowed = hammerhead_1.default.utils.dom.isTextEditableElementAndEditingAllowed;
exports.isContentEditableElement = hammerhead_1.default.utils.dom.isContentEditableElement;
exports.isDomElement = hammerhead_1.default.utils.dom.isDomElement;
exports.isShadowUIElement = hammerhead_1.default.utils.dom.isShadowUIElement;
exports.isShadowRoot = hammerhead_1.default.utils.dom.isShadowRoot;
exports.isElementFocusable = hammerhead_1.default.utils.dom.isElementFocusable;
exports.isHammerheadAttr = hammerhead_1.default.utils.dom.isHammerheadAttr;
exports.isElementReadOnly = hammerhead_1.default.utils.dom.isElementReadOnly;
exports.getScrollbarSize = hammerhead_1.default.utils.dom.getScrollbarSize;
exports.getMapContainer = hammerhead_1.default.utils.dom.getMapContainer;
exports.getTagName = hammerhead_1.default.utils.dom.getTagName;
exports.closest = hammerhead_1.default.utils.dom.closest;
exports.getParents = hammerhead_1.default.utils.dom.getParents;
exports.findParent = hammerhead_1.default.utils.dom.findParent;
exports.getTopSameDomainWindow = hammerhead_1.default.utils.dom.getTopSameDomainWindow;
exports.getParentExceptShadowRoot = hammerhead_1.default.utils.dom.getParentExceptShadowRoot;
function canFocus(element, parent, tabIndex) {
let activeElement = null;
if (parent.nodeType === Node.DOCUMENT_NODE)
activeElement = nativeMethods.documentActiveElementGetter.call(parent);
if (element === activeElement)
return true;
if (element.disabled)
return false;
if (getElementStyleProperty(element, 'display') === 'none' || getElementStyleProperty(element, 'visibility') === 'hidden')
return false;
if (browserUtils.isAndroid && (0, exports.isOptionElement)(element))
return false;
if (tabIndex !== null && tabIndex < 0)
return false;
return true;
}
function wrapElement(el) {
return {
el: el,
skip: el.shadowRoot && el.tabIndex < 0,
children: {},
};
}
function buildFocusableTree(parent, sort) {
const node = wrapElement(parent);
parent = parent.shadowRoot || parent;
if ((0, exports.isIframeElement)(parent))
parent = nativeMethods.contentDocumentGetter.call(parent);
if (parent && (parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE || parent.nodeType === Node.DOCUMENT_NODE)) {
const elements = filterFocusableElements(parent);
for (const el of elements) {
const key = !sort || el.tabIndex <= 0 ? -1 : el.tabIndex;
node.children[key] = node.children[key] || [];
node.children[key].push(buildFocusableTree(el, sort));
}
}
return node;
}
function filterFocusableElements(parent) {
// NOTE: We don't take into account the case of embedded contentEditable
// elements and specify the contentEditable attribute for focusable elements
const allElements = parent.querySelectorAll('*');
const invisibleElements = getInvisibleElements(allElements);
const inputElementsRegExp = /^(input|button|select|textarea)$/;
const focusableElements = [];
let element = null;
let tagName = null;
let tabIndex = null;
for (let i = 0; i < allElements.length; i++) {
element = allElements[i];
tagName = (0, exports.getTagName)(element);
tabIndex = getTabIndexAttributeIntValue(element);
if (!canFocus(element, parent, tabIndex))
continue;
const contentEditableAttr = element.getAttribute('contenteditable');
const needPush = inputElementsRegExp.test(tagName)
|| element.shadowRoot
|| (0, exports.isIframeElement)(element)
|| (0, exports.isAnchorElement)(element) && element.hasAttribute('href')
|| contentEditableAttr === ''
|| contentEditableAttr === 'true'
|| tabIndex !== null;
if (needPush)
focusableElements.push(element);
}
//NOTE: remove children of invisible elements
return arrayUtils.filter(focusableElements, el => !containsElement(invisibleElements, el));
}
function flattenFocusableTree(node) {
const result = [];
if (!node.skip && node.el.nodeType !== Node.DOCUMENT_NODE && !(0, exports.isIframeElement)(node.el))
result.push(node.el);
for (const prop in node.children) {
for (const childNode of node.children[prop])
result.push(...flattenFocusableTree(childNode));
}
return result;
}
function getFocusableElements(doc, sort = false) {
const root = buildFocusableTree(doc, sort);
return flattenFocusableTree(root);
}
exports.getFocusableElements = getFocusableElements;
function getInvisibleElements(elements) {
const invisibleElements = [];
for (let i = 0; i < elements.length; i++) {
if (getElementStyleProperty(elements[i], 'display') === 'none')
invisibleElements.push(elements[i]);
}
return invisibleElements;
}
function getTabIndexAttributeIntValue(el) {
let tabIndex = nativeMethods.getAttribute.call(el, 'tabindex');
if (tabIndex !== null) {
tabIndex = parseInt(tabIndex, 10);
tabIndex = isNaN(tabIndex) ? null : tabIndex;
}
return tabIndex;
}
exports.getTabIndexAttributeIntValue = getTabIndexAttributeIntValue;
function containsElement(elements, element) {
if (elements.contains)
return elements.contains(element);
return arrayUtils.some(elements, parent => parent.contains(element));
}
exports.containsElement = containsElement;
function getTextareaIndentInLine(textarea, position) {
const textareaValue = getTextAreaValue(textarea);
if (!textareaValue)
return 0;
const topPart = textareaValue.substring(0, position);
const linePosition = topPart.lastIndexOf('\n') === -1 ? 0 : topPart.lastIndexOf('\n') + 1;
return position - linePosition;
}
exports.getTextareaIndentInLine = getTextareaIndentInLine;
function getTextareaLineNumberByPosition(textarea, position) {
const textareaValue = getTextAreaValue(textarea);
const lines = textareaValue.split('\n');
let topPartLength = 0;
let line = 0;
for (let i = 0; topPartLength <= position; i++) {
if (position <= topPartLength + lines[i].length) {
line = i;
break;
}
topPartLength += lines[i].length + 1;
}
return line;
}
exports.getTextareaLineNumberByPosition = getTextareaLineNumberByPosition;
function getTextareaPositionByLineAndOffset(textarea, line, offset) {
const textareaValue = getTextAreaValue(textarea);
const lines = textareaValue.split('\n');
let lineIndex = 0;
for (let i = 0; i < line; i++)
lineIndex += lines[i].length + 1;
return lineIndex + offset;
}
exports.getTextareaPositionByLineAndOffset = getTextareaPositionByLineAndOffset;
// NOTE: the form is also submitted on enter key press if there is only one input of certain
// types (referred to as types that block implicit submission in the HTML5 standard) on the
// form and this input is focused (http://www.w3.org/TR/html5/forms.html#implicit-submission)
function blocksImplicitSubmission(el) {
let inputTypeRegExp = null;
if (browserUtils.isSafari)
inputTypeRegExp = /^(text|password|color|date|time|datetime|datetime-local|email|month|number|search|tel|url|week|image)$/i;
else if (browserUtils.isFirefox)
inputTypeRegExp = /^(text|password|date|time|datetime|datetime-local|email|month|number|search|tel|url|week|image)$/i;
else
inputTypeRegExp = /^(text|password|datetime|email|number|search|tel|url|image)$/i;
return inputTypeRegExp.test(el.type);
}
exports.blocksImplicitSubmission = blocksImplicitSubmission;
function isEditableElement(el, checkEditingAllowed) {
return checkEditingAllowed ?
(0, exports.isTextEditableElementAndEditingAllowed)(el) || (0, exports.isContentEditableElement)(el) :
(0, exports.isTextEditableElement)(el) || (0, exports.isContentEditableElement)(el);
}
exports.isEditableElement = isEditableElement;
function isElementContainsNode(parentElement, childNode) {
if (isTheSameNode(childNode, parentElement))
return true;
const childNodes = nativeMethods.nodeChildNodesGetter.call(parentElement);
const length = getChildNodesLength(childNodes);
for (let i = 0; i < length; i++) {
const el = childNodes[i];
if (!(0, exports.isShadowUIElement)(el) && isElementContainsNode(el, childNode))
return true;
}
return false;
}
exports.isElementContainsNode = isElementContainsNode;
function isOptionGroupElement(element) {
return hammerhead_1.default.utils.dom.instanceToString(element) === '[object HTMLOptGroupElement]';
}
exports.isOptionGroupElement = isOptionGroupElement;
function getElementIndexInParent(parent, child) {
const children = parent.querySelectorAll((0, exports.getTagName)(child));
return arrayUtils.indexOf(children, child);
}
exports.getElementIndexInParent = getElementIndexInParent;
function isTheSameNode(node1, node2) {
//NOTE: Mozilla has not isSameNode method
if (node1 && node2 && node1.isSameNode)
return node1.isSameNode(node2);
return node1 === node2;
}
exports.isTheSameNode = isTheSameNode;
function getElementDescription(el) {
const attributes = {
id: 'id',
name: 'name',
'class': 'className',
};
const res = [];
res.push('<');
res.push((0, exports.getTagName)(el));
for (const attr in attributes) {
if (attributes.hasOwnProperty(attr)) { //eslint-disable-line no-prototype-builtins
const val = el[attributes[attr]];
if (val)
res.push(' ' + attr + '="' + val + '"');
}
}
res.push('>');
return res.join('');
}
exports.getElementDescription = getElementDescription;
function getFocusableParent(el) {
const parents = (0, exports.getParents)(el);
for (let i = 0; i < parents.length; i++) {
if ((0, exports.isElementFocusable)(parents[i]))
return parents[i];
}
return null;
}
exports.getFocusableParent = getFocusableParent;
function remove(el) {
if (el && el.parentElement)
el.parentElement.removeChild(el);
}
exports.remove = remove;
function isIFrameWindowInDOM(win) {
let frameElement = null;
try {
//NOTE: This may raise a cross-domain policy error in some browsers.
frameElement = win.frameElement;
}
catch (e) {
return !!win.top;
}
// NOTE: in Firefox and WebKit, frameElement is null for cross-domain iframes even if they are in the DOM.
// But these browsers don't execute scripts in removed iframes, so we suppose that the iframe is in the DOM.
if ((browserUtils.isFirefox || browserUtils.isWebKit) && win.top !== win && !frameElement)
return true;
return !!(frameElement && nativeMethods.contentDocumentGetter.call(frameElement));
}
exports.isIFrameWindowInDOM = isIFrameWindowInDOM;
function isTopWindow(win) {
return win.top === win;
}
exports.isTopWindow = isTopWindow;
function findIframeByWindow(iframeWindow) {
const iframes = [];
(0, exports.find)(document, '*', elem => {
if (elem.tagName === 'IFRAME')
iframes.push(elem);
if (elem.shadowRoot)
(0, exports.find)(elem.shadowRoot, 'iframe', iframe => iframes.push(iframe));
});
for (let i = 0; i < iframes.length; i++) {
if (nativeMethods.contentWindowGetter.call(iframes[i]) === iframeWindow)
return iframes[i];
}
return null;
}
exports.findIframeByWindow = findIframeByWindow;
function isEditableFormElement(element) {
return (0, exports.isTextEditableElement)(element) || (0, exports.isSelectElement)(element);
}
exports.isEditableFormElement = isEditableFormElement;
function getCommonAncestor(element1, element2) {
if (isTheSameNode(element1, element2))
return element1;
const el1Parents = [element1].concat((0, exports.getParents)(element1));
let commonAncestor = element2;
while (commonAncestor) {
if (arrayUtils.indexOf(el1Parents, commonAncestor) > -1)
return commonAncestor;
commonAncestor = nativeMethods.nodeParentNodeGetter.call(commonAncestor);
}
return commonAncestor;
}
exports.getCommonAncestor = getCommonAncestor;
function getChildrenLength(children) {
return nativeMethods.htmlCollectionLengthGetter.call(children);
}
exports.getChildrenLength = getChildrenLength;
function getChildNodesLength(childNodes) {
return nativeMethods.nodeListLengthGetter.call(childNodes);
}
exports.getChildNodesLength = getChildNodesLength;
function getInputValue(input) {
return nativeMethods.inputValueGetter.call(input);
}
exports.getInputValue = getInputValue;
function getTextAreaValue(textArea) {
return nativeMethods.textAreaValueGetter.call(textArea);
}
exports.getTextAreaValue = getTextAreaValue;
function setInputValue(input, value) {
return nativeMethods.inputValueSetter.call(input, value);
}
exports.setInputValue = setInputValue;
function setTextAreaValue(textArea, value) {
return nativeMethods.textAreaValueSetter.call(textArea, value);
}
exports.setTextAreaValue = setTextAreaValue;
function getElementValue(element) {
if ((0, exports.isInputElement)(element))
return getInputValue(element);
else if ((0, exports.isTextAreaElement)(element))
return getTextAreaValue(element);
/*eslint-disable no-restricted-properties*/
return element.value;
/*eslint-enable no-restricted-properties*/
}
exports.getElementValue = getElementValue;
function setElementValue(element, value) {
if ((0, exports.isInputElement)(element))
return setInputValue(element, value);
else if ((0, exports.isTextAreaElement)(element))
return setTextAreaValue(element, value);
/*eslint-disable no-restricted-properties*/
element.value = value;
/*eslint-enable no-restricted-properties*/
return value;
}
exports.setElementValue = setElementValue;
function isShadowElement(element) {
return element && element.getRootNode && (0, exports.findDocument)(element) !== element.getRootNode();
}
exports.isShadowElement = isShadowElement;
function contains(element, target) {
if (!element || !target)
return false;
if (element.contains)
return element.contains(target);
return !!(0, exports.findParent)(target, true, node => node === element);
}
exports.contains = contains;
function isNodeEqual(el1, el2) {
return el1 === el2;
}
exports.isNodeEqual = isNodeEqual;
function getNodeText(el) {
return nativeMethods.nodeTextContentGetter.call(el);
}
exports.getNodeText = getNodeText;
function getImgMapName(img) {
return img.useMap.substring(1);
}
exports.getImgMapName = getImgMapName;
function getDocumentElement(win) {
return win.document.documentElement;
}
exports.getDocumentElement = getDocumentElement;
function isDocumentElement(el) {
return el === document.documentElement;
}
exports.isDocumentElement = isDocumentElement;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9jb3JlL3V0aWxzL2RvbS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvRUFBNEM7QUFDNUMsb0RBQXNDO0FBRXRDLE1BQU0sWUFBWSxHQUFJLG9CQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUMvQyxNQUFNLGFBQWEsR0FBRyxvQkFBVSxDQUFDLGFBQWEsQ0FBQztBQUUvQywyREFBMkQ7QUFDM0QsaUVBQWlFO0FBQ2pFLE1BQU0sdUJBQXVCLEdBQUcsb0JBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUU5QyxRQUFBLGdCQUFnQixHQUF5QixvQkFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7QUFDL0UsUUFBQSxZQUFZLEdBQTZCLG9CQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7QUFDM0UsUUFBQSxJQUFJLEdBQXFDLG9CQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDbkUsUUFBQSxtQkFBbUIsR0FBc0Isb0JBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO0FBQ2xGLFFBQUEsaUJBQWlCLEdBQXdCLG9CQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztBQUNoRixRQUFBLGtCQUFrQixHQUF1QixvQkFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7QUFDakYsUUFBQSxvQkFBb0IsR0FBcUIsb0JBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO0FBQ25GLFFBQUEsZUFBZSxHQUEwQixvQkFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0FBQzlFLFFBQUEsb0JB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QUFFO0lBQ2pDLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxlQUFlLENBQUM7QUFDM0MsQ0FBQztBQUZELDhDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGhhbW1lcmhlYWQgZnJvbSAnLi4vZGVwcy9oYW1tZXJoZWFkJztcbmltcG9ydCAqIGFzIGFycmF5VXRpbHMgZnJvbSAnLi9hcnJheSc7XG5cbmNvbnN0IGJyb3dzZXJVdGlscyAgPSBoYW1tZXJoZWFkLnV0aWxzLmJyb3dzZXI7XG5jb25zdCBuYXRpdmVNZXRob2RzID0gaGFtbWVyaGVhZC5uYXRpdmVNZXRob2RzO1xuXG4vLyBOT1RFOiBXZSBoYXZlIHRvIHJldHJpZXZlIHN0eWxlVXRpbHMuZ2V0IGZyb20gaGFtbWVyaGVhZFxuLy8gdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGJldHdlZW4gZG9tVXRpbHMgYW5kIHN0eWxlVXRpbHNcbmNvbnN0IGdldEVsZW1lbnRTdHlsZVByb3BlcnR5ID0gaGFtbWVyaGVhZC51dGlscy5zdHlsZS5nZXQ7XG5cbmV4cG9ydCBjb25zdCBnZXRBY3RpdmVFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmdldEFjdGl2ZUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgZmluZERvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5maW5kRG9jdW1lbnQ7XG5leHBvcnQgY29uc3QgZmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5maW5kO1xuZXhwb3J0IGNvbnN0IGlzRWxlbWVudEluRG9jdW1lbnQgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNFbGVtZW50SW5Eb2N1bWVudDtcbmV4cG9ydCBjb25zdCBpc0VsZW1lbnRJbklmcmFtZSAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRWxlbWVudEluSWZyYW1lO1xuZXhwb3J0IGNvbnN0IGdldElmcmFtZUJ5RWxlbWVudCAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uZ2V0SWZyYW1lQnlFbGVtZW50O1xuZXhwb3J0IGNvbnN0IGlzQ3Jvc3NEb21haW5XaW5kb3dzICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNDcm9zc0RvbWFpbldpbmRvd3M7XG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0UGFyZW50ICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5nZXRTZWxlY3RQYXJlbnQ7XG5leHBvcnQgY29uc3QgZ2V0Q2hpbGRWaXNpYmxlSW5kZXggICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5nZXRDaGlsZFZpc2libGVJbmRleDtcbmV4cG9ydCBjb25zdCBnZXRTZWxlY3RWaXNpYmxlQ2hpbGRyZW4gICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmdldFNlbGVjdFZpc2libGVDaGlsZHJlbjtcbmV4cG9ydCBjb25zdCBpc0VsZW1lbnROb2RlICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRWxlbWVudE5vZGU7XG5leHBvcnQgY29uc3QgaXNUZXh0Tm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1RleHROb2RlO1xuZXhwb3J0IGNvbnN0IGlzUmVuZGVyZWROb2RlICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNSZW5kZXJlZE5vZGU7XG5leHBvcnQgY29uc3QgaXNJZnJhbWVFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0lmcmFtZUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNJbnB1dEVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0lucHV0RWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0J1dHRvbkVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzQnV0dG9uRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0ZpbGVJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRmlsZUlucHV0O1xuZXhwb3J0IGNvbnN0IGlzVGV4dEFyZWFFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNUZXh0QXJlYUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNBbmNob3JFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0FuY2hvckVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNJbWdFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0ltZ0VsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNGb3JtRWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0Zvcm1FbGVtZW50O1xuZXhwb3J0IGNvbnN0IGlzTGFiZWxFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNMYWJlbEVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNTZWxlY3RFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1NlbGVjdEVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNSYWRpb0J1dHRvbkVsZW1lbnQgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1JhZGlvQnV0dG9uRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0NvbG9ySW5wdXRFbGVtZW50ICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzQ29sb3JJbnB1dEVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNDaGVja2JveEVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0NoZWNrYm94RWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc09wdGlvbkVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzT3B0aW9uRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc1NWR0VsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzU1ZHRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc01hcEVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzTWFwRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0JvZHlFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzQm9keUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNIdG1sRWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc0h0bWxFbGVtZW50O1xuZXhwb3J0IGNvbnN0IGlzRG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNEb2N1bWVudDtcbmV4cG9ydCBjb25zdCBpc1RleHRFZGl0YWJsZUlucHV0ICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzVGV4dEVkaXRhYmxlSW5wdXQ7XG5leHBvcnQgY29uc3QgaXNUZXh0RWRpdGFibGVFbGVtZW50ICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1RleHRFZGl0YWJsZUVsZW1lbnQ7XG5leHBvcnQgY29uc3QgaXNUZXh0RWRpdGFibGVFbGVtZW50QW5kRWRpdGluZ0FsbG93ZWQgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5pc1RleHRFZGl0YWJsZUVsZW1lbnRBbmRFZGl0aW5nQWxsb3dlZDtcbmV4cG9ydCBjb25zdCBpc0NvbnRlbnRFZGl0YWJsZUVsZW1lbnQgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzQ29udGVudEVkaXRhYmxlRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc0RvbUVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRG9tRWxlbWVudDtcbmV4cG9ydCBjb25zdCBpc1NoYWRvd1VJRWxlbWVudCAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzU2hhZG93VUlFbGVtZW50O1xuZXhwb3J0IGNvbnN0IGlzU2hhZG93Um9vdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNTaGFkb3dSb290O1xuZXhwb3J0IGNvbnN0IGlzRWxlbWVudEZvY3VzYWJsZSAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNFbGVtZW50Rm9jdXNhYmxlO1xuZXhwb3J0IGNvbnN0IGlzSGFtbWVyaGVhZEF0dHIgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uaXNIYW1tZXJoZWFkQXR0cjtcbmV4cG9ydCBjb25zdCBpc0VsZW1lbnRSZWFkT25seSAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmlzRWxlbWVudFJlYWRPbmx5O1xuZXhwb3J0IGNvbnN0IGdldFNjcm9sbGJhclNpemUgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uZ2V0U2Nyb2xsYmFyU2l6ZTtcbmV4cG9ydCBjb25zdCBnZXRNYXBDb250YWluZXIgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmdldE1hcENvbnRhaW5lcjtcbmV4cG9ydCBjb25zdCBnZXRUYWdOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmdldFRhZ05hbWU7XG5leHBvcnQgY29uc3QgY2xvc2VzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5jbG9zZXN0O1xuZXhwb3J0IGNvbnN0IGdldFBhcmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uZ2V0UGFyZW50cztcbmV4cG9ydCBjb25zdCBmaW5kUGFyZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbW1lcmhlYWQudXRpbHMuZG9tLmZpbmRQYXJlbnQ7XG5leHBvcnQgY29uc3QgZ2V0VG9wU2FtZURvbWFpbldpbmRvdyAgICAgICAgICAgICAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmRvbS5nZXRUb3BTYW1lRG9tYWluV2luZG93O1xuZXhwb3J0IGNvbnN0IGdldFBhcmVudEV4Y2VwdFNoYWRvd1Jvb3QgICAgICAgICAgICAgID0gaGFtbWVyaGVhZC51dGlscy5kb20uZ2V0UGFyZW50RXhjZXB0U2hhZG93Um9vdDtcblxuZnVuY3Rpb24gY2FuRm9jdXMgKGVsZW1lbnQsIHBhcmVudCwgdGFiSW5kZXgpIHtcbiAgICBsZXQgYWN0aXZlRWxlbWVudCA9IG51bGw7XG5cbiAgICBpZiAocGFyZW50Lm5vZGVUeXBlID09PSBOb2RlLkRPQ1VNRU5UX05PREUpXG4gICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBuYXRpdmVNZXRob2RzLmRvY3VtZW50QWN0aXZlRWxlbWVudEdldHRlci5jYWxsKHBhcmVudCk7XG5cbiAgICBpZiAoZWxlbWVudCA9PT0gYWN0aXZlRWxlbWVudClcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAoZWxlbWVudC5kaXNhYmxlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGdldEVsZW1lbnRTdHlsZVByb3BlcnR5KGVsZW1lbnQsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBnZXRFbGVtZW50U3R5bGVQcm9wZXJ0eShlbGVtZW50LCAndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGJyb3dzZXJVdGlscy5pc0FuZHJvaWQgJiYgaXNPcHRpb25FbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFiSW5kZXggIT09IG51bGwgJiYgdGFiSW5kZXggPCAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd3JhcEVsZW1lbnQgKGVsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWw6ICAgICAgIGVsLFxuICAgICAgICBza2lwOiAgICAgZWwuc2hhZG93Um9vdCAmJiBlbC50YWJJbmRleCA8IDAsXG4gICAgICAgIGNoaWxkcmVuOiB7fS