UNPKG

25.8 kBJavaScriptView Raw
1import ts from 'typescript';
2import * as utils from './utils';
3export function getNameNode(node) {
4 return utils.getValueOrUndefined(node.name);
5}
6export function getNameNodeOrThrow(node) {
7 return utils.throwIfNullOrUndefined(getNameNode(node), 'name');
8}
9export function getName(node) {
10 const name = getNameNode(node);
11 if (name === undefined || ts.isObjectBindingPattern(name) || ts.isArrayBindingPattern(name)) {
12 return undefined;
13 }
14 return name.getText();
15}
16export function getNameOrThrow(node) {
17 return utils.throwIfNullOrUndefined(getName(node), 'name');
18}
19export function getPropertyNameNode(node) {
20 return utils.getValueOrUndefined(node.propertyName);
21}
22export function getDotDotDotToken(node) {
23 return utils.getValueOrUndefined(node.dotDotDotToken);
24}
25export function getText(node) {
26 return node.getText();
27}
28export function getParentSyntaxList(node) {
29 const parent = utils.getValueOrUndefined(node.parent);
30 if (parent === undefined) {
31 return undefined;
32 }
33 const { pos, end } = node;
34 for (const child of parent.getChildren()) {
35 if (child.pos > end || child === node) {
36 return undefined;
37 }
38 if (child.kind === ts.SyntaxKind.SyntaxList && child.pos <= pos && child.end >= end) {
39 return child;
40 }
41 }
42 return undefined;
43}
44export function getParent(node) {
45 const parent = utils.getValueOrUndefined(node.parent);
46 return parent === undefined ? undefined : node.parent;
47}
48export function* getAncestors(node) {
49 let parent = getParent(node);
50 while (parent !== undefined) {
51 yield parent;
52 parent = getParent(parent);
53 }
54}
55export function* getDescendants(node) {
56 let children = getChildren(node);
57 while (children.length > 0) {
58 const mutableNextChildren = [];
59 for (const child of children) {
60 yield child;
61 mutableNextChildren.push(...getChildren(child));
62 }
63 children = mutableNextChildren;
64 }
65}
66export function* getDescendantsByKind(node, kind) {
67 for (const descendant of getDescendants(node)) {
68 if (descendant.kind === kind) {
69 yield descendant;
70 }
71 }
72}
73function getTarget(symbol) {
74 const target = symbol.target;
75 return target === undefined ? symbol : target;
76}
77export function getSymbol(typeChecker, node) {
78 const symbol = utils.getValueOrUndefined(node.symbol);
79 if (symbol !== undefined) {
80 return getTarget(symbol);
81 }
82 const typeCheckerSymbol = utils.getValueOrUndefined(typeChecker.getSymbolAtLocation(node));
83 if (typeCheckerSymbol !== undefined) {
84 return getTarget(typeCheckerSymbol);
85 }
86 const nameNode = getNameNode(node);
87 if (nameNode !== undefined) {
88 return getSymbol(typeChecker, nameNode);
89 }
90 return undefined;
91}
92export function getSymbolOrThrow(typeChecker, node) {
93 return utils.throwIfNullOrUndefined(getSymbol(typeChecker, node), 'symbol');
94}
95function getChildren(node) {
96 return node.getChildren();
97}
98export function getFirstChild(node) {
99 const children = getChildren(node);
100 return utils.getValueOrUndefined(children[0]);
101}
102export function getFirstChildByKind(node, kind) {
103 const children = getChildren(node);
104 return children.find((value) => value.kind === kind);
105}
106export function getFirstAncestorByKind(node, kind) {
107 for (const ancestor of getAncestors(node)) {
108 if (ancestor.kind === kind) {
109 return ancestor;
110 }
111 }
112 return undefined;
113}
114export function getFirstAncestorByKindOrThrow(node, kind) {
115 return utils.throwIfNullOrUndefined(getFirstAncestorByKind(node, kind), 'ancestor');
116}
117export function getFirstAncestorByTest(node, isNode) {
118 for (const ancestor of getAncestors(node)) {
119 if (isNode(ancestor)) {
120 return ancestor;
121 }
122 }
123 return undefined;
124}
125export function getFirstAncestorByTestOrThrow(node, isNode) {
126 return utils.throwIfNullOrUndefined(getFirstAncestorByTest(node, isNode), 'ancestor');
127}
128export function getFirstDescendantByKind(node, kind) {
129 for (const ancestor of getDescendants(node)) {
130 if (ancestor.kind === kind) {
131 return ancestor;
132 }
133 }
134 return undefined;
135}
136function hasNodeFlag(node, flag) {
137 return (node.flags & flag) !== 0;
138}
139export function isGlobalAugmentation(node) {
140 return hasNodeFlag(node, ts.NodeFlags.GlobalAugmentation);
141}
142export function getSourceFile(node) {
143 return node.getSourceFile();
144}
145export function getPos(node) {
146 return node.pos;
147}
148export function getEnd(node) {
149 return node.end;
150}
151export function getChildAtPos(node, pos) {
152 if (pos < getPos(node) || pos >= getEnd(node)) {
153 return undefined;
154 }
155 return getChildren(node).find((child) => pos >= getPos(child) && pos < getEnd(child));
156}
157export function getDescendantAtPos(nodeIn, pos) {
158 let node;
159 while (true) {
160 const nextNode = getChildAtPos(node === undefined ? nodeIn : node, pos);
161 if (nextNode === undefined) {
162 return node;
163 }
164 node = nextNode;
165 }
166}
167export function isPartOfTypeNode(node) {
168 return ts.isPartOfTypeNode(node);
169}
170
171//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksR0FBRyxRQUFRLENBQUM7S0FDakI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQWE7SUFFNUMsT0FBUSxFQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsImZpbGUiOiJuZW8tb25lLXRzLXV0aWxzL3NyYy9ub2RlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGUgbm8tYW55XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxudHlwZSBOYW1lZE5vZGUgPSB0cy5Ob2RlICYgeyByZWFkb25seSBuYW1lOiB0cy5JZGVudGlmaWVyIH07XG50eXBlIE5hbWVhYmxlTm9kZSA9IHRzLk5vZGUgJiB7IHJlYWRvbmx5IG5hbWU/OiB0cy5JZGVudGlmaWVyIH07XG5leHBvcnQgdHlwZSBQcm9wZXJ0eU5hbWVkTm9kZSA9IHRzLk5vZGUgJiB7IHJlYWRvbmx5IG5hbWU6IHRzLlByb3BlcnR5TmFtZSB9O1xudHlwZSBQcm9wZXJ0eU5hbWVhYmxlTm9kZSA9IHRzLk5vZGUgJiB7IHJlYWRvbmx5IG5hbWU/OiB0cy5Qcm9wZXJ0eU5hbWUgfTtcbnR5cGUgQmluZGluZ05hbWVkTm9kZSA9IHRzLk5vZGUgJiB7IHJlYWRvbmx5IG5hbWU6IHRzLkJpbmRpbmdOYW1lIH07XG50eXBlIEJpbmRpbmdOYW1lYWJsZU5vZGUgPSB0cy5Ob2RlICYgeyByZWFkb25seSBuYW1lPzogdHMuQmluZGluZ05hbWUgfTtcbmV4cG9ydCB0eXBlIEFueU5hbWVhYmxlTm9kZSA9IE5hbWVhYmxlTm9kZSB8IFByb3BlcnR5TmFtZWFibGVOb2RlIHwgQmluZGluZ05hbWVhYmxlTm9kZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVOb2RlKG5vZGU6IE5hbWVkTm9kZSk6IHRzLklkZW50aWZpZXI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGUobm9kZTogUHJvcGVydHlOYW1lZE5vZGUpOiB0cy5Qcm9wZXJ0eU5hbWU7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGUobm9kZTogQmluZGluZ05hbWVkTm9kZSk6IHRzLkJpbmRpbmdOYW1lO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVOb2RlKG5vZGU6IE5hbWVhYmxlTm9kZSk6IHRzLklkZW50aWZpZXIgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGUobm9kZTogUHJvcGVydHlOYW1lYWJsZU5vZGUpOiB0cy5Qcm9wZXJ0eU5hbWUgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGUobm9kZTogQmluZGluZ05hbWVhYmxlTm9kZSk6IHRzLkJpbmRpbmdOYW1lIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVOb2RlKG5vZGU6IEFueU5hbWVhYmxlTm9kZSk6IHRzLklkZW50aWZpZXIgfCB0cy5Qcm9wZXJ0eU5hbWUgfCB0cy5CaW5kaW5nTmFtZSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lTm9kZShub2RlOiBhbnkpOiB0cy5JZGVudGlmaWVyIHwgdHMuUHJvcGVydHlOYW1lIHwgdHMuQmluZGluZ05hbWUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZChub2RlLm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGVPclRocm93KG5vZGU6IE5hbWVhYmxlTm9kZSB8IE5hbWVkTm9kZSk6IHRzLklkZW50aWZpZXI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGVPclRocm93KG5vZGU6IFByb3BlcnR5TmFtZWFibGVOb2RlIHwgUHJvcGVydHlOYW1lZE5vZGUpOiB0cy5Qcm9wZXJ0eU5hbWU7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGVPclRocm93KG5vZGU6IEJpbmRpbmdOYW1lYWJsZU5vZGUgfCBCaW5kaW5nTmFtZWROb2RlKTogdHMuQmluZGluZ05hbWU7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGVPclRocm93KG5vZGU6IGFueSk6IHRzLklkZW50aWZpZXIgfCB0cy5Qcm9wZXJ0eU5hbWUgfCB0cy5CaW5kaW5nTmFtZSB7XG4gIHJldHVybiB1dGlscy50aHJvd0lmTnVsbE9yVW5kZWZpbmVkKGdldE5hbWVOb2RlKG5vZGUpLCAnbmFtZScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZShub2RlOiBOYW1lZE5vZGUgfCBQcm9wZXJ0eU5hbWVkTm9kZSk6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lKFxuICBub2RlOiBOYW1lYWJsZU5vZGUgfCBQcm9wZXJ0eU5hbWVhYmxlTm9kZSB8IEJpbmRpbmdOYW1lYWJsZU5vZGUgfCBCaW5kaW5nTmFtZWROb2RlLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWUobm9kZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbmFtZSA9IGdldE5hbWVOb2RlKG5vZGUpIGFzIHRzLklkZW50aWZpZXIgfCB0cy5Qcm9wZXJ0eU5hbWUgfCB0cy5CaW5kaW5nTmFtZSB8IHVuZGVmaW5lZDtcbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB0cy5pc09iamVjdEJpbmRpbmdQYXR0ZXJuKG5hbWUpIHx8IHRzLmlzQXJyYXlCaW5kaW5nUGF0dGVybihuYW1lKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gbmFtZS5nZXRUZXh0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lT3JUaHJvdyhcbiAgbm9kZTogTmFtZWFibGVOb2RlIHwgTmFtZWROb2RlIHwgUHJvcGVydHlOYW1lYWJsZU5vZGUgfCBQcm9wZXJ0eU5hbWVkTm9kZSB8IEJpbmRpbmdOYW1lYWJsZU5vZGUgfCBCaW5kaW5nTmFtZWROb2RlLFxuKTogc3RyaW5nIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXROYW1lKG5vZGUgYXMgYW55KSwgJ25hbWUnKTtcbn1cblxudHlwZSBQcm9wZXJ0eU5hbWVOYW1lYWJsZU5vZGU8VCBleHRlbmRzIHRzLlByb3BlcnR5TmFtZT4gPSB0cy5Ob2RlICYgeyByZWFkb25seSBwcm9wZXJ0eU5hbWU/OiBUIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eU5hbWVOb2RlPFQgZXh0ZW5kcyB0cy5Qcm9wZXJ0eU5hbWU+KG5vZGU6IFByb3BlcnR5TmFtZU5hbWVhYmxlTm9kZTxUPik6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZChub2RlLnByb3BlcnR5TmFtZSk7XG59XG5cbnR5cGUgRG90RG90RG90VG9rZW5Ob2RlID0gdHMuTm9kZSAmIHsgcmVhZG9ubHkgZG90RG90RG90VG9rZW4/OiB0cy5Eb3REb3REb3RUb2tlbiB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG90RG90RG90VG9rZW4obm9kZTogRG90RG90RG90VG9rZW5Ob2RlKTogdHMuRG90RG90RG90VG9rZW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZChub2RlLmRvdERvdERvdFRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHQobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gIHJldHVybiBub2RlLmdldFRleHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFN5bnRheExpc3Qobm9kZTogdHMuTm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSB1dGlscy5nZXRWYWx1ZU9yVW5kZWZpbmVkKG5vZGUucGFyZW50KTtcbiAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHsgcG9zLCBlbmQgfSA9IG5vZGU7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIHBhcmVudC5nZXRDaGlsZHJlbigpKSB7XG4gICAgaWYgKGNoaWxkLnBvcyA+IGVuZCB8fCBjaGlsZCA9PT0gbm9kZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5TeW50YXhMaXN0ICYmIGNoaWxkLnBvcyA8PSBwb3MgJiYgY2hpbGQuZW5kID49IGVuZCkge1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7IC8vIHNob3VsZG4ndCBoYXBwZW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudDxUTm9kZSBleHRlbmRzIHRzLk5vZGU+KFxuICBub2RlOiBUTm9kZSxcbik6IFROb2RlIGV4dGVuZHMgeyByZWFkb25seSBwYXJlbnQ/OiBpbmZlciBUUGFyZW50IHwgbnVsbCB9ID8gVFBhcmVudCA6IG5ldmVyIHtcbiAgY29uc3QgcGFyZW50ID0gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZChub2RlLnBhcmVudCk7XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gcGFyZW50ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAobm9kZS5wYXJlbnQgYXMgYW55KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBnZXRBbmNlc3RvcnMobm9kZTogdHMuTm9kZSk6IEl0ZXJhYmxlSXRlcmF0b3I8dHMuTm9kZT4ge1xuICBsZXQgcGFyZW50ID0gZ2V0UGFyZW50KG5vZGUpIGFzIHRzLk5vZGUgfCB1bmRlZmluZWQ7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICB3aGlsZSAocGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICB5aWVsZCBwYXJlbnQ7XG4gICAgcGFyZW50ID0gZ2V0UGFyZW50KHBhcmVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBnZXREZXNjZW5kYW50cyhub2RlOiB0cy5Ob2RlKTogSXRlcmFibGVJdGVyYXRvcjx0cy5Ob2RlPiB7XG4gIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKG5vZGUpO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgd2hpbGUgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBtdXRhYmxlTmV4dENoaWxkcmVuOiB0cy5Ob2RlW10gPSBbXTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB5aWVsZCBjaGlsZDtcbiAgICAgIG11dGFibGVOZXh0Q2hpbGRyZW4ucHVzaCguLi5nZXRDaGlsZHJlbihjaGlsZCkpO1xuICAgIH1cblxuICAgIGNoaWxkcmVuID0gbXV0YWJsZU5leHRDaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGdldERlc2NlbmRhbnRzQnlLaW5kPFROb2RlIGV4dGVuZHMgdHMuTm9kZT4oXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGtpbmQ6IFROb2RlIGV4dGVuZHMgeyByZWFkb25seSBraW5kOiBpbmZlciBUS2luZCB9ID8gVEtpbmQgOiBuZXZlcixcbik6IEl0ZXJhYmxlSXRlcmF0b3I8VE5vZGU+IHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gIGZvciAoY29uc3QgZGVzY2VuZGFudCBvZiBnZXREZXNjZW5kYW50cyhub2RlKSkge1xuICAgIGlmIChkZXNjZW5kYW50LmtpbmQgPT09IGtpbmQpIHtcbiAgICAgIHlpZWxkIGRlc2NlbmRhbnQgYXMgVE5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldChzeW1ib2w6IHRzLlN5bWJvbCk6IHRzLlN5bWJvbCB7XG4gIGNvbnN0IHRhcmdldCA9IChzeW1ib2wgYXMgYW55KS50YXJnZXQ7XG5cbiAgcmV0dXJuIHRhcmdldCA9PT0gdW5kZWZpbmVkID8gc3ltYm9sIDogdGFyZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ltYm9sKHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlciwgbm9kZTogdHMuTm9kZSk6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgY29uc3Qgc3ltYm9sID0gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCgobm9kZSBhcyBhbnkpLnN5bWJvbCk7XG4gIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRUYXJnZXQoc3ltYm9sKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVDaGVja2VyU3ltYm9sID0gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCh0eXBlQ2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpKTtcbiAgaWYgKHR5cGVDaGVja2VyU3ltYm9sICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0VGFyZ2V0KHR5cGVDaGVja2VyU3ltYm9sKTtcbiAgfVxuXG4gIGNvbnN0IG5hbWVOb2RlID0gZ2V0TmFtZU5vZGUobm9kZSk7XG4gIGlmIChuYW1lTm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGdldFN5bWJvbCh0eXBlQ2hlY2tlciwgbmFtZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bWJvbE9yVGhyb3codHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLCBub2RlOiB0cy5Ob2RlKTogdHMuU3ltYm9sIHtcbiAgcmV0dXJuIHV0aWxzLnRocm93SWZOdWxsT3JVbmRlZmluZWQoZ2V0U3ltYm9sKHR5cGVDaGVja2VyLCBub2RlKSwgJ3N5bWJvbCcpO1xufVxuXG5mdW5jdGlvbiBnZXRDaGlsZHJlbihub2RlOiB0cy5Ob2RlKTogcmVhZG9ubHkgdHMuTm9kZVtdIHtcbiAgcmV0dXJuIG5vZGUuZ2V0Q2hpbGRyZW4oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0Q2hpbGQobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKG5vZGUpO1xuXG4gIHJldHVybiB1dGlscy5nZXRWYWx1ZU9yVW5kZWZpbmVkKGNoaWxkcmVuWzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0Q2hpbGRCeUtpbmQ8VE5vZGUgZXh0ZW5kcyB0cy5Ob2RlPihcbiAgbm9kZTogdHMuTm9kZSxcbiAga2luZDogVE5vZGUgZXh0ZW5kcyB7IHJlYWRvbmx5IGtpbmQ6IGluZmVyIFRLaW5kIH0gPyBUS2luZCA6IG5ldmVyLFxuKTogVE5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKG5vZGUpO1xuXG4gIHJldHVybiBjaGlsZHJlbi5maW5kKCh2YWx1ZSk6IHZhbHVlIGlzIFROb2RlID0+IHZhbHVlLmtpbmQgPT09IGtpbmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RBbmNlc3RvckJ5S2luZDxUTm9kZSBleHRlbmRzIHRzLk5vZGU+KFxuICBub2RlOiB0cy5Ob2RlLFxuICBraW5kOiBUTm9kZSBleHRlbmRzIHsgcmVhZG9ubHkga2luZDogaW5mZXIgVEtpbmQgfSA/IFRLaW5kIDogbmV2ZXIsXG4pOiBUTm9kZSB8IHVuZGVmaW5lZCB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGdldEFuY2VzdG9ycyhub2RlKSkge1xuICAgIGlmIChhbmNlc3Rvci5raW5kID09PSBraW5kKSB7XG4gICAgICByZXR1cm4gYW5jZXN0b3IgYXMgVE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0QW5jZXN0b3JCeUtpbmRPclRocm93PFROb2RlIGV4dGVuZHMgdHMuTm9kZT4oXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGtpbmQ6IFROb2RlIGV4dGVuZHMgeyByZWFkb25seSBraW5kOiBpbmZlciBUS2luZCB9ID8gVEtpbmQgOiBuZXZlcixcbik6IFROb2RlIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXRGaXJzdEFuY2VzdG9yQnlLaW5kPFROb2RlPihub2RlLCBraW5kIGFzIGFueSksICdhbmNlc3RvcicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RBbmNlc3RvckJ5VGVzdDxUTm9kZSBleHRlbmRzIHRzLk5vZGU+KFxuICBub2RlOiB0cy5Ob2RlLFxuICBpc05vZGU6ICh2YWx1ZTogdHMuTm9kZSkgPT4gdmFsdWUgaXMgVE5vZGUsXG4pOiBUTm9kZSB8IHVuZGVmaW5lZCB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGdldEFuY2VzdG9ycyhub2RlKSkge1xuICAgIGlmIChpc05vZGUoYW5jZXN0b3IpKSB7XG4gICAgICByZXR1cm4gYW5jZXN0b3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0QW5jZXN0b3JCeVRlc3RPclRocm93PFROb2RlIGV4dGVuZHMgdHMuTm9kZT4oXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGlzTm9kZTogKHZhbHVlOiB0cy5Ob2RlKSA9PiB2YWx1ZSBpcyBUTm9kZSxcbik6IFROb2RlIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXRGaXJzdEFuY2VzdG9yQnlUZXN0PFROb2RlPihub2RlLCBpc05vZGUpLCAnYW5jZXN0b3InKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0RGVzY2VuZGFudEJ5S2luZDxUTm9kZSBleHRlbmRzIHRzLk5vZGU+KFxuICBub2RlOiB0cy5Ob2RlLFxuICBraW5kOiBUTm9kZSBleHRlbmRzIHsgcmVhZG9ubHkga2luZDogaW5mZXIgVEtpbmQgfSA/IFRLaW5kIDogbmV2ZXIsXG4pOiBUTm9kZSB8IHVuZGVmaW5lZCB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGdldERlc2NlbmRhbnRzKG5vZGUpKSB7XG4gICAgaWYgKGFuY2VzdG9yLmtpbmQgPT09IGtpbmQpIHtcbiAgICAgIHJldHVybiBhbmNlc3RvciBhcyBUTm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNOb2RlRmxhZyhub2RlOiB0cy5Ob2RlLCBmbGFnOiB0cy5Ob2RlRmxhZ3MpOiBib29sZWFuIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgcmV0dXJuIChub2RlLmZsYWdzICYgZmxhZykgIT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JhbEF1Z21lbnRhdGlvbihub2RlOiB0cy5Ob2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNOb2RlRmxhZyhub2RlLCB0cy5Ob2RlRmxhZ3MuR2xvYmFsQXVnbWVudGF0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUZpbGUobm9kZTogdHMuTm9kZSk6IHRzLlNvdXJjZUZpbGUge1xuICByZXR1cm4gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3Mobm9kZTogdHMuTm9kZSk6IG51bWJlciB7XG4gIHJldHVybiBub2RlLnBvcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVuZChub2RlOiB0cy5Ob2RlKTogbnVtYmVyIHtcbiAgcmV0dXJuIG5vZGUuZW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hpbGRBdFBvcyhub2RlOiB0cy5Ob2RlLCBwb3M6IG51bWJlcik6IHRzLk5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zIDwgZ2V0UG9zKG5vZGUpIHx8IHBvcyA+PSBnZXRFbmQobm9kZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGdldENoaWxkcmVuKG5vZGUpLmZpbmQoKGNoaWxkKSA9PiBwb3MgPj0gZ2V0UG9zKGNoaWxkKSAmJiBwb3MgPCBnZXRFbmQoY2hpbGQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2NlbmRhbnRBdFBvcyhub2RlSW46IHRzLk5vZGUsIHBvczogbnVtYmVyKTogdHMuTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGxldCBub2RlOiB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBuZXh0Tm9kZSA9IGdldENoaWxkQXRQb3Mobm9kZSA9PT0gdW5kZWZpbmVkID8gbm9kZUluIDogbm9kZSwgcG9zKTtcbiAgICBpZiAobmV4dE5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnRPZlR5cGVOb2RlKG5vZGU6IHRzLk5vZGUpOiBib29sZWFuIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gKHRzIGFzIGFueSkuaXNQYXJ0T2ZUeXBlTm9kZShub2RlKTtcbn1cbiJdfQ==