@ethlete/core 4.23.8 → 4.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/fesm2022/ethlete-core.mjs +131 -139
- package/fesm2022/ethlete-core.mjs.map +1 -1
- package/lib/types/angular.types.d.ts +0 -1
- package/lib/utils/signal.utils.d.ts +5 -0
- package/package.json +7 -9
- package/esm2022/ethlete-core.mjs +0 -5
- package/esm2022/index.mjs +0 -38
- package/esm2022/lib/components/structured-data/index.mjs +0 -2
- package/esm2022/lib/components/structured-data/structured-data.component.mjs +0 -37
- package/esm2022/lib/constants/index.mjs +0 -2
- package/esm2022/lib/constants/viewport.constants.mjs +0 -17
- package/esm2022/lib/decorators/memo/index.mjs +0 -2
- package/esm2022/lib/decorators/memo/memo.decorator.mjs +0 -25
- package/esm2022/lib/directives/animatable/animatable.directive.mjs +0 -121
- package/esm2022/lib/directives/animatable/index.mjs +0 -2
- package/esm2022/lib/directives/animated-if/animated-if.directive.mjs +0 -54
- package/esm2022/lib/directives/animated-if/index.mjs +0 -2
- package/esm2022/lib/directives/animated-lifecycle/animated-lifecycle.directive.mjs +0 -136
- package/esm2022/lib/directives/animated-lifecycle/index.mjs +0 -2
- package/esm2022/lib/directives/animated-overlay/animated-overlay.directive.mjs +0 -344
- package/esm2022/lib/directives/animated-overlay/index.mjs +0 -2
- package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +0 -37
- package/esm2022/lib/directives/click-outside/index.mjs +0 -2
- package/esm2022/lib/directives/cursor-drag-scroll/cursor-drag-scroll.constants.mjs +0 -3
- package/esm2022/lib/directives/cursor-drag-scroll/cursor-drag-scroll.directive.mjs +0 -170
- package/esm2022/lib/directives/cursor-drag-scroll/index.mjs +0 -3
- package/esm2022/lib/directives/debug/debug.directive.mjs +0 -44
- package/esm2022/lib/directives/debug/index.mjs +0 -2
- package/esm2022/lib/directives/delayable/delayable.directive.mjs +0 -55
- package/esm2022/lib/directives/delayable/index.mjs +0 -2
- package/esm2022/lib/directives/is-active-element/index.mjs +0 -2
- package/esm2022/lib/directives/is-active-element/is-active-element.directive.mjs +0 -33
- package/esm2022/lib/directives/is-element/index.mjs +0 -2
- package/esm2022/lib/directives/is-element/is-element.directive.mjs +0 -33
- package/esm2022/lib/directives/let/index.mjs +0 -3
- package/esm2022/lib/directives/let/let.directive.mjs +0 -40
- package/esm2022/lib/directives/let/let.types.mjs +0 -9
- package/esm2022/lib/directives/observe-content/index.mjs +0 -2
- package/esm2022/lib/directives/observe-content/observe-content.directive.mjs +0 -72
- package/esm2022/lib/directives/observe-resize/index.mjs +0 -2
- package/esm2022/lib/directives/observe-resize/observe-resize.directive.mjs +0 -72
- package/esm2022/lib/directives/observe-scroll-state/index.mjs +0 -4
- package/esm2022/lib/directives/observe-scroll-state/observe-scroll-state.constants.mjs +0 -3
- package/esm2022/lib/directives/observe-scroll-state/observe-scroll-state.directive.mjs +0 -180
- package/esm2022/lib/directives/observe-scroll-state/observe-scroll-state.types.mjs +0 -2
- package/esm2022/lib/directives/observe-visibility/index.mjs +0 -2
- package/esm2022/lib/directives/observe-visibility/observe-visibility.directive.mjs +0 -80
- package/esm2022/lib/directives/repeat/index.mjs +0 -2
- package/esm2022/lib/directives/repeat/repeat.directive.mjs +0 -35
- package/esm2022/lib/directives/root-boundary/index.mjs +0 -2
- package/esm2022/lib/directives/root-boundary/root-boundary.directive.mjs +0 -36
- package/esm2022/lib/directives/scroll-observer-first-element/index.mjs +0 -2
- package/esm2022/lib/directives/scroll-observer-first-element/scroll-observer-first-element.directive.mjs +0 -24
- package/esm2022/lib/directives/scroll-observer-ignore-target/index.mjs +0 -2
- package/esm2022/lib/directives/scroll-observer-ignore-target/scroll-observer-ignore-target.directive.mjs +0 -18
- package/esm2022/lib/directives/scroll-observer-last-element/index.mjs +0 -2
- package/esm2022/lib/directives/scroll-observer-last-element/scroll-observer-last-element.directive.mjs +0 -27
- package/esm2022/lib/directives/seo/index.mjs +0 -5
- package/esm2022/lib/directives/seo/seo.directive.constants.mjs +0 -3
- package/esm2022/lib/directives/seo/seo.directive.mjs +0 -166
- package/esm2022/lib/directives/seo/seo.directive.types.mjs +0 -2
- package/esm2022/lib/directives/seo/seo.directive.utils.mjs +0 -7
- package/esm2022/lib/pipes/infer-mime-type/index.mjs +0 -3
- package/esm2022/lib/pipes/infer-mime-type/infer-mime-type.pipe.mjs +0 -18
- package/esm2022/lib/pipes/infer-mime-type/infer-mime-type.util.mjs +0 -196
- package/esm2022/lib/pipes/normalize-game-result-type/index.mjs +0 -4
- package/esm2022/lib/pipes/normalize-game-result-type/normalize-game-result-type.pipe.mjs +0 -15
- package/esm2022/lib/pipes/normalize-game-result-type/normalize-game-result-type.types.mjs +0 -2
- package/esm2022/lib/pipes/normalize-game-result-type/normalize-game-result-type.util.mjs +0 -34
- package/esm2022/lib/pipes/normalize-match-participants/index.mjs +0 -4
- package/esm2022/lib/pipes/normalize-match-participants/normalize-match-participants.pipe.mjs +0 -15
- package/esm2022/lib/pipes/normalize-match-participants/normalize-match-participants.types.mjs +0 -2
- package/esm2022/lib/pipes/normalize-match-participants/normalize-match-participants.util.mjs +0 -47
- package/esm2022/lib/pipes/normalize-match-score/index.mjs +0 -4
- package/esm2022/lib/pipes/normalize-match-score/normalize-match-score.pipe.mjs +0 -15
- package/esm2022/lib/pipes/normalize-match-score/normalize-match-score.types.mjs +0 -2
- package/esm2022/lib/pipes/normalize-match-score/normalize-match-score.util.mjs +0 -126
- package/esm2022/lib/pipes/normalize-match-state/index.mjs +0 -4
- package/esm2022/lib/pipes/normalize-match-state/normalize-match-state.constants.mjs +0 -2
- package/esm2022/lib/pipes/normalize-match-state/normalize-match-state.pipe.mjs +0 -15
- package/esm2022/lib/pipes/normalize-match-state/normalize-match-state.util.mjs +0 -19
- package/esm2022/lib/pipes/normalize-match-type/index.mjs +0 -3
- package/esm2022/lib/pipes/normalize-match-type/normalize-match-type.pipe.mjs +0 -15
- package/esm2022/lib/pipes/normalize-match-type/normalize-match-type.util.mjs +0 -38
- package/esm2022/lib/pipes/to-array/index.mjs +0 -3
- package/esm2022/lib/pipes/to-array/to-array.pipe.mjs +0 -15
- package/esm2022/lib/pipes/to-array/to-array.util.mjs +0 -5
- package/esm2022/lib/props/create-prop-handlers.mjs +0 -17
- package/esm2022/lib/props/create-props.mjs +0 -53
- package/esm2022/lib/props/create-setup.mjs +0 -19
- package/esm2022/lib/props/dependency-stash.mjs +0 -20
- package/esm2022/lib/props/element-dictionary.mjs +0 -44
- package/esm2022/lib/props/index.mjs +0 -9
- package/esm2022/lib/props/props-binding.mjs +0 -53
- package/esm2022/lib/props/props.directive.mjs +0 -35
- package/esm2022/lib/props/template-input.mjs +0 -41
- package/esm2022/lib/services/click-observer.service.mjs +0 -73
- package/esm2022/lib/services/content-observer.service.mjs +0 -79
- package/esm2022/lib/services/focus-visible.service.mjs +0 -34
- package/esm2022/lib/services/index.mjs +0 -9
- package/esm2022/lib/services/intersection-observer.service.mjs +0 -75
- package/esm2022/lib/services/resize-observer.service.mjs +0 -75
- package/esm2022/lib/services/router-state.service.mjs +0 -205
- package/esm2022/lib/services/viewport.service.mjs +0 -244
- package/esm2022/lib/services/viewport.types.mjs +0 -2
- package/esm2022/lib/types/angular.types.mjs +0 -15
- package/esm2022/lib/types/i18n.types.mjs +0 -2
- package/esm2022/lib/types/index.mjs +0 -5
- package/esm2022/lib/types/value.types.mjs +0 -2
- package/esm2022/lib/types/viewport.types.mjs +0 -2
- package/esm2022/lib/utils/active-selection-model.utils.mjs +0 -91
- package/esm2022/lib/utils/angular.utils.mjs +0 -7
- package/esm2022/lib/utils/animation.utils.mjs +0 -113
- package/esm2022/lib/utils/clamp.util.mjs +0 -4
- package/esm2022/lib/utils/clone.util.mjs +0 -78
- package/esm2022/lib/utils/component-id.utils.mjs +0 -7
- package/esm2022/lib/utils/cookie.util.mjs +0 -53
- package/esm2022/lib/utils/destroy.utils.mjs +0 -13
- package/esm2022/lib/utils/equal.util.mjs +0 -118
- package/esm2022/lib/utils/form.utils.mjs +0 -63
- package/esm2022/lib/utils/index.mjs +0 -27
- package/esm2022/lib/utils/inject.utils.mjs +0 -4
- package/esm2022/lib/utils/intersection-observer.utils.mjs +0 -65
- package/esm2022/lib/utils/key-press-manager.utils.mjs +0 -30
- package/esm2022/lib/utils/media-query-observable.util.mjs +0 -18
- package/esm2022/lib/utils/mutation-observable.util.mjs +0 -42
- package/esm2022/lib/utils/object.utils.mjs +0 -30
- package/esm2022/lib/utils/reactive-binding.util.mjs +0 -124
- package/esm2022/lib/utils/resize-observable.util.mjs +0 -12
- package/esm2022/lib/utils/round.utils.mjs +0 -5
- package/esm2022/lib/utils/runtime-error.utils.mjs +0 -31
- package/esm2022/lib/utils/scrollable.utils.mjs +0 -157
- package/esm2022/lib/utils/selection-model.utils.mjs +0 -376
- package/esm2022/lib/utils/signal.utils.mjs +0 -1004
- package/esm2022/lib/utils/smart-block-scroll-strategy.utils.mjs +0 -96
- package/esm2022/lib/utils/value.utils.mjs +0 -22
- package/esm2022/lib/utils/viewport.util.mjs +0 -5
- package/esm2022/lib/validators/at-least-one-required.validator.mjs +0 -20
- package/esm2022/lib/validators/index.mjs +0 -15
- package/esm2022/lib/validators/is-array-not-empty.validator.mjs +0 -9
- package/esm2022/lib/validators/is-email.validator.mjs +0 -10
- package/esm2022/lib/validators/must-match.validator.mjs +0 -19
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { clamp } from './clamp.util';
|
|
2
|
-
export const elementCanScroll = (element, direction) => {
|
|
3
|
-
const { scrollHeight, clientHeight, scrollWidth, clientWidth } = element;
|
|
4
|
-
if (direction === 'x') {
|
|
5
|
-
return scrollWidth > clientWidth;
|
|
6
|
-
}
|
|
7
|
-
else if (direction === 'y') {
|
|
8
|
-
return scrollHeight > clientHeight;
|
|
9
|
-
}
|
|
10
|
-
return scrollHeight > clientHeight || scrollWidth > clientWidth;
|
|
11
|
-
};
|
|
12
|
-
export const isElementVisible = (options) => {
|
|
13
|
-
let { container } = options;
|
|
14
|
-
const { element } = options;
|
|
15
|
-
if (!element || container === null) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
container ||= document.documentElement;
|
|
19
|
-
const canScroll = elementCanScroll(container);
|
|
20
|
-
if (!canScroll) {
|
|
21
|
-
return {
|
|
22
|
-
inline: true,
|
|
23
|
-
block: true,
|
|
24
|
-
blockIntersection: 1,
|
|
25
|
-
inlineIntersection: 1,
|
|
26
|
-
intersectionRatio: 1,
|
|
27
|
-
isIntersecting: true,
|
|
28
|
-
element,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
const elementRect = options.elementRect || element.getBoundingClientRect();
|
|
32
|
-
const containerRect = options.containerRect || container.getBoundingClientRect();
|
|
33
|
-
const elementInlineStart = elementRect.left;
|
|
34
|
-
const elementBlockStart = elementRect.top;
|
|
35
|
-
const containerInlineStart = containerRect.left;
|
|
36
|
-
const containerBlockStart = containerRect.top;
|
|
37
|
-
const elWith = elementRect.width || 1;
|
|
38
|
-
const elHeight = elementRect.height || 1;
|
|
39
|
-
const elementInlineEnd = elementInlineStart + elWith;
|
|
40
|
-
const elementBlockEnd = elementBlockStart + elHeight;
|
|
41
|
-
const containerInlineEnd = containerInlineStart + containerRect.width;
|
|
42
|
-
const containerBlockEnd = containerBlockStart + containerRect.height;
|
|
43
|
-
const isElementInlineVisible = elementInlineStart >= containerInlineStart && elementInlineEnd <= containerInlineEnd;
|
|
44
|
-
const isElementBlockVisible = elementBlockStart >= containerBlockStart && elementBlockEnd <= containerBlockEnd;
|
|
45
|
-
const inlineIntersection = Math.min(elementInlineEnd, containerInlineEnd) - Math.max(elementInlineStart, containerInlineStart);
|
|
46
|
-
const blockIntersection = Math.min(elementBlockEnd, containerBlockEnd) - Math.max(elementBlockStart, containerBlockStart);
|
|
47
|
-
const inlineIntersectionPercentage = clamp(inlineIntersection / elWith, 0, 1);
|
|
48
|
-
const blockIntersectionPercentage = clamp(blockIntersection / elHeight, 0, 1);
|
|
49
|
-
return {
|
|
50
|
-
inline: isElementInlineVisible,
|
|
51
|
-
block: isElementBlockVisible,
|
|
52
|
-
inlineIntersection: inlineIntersectionPercentage,
|
|
53
|
-
blockIntersection: blockIntersectionPercentage,
|
|
54
|
-
isIntersecting: isElementInlineVisible && isElementBlockVisible,
|
|
55
|
-
element,
|
|
56
|
-
// Round the intersection ratio to the nearest 0.01 to avoid floating point errors and system scaling issues.
|
|
57
|
-
intersectionRatio: Math.round(Math.min(inlineIntersectionPercentage, blockIntersectionPercentage) * 100) / 100,
|
|
58
|
-
};
|
|
59
|
-
};
|
|
60
|
-
export const getElementScrollCoordinates = (options) => {
|
|
61
|
-
let { container } = options;
|
|
62
|
-
const { element, direction, behavior = 'smooth', origin = 'nearest', scrollBlockMargin = 0, scrollInlineMargin = 0, } = options;
|
|
63
|
-
if (!element || container === null) {
|
|
64
|
-
return {
|
|
65
|
-
behavior,
|
|
66
|
-
left: undefined,
|
|
67
|
-
top: undefined,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
container ||= document.documentElement;
|
|
71
|
-
const canScroll = elementCanScroll(container);
|
|
72
|
-
if (!canScroll) {
|
|
73
|
-
return {
|
|
74
|
-
behavior,
|
|
75
|
-
left: undefined,
|
|
76
|
-
top: undefined,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
const elementRect = element.getBoundingClientRect();
|
|
80
|
-
const containerRect = container.getBoundingClientRect();
|
|
81
|
-
const { scrollLeft, scrollTop } = container;
|
|
82
|
-
const { width: elementWidth, height: elementHeight, left: elementLeft, top: elementTop } = elementRect;
|
|
83
|
-
const { width: containerWidth, height: containerHeight, left: containerLeft, top: containerTop } = containerRect;
|
|
84
|
-
const shouldScrollLeft = direction === 'inline' || direction === 'both' || !direction;
|
|
85
|
-
const shouldScrollTop = direction === 'block' || direction === 'both' || !direction;
|
|
86
|
-
let scrollLeftTo = scrollLeft;
|
|
87
|
-
let scrollTopTo = scrollTop;
|
|
88
|
-
const scrollToElementStart = () => {
|
|
89
|
-
const relativeTop = elementTop - containerTop;
|
|
90
|
-
const relativeLeft = elementLeft - containerLeft;
|
|
91
|
-
const amountToScrollTop = relativeTop;
|
|
92
|
-
const amountToScrollLeft = relativeLeft;
|
|
93
|
-
const scrollTopPosition = scrollTop + amountToScrollTop;
|
|
94
|
-
const scrollLeftPosition = scrollLeft + amountToScrollLeft;
|
|
95
|
-
scrollLeftTo = scrollLeftPosition - scrollInlineMargin;
|
|
96
|
-
scrollTopTo = scrollTopPosition - scrollBlockMargin;
|
|
97
|
-
};
|
|
98
|
-
const scrollToElementEnd = () => {
|
|
99
|
-
const relativeTop = elementTop - containerTop;
|
|
100
|
-
const relativeLeft = elementLeft - containerLeft;
|
|
101
|
-
const amountToScrollTop = relativeTop - containerHeight + elementHeight;
|
|
102
|
-
const amountToScrollLeft = relativeLeft - containerWidth + elementWidth;
|
|
103
|
-
const scrollTopPosition = scrollTop + amountToScrollTop;
|
|
104
|
-
const scrollLeftPosition = scrollLeft + amountToScrollLeft;
|
|
105
|
-
scrollLeftTo = scrollLeftPosition + scrollInlineMargin;
|
|
106
|
-
scrollTopTo = scrollTopPosition + scrollBlockMargin;
|
|
107
|
-
};
|
|
108
|
-
const scrollToElementCenter = () => {
|
|
109
|
-
const relativeTop = elementTop - containerTop;
|
|
110
|
-
const relativeLeft = elementLeft - containerLeft;
|
|
111
|
-
const amountToScrollTop = relativeTop - containerHeight / 2 + elementHeight / 2;
|
|
112
|
-
const amountToScrollLeft = relativeLeft - containerWidth / 2 + elementWidth / 2;
|
|
113
|
-
const scrollTopPosition = scrollTop + amountToScrollTop;
|
|
114
|
-
const scrollLeftPosition = scrollLeft + amountToScrollLeft;
|
|
115
|
-
scrollLeftTo = scrollLeftPosition;
|
|
116
|
-
scrollTopTo = scrollTopPosition;
|
|
117
|
-
};
|
|
118
|
-
const scrollToElementNearest = () => {
|
|
119
|
-
const isAbove = elementRect.bottom < containerRect.top;
|
|
120
|
-
const isPartialAbove = elementRect.top < containerRect.top && elementRect.bottom > containerRect.top;
|
|
121
|
-
const isBelow = elementRect.top > containerRect.bottom;
|
|
122
|
-
const isPartialBelow = elementRect.top < containerRect.bottom && elementRect.bottom > containerRect.bottom;
|
|
123
|
-
const isLeft = elementRect.right < containerRect.left;
|
|
124
|
-
const isPartialLeft = elementRect.left < containerRect.left && elementRect.right > containerRect.left;
|
|
125
|
-
const isRight = elementRect.left > containerRect.right;
|
|
126
|
-
const isPartialRight = elementRect.left < containerRect.right && elementRect.right > containerRect.right;
|
|
127
|
-
if (isAbove || isPartialAbove || isLeft || isPartialLeft) {
|
|
128
|
-
scrollToElementStart();
|
|
129
|
-
}
|
|
130
|
-
else if (isBelow || isPartialBelow || isRight || isPartialRight) {
|
|
131
|
-
scrollToElementEnd();
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
switch (origin) {
|
|
135
|
-
case 'start':
|
|
136
|
-
scrollToElementStart();
|
|
137
|
-
break;
|
|
138
|
-
case 'end':
|
|
139
|
-
scrollToElementEnd();
|
|
140
|
-
break;
|
|
141
|
-
case 'center':
|
|
142
|
-
scrollToElementCenter();
|
|
143
|
-
break;
|
|
144
|
-
case 'nearest':
|
|
145
|
-
scrollToElementNearest();
|
|
146
|
-
break;
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
149
|
-
behavior,
|
|
150
|
-
left: shouldScrollLeft ? scrollLeftTo : undefined,
|
|
151
|
-
top: shouldScrollTop ? scrollTopTo : undefined,
|
|
152
|
-
};
|
|
153
|
-
};
|
|
154
|
-
export const scrollToElement = (options) => {
|
|
155
|
-
options.container?.scrollTo(getElementScrollCoordinates(options));
|
|
156
|
-
};
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3V0aWxzL3Njcm9sbGFibGUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQW9CLEVBQUUsU0FBcUIsRUFBRSxFQUFFO0lBQzlFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFekUsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDdEIsT0FBTyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7U0FBTSxJQUFJLFNBQVMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUM3QixPQUFPLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztJQUVELE9BQU8sWUFBWSxHQUFHLFlBQVksSUFBSSxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQ2xFLENBQUMsQ0FBQztBQWdFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQWdDLEVBQW1DLEVBQUU7SUFDcEcsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUM1QixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTVCLElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVMsS0FBSyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBRXZDLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE9BQU87WUFD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aWwnO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudENhblNjcm9sbCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZGlyZWN0aW9uPzogJ3gnIHwgJ3knKSA9PiB7XG4gIGNvbnN0IHsgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQsIHNjcm9sbFdpZHRoLCBjbGllbnRXaWR0aCB9ID0gZWxlbWVudDtcblxuICBpZiAoZGlyZWN0aW9uID09PSAneCcpIHtcbiAgICByZXR1cm4gc2Nyb2xsV2lkdGggPiBjbGllbnRXaWR0aDtcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICd5Jykge1xuICAgIHJldHVybiBzY3JvbGxIZWlnaHQgPiBjbGllbnRIZWlnaHQ7XG4gIH1cblxuICByZXR1cm4gc2Nyb2xsSGVpZ2h0ID4gY2xpZW50SGVpZ2h0IHx8IHNjcm9sbFdpZHRoID4gY2xpZW50V2lkdGg7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElzRWxlbWVudFZpc2libGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGNoZWNrIGlmIGl0IGlzIHZpc2libGUgaW5zaWRlIGEgY29udGFpbmVyLlxuICAgKi9cbiAgZWxlbWVudD86IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lciB0byBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluc2lkZS5cbiAgICogQGRlZmF1bHQgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAqL1xuICBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIncyByZWN0IHRvIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW5zaWRlLiBDYW4gYmUgc3VwcGxpZWQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgRE9NIHJlYWRzLlxuICAgKiBAZGVmYXVsdCBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICovXG4gIGNvbnRhaW5lclJlY3Q/OiBET01SZWN0IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQncyByZWN0LiBDYW4gYmUgc3VwcGxpZWQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgRE9NIHJlYWRzLlxuICAgKiBAZGVmYXVsdCBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICovXG4gIGVsZW1lbnRSZWN0PzogRE9NUmVjdCB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudEVsZW1lbnRWaXNpYmlsaXR5IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgaW5saW5lIGRpcmVjdGlvbi5cbiAgICovXG4gIGlubGluZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIHRoZSBibG9jayBkaXJlY3Rpb24uXG4gICAqL1xuICBibG9jazogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyB2aXNpYmxlIGluIHRoZSBpbmxpbmUgZGlyZWN0aW9uLlxuICAgKi9cbiAgaW5saW5lSW50ZXJzZWN0aW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgdmlzaWJsZSBpbiB0aGUgYmxvY2sgZGlyZWN0aW9uLlxuICAgKi9cbiAgYmxvY2tJbnRlcnNlY3Rpb246IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZWxlbWVudCBpcyBpbnRlcnNlY3RpbmcgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIGlzSW50ZXJzZWN0aW5nOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBpbnRlcnNlY3RpbmcgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIGludGVyc2VjdGlvblJhdGlvOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgaXMgYmVpbmcgY2hlY2tlZCBmb3IgdmlzaWJpbGl0eS5cbiAgICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgaXNFbGVtZW50VmlzaWJsZSA9IChvcHRpb25zOiBJc0VsZW1lbnRWaXNpYmxlT3B0aW9ucyk6IEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSB8IG51bGwgPT4ge1xuICBsZXQgeyBjb250YWluZXIgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgZWxlbWVudCB9ID0gb3B0aW9ucztcblxuICBpZiAoIWVsZW1lbnQgfHwgY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb250YWluZXIgfHw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICBjb25zdCBjYW5TY3JvbGwgPSBlbGVtZW50Q2FuU2Nyb2xsKGNvbnRhaW5lcik7XG5cbiAgaWYgKCFjYW5TY3JvbGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5saW5lOiB0cnVlLFxuICAgICAgYmxvY2s6IHRydWUsXG4gICAgICBibG9ja0ludGVyc2VjdGlvbjogMSxcbiAgICAgIGlubGluZUludGVyc2VjdGlvbjogMSxcbiAgICAgIGludGVyc2VjdGlvblJhdGlvOiAxLFxuICAgICAgaXNJbnRlcnNlY3Rpbmc6IHRydWUsXG4gICAgICBlbGVtZW50LFxuICAgIH07XG4gIH1cblxuICBjb25zdCBlbGVtZW50UmVjdCA9IG9wdGlvbnMuZWxlbWVudFJlY3QgfHwgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgY29udGFpbmVyUmVjdCA9IG9wdGlvbnMuY29udGFpbmVyUmVjdCB8fCBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgY29uc3QgZWxlbWVudElubGluZVN0YXJ0ID0gZWxlbWVudFJlY3QubGVmdDtcbiAgY29uc3QgZWxlbWVudEJsb2NrU3RhcnQgPSBlbGVtZW50UmVjdC50b3A7XG5cbiAgY29uc3QgY29udGFpbmVySW5saW5lU3RhcnQgPSBjb250YWluZXJSZWN0LmxlZnQ7XG4gIGNvbnN0IGNvbnRhaW5lckJsb2NrU3RhcnQgPSBjb250YWluZXJSZWN0LnRvcDtcblxuICBjb25zdCBlbFdpdGggPSBlbGVtZW50UmVjdC53aWR0aCB8fCAxO1xuICBjb25zdCBlbEhlaWdodCA9IGVsZW1lbnRSZWN0LmhlaWdodCB8fCAxO1xuXG4gIGNvbnN0IGVsZW1lbnRJbmxpbmVFbmQgPSBlbGVtZW50SW5saW5lU3RhcnQgKyBlbFdpdGg7XG4gIGNvbnN0IGVsZW1lbnRCbG9ja0VuZCA9IGVsZW1lbnRCbG9ja1N0YXJ0ICsgZWxIZWlnaHQ7XG5cbiAgY29uc3QgY29udGFpbmVySW5saW5lRW5kID0gY29udGFpbmVySW5saW5lU3RhcnQgKyBjb250YWluZXJSZWN0LndpZHRoO1xuICBjb25zdCBjb250YWluZXJCbG9ja0VuZCA9IGNvbnRhaW5lckJsb2NrU3RhcnQgKyBjb250YWluZXJSZWN0LmhlaWdodDtcblxuICBjb25zdCBpc0VsZW1lbnRJbmxpbmVWaXNpYmxlID0gZWxlbWVudElubGluZVN0YXJ0ID49IGNvbnRhaW5lcklubGluZVN0YXJ0ICYmIGVsZW1lbnRJbmxpbmVFbmQgPD0gY29udGFpbmVySW5saW5lRW5kO1xuICBjb25zdCBpc0VsZW1lbnRCbG9ja1Zpc2libGUgPSBlbGVtZW50QmxvY2tTdGFydCA+PSBjb250YWluZXJCbG9ja1N0YXJ0ICYmIGVsZW1lbnRCbG9ja0VuZCA8PSBjb250YWluZXJCbG9ja0VuZDtcblxuICBjb25zdCBpbmxpbmVJbnRlcnNlY3Rpb24gPVxuICAgIE1hdGgubWluKGVsZW1lbnRJbmxpbmVFbmQsIGNvbnRhaW5lcklubGluZUVuZCkgLSBNYXRoLm1heChlbGVtZW50SW5saW5lU3RhcnQsIGNvbnRhaW5lcklubGluZVN0YXJ0KTtcbiAgY29uc3QgYmxvY2tJbnRlcnNlY3Rpb24gPVxuICAgIE1hdGgubWluKGVsZW1lbnRCbG9ja0VuZCwgY29udGFpbmVyQmxvY2tFbmQpIC0gTWF0aC5tYXgoZWxlbWVudEJsb2NrU3RhcnQsIGNvbnRhaW5lckJsb2NrU3RhcnQpO1xuXG4gIGNvbnN0IGlubGluZUludGVyc2VjdGlvblBlcmNlbnRhZ2UgPSBjbGFtcChpbmxpbmVJbnRlcnNlY3Rpb24gLyBlbFdpdGgsIDAsIDEpO1xuICBjb25zdCBibG9ja0ludGVyc2VjdGlvblBlcmNlbnRhZ2UgPSBjbGFtcChibG9ja0ludGVyc2VjdGlvbiAvIGVsSGVpZ2h0LCAwLCAxKTtcblxuICByZXR1cm4ge1xuICAgIGlubGluZTogaXNFbGVtZW50SW5saW5lVmlzaWJsZSxcbiAgICBibG9jazogaXNFbGVtZW50QmxvY2tWaXNpYmxlLFxuICAgIGlubGluZUludGVyc2VjdGlvbjogaW5saW5lSW50ZXJzZWN0aW9uUGVyY2VudGFnZSxcbiAgICBibG9ja0ludGVyc2VjdGlvbjogYmxvY2tJbnRlcnNlY3Rpb25QZXJjZW50YWdlLFxuICAgIGlzSW50ZXJzZWN0aW5nOiBpc0VsZW1lbnRJbmxpbmVWaXNpYmxlICYmIGlzRWxlbWVudEJsb2NrVmlzaWJsZSxcbiAgICBlbGVtZW50LFxuXG4gICAgLy8gUm91bmQgdGhlIGludGVyc2VjdGlvbiByYXRpbyB0byB0aGUgbmVhcmVzdCAwLjAxIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IGVycm9ycyBhbmQgc3lzdGVtIHNjYWxpbmcgaXNzdWVzLlxuICAgIGludGVyc2VjdGlvblJhdGlvOiBNYXRoLnJvdW5kKE1hdGgubWluKGlubGluZUludGVyc2VjdGlvblBlcmNlbnRhZ2UsIGJsb2NrSW50ZXJzZWN0aW9uUGVyY2VudGFnZSkgKiAxMDApIC8gMTAwLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRTY3JvbGxDb29yZGluYXRlcyA9IChvcHRpb25zOiBTY3JvbGxUb0VsZW1lbnRPcHRpb25zKTogU2Nyb2xsVG9PcHRpb25zID0+IHtcbiAgbGV0IHsgY29udGFpbmVyIH0gPSBvcHRpb25zO1xuICBjb25zdCB7XG4gICAgZWxlbWVudCxcbiAgICBkaXJlY3Rpb24sXG4gICAgYmVoYXZpb3IgPSAnc21vb3RoJyxcbiAgICBvcmlnaW4gPSAnbmVhcmVzdCcsXG4gICAgc2Nyb2xsQmxvY2tNYXJnaW4gPSAwLFxuICAgIHNjcm9sbElubGluZU1hcmdpbiA9IDAsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmICghZWxlbWVudCB8fCBjb250YWluZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmVoYXZpb3IsXG4gICAgICBsZWZ0OiB1bmRlZmluZWQsXG4gICAgICB0b3A6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgY29udGFpbmVyIHx8PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgY29uc3QgY2FuU2Nyb2xsID0gZWxlbWVudENhblNjcm9sbChjb250YWluZXIpO1xuXG4gIGlmICghY2FuU2Nyb2xsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJlaGF2aW9yLFxuICAgICAgbGVmdDogdW5kZWZpbmVkLFxuICAgICAgdG9wOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICBjb25zdCB7IHNjcm9sbExlZnQsIHNjcm9sbFRvcCB9ID0gY29udGFpbmVyO1xuICBjb25zdCB7IHdpZHRoOiBlbGVtZW50V2lkdGgsIGhlaWdodDogZWxlbWVudEhlaWdodCwgbGVmdDogZWxlbWVudExlZnQsIHRvcDogZWxlbWVudFRvcCB9ID0gZWxlbWVudFJlY3Q7XG4gIGNvbnN0IHsgd2lkdGg6IGNvbnRhaW5lcldpZHRoLCBoZWlnaHQ6IGNvbnRhaW5lckhlaWdodCwgbGVmdDogY29udGFpbmVyTGVmdCwgdG9wOiBjb250YWluZXJUb3AgfSA9IGNvbnRhaW5lclJlY3Q7XG5cbiAgY29uc3Qgc2hvdWxkU2Nyb2xsTGVmdCA9IGRpcmVjdGlvbiA9PT0gJ2lubGluZScgfHwgZGlyZWN0aW9uID09PSAnYm90aCcgfHwgIWRpcmVjdGlvbjtcbiAgY29uc3Qgc2hvdWxkU2Nyb2xsVG9wID0gZGlyZWN0aW9uID09PSAnYmxvY2snIHx8IGRpcmVjdGlvbiA9PT0gJ2JvdGgnIHx8ICFkaXJlY3Rpb247XG5cbiAgbGV0IHNjcm9sbExlZnRUbyA9IHNjcm9sbExlZnQ7XG4gIGxldCBzY3JvbGxUb3BUbyA9IHNjcm9sbFRvcDtcblxuICBjb25zdCBzY3JvbGxUb0VsZW1lbnRTdGFydCA9ICgpID0+IHtcbiAgICBjb25zdCByZWxhdGl2ZVRvcCA9IGVsZW1lbnRUb3AgLSBjb250YWluZXJUb3A7XG4gICAgY29uc3QgcmVsYXRpdmVMZWZ0ID0gZWxlbWVudExlZnQgLSBjb250YWluZXJMZWZ0O1xuXG4gICAgY29uc3QgYW1vdW50VG9TY3JvbGxUb3AgPSByZWxhdGl2ZVRvcDtcbiAgICBjb25zdCBhbW91bnRUb1Njcm9sbExlZnQgPSByZWxhdGl2ZUxlZnQ7XG5cbiAgICBjb25zdCBzY3JvbGxUb3BQb3NpdGlvbiA9IHNjcm9sbFRvcCArIGFtb3VudFRvU2Nyb2xsVG9wO1xuICAgIGNvbnN0IHNjcm9sbExlZnRQb3NpdGlvbiA9IHNjcm9sbExlZnQgKyBhbW91bnRUb1Njcm9sbExlZnQ7XG5cbiAgICBzY3JvbGxMZWZ0VG8gPSBzY3JvbGxMZWZ0UG9zaXRpb24gLSBzY3JvbGxJbmxpbmVNYXJnaW47XG4gICAgc2Nyb2xsVG9wVG8gPSBzY3JvbGxUb3BQb3NpdGlvbiAtIHNjcm9sbEJsb2NrTWFyZ2luO1xuICB9O1xuXG4gIGNvbnN0IHNjcm9sbFRvRWxlbWVudEVuZCA9ICgpID0+IHtcbiAgICBjb25zdCByZWxhdGl2ZVRvcCA9IGVsZW1lbnRUb3AgLSBjb250YWluZXJUb3A7XG4gICAgY29uc3QgcmVsYXRpdmVMZWZ0ID0gZWxlbWVudExlZnQgLSBjb250YWluZXJMZWZ0O1xuXG4gICAgY29uc3QgYW1vdW50VG9TY3JvbGxUb3AgPSByZWxhdGl2ZVRvcCAtIGNvbnRhaW5lckhlaWdodCArIGVsZW1lbnRIZWlnaHQ7XG4gICAgY29uc3QgYW1vdW50VG9TY3JvbGxMZWZ0ID0gcmVsYXRpdmVMZWZ0IC0gY29udGFpbmVyV2lkdGggKyBlbGVtZW50V2lkdGg7XG5cbiAgICBjb25zdCBzY3JvbGxUb3BQb3NpdGlvbiA9IHNjcm9sbFRvcCArIGFtb3VudFRvU2Nyb2xsVG9wO1xuICAgIGNvbnN0IHNjcm9sbExlZnRQb3NpdGlvbiA9IHNjcm9sbExlZnQgKyBhbW91bnRUb1Njcm9sbExlZnQ7XG5cbiAgICBzY3JvbGxMZWZ0VG8gPSBzY3JvbGxMZWZ0UG9zaXRpb24gKyBzY3JvbGxJbmxpbmVNYXJnaW47XG4gICAgc2Nyb2xsVG9wVG8gPSBzY3JvbGxUb3BQb3NpdGlvbiArIHNjcm9sbEJsb2NrTWFyZ2luO1xuICB9O1xuXG4gIGNvbnN0IHNjcm9sbFRvRWxlbWVudENlbnRlciA9ICgpID0+IHtcbiAgICBjb25zdCByZWxhdGl2ZVRvcCA9IGVsZW1lbnRUb3AgLSBjb250YWluZXJUb3A7XG4gICAgY29uc3QgcmVsYXRpdmVMZWZ0ID0gZWxlbWVudExlZnQgLSBjb250YWluZXJMZWZ0O1xuXG4gICAgY29uc3QgYW1vdW50VG9TY3JvbGxUb3AgPSByZWxhdGl2ZVRvcCAtIGNvbnRhaW5lckhlaWdodCAvIDIgKyBlbGVtZW50SGVpZ2h0IC8gMjtcbiAgICBjb25zdCBhbW91bnRUb1Njcm9sbExlZnQgPSByZWxhdGl2ZUxlZnQgLSBjb250YWluZXJXaWR0aCAvIDIgKyBlbGVtZW50V2lkdGggLyAyO1xuXG4gICAgY29uc3Qgc2Nyb2xsVG9wUG9zaXRpb24gPSBzY3JvbGxUb3AgKyBhbW91bnRUb1Njcm9sbFRvcDtcbiAgICBjb25zdCBzY3JvbGxMZWZ0UG9zaXRpb24gPSBzY3JvbGxMZWZ0ICsgYW1vdW50VG9TY3JvbGxMZWZ0O1xuXG4gICAgc2Nyb2xsTGVmdFRvID0gc2Nyb2xsTGVmdFBvc2l0aW9uO1xuICAgIHNjcm9sbFRvcFRvID0gc2Nyb2xsVG9wUG9zaXRpb247XG4gIH07XG5cbiAgY29uc3Qgc2Nyb2xsVG9FbGVtZW50TmVhcmVzdCA9ICgpID0+IHtcbiAgICBjb25zdCBpc0Fib3ZlID0gZWxlbWVudFJlY3QuYm90dG9tIDwgY29udGFpbmVyUmVjdC50b3A7XG4gICAgY29uc3QgaXNQYXJ0aWFsQWJvdmUgPSBlbGVtZW50UmVjdC50b3AgPCBjb250YWluZXJSZWN0LnRvcCAmJiBlbGVtZW50UmVjdC5ib3R0b20gPiBjb250YWluZXJSZWN0LnRvcDtcblxuICAgIGNvbnN0IGlzQmVsb3cgPSBlbGVtZW50UmVjdC50b3AgPiBjb250YWluZXJSZWN0LmJvdHRvbTtcbiAgICBjb25zdCBpc1BhcnRpYWxCZWxvdyA9IGVsZW1lbnRSZWN0LnRvcCA8IGNvbnRhaW5lclJlY3QuYm90dG9tICYmIGVsZW1lbnRSZWN0LmJvdHRvbSA+IGNvbnRhaW5lclJlY3QuYm90dG9tO1xuXG4gICAgY29uc3QgaXNMZWZ0ID0gZWxlbWVudFJlY3QucmlnaHQgPCBjb250YWluZXJSZWN0LmxlZnQ7XG4gICAgY29uc3QgaXNQYXJ0aWFsTGVmdCA9IGVsZW1lbnRSZWN0LmxlZnQgPCBjb250YWluZXJSZWN0LmxlZnQgJiYgZWxlbWVudFJlY3QucmlnaHQgPiBjb250YWluZXJSZWN0LmxlZnQ7XG5cbiAgICBjb25zdCBpc1JpZ2h0ID0gZWxlbWVudFJlY3QubGVmdCA+IGNvbnRhaW5lclJlY3QucmlnaHQ7XG4gICAgY29uc3QgaXNQYXJ0aWFsUmlnaHQgPSBlbGVtZW50UmVjdC5sZWZ0IDwgY29udGFpbmVyUmVjdC5yaWdodCAmJiBlbGVtZW50UmVjdC5yaWdodCA+IGNvbnRhaW5lclJlY3QucmlnaHQ7XG5cbiAgICBpZiAoaXNBYm92ZSB8fCBpc1BhcnRpYWxBYm92ZSB8fCBpc0xlZnQgfHwgaXNQYXJ0aWFsTGVmdCkge1xuICAgICAgc2Nyb2xsVG9FbGVtZW50U3RhcnQoKTtcbiAgICB9IGVsc2UgaWYgKGlzQmVsb3cgfHwgaXNQYXJ0aWFsQmVsb3cgfHwgaXNSaWdodCB8fCBpc1BhcnRpYWxSaWdodCkge1xuICAgICAgc2Nyb2xsVG9FbGVtZW50RW5kKCk7XG4gICAgfVxuICB9O1xuXG4gIHN3aXRjaCAob3JpZ2luKSB7XG4gICAgY2FzZSAnc3RhcnQnOlxuICAgICAgc2Nyb2xsVG9FbGVtZW50U3RhcnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZCc6XG4gICAgICBzY3JvbGxUb0VsZW1lbnRFbmQoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBzY3JvbGxUb0VsZW1lbnRDZW50ZXIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgc2Nyb2xsVG9FbGVtZW50TmVhcmVzdCgpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJlaGF2aW9yLFxuICAgIGxlZnQ6IHNob3VsZFNjcm9sbExlZnQgPyBzY3JvbGxMZWZ0VG8gOiB1bmRlZmluZWQsXG4gICAgdG9wOiBzaG91bGRTY3JvbGxUb3AgPyBzY3JvbGxUb3BUbyA6IHVuZGVmaW5lZCxcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsVG9FbGVtZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0byBzY3JvbGwgdG8uXG4gICAqL1xuICBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Nyb2xsIGNvbnRhaW5lciB0byBzY3JvbGwgdG8gdGhlIGVsZW1lbnQgaW4uXG4gICAqIEBkZWZhdWx0IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgKi9cbiAgY29udGFpbmVyPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aW9uIHRvIHNjcm9sbCBpbi5cbiAgICogQGRlZmF1bHQgJ2JvdGgnXG4gICAqL1xuICBkaXJlY3Rpb24/OiAnaW5saW5lJyB8ICdibG9jaycgfCAnYm90aCc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gb2YgdGhlIGVsZW1lbnQgdG8gc2Nyb2xsIHRvLlxuICAgKiBAZGVmYXVsdCAnbmVhcmVzdCdcbiAgICovXG4gIG9yaWdpbj86ICdzdGFydCcgfCAnZW5kJyB8ICdjZW50ZXInIHwgJ25lYXJlc3QnO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Nyb2xsIGJlaGF2aW9yLlxuICAgKiBAZGVmYXVsdCAnc21vb3RoJ1xuICAgKi9cbiAgYmVoYXZpb3I/OiBTY3JvbGxCZWhhdmlvcjtcblxuICAvKipcbiAgICogVGhlIHNjcm9sbCBpbmxpbmUtbWFyZ2luXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHNjcm9sbElubGluZU1hcmdpbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHNjcm9sbCBibG9jay1tYXJnaW5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgc2Nyb2xsQmxvY2tNYXJnaW4/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBzY3JvbGxUb0VsZW1lbnQgPSAob3B0aW9uczogU2Nyb2xsVG9FbGVtZW50T3B0aW9ucykgPT4ge1xuICBvcHRpb25zLmNvbnRhaW5lcj8uc2Nyb2xsVG8oZ2V0RWxlbWVudFNjcm9sbENvb3JkaW5hdGVzKG9wdGlvbnMpKTtcbn07XG4iXX0=
|
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
import { assertInInjectionContext } from '@angular/core';
|
|
2
|
-
import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
|
|
3
|
-
import { BehaviorSubject, combineLatest, filter, map, shareReplay, startWith, take, takeUntil, tap, } from 'rxjs';
|
|
4
|
-
import { switchQueryListChanges } from './angular.utils';
|
|
5
|
-
import { createDestroy } from './destroy.utils';
|
|
6
|
-
import { getObjectProperty, isObject } from './object.utils';
|
|
7
|
-
export class SelectionModel {
|
|
8
|
-
get selection$() {
|
|
9
|
-
return this._selection$.asObservable();
|
|
10
|
-
}
|
|
11
|
-
get selection() {
|
|
12
|
-
return this._selection$.value;
|
|
13
|
-
}
|
|
14
|
-
get options$() {
|
|
15
|
-
return this._options$.asObservable();
|
|
16
|
-
}
|
|
17
|
-
get options() {
|
|
18
|
-
return this._options$.value;
|
|
19
|
-
}
|
|
20
|
-
get valueBinding$() {
|
|
21
|
-
return this._valueBinding$.asObservable();
|
|
22
|
-
}
|
|
23
|
-
get valueBinding() {
|
|
24
|
-
return this._valueBinding$.value;
|
|
25
|
-
}
|
|
26
|
-
get keyBinding$() {
|
|
27
|
-
return combineLatest([this._keyBinding$, this.valueBinding$]).pipe(map(([keyBinding, valueBinding]) => keyBinding || valueBinding));
|
|
28
|
-
}
|
|
29
|
-
get keyBinding() {
|
|
30
|
-
return this._keyBinding$.value || this.valueBinding;
|
|
31
|
-
}
|
|
32
|
-
get labelBinding$() {
|
|
33
|
-
return this._labelBinding$.asObservable();
|
|
34
|
-
}
|
|
35
|
-
get labelBinding() {
|
|
36
|
-
return this._labelBinding$.value;
|
|
37
|
-
}
|
|
38
|
-
get disabledBinding$() {
|
|
39
|
-
return this._disabledBinding$.asObservable();
|
|
40
|
-
}
|
|
41
|
-
get disabledBinding() {
|
|
42
|
-
return this._disabledBinding$.value;
|
|
43
|
-
}
|
|
44
|
-
get allowMultiple$() {
|
|
45
|
-
return this._allowMultiple$.asObservable();
|
|
46
|
-
}
|
|
47
|
-
get allowMultiple() {
|
|
48
|
-
return this._allowMultiple$.value;
|
|
49
|
-
}
|
|
50
|
-
get filter$() {
|
|
51
|
-
return this._filter$.asObservable();
|
|
52
|
-
}
|
|
53
|
-
get filter() {
|
|
54
|
-
return this._filter$.value;
|
|
55
|
-
}
|
|
56
|
-
constructor() {
|
|
57
|
-
this._destroy$ = createDestroy();
|
|
58
|
-
this._lastSelectionSetSubscription = null;
|
|
59
|
-
this._selection$ = new BehaviorSubject([]);
|
|
60
|
-
this._options$ = new BehaviorSubject([]);
|
|
61
|
-
this.optionsSignal = toSignal(this.options$);
|
|
62
|
-
this._valueBinding$ = new BehaviorSubject(null);
|
|
63
|
-
this._keyBinding$ = new BehaviorSubject(null);
|
|
64
|
-
this._labelBinding$ = new BehaviorSubject(null);
|
|
65
|
-
this._disabledBinding$ = new BehaviorSubject(null);
|
|
66
|
-
this._allowMultiple$ = new BehaviorSubject(false);
|
|
67
|
-
this._filter$ = new BehaviorSubject('');
|
|
68
|
-
this.value$ = combineLatest([this.selection$, this.valueBinding$, this.allowMultiple$]).pipe(map(([selection, valueBinding, allowMultiple]) => {
|
|
69
|
-
if (allowMultiple) {
|
|
70
|
-
return selection.map((option) => this.execFnOrGetOptionProperty(option, valueBinding));
|
|
71
|
-
}
|
|
72
|
-
const [option] = selection;
|
|
73
|
-
if (!option)
|
|
74
|
-
return null;
|
|
75
|
-
return this.execFnOrGetOptionProperty(option, valueBinding);
|
|
76
|
-
}));
|
|
77
|
-
this.filteredOptions$ = combineLatest([this.options$, this.filter$, this.labelBinding$]).pipe(map(([options, filter]) => this.getFilteredOptions(filter, options)), shareReplay({ bufferSize: 1, refCount: true }));
|
|
78
|
-
this._optionsAndSelection$ = combineLatest([this._options$, this._selection$]);
|
|
79
|
-
this.trackByOptionKey = (option) => this.getKey(option);
|
|
80
|
-
this.allowMultiple$
|
|
81
|
-
.pipe(tap(() => {
|
|
82
|
-
if (this.allowMultiple)
|
|
83
|
-
return;
|
|
84
|
-
const [option] = this.selection;
|
|
85
|
-
if (!option)
|
|
86
|
-
return;
|
|
87
|
-
this.setSelection([option]);
|
|
88
|
-
}), takeUntilDestroyed())
|
|
89
|
-
.subscribe();
|
|
90
|
-
}
|
|
91
|
-
setSelection(selection) {
|
|
92
|
-
if (!Array.isArray(selection)) {
|
|
93
|
-
selection = [selection];
|
|
94
|
-
}
|
|
95
|
-
this._selection$.next(selection);
|
|
96
|
-
return this;
|
|
97
|
-
}
|
|
98
|
-
setSelectionFromValue(value) {
|
|
99
|
-
if (Array.isArray(value)) {
|
|
100
|
-
const selection = value.map((v) => this.getOptionByValue(v)).filter((v) => v !== undefined);
|
|
101
|
-
this.setSelection(selection);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
const selection = this.getOptionByValue(value);
|
|
105
|
-
if (selection) {
|
|
106
|
-
this.setSelection(selection);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
this.clearSelectedOptions();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
setSelectionFromValue$(value) {
|
|
114
|
-
this._lastSelectionSetSubscription?.unsubscribe();
|
|
115
|
-
this._lastSelectionSetSubscription = this.options$
|
|
116
|
-
.pipe(takeUntil(this._destroy$), filter((o) => !!o.length), tap(() => this.setSelectionFromValue(value)), take(1))
|
|
117
|
-
.subscribe();
|
|
118
|
-
}
|
|
119
|
-
setValueBinding(fnOrPropertyPath) {
|
|
120
|
-
this._valueBinding$.next(fnOrPropertyPath);
|
|
121
|
-
return this;
|
|
122
|
-
}
|
|
123
|
-
setKeyBinding(fnOrPropertyPath) {
|
|
124
|
-
this._keyBinding$.next(fnOrPropertyPath);
|
|
125
|
-
return this;
|
|
126
|
-
}
|
|
127
|
-
setLabelBinding(fnOrPropertyPath) {
|
|
128
|
-
this._labelBinding$.next(fnOrPropertyPath);
|
|
129
|
-
return this;
|
|
130
|
-
}
|
|
131
|
-
setDisabledBinding(fnOrPropertyPath) {
|
|
132
|
-
this._disabledBinding$.next(fnOrPropertyPath);
|
|
133
|
-
return this;
|
|
134
|
-
}
|
|
135
|
-
setOptions(options) {
|
|
136
|
-
this._options$.next(options);
|
|
137
|
-
return this;
|
|
138
|
-
}
|
|
139
|
-
setOptionsFromQueryList(queryList) {
|
|
140
|
-
assertInInjectionContext(this.setOptionsFromQueryList);
|
|
141
|
-
queryList.changes
|
|
142
|
-
.pipe(startWith(queryList), tap((list) => this.setOptions(list.toArray())), takeUntilDestroyed())
|
|
143
|
-
.subscribe();
|
|
144
|
-
return this;
|
|
145
|
-
}
|
|
146
|
-
setOptionsFromQueryList$(queryList$) {
|
|
147
|
-
assertInInjectionContext(this.setOptionsFromQueryList$);
|
|
148
|
-
queryList$
|
|
149
|
-
.pipe(switchQueryListChanges(), tap((list) => this.setOptions(list?.toArray() || [])), takeUntilDestroyed())
|
|
150
|
-
.subscribe();
|
|
151
|
-
return this;
|
|
152
|
-
}
|
|
153
|
-
setAllowMultiple(allowMultiple) {
|
|
154
|
-
this._allowMultiple$.next(allowMultiple);
|
|
155
|
-
return this;
|
|
156
|
-
}
|
|
157
|
-
setFilter(filter) {
|
|
158
|
-
const sanitizedFilter = filter?.trim() || '';
|
|
159
|
-
this._filter$.next(sanitizedFilter);
|
|
160
|
-
}
|
|
161
|
-
reset() {
|
|
162
|
-
this._selection$.next([]);
|
|
163
|
-
this._options$.next([]);
|
|
164
|
-
this._valueBinding$.next(null);
|
|
165
|
-
this._keyBinding$.next(null);
|
|
166
|
-
this._disabledBinding$.next(null);
|
|
167
|
-
this._labelBinding$.next(null);
|
|
168
|
-
this._allowMultiple$.next(false);
|
|
169
|
-
}
|
|
170
|
-
getOptionByValue$(value) {
|
|
171
|
-
return this._optionsAndSelection$.pipe(map(() => this.getOptionByValue(value)));
|
|
172
|
-
}
|
|
173
|
-
getOptionByLabel$(label) {
|
|
174
|
-
return this._optionsAndSelection$.pipe(map(() => this.getOptionByLabel(label)));
|
|
175
|
-
}
|
|
176
|
-
getOptionByKey$(key) {
|
|
177
|
-
return this._optionsAndSelection$.pipe(map(() => this.getOptionByKey(key)));
|
|
178
|
-
}
|
|
179
|
-
isSelected$(option) {
|
|
180
|
-
return this._selection$.pipe(map(() => this.isSelected(option)));
|
|
181
|
-
}
|
|
182
|
-
isDisabled$(option) {
|
|
183
|
-
return this._optionsAndSelection$.pipe(map(() => this.isDisabled(option)));
|
|
184
|
-
}
|
|
185
|
-
getLabel$(option) {
|
|
186
|
-
return this.labelBinding$.pipe(map((labelBinding) => this.execFnOrGetOptionProperty(option, labelBinding)));
|
|
187
|
-
}
|
|
188
|
-
getValue$(option) {
|
|
189
|
-
return this.valueBinding$.pipe(map((valueBinding) => this.execFnOrGetOptionProperty(option, valueBinding)));
|
|
190
|
-
}
|
|
191
|
-
getKey$(option) {
|
|
192
|
-
return this.keyBinding$.pipe(map((keyBinding) => this.execFnOrGetOptionProperty(option, keyBinding)));
|
|
193
|
-
}
|
|
194
|
-
getOptionByValue(value) {
|
|
195
|
-
return this.getOption(value, this.valueBinding);
|
|
196
|
-
}
|
|
197
|
-
getOptionByLabel(label) {
|
|
198
|
-
return this.getOption(label, this.labelBinding);
|
|
199
|
-
}
|
|
200
|
-
getOptionByKey(key) {
|
|
201
|
-
return this.getOption(key, this.keyBinding);
|
|
202
|
-
}
|
|
203
|
-
getOption(value, propertyPath = null, options = [...this.options, ...this.selection]) {
|
|
204
|
-
if (!propertyPath) {
|
|
205
|
-
return options.find((option) => option === value);
|
|
206
|
-
}
|
|
207
|
-
return options.find((option) => {
|
|
208
|
-
if (!isObject(option))
|
|
209
|
-
return false;
|
|
210
|
-
return this.execFnOrGetOptionProperty(option, propertyPath) === value;
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
getOptionByIndex(index, options = this.getFilteredOptions()) {
|
|
214
|
-
return options[index] || null;
|
|
215
|
-
}
|
|
216
|
-
getOptionByOffset(offset, index, config = { clamp: true }) {
|
|
217
|
-
const { loop, clamp, skipDisabled, options = this.getFilteredOptions() } = config;
|
|
218
|
-
const newIndex = index + offset;
|
|
219
|
-
const remainingOffset = newIndex * -1;
|
|
220
|
-
let optionResult = null;
|
|
221
|
-
if (newIndex < 0) {
|
|
222
|
-
if (loop) {
|
|
223
|
-
optionResult = this.getOptionByOffset(remainingOffset, options.length - 1, config);
|
|
224
|
-
}
|
|
225
|
-
else if (clamp) {
|
|
226
|
-
optionResult = this.getFirstOption();
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
optionResult = null;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
else if (newIndex >= options.length) {
|
|
233
|
-
if (loop) {
|
|
234
|
-
optionResult = this.getOptionByOffset(remainingOffset, 0, config);
|
|
235
|
-
}
|
|
236
|
-
else if (clamp) {
|
|
237
|
-
optionResult = this.getLastOption();
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
optionResult = null;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
optionResult = this.getOptionByIndex(newIndex);
|
|
245
|
-
}
|
|
246
|
-
if (optionResult && skipDisabled && this.isDisabled(optionResult)) {
|
|
247
|
-
return this.getOptionByOffset(offset, newIndex, config);
|
|
248
|
-
}
|
|
249
|
-
return optionResult;
|
|
250
|
-
}
|
|
251
|
-
getFirstOption(options = this.getFilteredOptions()) {
|
|
252
|
-
return this.getOptionByIndex(0, options);
|
|
253
|
-
}
|
|
254
|
-
getLastOption(options = this.getFilteredOptions()) {
|
|
255
|
-
return this.getOptionByIndex(options.length - 1, options);
|
|
256
|
-
}
|
|
257
|
-
getOptionIndex(option, options = this.getFilteredOptions()) {
|
|
258
|
-
const key = this.getKey(option);
|
|
259
|
-
const index = options.findIndex((o) => this.getKey(o) === key);
|
|
260
|
-
return index === -1 ? null : index;
|
|
261
|
-
}
|
|
262
|
-
getNonMultipleSelectedOption() {
|
|
263
|
-
if (this.allowMultiple)
|
|
264
|
-
return null;
|
|
265
|
-
return this.selection[0] || null;
|
|
266
|
-
}
|
|
267
|
-
getNonMultipleSelectedOptionIndex() {
|
|
268
|
-
if (this.allowMultiple)
|
|
269
|
-
return null;
|
|
270
|
-
const opt = this.getNonMultipleSelectedOption();
|
|
271
|
-
if (!opt)
|
|
272
|
-
return null;
|
|
273
|
-
return this.getOptionIndex(opt);
|
|
274
|
-
}
|
|
275
|
-
getNonMultipleOptionByOffsetFromSelected(offset, config = { clamp: true }) {
|
|
276
|
-
if (this.allowMultiple)
|
|
277
|
-
return null;
|
|
278
|
-
const index = this.getNonMultipleSelectedOptionIndex();
|
|
279
|
-
if (index === null)
|
|
280
|
-
return null;
|
|
281
|
-
return this.getOptionByOffset(index, offset, config);
|
|
282
|
-
}
|
|
283
|
-
getLabel(option) {
|
|
284
|
-
return this.execFnOrGetOptionProperty(option, this.labelBinding);
|
|
285
|
-
}
|
|
286
|
-
getValue(option) {
|
|
287
|
-
return this.execFnOrGetOptionProperty(option, this.valueBinding);
|
|
288
|
-
}
|
|
289
|
-
getKey(option) {
|
|
290
|
-
return this.execFnOrGetOptionProperty(option, this.keyBinding);
|
|
291
|
-
}
|
|
292
|
-
getDisabled(option) {
|
|
293
|
-
return this.execFnOrGetOptionProperty(option, this.disabledBinding);
|
|
294
|
-
}
|
|
295
|
-
execFnOrGetOptionProperty(option, fnOrPropertyPath) {
|
|
296
|
-
if (!fnOrPropertyPath || !isObject(option))
|
|
297
|
-
return option;
|
|
298
|
-
if (typeof fnOrPropertyPath === 'function') {
|
|
299
|
-
return fnOrPropertyPath(option);
|
|
300
|
-
}
|
|
301
|
-
return getObjectProperty(option, fnOrPropertyPath);
|
|
302
|
-
}
|
|
303
|
-
execFnOrGetOptionPropertyNullable(option, fnOrPropertyPath) {
|
|
304
|
-
if (!fnOrPropertyPath || !isObject(option))
|
|
305
|
-
return null;
|
|
306
|
-
return this.execFnOrGetOptionProperty(option, fnOrPropertyPath);
|
|
307
|
-
}
|
|
308
|
-
getOptionProperty(option, propertyPath) {
|
|
309
|
-
if (!propertyPath || !isObject(option))
|
|
310
|
-
return option;
|
|
311
|
-
return getObjectProperty(option, propertyPath);
|
|
312
|
-
}
|
|
313
|
-
isSelected(option) {
|
|
314
|
-
const optionKey = this.execFnOrGetOptionProperty(option, this.keyBinding);
|
|
315
|
-
return this.getOption(optionKey, this.keyBinding, this.selection) !== undefined;
|
|
316
|
-
}
|
|
317
|
-
isDisabled(option) {
|
|
318
|
-
return !!this.execFnOrGetOptionPropertyNullable(option, this.disabledBinding);
|
|
319
|
-
}
|
|
320
|
-
getFilteredOptions(filter = this.filter, options = this.options) {
|
|
321
|
-
if (!filter)
|
|
322
|
-
return options;
|
|
323
|
-
const splitFilter = filter.split(' ').filter((f) => f);
|
|
324
|
-
return options.filter((option) => {
|
|
325
|
-
const label = this.getLabel(option);
|
|
326
|
-
if (!label || typeof label !== 'string')
|
|
327
|
-
return false;
|
|
328
|
-
const splitLabel = label.split(' ').filter((l) => l);
|
|
329
|
-
return splitFilter.every((f) => splitLabel.some((l) => l.toLowerCase().includes(f.toLowerCase())));
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
addSelectedOption(option) {
|
|
333
|
-
if (this.allowMultiple) {
|
|
334
|
-
if (this.isSelected(option))
|
|
335
|
-
return;
|
|
336
|
-
this._selection$.next([...this.selection, option]);
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
this._selection$.next([option]);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
removeSelectedOption(option) {
|
|
343
|
-
const optionKey = this.execFnOrGetOptionProperty(option, this.keyBinding);
|
|
344
|
-
if (!this.isSelected(option))
|
|
345
|
-
return;
|
|
346
|
-
this._selection$.next(this.selection.filter((selectedOption) => {
|
|
347
|
-
const key = this.execFnOrGetOptionProperty(selectedOption, this.keyBinding);
|
|
348
|
-
return key !== optionKey;
|
|
349
|
-
}));
|
|
350
|
-
}
|
|
351
|
-
clearSelectedOptions() {
|
|
352
|
-
this._selection$.next([]);
|
|
353
|
-
}
|
|
354
|
-
toggleSelectedOption(option) {
|
|
355
|
-
if (this.isSelected(option)) {
|
|
356
|
-
this.removeSelectedOption(option);
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
this.addSelectedOption(option);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
// FIXME: Toggle should respect disabled binding if it exists
|
|
363
|
-
toggleAllSelectedOptions() {
|
|
364
|
-
const filteredOptions = this.getFilteredOptions();
|
|
365
|
-
const unselectedOptions = filteredOptions.filter((option) => !this.isSelected(option));
|
|
366
|
-
if (unselectedOptions.length) {
|
|
367
|
-
const selection = unselectedOptions.filter((o) => !this.selection.some((s) => this.getKey(s) === this.getKey(o)));
|
|
368
|
-
this._selection$.next([...this.selection, ...selection]);
|
|
369
|
-
}
|
|
370
|
-
else {
|
|
371
|
-
const selection = this.selection.filter((s) => !filteredOptions.some((o) => this.getKey(o) === this.getKey(s)));
|
|
372
|
-
this._selection$.next(selection);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLW1vZGVsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2VsZWN0aW9uLW1vZGVsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUUsT0FBTyxFQUNMLGVBQWUsRUFHZixhQUFhLEVBQ2IsTUFBTSxFQUNOLEdBQUcsRUFDSCxXQUFXLEVBQ1gsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQXlCN0QsTUFBTSxPQUFPLGNBQWM7SUFJekIsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFHRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUlELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBQ0Qs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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWhILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YnNjcmlwdGlvbixcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzdGFydFdpdGgsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFR5cGVkUXVlcnlMaXN0IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgc3dpdGNoUXVlcnlMaXN0Q2hhbmdlcyB9IGZyb20gJy4vYW5ndWxhci51dGlscyc7XG5pbXBvcnQgeyBjcmVhdGVEZXN0cm95IH0gZnJvbSAnLi9kZXN0cm95LnV0aWxzJztcbmltcG9ydCB7IGdldE9iamVjdFByb3BlcnR5LCBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0LnV0aWxzJztcblxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uTW9kZWxUeXBlcyA9IHN0cmluZyB8IG51bWJlciB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bjtcbmV4cG9ydCB0eXBlIFNlbGVjdGlvbk1vZGVsUHJvcGVydHlQYXRoID0gc3RyaW5nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uTW9kZWxPcHRpb25WYWx1ZUZuPFQgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbFR5cGVzID0gYW55PiA9IChvcHRpb246IFQpID0+IHVua25vd247XG5cbi8qKlxuICogWW91IGNhbiB1c2UgYSBwcm9wZXJ0eSBwYXRoIG9yIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhbiBvcHRpb24uIFRoZSBmdW5jdGlvbiBzaG91bGQgYmUgYXMgKipsaWdodHdlaWdodCBhcyBwb3NzaWJsZSoqIGFzIGl0IHdpbGwgYmUgY2FsbGVkICoqYSBsb3QqKi5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUHJvcGVydHkgcGF0aFxuICogXCJpZFwiIC8vIG9wdGlvbi5pZFxuICogXCJ1c2VyLm5hbWVcIiAvLyBvcHRpb24udXNlci5uYW1lXG4gKlxuICogLy8gRnVuY3Rpb25cbiAqIChvcHRpb24pID0+IG9wdGlvbi5pZCAvLyBvcHRpb24uaWRcbiAqIChvcHRpb24pID0+IG9wdGlvbi51c2VyLm5hbWUgLy8gb3B0aW9uLnVzZXIubmFtZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbFR5cGVzID0gYW55PiA9XG4gIHwgU2VsZWN0aW9uTW9kZWxQcm9wZXJ0eVBhdGhcbiAgfCBTZWxlY3Rpb25Nb2RlbE9wdGlvblZhbHVlRm48VD47XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbDxUIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWxUeXBlcyA9IHVua25vd24+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBjcmVhdGVEZXN0cm95KCk7XG4gIHByaXZhdGUgX2xhc3RTZWxlY3Rpb25TZXRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBzZWxlY3Rpb24kKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24kLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbiQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VFtdPihbXSk7XG5cbiAgZ2V0IG9wdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucyQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuICByZWFkb25seSBvcHRpb25zU2lnbmFsID0gdG9TaWduYWwodGhpcy5vcHRpb25zJCk7XG5cbiAgZ2V0IHZhbHVlQmluZGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlQmluZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0IHZhbHVlQmluZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVCaW5kaW5nJC52YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF92YWx1ZUJpbmRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsPihudWxsKTtcblxuICBnZXQga2V5QmluZGluZyQoKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RoaXMuX2tleUJpbmRpbmckLCB0aGlzLnZhbHVlQmluZGluZyRdKS5waXBlKFxuICAgICAgbWFwKChba2V5QmluZGluZywgdmFsdWVCaW5kaW5nXSkgPT4ga2V5QmluZGluZyB8fCB2YWx1ZUJpbmRpbmcpLFxuICAgICk7XG4gIH1cbiAgZ2V0IGtleUJpbmRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleUJpbmRpbmckLnZhbHVlIHx8IHRoaXMudmFsdWVCaW5kaW5nO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2tleUJpbmRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsPihudWxsKTtcblxuICBnZXQgbGFiZWxCaW5kaW5nJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWxCaW5kaW5nJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgbGFiZWxCaW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sYWJlbEJpbmRpbmckLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhYmVsQmluZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGw+KG51bGwpO1xuXG4gIGdldCBkaXNhYmxlZEJpbmRpbmckKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZEJpbmRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBkaXNhYmxlZEJpbmRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkQmluZGluZyQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlzYWJsZWRCaW5kaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgZ2V0IGFsbG93TXVsdGlwbGUkKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGxvd011bHRpcGxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgYWxsb3dNdWx0aXBsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dNdWx0aXBsZSQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfYWxsb3dNdWx0aXBsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBnZXQgZmlsdGVyJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgZmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXIkLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHJlYWRvbmx5IHZhbHVlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuc2VsZWN0aW9uJCwgdGhpcy52YWx1ZUJpbmRpbmckLCB0aGlzLmFsbG93TXVsdGlwbGUkXSkucGlwZShcbiAgICBtYXAoKFtzZWxlY3Rpb24sIHZhbHVlQmluZGluZywgYWxsb3dNdWx0aXBsZV0pID0+IHtcbiAgICAgIGlmIChhbGxvd011bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24ubWFwKChvcHRpb24pID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHZhbHVlQmluZGluZykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbb3B0aW9uXSA9IHNlbGVjdGlvbjtcblxuICAgICAgaWYgKCFvcHRpb24pIHJldHVybiBudWxsO1xuXG4gICAgICByZXR1cm4gdGhpcy5leGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbiwgdmFsdWVCaW5kaW5nKTtcbiAgICB9KSxcbiAgKTtcblxuICByZWFkb25seSBmaWx0ZXJlZE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5vcHRpb25zJCwgdGhpcy5maWx0ZXIkLCB0aGlzLmxhYmVsQmluZGluZyRdKS5waXBlKFxuICAgIG1hcCgoW29wdGlvbnMsIGZpbHRlcl0pID0+IHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKGZpbHRlciwgb3B0aW9ucykpLFxuICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc0FuZFNlbGVjdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9vcHRpb25zJCwgdGhpcy5fc2VsZWN0aW9uJF0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWxsb3dNdWx0aXBsZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IFtvcHRpb25dID0gdGhpcy5zZWxlY3Rpb247XG5cbiAgICAgICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oW29wdGlvbl0pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uOiBUIHwgVFtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgIHNlbGVjdGlvbiA9IFtzZWxlY3Rpb25dO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGlvbiQubmV4dChzZWxlY3Rpb24pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRTZWxlY3Rpb25Gcm9tVmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHZhbHVlLm1hcCgodikgPT4gdGhpcy5nZXRPcHRpb25CeVZhbHVlKHYpKS5maWx0ZXIoKHYpOiB2IGlzIFQgPT4gdiAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5nZXRPcHRpb25CeVZhbHVlKHZhbHVlKTtcblxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkT3B0aW9ucygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFNlbGVjdGlvbkZyb21WYWx1ZSQodmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9sYXN0U2VsZWN0aW9uU2V0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5fbGFzdFNlbGVjdGlvblNldFN1YnNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKG8pID0+ICEhby5sZW5ndGgpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5zZXRTZWxlY3Rpb25Gcm9tVmFsdWUodmFsdWUpKSxcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHNldFZhbHVlQmluZGluZyhmbk9yUHJvcGVydHlQYXRoOiBTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsKSB7XG4gICAgdGhpcy5fdmFsdWVCaW5kaW5nJC5uZXh0KGZuT3JQcm9wZXJ0eVBhdGgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRLZXlCaW5kaW5nKGZuT3JQcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9rZXlCaW5kaW5nJC5uZXh0KGZuT3JQcm9wZXJ0eVBhdGgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMYWJlbEJpbmRpbmcoZm5PclByb3BlcnR5UGF0aDogU2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbCkge1xuICAgIHRoaXMuX2xhYmVsQmluZGluZyQubmV4dChmbk9yUHJvcGVydHlQYXRoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRCaW5kaW5nKGZuT3JQcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9kaXNhYmxlZEJpbmRpbmckLm5leHQoZm5PclByb3BlcnR5UGF0aCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE9wdGlvbnMob3B0aW9uczogVFtdKSB7XG4gICAgdGhpcy5fb3B0aW9ucyQubmV4dChvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3B0aW9uc0Zyb21RdWVyeUxpc3QocXVlcnlMaXN0OiBUeXBlZFF1ZXJ5TGlzdDxUPikge1xuICAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCh0aGlzLnNldE9wdGlvbnNGcm9tUXVlcnlMaXN0KTtcblxuICAgIHF1ZXJ5TGlzdC5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHF1ZXJ5TGlzdCksXG4gICAgICAgIHRhcCgobGlzdCkgPT4gdGhpcy5zZXRPcHRpb25zKGxpc3QudG9BcnJheSgpKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcHRpb25zRnJvbVF1ZXJ5TGlzdCQocXVlcnlMaXN0JDogT2JzZXJ2YWJsZTxUeXBlZFF1ZXJ5TGlzdDxUPiB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KHRoaXMuc2V0T3B0aW9uc0Zyb21RdWVyeUxpc3QkKTtcblxuICAgIHF1ZXJ5TGlzdCRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hRdWVyeUxpc3RDaGFuZ2VzKCksXG4gICAgICAgIHRhcCgobGlzdCkgPT4gdGhpcy5zZXRPcHRpb25zKGxpc3Q/LnRvQXJyYXkoKSB8fCBbXSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QWxsb3dNdWx0aXBsZShhbGxvd011bHRpcGxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fYWxsb3dNdWx0aXBsZSQubmV4dChhbGxvd011bHRpcGxlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RmlsdGVyKGZpbHRlcjogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IHNhbml0aXplZEZpbHRlciA9IGZpbHRlcj8udHJpbSgpIHx8ICcnO1xuXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KHNhbml0aXplZEZpbHRlcik7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoW10pO1xuICAgIHRoaXMuX29wdGlvbnMkLm5leHQoW10pO1xuICAgIHRoaXMuX3ZhbHVlQmluZGluZyQubmV4dChudWxsKTtcbiAgICB0aGlzLl9rZXlCaW5kaW5nJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rpc2FibGVkQmluZGluZyQubmV4dChudWxsKTtcbiAgICB0aGlzLl9sYWJlbEJpbmRpbmckLm5leHQobnVsbCk7XG4gICAgdGhpcy5fYWxsb3dNdWx0aXBsZSQubmV4dChmYWxzZSk7XG4gIH1cblxuICB0cmFja0J5T3B0aW9uS2V5ID0gKG9wdGlvbjogVCkgPT4gdGhpcy5nZXRLZXkob3B0aW9uKTtcblxuICBnZXRPcHRpb25CeVZhbHVlJCh2YWx1ZTogdW5rbm93bikge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQW5kU2VsZWN0aW9uJC5waXBlKG1hcCgoKSA9PiB0aGlzLmdldE9wdGlvbkJ5VmFsdWUodmFsdWUpKSk7XG4gIH1cblxuICBnZXRPcHRpb25CeUxhYmVsJChsYWJlbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNBbmRTZWxlY3Rpb24kLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0T3B0aW9uQnlMYWJlbChsYWJlbCkpKTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5S2V5JChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQW5kU2VsZWN0aW9uJC5waXBlKG1hcCgoKSA9PiB0aGlzLmdldE9wdGlvbkJ5S2V5KGtleSkpKTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQkKG9wdGlvbjogVCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24kLnBpcGUobWFwKCgpID0+IHRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSk7XG4gIH1cblxuICBpc0Rpc2FibGVkJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0FuZFNlbGVjdGlvbiQucGlwZShtYXAoKCkgPT4gdGhpcy5pc0Rpc2FibGVkKG9wdGlvbikpKTtcbiAgfVxuXG4gIGdldExhYmVsJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbEJpbmRpbmckLnBpcGUobWFwKChsYWJlbEJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIGxhYmVsQmluZGluZykpKTtcbiAgfVxuXG4gIGdldFZhbHVlJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZUJpbmRpbmckLnBpcGUobWFwKCh2YWx1ZUJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHZhbHVlQmluZGluZykpKTtcbiAgfVxuXG4gIGdldEtleSQob3B0aW9uOiBUKSB7XG4gICAgcmV0dXJuIHRoaXMua2V5QmluZGluZyQucGlwZShtYXAoKGtleUJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIGtleUJpbmRpbmcpKSk7XG4gIH1cblxuICBnZXRPcHRpb25CeVZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uKHZhbHVlLCB0aGlzLnZhbHVlQmluZGluZyk7XG4gIH1cblxuICBnZXRPcHRpb25CeUxhYmVsKGxhYmVsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPcHRpb24obGFiZWwsIHRoaXMubGFiZWxCaW5kaW5nKTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5S2V5KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uKGtleSwgdGhpcy5rZXlCaW5kaW5nKTtcbiAgfVxuXG4gIGdldE9wdGlvbihcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBwcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwgPSBudWxsLFxuICAgIG9wdGlvbnMgPSBbLi4udGhpcy5vcHRpb25zLCAuLi50aGlzLnNlbGVjdGlvbl0sXG4gICkge1xuICAgIGlmICghcHJvcGVydHlQYXRoKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbiA9PT0gdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCFpc09iamVjdChvcHRpb24pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHkob3B0aW9uLCBwcm9wZXJ0eVBhdGgpID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5SW5kZXgoaW5kZXg6IG51bWJlciwgb3B0aW9ucyA9IHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKCkpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIG9wdGlvbnNbaW5kZXhdIHx8IG51bGw7XG4gIH1cblxuICBnZXRPcHRpb25CeU9mZnNldChcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNvbmZpZzogeyBsb29wPzogYm9vbGVhbjsgY2xhbXA/OiBib29sZWFuOyBza2lwRGlzYWJsZWQ/OiBib29sZWFuOyBvcHRpb25zPzogVFtdIH0gPSB7IGNsYW1wOiB0cnVlIH0sXG4gICk6IFQgfCBudWxsIHtcbiAgICBjb25zdCB7IGxvb3AsIGNsYW1wLCBza2lwRGlzYWJsZWQsIG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpIH0gPSBjb25maWc7XG5cbiAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4ICsgb2Zmc2V0O1xuICAgIGNvbnN0IHJlbWFpbmluZ09mZnNldCA9IG5ld0luZGV4ICogLTE7XG5cbiAgICBsZXQgb3B0aW9uUmVzdWx0OiBUIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAobmV3SW5kZXggPCAwKSB7XG4gICAgICBpZiAobG9vcCkge1xuICAgICAgICBvcHRpb25SZXN1bHQgPSB0aGlzLmdldE9wdGlvbkJ5T2Zmc2V0KHJlbWFpbmluZ09mZnNldCwgb3B0aW9ucy5sZW5ndGggLSAxLCBjb25maWcpO1xuICAgICAgfSBlbHNlIGlmIChjbGFtcCkge1xuICAgICAgICBvcHRpb25SZXN1bHQgPSB0aGlzLmdldEZpcnN0T3B0aW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25SZXN1bHQgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV3SW5kZXggPj0gb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGlmIChsb29wKSB7XG4gICAgICAgIG9wdGlvblJlc3VsdCA9IHRoaXMuZ2V0T3B0aW9uQnlPZmZzZXQocmVtYWluaW5nT2Zmc2V0LCAwLCBjb25maWcpO1xuICAgICAgfSBlbHNlIGlmIChjbGFtcCkge1xuICAgICAgICBvcHRpb25SZXN1bHQgPSB0aGlzLmdldExhc3RPcHRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvblJlc3VsdCA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvblJlc3VsdCA9IHRoaXMuZ2V0T3B0aW9uQnlJbmRleChuZXdJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvblJlc3VsdCAmJiBza2lwRGlzYWJsZWQgJiYgdGhpcy5pc0Rpc2FibGVkKG9wdGlvblJlc3VsdCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5T2Zmc2V0KG9mZnNldCwgbmV3SW5kZXgsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvblJlc3VsdDtcbiAgfVxuXG4gIGdldEZpcnN0T3B0aW9uKG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5SW5kZXgoMCwgb3B0aW9ucyk7XG4gIH1cblxuICBnZXRMYXN0T3B0aW9uKG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5SW5kZXgob3B0aW9ucy5sZW5ndGggLSAxLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldE9wdGlvbkluZGV4KG9wdGlvbjogVCwgb3B0aW9ucyA9IHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKCkpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShvcHRpb24pO1xuICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IHRoaXMuZ2V0S2V5KG8pID09PSBrZXkpO1xuXG4gICAgcmV0dXJuIGluZGV4ID09PSAtMSA/IG51bGwgOiBpbmRleDtcbiAgfVxuXG4gIGdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb24oKTogVCB8IG51bGwge1xuICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uWzBdIHx8IG51bGw7XG4gIH1cblxuICBnZXROb25NdWx0aXBsZVNlbGVjdGVkT3B0aW9uSW5kZXgoKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBvcHQgPSB0aGlzLmdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb24oKTtcblxuICAgIGlmICghb3B0KSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkluZGV4KG9wdCk7XG4gIH1cblxuICBnZXROb25NdWx0aXBsZU9wdGlvbkJ5T2Zmc2V0RnJvbVNlbGVjdGVkKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIGNvbmZpZzogeyBsb29wPzogYm9vbGVhbjsgY2xhbXA/OiBib29sZWFuIH0gPSB7IGNsYW1wOiB0cnVlIH0sXG4gICkge1xuICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb25JbmRleCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5T2Zmc2V0KGluZGV4LCBvZmZzZXQsIGNvbmZpZyk7XG4gIH1cblxuICBnZXRMYWJlbChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbiwgdGhpcy5sYWJlbEJpbmRpbmcpO1xuICB9XG5cbiAgZ2V0VmFsdWUob3B0aW9uOiBUKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMudmFsdWVCaW5kaW5nKTtcbiAgfVxuXG4gIGdldEtleShvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbiwgdGhpcy5rZXlCaW5kaW5nKTtcbiAgfVxuXG4gIGdldERpc2FibGVkKG9wdGlvbjogVCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHkob3B0aW9uLCB0aGlzLmRpc2FibGVkQmluZGluZyk7XG4gIH1cblxuICBleGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbjogVCwgZm5PclByb3BlcnR5UGF0aDogU2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbCkge1xuICAgIGlmICghZm5PclByb3BlcnR5UGF0aCB8fCAhaXNPYmplY3Qob3B0aW9uKSkgcmV0dXJuIG9wdGlvbjtcblxuICAgIGlmICh0eXBlb2YgZm5PclByb3BlcnR5UGF0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGZuT3JQcm9wZXJ0eVBhdGgob3B0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCBmbk9yUHJvcGVydHlQYXRoKTtcbiAgfVxuXG4gIGV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHlOdWxsYWJsZShvcHRpb246IFQsIGZuT3JQcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwpIHtcbiAgICBpZiAoIWZuT3JQcm9wZXJ0eVBhdGggfHwgIWlzT2JqZWN0KG9wdGlvbikpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIGZuT3JQcm9wZXJ0eVBhdGgpO1xuICB9XG5cbiAgZ2V0T3B0aW9uUHJvcGVydHkob3B0aW9uOiBULCBwcm9wZXJ0eVBhdGg6IHN0cmluZyB8IG51bGwpIHtcbiAgICBpZiAoIXByb3BlcnR5UGF0aCB8fCAhaXNPYmplY3Qob3B0aW9uKSkgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eShvcHRpb24sIHByb3BlcnR5UGF0aCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKG9wdGlvbjogVCkge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMua2V5QmluZGluZyk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRPcHRpb24ob3B0aW9uS2V5LCB0aGlzLmtleUJpbmRpbmcsIHRoaXMuc2VsZWN0aW9uKSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNEaXNhYmxlZChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gISF0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHlOdWxsYWJsZShvcHRpb24sIHRoaXMuZGlzYWJsZWRCaW5kaW5nKTtcbiAgfVxuXG4gIGdldEZpbHRlcmVkT3B0aW9ucyhmaWx0ZXIgPSB0aGlzLmZpbHRlciwgb3B0aW9ucyA9IHRoaXMub3B0aW9ucykge1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gb3B0aW9ucztcblxuICAgIGNvbnN0IHNwbGl0RmlsdGVyID0gZmlsdGVyLnNwbGl0KCcgJykuZmlsdGVyKChmKSA9PiBmKTtcblxuICAgIHJldHVybiBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0TGFiZWwob3B0aW9uKTtcblxuICAgICAgaWYgKCFsYWJlbCB8fCB0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHNwbGl0TGFiZWwgPSBsYWJlbC5zcGxpdCgnICcpLmZpbHRlcigobCkgPT4gbCk7XG5cbiAgICAgIHJldHVybiBzcGxpdEZpbHRlci5ldmVyeSgoZikgPT4gc3BsaXRMYWJlbC5zb21lKChsKSA9PiBsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZi50b0xvd2VyQ2FzZSgpKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiBUKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX3NlbGVjdGlvbiQubmV4dChbLi4udGhpcy5zZWxlY3Rpb24sIG9wdGlvbl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoW29wdGlvbl0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogVCkge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMua2V5QmluZGluZyk7XG5cbiAgICBpZiAoIXRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSByZXR1cm47XG5cbiAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoXG4gICAgICB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKHNlbGVjdGVkT3B0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShzZWxlY3RlZE9wdGlvbiwgdGhpcy5rZXlCaW5kaW5nKTtcblxuICAgICAgICByZXR1cm4ga2V5ICE9PSBvcHRpb25LZXk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgY2xlYXJTZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uJC5uZXh0KFtdKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogVCkge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gRklYTUU6IFRvZ2dsZSBzaG91bGQgcmVzcGVjdCBkaXNhYmxlZCBiaW5kaW5nIGlmIGl0IGV4aXN0c1xuICB0b2dnbGVBbGxTZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gdGhpcy5nZXRGaWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCB1bnNlbGVjdGVkT3B0aW9ucyA9IGZpbHRlcmVkT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIXRoaXMuaXNTZWxlY3RlZChvcHRpb24pKTtcblxuICAgIGlmICh1bnNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHVuc2VsZWN0ZWRPcHRpb25zLmZpbHRlcigobykgPT4gIXRoaXMuc2VsZWN0aW9uLnNvbWUoKHMpID0+IHRoaXMuZ2V0S2V5KHMpID09PSB0aGlzLmdldEtleShvKSkpO1xuXG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoWy4uLnRoaXMuc2VsZWN0aW9uLCAuLi5zZWxlY3Rpb25dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uZmlsdGVyKChzKSA9PiAhZmlsdGVyZWRPcHRpb25zLnNvbWUoKG8pID0+IHRoaXMuZ2V0S2V5KG8pID09PSB0aGlzLmdldEtleShzKSkpO1xuXG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoc2VsZWN0aW9uKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|