barsa-user-workspace 0.0.0-watch

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.
Files changed (56) hide show
  1. package/README.md +24 -0
  2. package/esm2022/barsa-user-workspace.mjs +5 -0
  3. package/esm2022/lib/barsa-user-workspace.module.mjs +82 -0
  4. package/esm2022/lib/coercion/boolean-property.mjs +5 -0
  5. package/esm2022/lib/coercion/number-property.mjs +14 -0
  6. package/esm2022/lib/directives/drag-handle.mjs +29 -0
  7. package/esm2022/lib/directives/placeholder.mjs +31 -0
  8. package/esm2022/lib/directives/resize-handle.mjs +29 -0
  9. package/esm2022/lib/grid/grid.component.mjs +609 -0
  10. package/esm2022/lib/grid-item/grid-item.component.mjs +196 -0
  11. package/esm2022/lib/grid.definitions.mjs +3 -0
  12. package/esm2022/lib/grid.service.mjs +49 -0
  13. package/esm2022/lib/layout-container/layout-container.component.mjs +213 -0
  14. package/esm2022/lib/layout-grid-mapper.pipe.mjs +29 -0
  15. package/esm2022/lib/nav-container/nav-container.component.mjs +27 -0
  16. package/esm2022/lib/report-grid-layout/report-grid-layout.component.mjs +15 -0
  17. package/esm2022/lib/utils/client-rect.mjs +57 -0
  18. package/esm2022/lib/utils/grid.utils.mjs +225 -0
  19. package/esm2022/lib/utils/operators.mjs +17 -0
  20. package/esm2022/lib/utils/passive-listeners.mjs +29 -0
  21. package/esm2022/lib/utils/pointer.utils.mjs +110 -0
  22. package/esm2022/lib/utils/react-grid-layout.utils.mjs +493 -0
  23. package/esm2022/lib/utils/scroll.mjs +233 -0
  24. package/esm2022/lib/utils/transition-duration.mjs +34 -0
  25. package/esm2022/lib/utils.mjs +14 -0
  26. package/esm2022/public-api.mjs +15 -0
  27. package/esm2022/types.mjs +2 -0
  28. package/fesm2022/barsa-user-workspace.mjs +2469 -0
  29. package/fesm2022/barsa-user-workspace.mjs.map +1 -0
  30. package/index.d.ts +5 -0
  31. package/lib/barsa-user-workspace.module.d.ts +34 -0
  32. package/lib/coercion/boolean-property.d.ts +7 -0
  33. package/lib/coercion/number-property.d.ts +9 -0
  34. package/lib/directives/drag-handle.d.ts +15 -0
  35. package/lib/directives/placeholder.d.ts +17 -0
  36. package/lib/directives/resize-handle.d.ts +15 -0
  37. package/lib/grid/grid.component.d.ts +147 -0
  38. package/lib/grid-item/grid-item.component.d.ts +83 -0
  39. package/lib/grid.definitions.d.ts +61 -0
  40. package/lib/grid.service.d.ts +15 -0
  41. package/lib/layout-container/layout-container.component.d.ts +79 -0
  42. package/lib/layout-grid-mapper.pipe.d.ts +9 -0
  43. package/lib/nav-container/nav-container.component.d.ts +10 -0
  44. package/lib/report-grid-layout/report-grid-layout.component.d.ts +7 -0
  45. package/lib/utils/client-rect.d.ts +36 -0
  46. package/lib/utils/grid.utils.d.ts +45 -0
  47. package/lib/utils/operators.d.ts +6 -0
  48. package/lib/utils/passive-listeners.d.ts +12 -0
  49. package/lib/utils/pointer.utils.d.ts +29 -0
  50. package/lib/utils/react-grid-layout.utils.d.ts +177 -0
  51. package/lib/utils/scroll.d.ts +28 -0
  52. package/lib/utils/transition-duration.d.ts +6 -0
  53. package/lib/utils.d.ts +6 -0
  54. package/package.json +25 -0
  55. package/public-api.d.ts +12 -0
  56. package/types.d.ts +3 -0
