rs-react-native-image-gallery
Version:
React Native Image Gallery with Thumbnails
114 lines • 17.6 kB
JavaScript
import React, { useCallback, useMemo, useRef } from 'react';
// react-native
import { Animated, Dimensions, PanResponder, View } from 'react-native';
// components
import { getMemoizedDistance, getScale } from './_helpers';
import { ANIMATION_DURATION, SWIPE_CLOSE_THRESHOLD, SWIPE_HORIZONTAL_THRESHOLD, SWIPE_VERTICAL_THRESHOLD } from './constants';
// ----------------------------------------------------------------------
var deviceHeight = Dimensions.get('window').height;
var PanContainer = function (_a) {
var children = _a.children, close = _a.close, setIsDragging = _a.setIsDragging;
var translationXY = useRef(new Animated.ValueXY()).current;
var scale = useRef(new Animated.Value(1)).current;
var _initialTouchesRef = useRef([]);
var onRelease = useCallback(function (_, gestureState) {
setIsDragging(false);
if (gestureState.dy > SWIPE_CLOSE_THRESHOLD && _initialTouchesRef.current.length === 1) {
// Animate out before closing
Animated.timing(translationXY.y, {
toValue: deviceHeight,
duration: ANIMATION_DURATION,
useNativeDriver: true
}).start(function () { return close(); });
return false;
}
// Reset with animation
Animated.parallel([
Animated.timing(scale, {
duration: ANIMATION_DURATION,
toValue: 1,
useNativeDriver: true
}),
Animated.timing(translationXY.x, {
duration: ANIMATION_DURATION,
toValue: 0,
useNativeDriver: true
}),
Animated.timing(translationXY.y, {
duration: ANIMATION_DURATION,
toValue: 0,
useNativeDriver: true
})
]).start();
}, [close, scale, translationXY.x, translationXY.y, setIsDragging]);
// Create panResponder with memoization
var panResponder = useMemo(function () {
return PanResponder.create({
onStartShouldSetPanResponder: function () { return true; },
onMoveShouldSetPanResponder: function (_, gestureState) {
var dx = gestureState.dx, dy = gestureState.dy, numberActiveTouches = gestureState.numberActiveTouches;
var absDx = Math.abs(dx);
var absDY = Math.abs(dy);
// Improved gesture recognition logic
if (absDY > SWIPE_VERTICAL_THRESHOLD && absDx <= SWIPE_HORIZONTAL_THRESHOLD && numberActiveTouches <= 1) {
return true;
}
if (absDx > 0 && numberActiveTouches <= 1) {
return false;
}
return true;
},
onPanResponderGrant: function (evt) {
setIsDragging(true);
_initialTouchesRef.current = evt.nativeEvent.touches;
translationXY.setOffset({ x: 0, y: 0 });
return true;
},
onPanResponderMove: function (evt, gestureState) {
var touches = evt.nativeEvent.touches;
var dx = gestureState.dx, dy = gestureState.dy;
if (touches.length <= 1) {
// Handle vertical swipe to close
if (Math.abs(dy) > SWIPE_VERTICAL_THRESHOLD) {
translationXY.y.setValue(dy);
return true;
}
// Handle horizontal swipe
if (Math.abs(dx) > 0) {
setIsDragging(false);
return false;
}
// Not enough touches for pinch-zoom
if (touches.length < 2) {
onRelease(evt, gestureState);
return false;
}
}
// Handle pinch zoom and pan
translationXY.x.setValue(dx);
translationXY.y.setValue(dy);
// Calculate scale for zooming using memoized version for better performance
var currentDistance = getMemoizedDistance(touches);
var initialDistance = getMemoizedDistance(_initialTouchesRef.current);
if (currentDistance && initialDistance) {
var newScale = getScale(currentDistance, initialDistance);
scale.setValue(newScale);
}
return true;
},
onPanResponderRelease: onRelease,
onPanResponderTerminate: function () { return true; },
onPanResponderTerminationRequest: function () { return true; }
});
}, [onRelease, setIsDragging, translationXY, scale]);
return (<View style={{ flex: 1 }}>
<Animated.View {...panResponder.panHandlers} style={{
flex: 1,
transform: [{ translateX: translationXY.x }, { translateY: translationXY.y }, { scale: scale }]
}}>
{children}
</Animated.View>
</View>);
};
export default React.memo(PanContainer);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuLWNvbnRhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYW4tY29udGFpbmVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFhLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3ZFLGVBQWU7QUFDZixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBMkMsWUFBWSxFQUE0QixJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0ksYUFBYTtBQUNiLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlILHlFQUF5RTtBQUVqRSxJQUFRLFlBQVksR0FBSyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUE3QixDQUE4QjtBQUUxRCxJQUFNLFlBQVksR0FBRyxVQUFDLEVBUXJCO1FBUEEsUUFBUSxjQUFBLEVBQ1IsS0FBSyxXQUFBLEVBQ0wsYUFBYSxtQkFBQTtJQU1iLElBQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM3RCxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ3BELElBQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUEwQixFQUFFLENBQUMsQ0FBQztJQUUvRCxJQUFNLFNBQVMsR0FBRyxXQUFXLENBQzVCLFVBQUMsQ0FBd0IsRUFBRSxZQUFzQztRQUNoRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckIsSUFBSSxZQUFZLENBQUMsRUFBRSxHQUFHLHFCQUFxQixJ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T0FBTyxJQUFJLENBQUM7WUFDYixDQUFDO1lBQ0QscUJBQXFCLEVBQUUsU0FBUztZQUNoQyx1QkFBdUIsRUFBRSxjQUFNLE9BQUEsSUFBSSxFQUFKLENBQUk7WUFDbkMsZ0NBQWdDLEVBQUUsY0FBTSxPQUFBLElBQUksRUFBSixDQUFJO1NBQzVDLENBQUM7SUEvREYsQ0ErREUsRUFDSCxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUNoRCxDQUFDO0lBRUYsT0FBTyxDQUNOLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQ3hCO0dBQUEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNiLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUM3QixLQUFLLENBQUMsQ0FBQztZQUNOLElBQUksRUFBRSxDQUFDO1lBQ1AsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssT0FBQSxFQUFFLENBQUM7U0FDeEYsQ0FBQyxDQUNGO0lBQUEsQ0FBQyxRQUFRLENBQ1Y7R0FBQSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQ2hCO0VBQUEsRUFBRSxJQUFJLENBQUMsQ0FDUCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsZUFBZSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IFJlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0Jztcbi8vIHJlYWN0LW5hdGl2ZVxuaW1wb3J0IHsgQW5pbWF0ZWQsIERpbWVuc2lvbnMsIEdlc3R1cmVSZXNwb25kZXJFdmVudCwgTmF0aXZlVG91Y2hFdmVudCwgUGFuUmVzcG9uZGVyLCBQYW5SZXNwb25kZXJHZXN0dXJlU3RhdGUsIFZpZXcgfSBmcm9tICdyZWFjdC1uYXRpdmUnO1xuLy8gY29tcG9uZW50c1xuaW1wb3J0IHsgZ2V0TWVtb2l6ZWREaXN0YW5jZSwgZ2V0U2NhbGUgfSBmcm9tICcuL19oZWxwZXJzJztcbmltcG9ydCB7IEFOSU1BVElPTl9EVVJBVElPTiwgU1dJUEVfQ0xPU0VfVEhSRVNIT0xELCBTV0lQRV9IT1JJWk9OVEFMX1RIUkVTSE9MRCwgU1dJUEVfVkVSVElDQUxfVEhSRVNIT0xEIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IHsgaGVpZ2h0OiBkZXZpY2VIZWlnaHQgfSA9IERpbWVuc2lvbnMuZ2V0KCd3aW5kb3cnKTtcblxuY29uc3QgUGFuQ29udGFpbmVyID0gKHtcblx0Y2hpbGRyZW4sXG5cdGNsb3NlLFxuXHRzZXRJc0RyYWdnaW5nXG59OiB7XG5cdGNoaWxkcmVuOiBSZWFjdE5vZGU7XG5cdGNsb3NlOiAoKSA9PiB2b2lkO1xuXHRzZXRJc0RyYWdnaW5nOiAoaXNEcmFnZ2luZzogYm9vbGVhbikgPT4gdm9pZDtcbn0pID0+IHtcblx0Y29uc3QgdHJhbnNsYXRpb25YWSA9IHVzZVJlZihuZXcgQW5pbWF0ZWQuVmFsdWVYWSgpKS5jdXJyZW50O1xuXHRjb25zdCBzY2FsZSA9IHVzZVJlZihuZXcgQW5pbWF0ZWQuVmFsdWUoMSkpLmN1cnJlbnQ7XG5cdGNvbnN0IF9pbml0aWFsVG91Y2hlc1JlZiA9IHVzZVJlZjxBcnJheTxOYXRpdmVUb3VjaEV2ZW50Pj4oW10pO1xuXG5cdGNvbnN0IG9uUmVsZWFzZSA9IHVzZUNhbGxiYWNrKFxuXHRcdChfOiBHZXN0dXJlUmVzcG9uZGVyRXZlbnQsIGdlc3R1cmVTdGF0ZTogUGFuUmVzcG9uZGVyR2VzdHVyZVN0YXRlKTogdm9pZCB8IGJvb2xlYW4gPT4ge1xuXHRcdFx0c2V0SXNEcmFnZ2luZyhmYWxzZSk7XG5cblx0XHRcdGlmIChnZXN0dXJlU3RhdGUuZHkgPiBTV0lQRV9DTE9TRV9USFJFU0hPTEQgJiYgX2luaXRpYWxUb3VjaGVzUmVmLmN1cnJlbnQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIEFuaW1hdGUgb3V0IGJlZm9yZSBjbG9zaW5nXG5cdFx0XHRcdEFuaW1hdGVkLnRpbWluZyh0cmFuc2xhdGlvblhZLnksIHtcblx0XHRcdFx0XHR0b1ZhbHVlOiBkZXZpY2VIZWlnaHQsXG5cdFx0XHRcdFx0ZHVyYXRpb246IEFOSU1BVElPTl9EVVJBVElPTixcblx0XHRcdFx0XHR1c2VOYXRpdmVEcml2ZXI6IHRydWVcblx0XHRcdFx0fSkuc3RhcnQoKCkgPT4gY2xvc2UoKSk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzZXQgd2l0aCBhbmltYXRpb25cblx0XHRcdEFuaW1hdGVkLnBhcmFsbGVsKFtcblx0XHRcdFx0QW5pbWF0ZWQudGltaW5nKHNjYWxlLCB7XG5cdFx0XHRcdFx0ZHVyYXRpb246IEFOSU1BVElPTl9EVVJBVElPTixcblx0XHRcdFx0XHR0b1ZhbHVlOiAxLFxuXHRcdFx0XHRcdHVzZU5hdGl2ZURyaXZlcjogdHJ1ZVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0QW5pbWF0ZWQudGltaW5nKHRyYW5zbGF0aW9uWFkueCwge1xuXHRcdFx0XHRcdGR1cmF0aW9uOiBBTklNQVRJT05fRFVSQVRJT04sXG5cdFx0XHRcdFx0dG9WYWx1ZTogMCxcblx0XHRcdFx0XHR1c2VOYXRpdmVEcml2ZXI6IHRydWVcblx0XHRcdFx0fSksXG5cdFx0XHRcdEFuaW1hdGVkLnRpbWluZyh0cmFuc2xhdGlvblhZLnksIHtcblx0XHRcdFx0XHRkdXJhdGlvbjogQU5JTUFUSU9OX0RVUkFUSU9OLFxuXHRcdFx0XHRcdHRvVmFsdWU6IDAsXG5cdFx0XHRcdFx0dXNlTmF0aXZlRHJpdmVyOiB0cnVlXG5cdFx0XHRcdH0pXG5cdFx0XHRdKS5zdGFydCgpO1xuXHRcdH0sXG5cdFx0W2Nsb3NlLCBzY2FsZSwgdHJhbnNsYXRpb25YWS54LCB0cmFuc2xhdGlvblhZLnksIHNldElzRHJhZ2dpbmddXG5cdCk7XG5cblx0Ly8gQ3JlYXRlIHBhblJlc3BvbmRlciB3aXRoIG1lbW9pemF0aW9uXG5cdGNvbnN0IHBhblJlc3BvbmRlciA9IHVzZU1lbW8oXG5cdFx0KCkgPT5cblx0XHRcdFBhblJlc3BvbmRlci5jcmVhdGUoe1xuXHRcdFx0XHRvblN0YXJ0U2hvdWxkU2V0UGFuUmVzcG9uZGVyOiAoKSA9PiB0cnVlLFxuXHRcdFx0XHRvbk1vdmVTaG91bGRTZXRQYW5SZXNwb25kZXI6IChfOiBHZXN0dXJlUmVzcG9uZGVyRXZlbnQsIGdlc3R1cmVTdGF0ZTogUGFuUmVzcG9uZGVyR2VzdHVyZVN0YXRlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgeyBkeCwgZHksIG51bWJlckFjdGl2ZVRvdWNoZXMgfSA9IGdlc3R1cmVTdGF0ZTtcblx0XHRcdFx0XHRjb25zdCBhYnNEeCA9IE1hdGguYWJzKGR4KTtcblx0XHRcdFx0XHRjb25zdCBhYnNEWSA9IE1hdGguYWJzKGR5KTtcblxuXHRcdFx0XHRcdC8vIEltcHJvdmVkIGdlc3R1cmUgcmVjb2duaXRpb24gbG9naWNcblx0XHRcdFx0XHRpZiAoYWJzRFkgPiBTV0lQRV9WRVJUSUNBTF9USFJFU0hPTEQgJiYgYWJzRHggPD0gU1dJUEVfSE9SSVpPTlRBTF9USFJFU0hPTEQgJiYgbnVtYmVyQWN0aXZlVG91Y2hlcyA8PSAxKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGFic0R4ID4gMCAmJiBudW1iZXJBY3RpdmVUb3VjaGVzIDw9IDEpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uUGFuUmVzcG9uZGVyR3JhbnQ6IChldnQ6IEdlc3R1cmVSZXNwb25kZXJFdmVudCkgPT4ge1xuXHRcdFx0XHRcdHNldElzRHJhZ2dpbmcodHJ1ZSk7XG5cdFx0XHRcdFx0X2luaXRpYWxUb3VjaGVzUmVmLmN1cnJlbnQgPSBldnQubmF0aXZlRXZlbnQudG91Y2hlcztcblx0XHRcdFx0XHR0cmFuc2xhdGlvblhZLnNldE9mZnNldCh7IHg6IDAsIHk6IDAgfSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uUGFuUmVzcG9uZGVyTW92ZTogKGV2dDogR2VzdHVyZVJlc3BvbmRlckV2ZW50LCBnZXN0dXJlU3RhdGU6IFBhblJlc3BvbmRlckdlc3R1cmVTdGF0ZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHsgdG91Y2hlcyB9ID0gZXZ0Lm5hdGl2ZUV2ZW50O1xuXHRcdFx0XHRcdGNvbnN0IHsgZHgsIGR5IH0gPSBnZXN0dXJlU3RhdGU7XG5cblx0XHRcdFx0XHRpZiAodG91Y2hlcy5sZW5ndGggPD0gMSkge1xuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHZlcnRpY2FsIHN3aXBlIHRvIGNsb3NlXG5cdFx0XHRcdFx0XHRpZiAoTWF0aC5hYnMoZHkpID4gU1dJUEVfVkVSVElDQUxfVEhSRVNIT0xEKSB7XG5cdFx0XHRcdFx0XHRcdHRyYW5zbGF0aW9uWFkueS5zZXRWYWx1ZShkeSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgaG9yaXpvbnRhbCBzd2lwZVxuXHRcdFx0XHRcdFx0aWYgKE1hdGguYWJzKGR4KSA+IDApIHtcblx0XHRcdFx0XHRcdFx0c2V0SXNEcmFnZ2luZyhmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTm90IGVub3VnaCB0b3VjaGVzIGZvciBwaW5jaC16b29tXG5cdFx0XHRcdFx0XHRpZiAodG91Y2hlcy5sZW5ndGggPCAyKSB7XG5cdFx0XHRcdFx0XHRcdG9uUmVsZWFzZShldnQsIGdlc3R1cmVTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgcGluY2ggem9vbSBhbmQgcGFuXG5cdFx0XHRcdFx0dHJhbnNsYXRpb25YWS54LnNldFZhbHVlKGR4KTtcblx0XHRcdFx0XHR0cmFuc2xhdGlvblhZLnkuc2V0VmFsdWUoZHkpO1xuXG5cdFx0XHRcdFx0Ly8gQ2FsY3VsYXRlIHNjYWxlIGZvciB6b29taW5nIHVzaW5nIG1lbW9pemVkIHZlcnNpb24gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldE1lbW9pemVkRGlzdGFuY2UodG91Y2hlcyk7XG5cdFx0XHRcdFx0Y29uc3QgaW5pdGlhbERpc3RhbmNlID0gZ2V0TWVtb2l6ZWREaXN0YW5jZShfaW5pdGlhbFRvdWNoZXNSZWYuY3VycmVudCk7XG5cdFx0XHRcdFx0aWYgKGN1cnJlbnREaXN0YW5jZSAmJiBpbml0aWFsRGlzdGFuY2UpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld1NjYWxlID0gZ2V0U2NhbGUoY3VycmVudERpc3RhbmNlLCBpbml0aWFsRGlzdGFuY2UpO1xuXHRcdFx0XHRcdFx0c2NhbGUuc2V0VmFsdWUobmV3U2NhbGUpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblBhblJlc3BvbmRlclJlbGVhc2U6IG9uUmVsZWFzZSxcblx0XHRcdFx0b25QYW5SZXNwb25kZXJUZXJtaW5hdGU6ICgpID0+IHRydWUsXG5cdFx0XHRcdG9uUGFuUmVzcG9uZGVyVGVybWluYXRpb25SZXF1ZXN0OiAoKSA9PiB0cnVlXG5cdFx0XHR9KSxcblx0XHRbb25SZWxlYXNlLCBzZXRJc0RyYWdnaW5nLCB0cmFuc2xhdGlvblhZLCBzY2FsZV1cblx0KTtcblxuXHRyZXR1cm4gKFxuXHRcdDxWaWV3IHN0eWxlPXt7IGZsZXg6IDEgfX0+XG5cdFx0XHQ8QW5pbWF0ZWQuVmlld1xuXHRcdFx0XHR7Li4ucGFuUmVzcG9uZGVyLnBhbkhhbmRsZXJzfVxuXHRcdFx0XHRzdHlsZT17e1xuXHRcdFx0XHRcdGZsZXg6IDEsXG5cdFx0XHRcdFx0dHJhbnNmb3JtOiBbeyB0cmFuc2xhdGVYOiB0cmFuc2xhdGlvblhZLnggfSwgeyB0cmFuc2xhdGVZOiB0cmFuc2xhdGlvblhZLnkgfSwgeyBzY2FsZSB9XVxuXHRcdFx0XHR9fT5cblx0XHRcdFx0e2NoaWxkcmVufVxuXHRcdFx0PC9BbmltYXRlZC5WaWV3PlxuXHRcdDwvVmlldz5cblx0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0Lm1lbW8oUGFuQ29udGFpbmVyKTtcbiJdfQ==