@ngutil/aria 0.0.70 → 0.0.71
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/esm2022/gestures/gesture-drag.mjs +93 -0
- package/esm2022/gestures/gesture-event.mjs +44 -0
- package/esm2022/gestures/gesture-longtap.mjs +36 -0
- package/esm2022/gestures/gesture-tap.mjs +33 -0
- package/esm2022/gestures/gesture.mjs +29 -0
- package/esm2022/gestures/gesture.service.mjs +279 -0
- package/esm2022/gestures/index.mjs +7 -3
- package/fesm2022/ngutil-aria.mjs +408 -115
- package/fesm2022/ngutil-aria.mjs.map +1 -1
- package/gestures/gesture-drag.d.ts +20 -0
- package/gestures/gesture-event.d.ts +44 -0
- package/gestures/gesture-longtap.d.ts +12 -0
- package/gestures/gesture-tap.d.ts +12 -0
- package/gestures/gesture.d.ts +35 -0
- package/gestures/gesture.service.d.ts +22 -0
- package/gestures/index.d.ts +6 -2
- package/package.json +3 -3
- package/esm2022/gestures/gestures/_base.mjs +0 -55
- package/esm2022/gestures/gestures/dragging.mjs +0 -14
- package/esm2022/gestures/gestures/index.mjs +0 -3
- package/esm2022/gestures/gestures.service.mjs +0 -146
- package/gestures/gestures/_base.d.ts +0 -63
- package/gestures/gestures/dragging.d.ts +0 -4
- package/gestures/gestures/index.d.ts +0 -2
- package/gestures/gestures.service.d.ts +0 -10
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { DOCUMENT } from "@angular/common";
|
|
2
|
+
import { inject, Injectable, NgZone } from "@angular/core";
|
|
3
|
+
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
|
4
|
+
import { combineLatest, connect, debounceTime, filter, finalize, map, merge, Observable, scan, share, startWith, Subject, switchMap, takeWhile, tap } from "rxjs";
|
|
5
|
+
import { __zone_symbol__, coerceElement, isFalsy, isTruthy } from "@ngutil/common";
|
|
6
|
+
import { Listeners } from "./gesture-event";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
const ADD_EVENT_LISTENER = __zone_symbol__("addEventListener");
|
|
9
|
+
const REMOVE_EVENT_LISTENER = __zone_symbol__("removeEventListener");
|
|
10
|
+
const DISPATCH_EVENT = __zone_symbol__("dispatchEvent");
|
|
11
|
+
const SCROLL_LISTENER_OPTIONS = { passive: true };
|
|
12
|
+
export class GestureService {
|
|
13
|
+
#zone = inject(NgZone);
|
|
14
|
+
#document = inject(DOCUMENT);
|
|
15
|
+
#watchers = [];
|
|
16
|
+
#trigger = new Subject();
|
|
17
|
+
#moving = merge(...Object.keys(Listeners)
|
|
18
|
+
.filter(name => Listeners[name].phase === "moving" /* GesturePhase.Moving */)
|
|
19
|
+
.map(name => this.#listen(name, Listeners[name]))).pipe(share());
|
|
20
|
+
#end = merge(...Object.keys(Listeners)
|
|
21
|
+
.filter(name => Listeners[name].phase === "end" /* GesturePhase.End */)
|
|
22
|
+
.map(name => this.#listen(name, Listeners[name]))).pipe(share());
|
|
23
|
+
#eventStream = merge(this.#moving, this.#end).pipe(share());
|
|
24
|
+
#begin = new Observable((dst) => {
|
|
25
|
+
let pointerType;
|
|
26
|
+
return this.#trigger
|
|
27
|
+
.pipe(filter(event => {
|
|
28
|
+
if (pointerType == null) {
|
|
29
|
+
pointerType = event.pointerType;
|
|
30
|
+
}
|
|
31
|
+
return event.pointerType === pointerType;
|
|
32
|
+
}), connect(events => merge(events,
|
|
33
|
+
// reset pointerType on end, after 200ms, because touchend is maybe followed by a mouse event
|
|
34
|
+
this.#end.pipe(debounceTime(200), tap(() => {
|
|
35
|
+
pointerType = undefined;
|
|
36
|
+
this.#enableTouchAction();
|
|
37
|
+
}), filter(() => false)))),
|
|
38
|
+
// Select active watchers
|
|
39
|
+
map(event => {
|
|
40
|
+
const eventTarget = event.target;
|
|
41
|
+
let includeScrollDistance = false;
|
|
42
|
+
const gestures = this.#watchers
|
|
43
|
+
.filter(({ gesture, el }) => gesture.filterByEvent(event) &&
|
|
44
|
+
(el === eventTarget || ("contains" in el && el.contains(eventTarget))))
|
|
45
|
+
.reduce((gestures, { gesture }) => {
|
|
46
|
+
if (!gestures.has(gesture)) {
|
|
47
|
+
includeScrollDistance = includeScrollDistance || gesture.includeScrollDistance;
|
|
48
|
+
gestures.set(gesture, 0 /* GestureCaptureState.Unchecked */);
|
|
49
|
+
}
|
|
50
|
+
return gestures;
|
|
51
|
+
}, new Map());
|
|
52
|
+
return { startEvent: event, gestures, includeScrollDistance };
|
|
53
|
+
}), filter(({ gestures }) => gestures.size > 0), tap(this.#disableTouchAction)
|
|
54
|
+
// finalize(() => console.log("FINALIZE BEGIN"))
|
|
55
|
+
)
|
|
56
|
+
.subscribe(dst);
|
|
57
|
+
});
|
|
58
|
+
#gesture = this.#begin.pipe(switchMap(({ startEvent, gestures, includeScrollDistance }) => {
|
|
59
|
+
const pointerType = startEvent.pointerType;
|
|
60
|
+
const startAt = startEvent.origin.timeStamp;
|
|
61
|
+
const dispatchEvent = startEvent.target[DISPATCH_EVENT].bind(startEvent.target);
|
|
62
|
+
const eventStreamInit = this.#eventStream.pipe(startWith(startEvent), filter(event => event.pointerType === pointerType));
|
|
63
|
+
const eventStreamSource = !includeScrollDistance
|
|
64
|
+
? eventStreamInit
|
|
65
|
+
: combineLatest([
|
|
66
|
+
eventStreamInit,
|
|
67
|
+
this.#scrollDistance(startEvent.target).pipe(startWith({ x: 0, y: 0 }))
|
|
68
|
+
]).pipe(map(([src, distance]) => {
|
|
69
|
+
;
|
|
70
|
+
src.scrollDistance = distance;
|
|
71
|
+
return src;
|
|
72
|
+
}));
|
|
73
|
+
const eventStream = eventStreamSource.pipe(scan((state, curr) => updatePointers({
|
|
74
|
+
...state,
|
|
75
|
+
...curr,
|
|
76
|
+
elapsed: curr.origin.timeStamp - startAt
|
|
77
|
+
}), startEvent), takeWhile(event => event.phase !== "end" /* GesturePhase.End */, true),
|
|
78
|
+
// finalize(() => console.log("FINALIZE WATCH")),
|
|
79
|
+
share());
|
|
80
|
+
const captureState = eventStream.pipe(connect(src => {
|
|
81
|
+
const state = { events: [], gestures, includeScrollDistance };
|
|
82
|
+
return merge(src.pipe(tap(event => state.events.push(event))), ...Array.from(gestures.keys()).map(gesture => gesture.capture(src.pipe(filter(gesture.filterByEvent))).pipe(takeWhile(result => result !== 2 /* GestureCaptureState.Skip */, true), tap(result => gestures.set(gesture, result))))).pipe(map(() => state));
|
|
83
|
+
})
|
|
84
|
+
// ,finalize(() => console.log("FINALIZE CAPTURE"))
|
|
85
|
+
);
|
|
86
|
+
const selectGesture = captureState.pipe(map(state => {
|
|
87
|
+
const partitions = {};
|
|
88
|
+
for (const [gesture, captureState] of state.gestures) {
|
|
89
|
+
const partition = (partitions[captureState] ??= []);
|
|
90
|
+
partition.push(gesture);
|
|
91
|
+
}
|
|
92
|
+
if (partitions[4 /* GestureCaptureState.Instant */] != null) {
|
|
93
|
+
return {
|
|
94
|
+
gesture: partitions[4 /* GestureCaptureState.Instant */].sort(sortByPripority)[0],
|
|
95
|
+
events: state.events
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// while not all gestures return from Gesture.capture
|
|
99
|
+
if (partitions[0 /* GestureCaptureState.Unchecked */] != null) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
// while has pending, the capture is continued
|
|
103
|
+
if (partitions[1 /* GestureCaptureState.Pending */] != null) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
// no pendig & has maybe
|
|
107
|
+
if (partitions[3 /* GestureCaptureState.Maybe */] != null) {
|
|
108
|
+
return {
|
|
109
|
+
gesture: partitions[3 /* GestureCaptureState.Maybe */].sort(sortByPripority)[0],
|
|
110
|
+
events: state.events
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// no pending & no maybe & no terminate
|
|
114
|
+
// so, nothign matched
|
|
115
|
+
return { events: state.events };
|
|
116
|
+
}), takeWhile(isFalsy, true), filter(isTruthy), takeWhile(v => v.gesture != null, false)
|
|
117
|
+
// finalize(() => console.log("FINALIZE SELECT"))
|
|
118
|
+
);
|
|
119
|
+
return selectGesture.pipe(switchMap(({ events, gesture }) => gesture.handle(eventStream.pipe(startWith(...events), filter(gesture.filterByEvent))).pipe(takeWhile(v => v.phase !== "end" /* GesturePhase.End */, true), tap((e) => dispatchEvent(new CustomEvent(e.type, { detail: e, bubbles: true, cancelable: true })))
|
|
120
|
+
// finalize(() => console.log("GESTURE FINALIZE")),
|
|
121
|
+
)),
|
|
122
|
+
// finalize(() => console.log("FINALIZE RESULT")),
|
|
123
|
+
finalize(this.#enableTouchAction));
|
|
124
|
+
}), share());
|
|
125
|
+
constructor() {
|
|
126
|
+
const triggers = merge(...Object.keys(Listeners)
|
|
127
|
+
.filter(name => Listeners[name].phase === "start" /* GesturePhase.Start */)
|
|
128
|
+
.map(name => this.#listen(name, Listeners[name])));
|
|
129
|
+
triggers.pipe(takeUntilDestroyed()).subscribe(this.#trigger);
|
|
130
|
+
}
|
|
131
|
+
listen(el, ...gestures) {
|
|
132
|
+
return new Observable((dst) => this.#zone.runOutsideAngular(() => {
|
|
133
|
+
const element = coerceElement(el);
|
|
134
|
+
const next = dst.next.bind(dst);
|
|
135
|
+
for (const gesture of gestures) {
|
|
136
|
+
element[ADD_EVENT_LISTENER](gesture.name, next);
|
|
137
|
+
dst.add(element[REMOVE_EVENT_LISTENER].bind(element, gesture.name, next));
|
|
138
|
+
}
|
|
139
|
+
dst.add(this.watch(element, ...gestures).subscribe());
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
watch(el, ...gestures) {
|
|
143
|
+
return new Observable((dst) => this.#zone.runOutsideAngular(() => {
|
|
144
|
+
const element = coerceElement(el);
|
|
145
|
+
const watchers = gestures.map(gesture => {
|
|
146
|
+
return { gesture, el: element };
|
|
147
|
+
});
|
|
148
|
+
this.#add(watchers);
|
|
149
|
+
dst.add(this.#gesture.subscribe(dst));
|
|
150
|
+
return () => {
|
|
151
|
+
this.#remove(watchers);
|
|
152
|
+
};
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
#add(watchers) {
|
|
156
|
+
this.#watchers = this.#watchers.concat(watchers);
|
|
157
|
+
}
|
|
158
|
+
#remove(watchers) {
|
|
159
|
+
this.#watchers = this.#watchers.filter(v => !watchers.includes(v));
|
|
160
|
+
}
|
|
161
|
+
#listen(name, config) {
|
|
162
|
+
const { phase, pointerType, options } = config;
|
|
163
|
+
const toResult = phase === "start" /* GesturePhase.Start */
|
|
164
|
+
? (origin) => ({
|
|
165
|
+
origin,
|
|
166
|
+
phase,
|
|
167
|
+
pointerType,
|
|
168
|
+
target: origin.target
|
|
169
|
+
})
|
|
170
|
+
: (origin) => {
|
|
171
|
+
if (origin.cancelable) {
|
|
172
|
+
origin.preventDefault();
|
|
173
|
+
}
|
|
174
|
+
return { origin, phase, pointerType };
|
|
175
|
+
};
|
|
176
|
+
return new Observable((dst) => this.#zone.runOutsideAngular(() => {
|
|
177
|
+
const listener = (origin) => {
|
|
178
|
+
if (origin.defaultPrevented) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
dst.next(toResult(origin));
|
|
182
|
+
};
|
|
183
|
+
// console.log("addEventListener", name)
|
|
184
|
+
this.#document[ADD_EVENT_LISTENER](name, listener, options);
|
|
185
|
+
return () => {
|
|
186
|
+
// console.log("removeEventListener", name)
|
|
187
|
+
this.#document[REMOVE_EVENT_LISTENER](name, listener, options);
|
|
188
|
+
};
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
#scrollDistance(element) {
|
|
192
|
+
const scrollPosition = () => {
|
|
193
|
+
let x = 0;
|
|
194
|
+
let y = 0;
|
|
195
|
+
let p = element;
|
|
196
|
+
do {
|
|
197
|
+
x += p.scrollLeft ?? 0;
|
|
198
|
+
y += p.scrollTop ?? 0;
|
|
199
|
+
p = p.parentNode;
|
|
200
|
+
} while (p != null);
|
|
201
|
+
return { x, y };
|
|
202
|
+
};
|
|
203
|
+
return new Observable((dst) => this.#zone.runOutsideAngular(() => {
|
|
204
|
+
const initial = scrollPosition();
|
|
205
|
+
const listener = () => {
|
|
206
|
+
const current = scrollPosition();
|
|
207
|
+
dst.next({ x: current.x - initial.x, y: current.y - initial.y });
|
|
208
|
+
};
|
|
209
|
+
this.#document[ADD_EVENT_LISTENER]("scroll", listener, SCROLL_LISTENER_OPTIONS);
|
|
210
|
+
return () => {
|
|
211
|
+
this.#document[REMOVE_EVENT_LISTENER]("scroll", listener, SCROLL_LISTENER_OPTIONS);
|
|
212
|
+
};
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
#lastTouchAction;
|
|
216
|
+
#disableTouchAction = () => {
|
|
217
|
+
if (this.#lastTouchAction == null) {
|
|
218
|
+
this.#lastTouchAction = window.getComputedStyle(this.#document.body).touchAction;
|
|
219
|
+
this.#document.body.style.touchAction = "none";
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
#enableTouchAction = () => {
|
|
223
|
+
if (this.#lastTouchAction != null) {
|
|
224
|
+
this.#document.body.style.touchAction = this.#lastTouchAction;
|
|
225
|
+
this.#lastTouchAction = undefined;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
229
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, providedIn: "root" }); }
|
|
230
|
+
}
|
|
231
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, decorators: [{
|
|
232
|
+
type: Injectable,
|
|
233
|
+
args: [{ providedIn: "root" }]
|
|
234
|
+
}], ctorParameters: () => [] });
|
|
235
|
+
function sortByPripority(a, b) {
|
|
236
|
+
return b.priority - a.priority;
|
|
237
|
+
}
|
|
238
|
+
function pointersFromEvent(event) {
|
|
239
|
+
if (event instanceof MouseEvent) {
|
|
240
|
+
return [
|
|
241
|
+
{
|
|
242
|
+
x: event.clientX,
|
|
243
|
+
y: event.clientY
|
|
244
|
+
}
|
|
245
|
+
];
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
return Array.from(event.touches).map(t => {
|
|
249
|
+
return { x: t.clientX, y: t.clientY };
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function updatePointers(state) {
|
|
254
|
+
if (state.phase === "start" /* GesturePhase.Start */) {
|
|
255
|
+
state.pointers = pointersFromEvent(state.origin).map(v => {
|
|
256
|
+
return { start: v, current: v, distance: { x: 0, y: 0 }, direction: { x: 0, y: 0 } };
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
else if (state.pointers) {
|
|
260
|
+
const pointers = pointersFromEvent(state.origin);
|
|
261
|
+
if (pointers.length === 0) {
|
|
262
|
+
return state;
|
|
263
|
+
}
|
|
264
|
+
state.pointers = state.pointers.map((v, i) => {
|
|
265
|
+
const p = pointers[i];
|
|
266
|
+
return {
|
|
267
|
+
start: v.start,
|
|
268
|
+
current: p,
|
|
269
|
+
distance: { x: p.x - v.start.x, y: p.y - v.start.y },
|
|
270
|
+
direction: { x: direction(v.start.x, p.x), y: direction(v.start.y, p.y) }
|
|
271
|
+
};
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
return state;
|
|
275
|
+
}
|
|
276
|
+
function direction(prev, curr) {
|
|
277
|
+
return curr > prev ? 1 : curr < prev ? -1 : 0;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VzdHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXJpYS9zcmMvZ2VzdHVyZXMvZ2VzdHVyZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFL0QsT0FBTyxFQUNILGFBQWEsRUFDYixPQUFPLEVBQ1AsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEVBQ1YsSUFBSSxFQUNKLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxFQUVQLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNOLE1BQU0sTUFBTSxDQUFBO0FBSWIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUloRyxPQUFPLEVBT0gsU0FBUyxFQUNaLE1BQU0saUJBQWlCLENBQUE7O0FBRXhCLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUE7QUFDOUQsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUNwRSxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUE7QUFvQ3ZELE1BQU0sdUJBQXVCLEdBQTRCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFBO0FBRzFFLE1BQU0sT0FBTyxjQUFjO0lBQ2QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN0QixTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxD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Q0FBQTtBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCJcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wXCJcblxuaW1wb3J0IHtcbiAgICBjb21iaW5lTGF0ZXN0LFxuICAgIGNvbm5lY3QsXG4gICAgZGVib3VuY2VUaW1lLFxuICAgIGZpbHRlcixcbiAgICBmaW5hbGl6ZSxcbiAgICBtYXAsXG4gICAgbWVyZ2UsXG4gICAgT2JzZXJ2YWJsZSxcbiAgICBzY2FuLFxuICAgIHNoYXJlLFxuICAgIHN0YXJ0V2l0aCxcbiAgICBTdWJqZWN0LFxuICAgIFN1YnNjcmliZXIsXG4gICAgc3dpdGNoTWFwLFxuICAgIHRha2VXaGlsZSxcbiAgICB0YXBcbn0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSBcInV0aWxpdHktdHlwZXNcIlxuXG5pbXBvcnQgeyBfX3pvbmVfc3ltYm9sX18sIGNvZXJjZUVsZW1lbnQsIEVsZW1lbnRJbnB1dCwgaXNGYWxzeSwgaXNUcnV0aHkgfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuaW1wb3J0IHsgUG9zaXRpb24gfSBmcm9tIFwiQG5ndXRpbC9zdHlsZVwiXG5cbmltcG9ydCB7IEdlc3R1cmUsIEdlc3R1cmVDYXB0dXJlU3RhdGUgfSBmcm9tIFwiLi9nZXN0dXJlXCJcbmltcG9ydCB7XG4gICAgR2VzdHVyZURvbUV2ZW50LFxuICAgIEdlc3R1cmVFdmVudCxcbiAgICBHZXN0dXJlTGlzdGVuZXJDb25maWcsXG4gICAgR2VzdHVyZU9yaWdpbixcbiAgICBHZXN0dXJlUGhhc2UsXG4gICAgR2VzdHVyZVBvaW50ZXJUeXBlLFxuICAgIExpc3RlbmVyc1xufSBmcm9tIFwiLi9nZXN0dXJlLWV2ZW50XCJcblxuY29uc3QgQUREX0VWRU5UX0xJU1RFTkVSID0gX196b25lX3N5bWJvbF9fKFwiYWRkRXZlbnRMaXN0ZW5lclwiKVxuY29uc3QgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gX196b25lX3N5bWJvbF9fKFwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiKVxuY29uc3QgRElTUEFUQ0hfRVZFTlQgPSBfX3pvbmVfc3ltYm9sX18oXCJkaXNwYXRjaEV2ZW50XCIpXG5cbnR5cGUgR2VzdHVyZXNUb0V2ZW50c1R5cGU8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PiA9XG4gICAgVCBleHRlbmRzIEFycmF5PGluZmVyIEc+ID8gKEcgZXh0ZW5kcyBHZXN0dXJlPGluZmVyIEU+ID8gRSA6IG5ldmVyKSA6IG5ldmVyXG5cbnR5cGUgR2VzdHVyZUV2ZW50RGlzY3JpbWluYXRvcjxUPiA9IFQgZXh0ZW5kcyB7IHR5cGU6IGluZmVyIE4gfSA/IHsgdHlwZTogTiB9ICYgVCA6IG5ldmVyXG5cbmV4cG9ydCB0eXBlIEdlc3R1cmVXYXRjaFJldHVybnM8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PiA9IE9ic2VydmFibGU8XG4gICAgR2VzdHVyZUV2ZW50RGlzY3JpbWluYXRvcjxHZXN0dXJlc1RvRXZlbnRzVHlwZTxUPj5cbj5cblxuZXhwb3J0IHR5cGUgR2VzdHVyZUxpc3RlblJldHVybnM8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PiA9IE9ic2VydmFibGU8R2VzdHVyZURvbUV2ZW50PEdlc3R1cmVzVG9FdmVudHNUeXBlPFQ+Pj5cblxuaW50ZXJmYWNlIEJlZ2luU3RhdGUge1xuICAgIHN0YXJ0RXZlbnQ6IEdlc3R1cmVFdmVudFxuICAgIGdlc3R1cmVzOiBNYXA8R2VzdHVyZSwgR2VzdHVyZUNhcHR1cmVTdGF0ZT5cbiAgICBpbmNsdWRlU2Nyb2xsRGlzdGFuY2U6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIENhcHR1cmVTdGF0ZSB7XG4gICAgZXZlbnRzOiBHZXN0dXJlRXZlbnRbXVxuICAgIGdlc3R1cmVzOiBCZWdpblN0YXRlW1wiZ2VzdHVyZXNcIl1cbiAgICBpbmNsdWRlU2Nyb2xsRGlzdGFuY2U6IEJlZ2luU3RhdGVbXCJpbmNsdWRlU2Nyb2xsRGlzdGFuY2VcIl1cbn1cblxuaW50ZXJmYWNlIENhcHR1cmVTZWxlY3RTdGF0ZSB7XG4gICAgZXZlbnRzOiBHZXN0dXJlRXZlbnRbXVxuICAgIGdlc3R1cmU/OiBHZXN0dXJlXG4gICAgd2F0Y2hlcnM/OiBBcnJheTxXYXRjaGVyPlxufVxuXG5pbnRlcmZhY2UgV2F0Y2hlciB7XG4gICAgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50XG4gICAgcmVhZG9ubHkgZ2VzdHVyZTogR2VzdHVyZVxufVxuXG5jb25zdCBTQ1JPTExfTElTVEVORVJfT1BUSU9OUzogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgR2VzdHVyZVNlcnZpY2Uge1xuICAgIHJlYWRvbmx5ICN6b25lID0gaW5qZWN0KE5nWm9uZSlcbiAgICByZWFkb25seSAjZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpXG5cbiAgICAjd2F0Y2hlcnM6IFdhdGNoZXJbXSA9IFtdXG4gICAgcmVhZG9ubHkgI3RyaWdnZXIgPSBuZXcgU3ViamVjdDxHZXN0dXJlRXZlbnQ+KClcblxuICAgIHJlYWRvbmx5ICNtb3Zpbmc6IE9ic2VydmFibGU8R2VzdHVyZUV2ZW50PiA9IG1lcmdlKFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhMaXN0ZW5lcnMpXG4gICAgICAgICAgICAuZmlsdGVyKG5hbWUgPT4gTGlzdGVuZXJzW25hbWVdLnBoYXNlID09PSBHZXN0dXJlUGhhc2UuTW92aW5nKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuI2xpc3RlbihuYW1lLCBMaXN0ZW5lcnNbbmFtZV0pKVxuICAgICkucGlwZShzaGFyZSgpKVxuXG4gICAgcmVhZG9ubHkgI2VuZDogT2JzZXJ2YWJsZTxHZXN0dXJlRXZlbnQ+ID0gbWVyZ2UoXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKExpc3RlbmVycylcbiAgICAgICAgICAgIC5maWx0ZXIobmFtZSA9PiBMaXN0ZW5lcnNbbmFtZV0ucGhhc2UgPT09IEdlc3R1cmVQaGFzZS5FbmQpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy4jbGlzdGVuKG5hbWUsIExpc3RlbmVyc1tuYW1lXSkpXG4gICAgKS5waXBlKHNoYXJlKCkpXG5cbiAgICByZWFkb25seSAjZXZlbnRTdHJlYW0gPSBtZXJnZSh0aGlzLiNtb3ZpbmcsIHRoaXMuI2VuZCkucGlwZShzaGFyZSgpKVxuXG4gICAgcmVhZG9ubHkgI2JlZ2luID0gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxCZWdpblN0YXRlPikgPT4ge1xuICAgICAgICBsZXQgcG9pbnRlclR5cGU6IEdlc3R1cmVQb2ludGVyVHlwZSB8IHVuZGVmaW5lZFxuXG4gICAgICAgIHJldHVybiB0aGlzLiN0cmlnZ2VyXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRlclR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGUgPSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJUeXBlID09PSBwb2ludGVyVHlwZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNvbm5lY3QoZXZlbnRzID0+XG4gICAgICAgICAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcG9pbnRlclR5cGUgb24gZW5kLCBhZnRlciAyMDBtcywgYmVjYXVzZSB0b3VjaGVuZCBpcyBtYXliZSBmb2xsb3dlZCBieSBhIG1vdXNlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNlbmQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyVHlwZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNlbmFibGVUb3VjaEFjdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAvLyBTZWxlY3QgYWN0aXZlIHdhdGNoZXJzXG4gICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRUYXJnZXQgPSBldmVudC50YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluY2x1ZGVTY3JvbGxEaXN0YW5jZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdlc3R1cmVzID0gdGhpcy4jd2F0Y2hlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgZ2VzdHVyZSwgZWwgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VzdHVyZS5maWx0ZXJCeUV2ZW50KGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWwgPT09IGV2ZW50VGFyZ2V0IHx8IChcImNvbnRhaW5zXCIgaW4gZWwgJiYgZWwuY29udGFpbnMoZXZlbnRUYXJnZXQpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdlc3R1cmVzLCB7IGdlc3R1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdlc3R1cmVzLmhhcyhnZXN0dXJlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVNjcm9sbERpc3RhbmNlID0gaW5jbHVkZVNjcm9sbERpc3RhbmNlIHx8IGdlc3R1cmUuaW5jbHVkZVNjcm9sbERpc3RhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXN0dXJlcy5zZXQoZ2VzdHVyZSwgR2VzdHVyZUNhcHR1cmVTdGF0ZS5VbmNoZWNrZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlc3R1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWFwKCkgYXMgQmVnaW5TdGF0ZVtcImdlc3R1cmVzXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnRFdmVudDogZXZlbnQsIGdlc3R1cmVzLCBpbmNsdWRlU2Nyb2xsRGlzdGFuY2UgfSBzYXRpc2ZpZXMgQmVnaW5TdGF0ZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoeyBnZXN0dXJlcyB9KSA9PiBnZXN0dXJlcy5zaXplID4gMCksXG4gICAgICAgICAgICAgICAgdGFwKHRoaXMuI2Rpc2FibGVUb3VjaEFjdGlvbilcbiAgICAgICAgICAgICAgICAvLyBmaW5hbGl6ZSgoKSA9PiBjb25zb2xlLmxvZyhcIkZJTkFMSVpFIEJFR0lOXCIpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShkc3QpXG4gICAgfSlcblxuICAgIHJlYWRvbmx5ICNnZXN0dXJlID0gdGhpcy4jYmVnaW4ucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCh7IHN0YXJ0RXZlbnQsIGdlc3R1cmVzLCBpbmNsdWRlU2Nyb2xsRGlzdGFuY2UgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlclR5cGUgPSBzdGFydEV2ZW50LnBvaW50ZXJUeXBlXG4gICAgICAgICAgICBjb25zdCBzdGFydEF0ID0gc3RhcnRFdmVudC5vcmlnaW4udGltZVN0YW1wXG4gICAgICAgICAgICBjb25zdCBkaXNwYXRjaEV2ZW50ID0gc3RhcnRFdmVudC50YXJnZXRbRElTUEFUQ0hfRVZFTlRdLmJpbmQoc3RhcnRFdmVudC50YXJnZXQpXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RyZWFtSW5pdCA9IHRoaXMuI2V2ZW50U3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHN0YXJ0RXZlbnQpLFxuICAgICAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RyZWFtU291cmNlID0gIWluY2x1ZGVTY3JvbGxEaXN0YW5jZVxuICAgICAgICAgICAgICAgID8gZXZlbnRTdHJlYW1Jbml0XG4gICAgICAgICAgICAgICAgOiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFN0cmVhbUluaXQsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy4jc2Nyb2xsRGlzdGFuY2Uoc3RhcnRFdmVudC50YXJnZXQpLnBpcGUoc3RhcnRXaXRoKHsgeDogMCwgeTogMCB9KSlcbiAgICAgICAgICAgICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgbWFwKChbc3JjLCBkaXN0YW5jZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOyhzcmMgYXMgTXV0YWJsZTxHZXN0dXJlRXZlbnQ+KS5zY3JvbGxEaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcmNcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjb25zdCBldmVudFN0cmVhbSA9IGV2ZW50U3RyZWFtU291cmNlLnBpcGUoXG4gICAgICAgICAgICAgICAgc2NhbihcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLCBjdXJyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUG9pbnRlcnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZDogY3Vyci5vcmlnaW4udGltZVN0YW1wIC0gc3RhcnRBdCFcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBzdGFydEV2ZW50XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0YWtlV2hpbGUoZXZlbnQgPT4gZXZlbnQucGhhc2UgIT09IEdlc3R1cmVQaGFzZS5FbmQsIHRydWUpLFxuICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiRklOQUxJWkUgV0FUQ0hcIikpLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgY2FwdHVyZVN0YXRlID0gZXZlbnRTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICBjb25uZWN0KHNyYyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlOiBDYXB0dXJlU3RhdGUgPSB7IGV2ZW50czogW10sIGdlc3R1cmVzLCBpbmNsdWRlU2Nyb2xsRGlzdGFuY2UgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmMucGlwZSh0YXAoZXZlbnQgPT4gc3RhdGUuZXZlbnRzLnB1c2goZXZlbnQpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BcnJheS5mcm9tKGdlc3R1cmVzLmtleXMoKSkubWFwKGdlc3R1cmUgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXN0dXJlLmNhcHR1cmUoc3JjLnBpcGUoZmlsdGVyKGdlc3R1cmUuZmlsdGVyQnlFdmVudCkpKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlV2hpbGUocmVzdWx0ID0+IHJlc3VsdCAhPT0gR2VzdHVyZUNhcHR1cmVTdGF0ZS5Ta2lwLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKHJlc3VsdCA9PiBnZXN0dXJlcy5zZXQoZ2VzdHVyZSwgcmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkucGlwZShtYXAoKCkgPT4gc3RhdGUpKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gLGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiRklOQUxJWkUgQ0FQVFVSRVwiKSlcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0R2VzdHVyZSA9IGNhcHR1cmVTdGF0ZS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChzdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnM6IHsgW2sgaW4gR2VzdHVyZUNhcHR1cmVTdGF0ZV0/OiBHZXN0dXJlW10gfSA9IHt9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZ2VzdHVyZSwgY2FwdHVyZVN0YXRlXSBvZiBzdGF0ZS5nZXN0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uID0gKHBhcnRpdGlvbnNbY2FwdHVyZVN0YXRlXSA/Pz0gW10pXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24ucHVzaChnZXN0dXJlKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNbR2VzdHVyZUNhcHR1cmVTdGF0ZS5JbnN0YW50XSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlc3R1cmU6IHBhcnRpdGlvbnNbR2VzdHVyZUNhcHR1cmVTdGF0ZS5JbnN0YW50XS5zb3J0KHNvcnRCeVByaXBvcml0eSlbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBzdGF0ZS5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgQ2FwdHVyZVNlbGVjdFN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBub3QgYWxsIGdlc3R1cmVzIHJldHVybiBmcm9tIEdlc3R1cmUuY2FwdHVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFydGl0aW9uc1tHZXN0dXJlQ2FwdHVyZVN0YXRlLlVuY2hlY2tlZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIGhhcyBwZW5kaW5nLCB0aGUgY2FwdHVyZSBpcyBjb250aW51ZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNbR2VzdHVyZUNhcHR1cmVTdGF0ZS5QZW5kaW5nXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gbm8gcGVuZGlnICYgaGFzIG1heWJlXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb25zW0dlc3R1cmVDYXB0dXJlU3RhdGUuTWF5YmVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VzdHVyZTogcGFydGl0aW9uc1tHZXN0dXJlQ2FwdHVyZVN0YXRlLk1heWJlXS5zb3J0KHNvcnRCeVByaXBvcml0eSlbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBzdGF0ZS5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgQ2FwdHVyZVNlbGVjdFN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBubyBwZW5kaW5nICYgbm8gbWF5YmUgJiBubyB0ZXJtaW5hdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc28sIG5vdGhpZ24gbWF0Y2hlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBldmVudHM6IHN0YXRlLmV2ZW50cyB9IGFzIENhcHR1cmVTZWxlY3RTdGF0ZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VXaGlsZShpc0ZhbHN5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoaXNUcnV0aHkpLFxuICAgICAgICAgICAgICAgIHRha2VXaGlsZSh2ID0+IHYhLmdlc3R1cmUgIT0gbnVsbCwgZmFsc2UpXG4gICAgICAgICAgICAgICAgLy8gZmluYWxpemUoKCkgPT4gY29uc29sZS5sb2coXCJGSU5BTElaRSBTRUxFQ1RcIikpXG4gICAgICAgICAgICApIGFzIE9ic2VydmFibGU8UmVxdWlyZWQ8Q2FwdHVyZVNlbGVjdFN0YXRlPj5cblxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdlc3R1cmUucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHsgZXZlbnRzLCBnZXN0dXJlIH0pID0+XG4gICAgICAgICAgICAgICAgICAgIGdlc3R1cmUuaGFuZGxlKGV2ZW50U3RyZWFtLnBpcGUoc3RhcnRXaXRoKC4uLmV2ZW50cyksIGZpbHRlcihnZXN0dXJlLmZpbHRlckJ5RXZlbnQpKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VXaGlsZSh2ID0+IHYucGhhc2UgIT09IEdlc3R1cmVQaGFzZS5FbmQsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFwKChlOiBNdXRhYmxlPEdlc3R1cmVFdmVudD4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZS50eXBlLCB7IGRldGFpbDogZSwgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiR0VTVFVSRSBGSU5BTElaRVwiKSksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiRklOQUxJWkUgUkVTVUxUXCIpKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSh0aGlzLiNlbmFibGVUb3VjaEFjdGlvbilcbiAgICAgICAgICAgIClcbiAgICAgICAgfSksXG4gICAgICAgIHNoYXJlKClcbiAgICApXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSBtZXJnZShcbiAgICAgICAgICAgIC4uLk9iamVjdC5rZXlzKExpc3RlbmVycylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKG5hbWUgPT4gTGlzdGVuZXJzW25hbWVdLnBoYXNlID09PSBHZXN0dXJlUGhhc2UuU3RhcnQpXG4gICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuI2xpc3RlbihuYW1lLCBMaXN0ZW5lcnNbbmFtZV0pKVxuICAgICAgICApXG4gICAgICAgIHRyaWdnZXJzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh0aGlzLiN0cmlnZ2VyKVxuICAgIH1cblxuICAgIGxpc3RlbjxUIGV4dGVuZHMgQXJyYXk8R2VzdHVyZT4+KGVsOiBFbGVtZW50SW5wdXQsIC4uLmdlc3R1cmVzOiBUKTogR2VzdHVyZUxpc3RlblJldHVybnM8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxHZXN0dXJlRXZlbnQ+KSA9PlxuICAgICAgICAgICAgdGhpcy4jem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvZXJjZUVsZW1lbnQoZWwpXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IGRzdC5uZXh0LmJpbmQoZHN0KVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZ2VzdHVyZSBvZiBnZXN0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50W0FERF9FVkVOVF9MSVNURU5FUl0oZ2VzdHVyZS5uYW1lIGFzIGFueSwgbmV4dClcbiAgICAgICAgICAgICAgICAgICAgZHN0LmFkZChlbGVtZW50W1JFTU9WRV9FVkVOVF9MSVNURU5FUl0uYmluZChlbGVtZW50LCBnZXN0dXJlLm5hbWUgYXMgYW55LCBuZXh0IGFzIGFueSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRzdC5hZGQodGhpcy53YXRjaChlbGVtZW50LCAuLi5nZXN0dXJlcykuc3Vic2NyaWJlKCkpXG4gICAgICAgICAgICB9KVxuICAgICAgICApIGFzIGFueVxuICAgIH1cblxuICAgIHdhdGNoPFQgZXh0ZW5kcyBBcnJheTxHZXN0dXJlPj4oZWw6IEVsZW1lbnRJbnB1dCwgLi4uZ2VzdHVyZXM6IFQpOiBHZXN0dXJlV2F0Y2hSZXR1cm5zPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChkc3Q6IFN1YnNjcmliZXI8R2VzdHVyZUV2ZW50PikgPT5cbiAgICAgICAgICAgIHRoaXMuI3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsKVxuICAgICAgICAgICAgICAgIGNvbnN0IHdhdGNoZXJzID0gZ2VzdHVyZXMubWFwKGdlc3R1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBnZXN0dXJlLCBlbDogZWxlbWVudCB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGQod2F0Y2hlcnMpXG4gICAgICAgICAgICAgICAgZHN0LmFkZCh0aGlzLiNnZXN0dXJlLnN1YnNjcmliZShkc3QpKVxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZSh3YXRjaGVycylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApIGFzIGFueVxuICAgIH1cblxuICAgICNhZGQod2F0Y2hlcnM6IFdhdGNoZXJbXSkge1xuICAgICAgICB0aGlzLiN3YXRjaGVycyA9IHRoaXMuI3dhdGNoZXJzLmNvbmNhdCh3YXRjaGVycylcbiAgICB9XG5cbiAgICAjcmVtb3ZlKHdhdGNoZXJzOiBXYXRjaGVyW10pIHtcbiAgICAgICAgdGhpcy4jd2F0Y2hlcnMgPSB0aGlzLiN3YXRjaGVycy5maWx0ZXIodiA9PiAhd2F0Y2hlcnMuaW5jbHVkZXModikpXG4gICAgfVxuXG4gICAgI2xpc3RlbihuYW1lOiBzdHJpbmcsIGNvbmZpZzogR2VzdHVyZUxpc3RlbmVyQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgcGhhc2UsIHBvaW50ZXJUeXBlLCBvcHRpb25zIH0gPSBjb25maWdcblxuICAgICAgICBjb25zdCB0b1Jlc3VsdCA9XG4gICAgICAgICAgICBwaGFzZSA9PT0gR2VzdHVyZVBoYXNlLlN0YXJ0XG4gICAgICAgICAgICAgICAgPyAob3JpZ2luOiBHZXN0dXJlT3JpZ2luKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9yaWdpbi50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICB9KSBhcyBHZXN0dXJlRXZlbnRcbiAgICAgICAgICAgICAgICA6IChvcmlnaW46IEdlc3R1cmVPcmlnaW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luLCBwaGFzZSwgcG9pbnRlclR5cGUgfSBhcyBHZXN0dXJlRXZlbnRcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxHZXN0dXJlRXZlbnQ+KSA9PlxuICAgICAgICAgICAgdGhpcy4jem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAob3JpZ2luOiBHZXN0dXJlT3JpZ2luKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW4uZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHN0Lm5leHQodG9SZXN1bHQob3JpZ2luKSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFkZEV2ZW50TGlzdGVuZXJcIiwgbmFtZSlcbiAgICAgICAgICAgICAgICB0aGlzLiNkb2N1bWVudFtBRERfRVZFTlRfTElTVEVORVJdKG5hbWUgYXMga2V5b2YgRG9jdW1lbnRFdmVudE1hcCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiLCBuYW1lKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkb2N1bWVudFtSRU1PVkVfRVZFTlRfTElTVEVORVJdKG5hbWUgYXMga2V5b2YgRG9jdW1lbnRFdmVudE1hcCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAjc2Nyb2xsRGlzdGFuY2UoZWxlbWVudDogRWxlbWVudCk6IE9ic2VydmFibGU8UG9zaXRpb24+IHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgeCA9IDBcbiAgICAgICAgICAgIGxldCB5ID0gMFxuICAgICAgICAgICAgbGV0IHAgPSBlbGVtZW50XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgeCArPSBwLnNjcm9sbExlZnQgPz8gMFxuICAgICAgICAgICAgICAgIHkgKz0gcC5zY3JvbGxUb3AgPz8gMFxuICAgICAgICAgICAgICAgIHAgPSBwLnBhcmVudE5vZGUgYXMgRWxlbWVudFxuICAgICAgICAgICAgfSB3aGlsZSAocCAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHsgeCwgeSB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxQb3NpdGlvbj4pID0+XG4gICAgICAgICAgICB0aGlzLiN6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsID0gc2Nyb2xsUG9zaXRpb24oKVxuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gc2Nyb2xsUG9zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICBkc3QubmV4dCh7IHg6IGN1cnJlbnQueCAtIGluaXRpYWwueCwgeTogY3VycmVudC55IC0gaW5pdGlhbC55IH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI2RvY3VtZW50W0FERF9FVkVOVF9MSVNURU5FUl0oXCJzY3JvbGxcIiwgbGlzdGVuZXIsIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKVxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RvY3VtZW50W1JFTU9WRV9FVkVOVF9MSVNURU5FUl0oXCJzY3JvbGxcIiwgbGlzdGVuZXIsIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAjbGFzdFRvdWNoQWN0aW9uPzogc3RyaW5nXG4gICAgI2Rpc2FibGVUb3VjaEFjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuI2xhc3RUb3VjaEFjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLiNsYXN0VG91Y2hBY3Rpb24gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLiNkb2N1bWVudC5ib2R5KS50b3VjaEFjdGlvblxuICAgICAgICAgICAgdGhpcy4jZG9jdW1lbnQuYm9keS5zdHlsZS50b3VjaEFjdGlvbiA9IFwibm9uZVwiXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjZW5hYmxlVG91Y2hBY3Rpb24gPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNsYXN0VG91Y2hBY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4jZG9jdW1lbnQuYm9keS5zdHlsZS50b3VjaEFjdGlvbiA9IHRoaXMuI2xhc3RUb3VjaEFjdGlvblxuICAgICAgICAgICAgdGhpcy4jbGFzdFRvdWNoQWN0aW9uID0gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNvcnRCeVByaXBvcml0eShhOiBHZXN0dXJlLCBiOiBHZXN0dXJlKSB7XG4gICAgcmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5XG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJzRnJvbUV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IFBvc2l0aW9uW10ge1xuICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFlcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGV2ZW50LnRvdWNoZXMpLm1hcCh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHg6IHQuY2xpZW50WCwgeTogdC5jbGllbnRZIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvaW50ZXJzKHN0YXRlOiBNdXRhYmxlPEdlc3R1cmVFdmVudD4pOiBHZXN0dXJlRXZlbnQge1xuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gR2VzdHVyZVBoYXNlLlN0YXJ0KSB7XG4gICAgICAgIHN0YXRlLnBvaW50ZXJzID0gcG9pbnRlcnNGcm9tRXZlbnQoc3RhdGUub3JpZ2luKS5tYXAodiA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogdiwgY3VycmVudDogdiwgZGlzdGFuY2U6IHsgeDogMCwgeTogMCB9LCBkaXJlY3Rpb246IHsgeDogMCwgeTogMCB9IH1cbiAgICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvaW50ZXJzKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJzID0gcG9pbnRlcnNGcm9tRXZlbnQoc3RhdGUub3JpZ2luKVxuICAgICAgICBpZiAocG9pbnRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnBvaW50ZXJzID0gc3RhdGUucG9pbnRlcnMubWFwKCh2LCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwID0gcG9pbnRlcnNbaV1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHYuc3RhcnQsXG4gICAgICAgICAgICAgICAgY3VycmVudDogcCxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogeyB4OiBwLnggLSB2LnN0YXJ0LngsIHk6IHAueSAtIHYuc3RhcnQueSB9LFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogeyB4OiBkaXJlY3Rpb24odi5zdGFydC54LCBwLngpLCB5OiBkaXJlY3Rpb24odi5zdGFydC55LCBwLnkpIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVcbn1cblxuZnVuY3Rpb24gZGlyZWN0aW9uKHByZXY6IG51bWJlciwgY3VycjogbnVtYmVyKTogLTEgfCAwIHwgMSB7XG4gICAgcmV0dXJuIGN1cnIgPiBwcmV2ID8gMSA6IGN1cnIgPCBwcmV2ID8gLTEgOiAwXG59XG4iXX0=
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./
|
|
3
|
-
|
|
1
|
+
export * from "./gesture-drag";
|
|
2
|
+
export * from "./gesture-event";
|
|
3
|
+
export * from "./gesture-longtap";
|
|
4
|
+
export * from "./gesture-tap";
|
|
5
|
+
export * from "./gesture.service";
|
|
6
|
+
export * from "./gesture";
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9nZXN0dXJlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFBO0FBQzlCLGNBQWMsaUJBQWlCLENBQUE7QUFDL0IsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxjQUFjLGVBQWUsQ0FBQTtBQUM3QixjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMsV0FBVyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZ2VzdHVyZS1kcmFnXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUtZXZlbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZ2VzdHVyZS1sb25ndGFwXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUtdGFwXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUuc2VydmljZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZXN0dXJlXCJcbiJdfQ==
|