@@ -0,0 +1,110 @@
1
+ import { fromEvent, iif, merge } from 'rxjs';
2
+ import { filter } from 'rxjs/operators';
3
+ import { ktdNormalizePassiveListenerOptions } from './passive-listeners';
4
+ /** Options that can be used to bind a passive event listener. */
5
+ const passiveEventListenerOptions = ktdNormalizePassiveListenerOptions({ passive: true });
6
+ /** Options that can be used to bind an active event listener. */
7
+ const activeEventListenerOptions = ktdNormalizePassiveListenerOptions({ passive: false });
8
+ let isMobile = null;
9
+ export function ktdIsMobileOrTablet() {
10
+ if (isMobile != null) {
11
+ return isMobile;
12
+ }
13
+ // Generic match pattern to identify mobile or tablet devices
14
+ const isMobileDevice = /Android|webOS|BlackBerry|Windows Phone|iPad|iPhone|iPod/i.test(navigator.userAgent);
15
+ // Since IOS 13 is not safe to just check for the generic solution. See: https://stackoverflow.com/questions/58019463/how-to-detect-device-name-in-safari-on-ios-13-while-it-doesnt-show-the-correct
16
+ const isIOSMobileDevice = /iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);
17
+ isMobile = isMobileDevice || isIOSMobileDevice;
18
+ return isMobile;
19
+ }
20
+ export function ktdIsMouseEvent(event) {
21
+ return event.clientX != null;
22
+ }
23
+ export function ktdIsTouchEvent(event) {
24
+ return event.touches != null && event.touches.length != null;
25
+ }
26
+ export function ktdPointerClientX(event) {
27
+ return ktdIsMouseEvent(event) ? event.clientX : event.touches[0].clientX;
28
+ }
29
+ export function ktdPointerClientY(event) {
30
+ return ktdIsMouseEvent(event) ? event.clientY : event.touches[0].clientY;
31
+ }
32
+ export function ktdPointerClient(event) {
33
+ return {
34
+ clientX: ktdIsMouseEvent(event) ? event.clientX : event.touches[0].clientX,
35
+ clientY: ktdIsMouseEvent(event) ? event.clientY : event.touches[0].clientY
36
+ };
37
+ }
38
+ export function ktdIsMouseEventOrMousePointerEvent(event) {
39
+ return event.type === 'mousedown'
40
+ || (event.type === 'pointerdown' && event.pointerType === 'mouse');
41
+ }
42
+ /** Returns true if browser supports pointer events */
43
+ export function ktdSupportsPointerEvents() {
44
+ return !!window.PointerEvent;
45
+ }
46
+ /**
47
+ * Emits when a mousedown or touchstart emits. Avoids conflicts between both events.
48
+ * @param element, html element where to listen the events.
49
+ * @param touchNumber number of the touch to track the event, default to the first one.
50
+ */
51
+ function ktdMouseOrTouchDown(element, touchNumber = 1) {
52
+ return iif(() => ktdIsMobileOrTablet(), fromEvent(element, 'touchstart', passiveEventListenerOptions).pipe(filter((touchEvent) => touchEvent.touches.length === touchNumber)), fromEvent(element, 'mousedown', activeEventListenerOptions).pipe(filter((mouseEvent) => {
53
+ /**
54
+ * 0 : Left mouse button
55
+ * 1 : Wheel button or middle button (if present)
56
+ * 2 : Right mouse button
57
+ */
58
+ return mouseEvent.button === 0; // Mouse down to be only fired if is left click
59
+ })));
60
+ }
61
+ /**
62
+ * Emits when a 'mousemove' or a 'touchmove' event gets fired.
63
+ * @param element, html element where to listen the events.
64
+ * @param touchNumber number of the touch to track the event, default to the first one.
65
+ */
66
+ function ktdMouseOrTouchMove(element, touchNumber = 1) {
67
+ return iif(() => ktdIsMobileOrTablet(), fromEvent(element, 'touchmove', activeEventListenerOptions).pipe(filter((touchEvent) => touchEvent.touches.length === touchNumber)), fromEvent(element, 'mousemove', activeEventListenerOptions));
68
+ }
69
+ export function ktdTouchEnd(element, touchNumber = 1) {
70
+ return merge(fromEvent(element, 'touchend').pipe(filter((touchEvent) => touchEvent.touches.length === touchNumber - 1)), fromEvent(element, 'touchcancel').pipe(filter((touchEvent) => touchEvent.touches.length === touchNumber - 1)));
71
+ }
72
+ /**
73
+ * Emits when a there is a 'mouseup' or the touch ends.
74
+ * @param element, html element where to listen the events.
75
+ * @param touchNumber number of the touch to track the event, default to the first one.
76
+ */
77
+ function ktdMouserOrTouchEnd(element, touchNumber = 1) {
78
+ return iif(() => ktdIsMobileOrTablet(), ktdTouchEnd(element, touchNumber), fromEvent(element, 'mouseup'));
79
+ }
80
+ /**
81
+ * Emits when a 'pointerdown' event occurs (only for the primary pointer). Fallbacks to 'mousemove' or a 'touchmove' if pointer events are not supported.
82
+ * @param element, html element where to listen the events.
83
+ */
84
+ export function ktdPointerDown(element) {
85
+ if (!ktdSupportsPointerEvents()) {
86
+ return ktdMouseOrTouchDown(element);
87
+ }
88
+ return fromEvent(element, 'pointerdown', activeEventListenerOptions).pipe(filter((pointerEvent) => pointerEvent.isPrimary));
89
+ }
90
+ /**
91
+ * Emits when a 'pointermove' event occurs (only for the primary pointer). Fallbacks to 'mousemove' or a 'touchmove' if pointer events are not supported.
92
+ * @param element, html element where to listen the events.
93
+ */
94
+ export function ktdPointerMove(element) {
95
+ if (!ktdSupportsPointerEvents()) {
96
+ return ktdMouseOrTouchMove(element);
97
+ }
98
+ return fromEvent(element, 'pointermove', activeEventListenerOptions).pipe(filter((pointerEvent) => pointerEvent.isPrimary));
99
+ }
100
+ /**
101
+ * Emits when a 'pointerup' event occurs (only for the primary pointer). Fallbacks to 'mousemove' or a 'touchmove' if pointer events are not supported.
102
+ * @param element, html element where to listen the events.
103
+ */
104
+ export function ktdPointerUp(element) {
105
+ if (!ktdSupportsPointerEvents()) {
106
+ return ktdMouserOrTouchEnd(element);
107
+ }
108
+ return fromEvent(element, 'pointerup').pipe(filter(pointerEvent => pointerEvent.isPrimary));
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlci51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXVzZXItd29ya3NwYWNlL3NyYy9saWIvdXRpbHMvcG9pbnRlci51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXpFLGlFQUFpRTtBQUNqRSxNQUFNLDJCQUEyQixHQUFHLGtDQUFrQyxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFeEYsaUVBQWlFO0FBQ2pFLE1BQU0sMEJBQTBCLEdBQUcsa0NBQWtDLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztBQUV4RixJQUFJLFFBQVEsR0FBbUIsSUFBSSxDQUFDO0FBRXBDLE1BQU0sVUFBVSxtQkFBbUI7SUFFL0IsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxNQUFNLGNBQWMsR0FBRywwREFBMEQsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTVHLG9NQUFvTTtJQUNwTSxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLFVBQVUsSUFBSSxTQUFTLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTdJLFFBQVEsR0FBRyxjQUFjLElBQUksaUJBQWlCLENBQUM7SUFFL0MsT0FBTyxRQUFRLENBQUM7QUFD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LENBQUE7QUFDTCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxPQUFPO0lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUM7UUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQWUsT0FBTyxFQUFFLGFBQWEsRUFBRSwwQkFBcUQsQ0FBQyxDQUFDLElBQUksQ0FDOUcsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQ25ELENBQUM7QUFDTixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUFPO0lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUM7UUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQWUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM5RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnJvbUV2ZW50LCBpaWYsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBrdGROb3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zIH0gZnJvbSAnLi9wYXNzaXZlLWxpc3RlbmVycyc7XG5cbi8qKiBPcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gYmluZCBhIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXIuICovXG5jb25zdCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSBrdGROb3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHtwYXNzaXZlOiB0cnVlfSk7XG5cbi8qKiBPcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gYmluZCBhbiBhY3RpdmUgZXZlbnQgbGlzdGVuZXIuICovXG5jb25zdCBhY3RpdmVFdmVudExpc3RlbmVyT3B0aW9ucyA9IGt0ZE5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMoe3Bhc3NpdmU6IGZhbHNlfSk7XG5cbmxldCBpc01vYmlsZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24ga3RkSXNNb2JpbGVPclRhYmxldCgpOiBib29sZWFuIHtcblxuICAgIGlmIChpc01vYmlsZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpc01vYmlsZTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmljIG1hdGNoIHBhdHRlcm4gdG8gaWRlbnRpZnkgbW9iaWxlIG9yIHRhYmxldCBkZXZpY2VzXG4gICAgY29uc3QgaXNNb2JpbGVEZXZpY2UgPSAvQW5kcm9pZHx3ZWJPU3xCbGFja0JlcnJ5fFdpbmRvd3MgUGhvbmV8aVBhZHxpUGhvbmV8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbiAgICAvLyBTaW5jZSBJT1MgMTMgaXMgbm90IHNhZmUgdG8ganVzdCBjaGVjayBmb3IgdGhlIGdlbmVyaWMgc29sdXRpb24uIFNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTgwMTk0NjMvaG93LXRvLWRldGVjdC1kZXZpY2UtbmFtZS1pbi1zYWZhcmktb24taW9zLTEzLXdoaWxlLWl0LWRvZXNudC1zaG93LXRoZS1jb3JyZWN0XG4gICAgY29uc3QgaXNJT1NNb2JpbGVEZXZpY2UgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pIHx8IChuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMSk7XG5cbiAgICBpc01vYmlsZSA9IGlzTW9iaWxlRGV2aWNlIHx8IGlzSU9TTW9iaWxlRGV2aWNlO1xuXG4gICAgcmV0dXJuIGlzTW9iaWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3RkSXNNb3VzZUV2ZW50KGV2ZW50OiBhbnkpOiBldmVudCBpcyBNb3VzZUV2ZW50IHtcbiAgICByZXR1cm4gKGV2ZW50IGFzIE1vdXNlRXZlbnQpLmNsaWVudFggIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt0ZElzVG91Y2hFdmVudChldmVudDogYW55KTogZXZlbnQgaXMgVG91Y2hFdmVudCB7XG4gICAgcmV0dXJuIChldmVudCBhcyBUb3VjaEV2ZW50KS50b3VjaGVzICE9IG51bGwgJiYgKGV2ZW50IGFzIFRvdWNoRXZlbnQpLnRvdWNoZXMubGVuZ3RoICE9IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdGRQb2ludGVyQ2xpZW50WChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiBudW1iZXIge1xuICAgIHJldHVybiBrdGRJc01vdXNlRXZlbnQoZXZlbnQpID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt0ZFBvaW50ZXJDbGllbnRZKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGt0ZElzTW91c2VFdmVudChldmVudCkgPyBldmVudC5jbGllbnRZIDogZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3RkUG9pbnRlckNsaWVudChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB7IGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNsaWVudFg6IGt0ZElzTW91c2VFdmVudChldmVudCkgPyBldmVudC5jbGllbnRYIDogZXZlbnQudG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBrdGRJc01vdXNlRXZlbnQoZXZlbnQpID8gZXZlbnQuY2xpZW50WSA6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WVxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdGRJc01vdXNlRXZlbnRPck1vdXNlUG9pbnRlckV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVudC50eXBlID09PSAnbW91c2Vkb3duJ1xuICAgICAgICB8fCAoZXZlbnQudHlwZSA9PT0gJ3BvaW50ZXJkb3duJyAmJiAoZXZlbnQgYXMgUG9pbnRlckV2ZW50KS5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyk7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYnJvd3NlciBzdXBwb3J0cyBwb2ludGVyIGV2ZW50cyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZFN1cHBvcnRzUG9pbnRlckV2ZW50cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xufVxuXG4vKipcbiAqIEVtaXRzIHdoZW4gYSBtb3VzZWRvd24gb3IgdG91Y2hzdGFydCBlbWl0cy4gQXZvaWRzIGNvbmZsaWN0cyBiZXR3ZWVuIGJvdGggZXZlbnRzLlxuICogQHBhcmFtIGVsZW1lbnQsIGh0bWwgZWxlbWVudCB3aGVyZSB0byAgbGlzdGVuIHRoZSBldmVudHMuXG4gKiBAcGFyYW0gdG91Y2hOdW1iZXIgbnVtYmVyIG9mIHRoZSB0b3VjaCB0byB0cmFjayB0aGUgZXZlbnQsIGRlZmF1bHQgdG8gdGhlIGZpcnN0IG9uZS5cbiAqL1xuZnVuY3Rpb24ga3RkTW91c2VPclRvdWNoRG93bihlbGVtZW50LCB0b3VjaE51bWJlciA9IDEpOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50PiB7XG4gICAgcmV0dXJuIGlpZihcbiAgICAgICAgKCkgPT4ga3RkSXNNb2JpbGVPclRhYmxldCgpLFxuICAgICAgICBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oZWxlbWVudCwgJ3RvdWNoc3RhcnQnLCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgYXMgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKHRvdWNoRXZlbnQpID0+IHRvdWNoRXZlbnQudG91Y2hlcy5sZW5ndGggPT09IHRvdWNoTnVtYmVyKVxuICAgICAgICApLFxuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZWxlbWVudCwgJ21vdXNlZG93bicsIGFjdGl2ZUV2ZW50TGlzdGVuZXJPcHRpb25zIGFzIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogMCA6IExlZnQgbW91c2UgYnV0dG9uXG4gICAgICAgICAgICAgICAgICogMSA6IFdoZWVsIGJ1dHRvbiBvciBtaWRkbGUgYnV0dG9uIChpZiBwcmVzZW50KVxuICAgICAgICAgICAgICAgICAqIDIgOiBSaWdodCBtb3VzZSBidXR0b25cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gbW91c2VFdmVudC5idXR0b24gPT09IDA7IC8vIE1vdXNlIGRvd24gdG8gYmUgb25seSBmaXJlZCBpZiBpcyBsZWZ0IGNsaWNrXG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgKTtcbn1cblxuLyoqXG4gKiBFbWl0cyB3aGVuIGEgJ21vdXNlbW92ZScgb3IgYSAndG91Y2htb3ZlJyBldmVudCBnZXRzIGZpcmVkLlxuICogQHBhcmFtIGVsZW1lbnQsIGh0bWwgZWxlbWVudCB3aGVyZSB0byAgbGlzdGVuIHRoZSBldmVudHMuXG4gKiBAcGFyYW0gdG91Y2hOdW1iZXIgbnVtYmVyIG9mIHRoZSB0b3VjaCB0byB0cmFjayB0aGUgZXZlbnQsIGRlZmF1bHQgdG8gdGhlIGZpcnN0IG9uZS5cbiAqL1xuZnVuY3Rpb24ga3RkTW91c2VPclRvdWNoTW92ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgdG91Y2hOdW1iZXIgPSAxKTogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD4ge1xuICAgIHJldHVybiBpaWYoXG4gICAgICAgICgpID0+IGt0ZElzTW9iaWxlT3JUYWJsZXQoKSxcbiAgICAgICAgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGVsZW1lbnQsICd0b3VjaG1vdmUnLCBhY3RpdmVFdmVudExpc3RlbmVyT3B0aW9ucyBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucykucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigodG91Y2hFdmVudCkgPT4gdG91Y2hFdmVudC50b3VjaGVzLmxlbmd0aCA9PT0gdG91Y2hOdW1iZXIpLFxuICAgICAgICApLFxuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZWxlbWVudCwgJ21vdXNlbW92ZScsIGFjdGl2ZUV2ZW50TGlzdGVuZXJPcHRpb25zIGFzIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKVxuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdGRUb3VjaEVuZChlbGVtZW50LCB0b3VjaE51bWJlciA9IDEpOiBPYnNlcnZhYmxlPFRvdWNoRXZlbnQ+IHtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50PihlbGVtZW50LCAndG91Y2hlbmQnKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKCh0b3VjaEV2ZW50KSA9PiB0b3VjaEV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSB0b3VjaE51bWJlciAtIDEpXG4gICAgICAgICksXG4gICAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50PihlbGVtZW50LCAndG91Y2hjYW5jZWwnKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKCh0b3VjaEV2ZW50KSA9PiB0b3VjaEV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSB0b3VjaE51bWJlciAtIDEpXG4gICAgICAgIClcbiAgICApO1xufVxuXG4vKipcbiAqIEVtaXRzIHdoZW4gYSB0aGVyZSBpcyBhICdtb3VzZXVwJyBvciB0aGUgdG91Y2ggZW5kcy5cbiAqIEBwYXJhbSBlbGVtZW50LCBodG1sIGVsZW1lbnQgd2hlcmUgdG8gIGxpc3RlbiB0aGUgZXZlbnRzLlxuICogQHBhcmFtIHRvdWNoTnVtYmVyIG51bWJlciBvZiB0aGUgdG91Y2ggdG8gdHJhY2sgdGhlIGV2ZW50LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBvbmUuXG4gKi9cbmZ1bmN0aW9uIGt0ZE1vdXNlck9yVG91Y2hFbmQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHRvdWNoTnVtYmVyID0gMSk6IE9ic2VydmFibGU8TW91c2VFdmVudCB8IFRvdWNoRXZlbnQ+IHtcbiAgICByZXR1cm4gaWlmKFxuICAgICAgICAoKSA9PiBrdGRJc01vYmlsZU9yVGFibGV0KCksXG4gICAgICAgIGt0ZFRvdWNoRW5kKGVsZW1lbnQsIHRvdWNoTnVtYmVyKSxcbiAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGVsZW1lbnQsICdtb3VzZXVwJyksXG4gICAgKTtcbn1cblxuXG4vKipcbiAqIEVtaXRzIHdoZW4gYSAncG9pbnRlcmRvd24nIGV2ZW50IG9jY3VycyAob25seSBmb3IgdGhlIHByaW1hcnkgcG9pbnRlcikuIEZhbGxiYWNrcyB0byAnbW91c2Vtb3ZlJyBvciBhICd0b3VjaG1vdmUnIGlmIHBvaW50ZXIgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIGVsZW1lbnQsIGh0bWwgZWxlbWVudCB3aGVyZSB0byBsaXN0ZW4gdGhlIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZFBvaW50ZXJEb3duKGVsZW1lbnQpOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgUG9pbnRlckV2ZW50PiB7XG4gICAgaWYgKCFrdGRTdXBwb3J0c1BvaW50ZXJFdmVudHMoKSkge1xuICAgICAgICByZXR1cm4ga3RkTW91c2VPclRvdWNoRG93bihlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbUV2ZW50PFBvaW50ZXJFdmVudD4oZWxlbWVudCwgJ3BvaW50ZXJkb3duJywgYWN0aXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgYXMgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpLnBpcGUoXG4gICAgICAgIGZpbHRlcigocG9pbnRlckV2ZW50KSA9PiBwb2ludGVyRXZlbnQuaXNQcmltYXJ5KVxuICAgIClcbn1cblxuLyoqXG4gKiBFbWl0cyB3aGVuIGEgJ3BvaW50ZXJtb3ZlJyBldmVudCBvY2N1cnMgKG9ubHkgZm9yIHRoZSBwcmltYXJ5IHBvaW50ZXIpLiBGYWxsYmFja3MgdG8gJ21vdXNlbW92ZScgb3IgYSAndG91Y2htb3ZlJyBpZiBwb2ludGVyIGV2ZW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBlbGVtZW50LCBodG1sIGVsZW1lbnQgd2hlcmUgdG8gbGlzdGVuIHRoZSBldmVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrdGRQb2ludGVyTW92ZShlbGVtZW50KTogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudD4ge1xuICAgIGlmICgha3RkU3VwcG9ydHNQb2ludGVyRXZlbnRzKCkpIHtcbiAgICAgICAgcmV0dXJuIGt0ZE1vdXNlT3JUb3VjaE1vdmUoZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBmcm9tRXZlbnQ8UG9pbnRlckV2ZW50PihlbGVtZW50LCAncG9pbnRlcm1vdmUnLCBhY3RpdmVFdmVudExpc3RlbmVyT3B0aW9ucyBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucykucGlwZShcbiAgICAgICAgZmlsdGVyKChwb2ludGVyRXZlbnQpID0+IHBvaW50ZXJFdmVudC5pc1ByaW1hcnkpLFxuICAgICk7XG59XG5cbi8qKlxuICogRW1pdHMgd2hlbiBhICdwb2ludGVydXAnIGV2ZW50IG9jY3VycyAob25seSBmb3IgdGhlIHByaW1hcnkgcG9pbnRlcikuIEZhbGxiYWNrcyB0byAnbW91c2Vtb3ZlJyBvciBhICd0b3VjaG1vdmUnIGlmIHBvaW50ZXIgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIGVsZW1lbnQsIGh0bWwgZWxlbWVudCB3aGVyZSB0byBsaXN0ZW4gdGhlIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZFBvaW50ZXJVcChlbGVtZW50KTogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudD4ge1xuICAgIGlmICgha3RkU3VwcG9ydHNQb2ludGVyRXZlbnRzKCkpIHtcbiAgICAgICAgcmV0dXJuIGt0ZE1vdXNlck9yVG91Y2hFbmQoZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBmcm9tRXZlbnQ8UG9pbnRlckV2ZW50PihlbGVtZW50LCAncG9pbnRlcnVwJykucGlwZShmaWx0ZXIocG9pbnRlckV2ZW50ID0+IHBvaW50ZXJFdmVudC5pc1ByaW1hcnkpKTtcbn1cbiJdfQ==