react-film
Version:
React component for showing carousel just like a film strip
289 lines (232 loc) • 33.3 kB
JavaScript
;
require("core-js/modules/es.object.keys.js");
require("core-js/modules/es.symbol.js");
require("core-js/modules/es.array.filter.js");
require("core-js/modules/es.object.get-own-property-descriptor.js");
require("core-js/modules/es.array.for-each.js");
require("core-js/modules/web.dom-collections.for-each.js");
require("core-js/modules/es.object.get-own-property-descriptors.js");
require("core-js/modules/es.object.define-properties.js");
require("core-js/modules/es.object.define-property.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/es.weak-map.js");
require("core-js/modules/web.dom-collections.iterator.js");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/es.object.from-entries.js");
require("core-js/modules/es.array.map.js");
require("core-js/modules/es.object.entries.js");
require("core-js/modules/web.timers.js");
var _createInstance = _interopRequireDefault(require("@emotion/css/create-instance"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireWildcard(require("react"));
var _AutoCenter = _interopRequireDefault(require("./AutoCenter"));
var _computeScrollLeft = _interopRequireDefault(require("./computeScrollLeft"));
var _createBasicStyleSet = _interopRequireDefault(require("./createBasicStyleSet"));
var _createCSSKey = _interopRequireDefault(require("./util/createCSSKey"));
var _FunctionContext = _interopRequireDefault(require("./FunctionContext"));
var _getView = _interopRequireDefault(require("./getView"));
var _InternalContext = _interopRequireDefault(require("./InternalContext"));
var _LegacyContext = _interopRequireDefault(require("./LegacyContext"));
var _patchStyleOptions = _interopRequireDefault(require("./patchStyleOptions"));
var _PropsContext = _interopRequireDefault(require("./PropsContext"));
var _useAnimateScrollLeft = _interopRequireDefault(require("./hooks/internal/useAnimateScrollLeft"));
var _useCallbackRefWithSubscribe = _interopRequireDefault(require("./hooks/internal/useCallbackRefWithSubscribe"));
var _useObserveScrollLeft = _interopRequireDefault(require("./hooks/internal/useObserveScrollLeft"));
var _ViewContext = _interopRequireDefault(require("./ViewContext"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
// We pool the emotion, so we don't create a new set of <style> for every component and reuse as much as we could.
var emotionPool = {};
var Composer = function Composer(_ref) {
var children = _ref.children,
dir = _ref.dir,
height = _ref.height,
nonce = _ref.nonce,
numItems = _ref.numItems,
styleOptions = _ref.styleOptions,
styleSet = _ref.styleSet;
dir = dir === 'ltr' || dir === 'rtl' ? dir : undefined;
var patchedStyleOptions = (0, _react.useMemo)(function () {
return (0, _patchStyleOptions["default"])(styleOptions);
}, [styleOptions]);
var patchedStyleSet = (0, _react.useMemo)(function () {
return styleSet || (0, _createBasicStyleSet["default"])(patchedStyleOptions);
}, [patchedStyleOptions, styleSet]);
var styleSetClassNames = (0, _react.useMemo)(function () {
var emotion = emotionPool[nonce] || (emotionPool[nonce] = (0, _createInstance["default"])({
key: "react-film--css-".concat((0, _createCSSKey["default"])()),
nonce: nonce
}));
return Object.fromEntries(Object.entries(patchedStyleSet).map(function (_ref2) {
var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
name = _ref3[0],
style = _ref3[1];
return [name, emotion.css(style) + ''];
}));
}, [nonce, patchedStyleSet]);
var _useState = (0, _react.useState)(),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
_ = _useState2[0],
forceRender = _useState2[1];
var itemContainerCallbackRefWithSubscribe = (0, _useCallbackRefWithSubscribe["default"])();
var scrollableCallbackRefWithSubscribe = (0, _useCallbackRefWithSubscribe["default"])();
var scrollLeftRef = (0, _react.useRef)(null);
var scrollTimeoutRef = (0, _react.useRef)();
(0, _react.useEffect)(function () {
return function () {
return clearTimeout(scrollTimeoutRef.current);
};
}, [scrollTimeoutRef]);
var scrollTo = (0, _react.useCallback)(function (scrollFn) {
var view = (0, _getView["default"])(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, scrollLeftRef.current);
if (view) {
var index = view.index,
indexFraction = view.indexFraction;
var targetIndex = scrollFn({
index: index,
indexFraction: indexFraction
});
if (typeof targetIndex === 'number') {
scrollLeftRef.current = (0, _computeScrollLeft["default"])(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, targetIndex);
forceRender({});
}
}
}, [dir, forceRender, itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe, scrollLeftRef]);
var scrollOneLeft = (0, _react.useCallback)(function () {
scrollTo(function (_ref4) {
var indexFraction = _ref4.indexFraction;
return dir === 'rtl' ? Math.floor(indexFraction) + 1 : Math.ceil(indexFraction) - 1;
});
}, [dir, scrollTo]);
var scrollOneRight = (0, _react.useCallback)(function () {
scrollTo(function (_ref5) {
var indexFraction = _ref5.indexFraction;
return dir === 'rtl' ? Math.ceil(indexFraction) - 1 : Math.floor(indexFraction) + 1;
});
}, [dir, scrollTo]);
var functionContext = (0, _react.useMemo)(function () {
return {
scrollTo: scrollTo,
scrollOneLeft: scrollOneLeft,
scrollOneRight: scrollOneRight
};
}, [scrollTo, scrollOneLeft, scrollOneRight]);
var internalContext = (0, _react.useMemo)(function () {
return {
itemContainerCallbackRefWithSubscribe: itemContainerCallbackRefWithSubscribe,
scrollableCallbackRefWithSubscribe: scrollableCallbackRefWithSubscribe
};
}, [itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe]);
var propsContext = (0, _react.useMemo)(function () {
return {
dir: dir,
height: height,
nonce: nonce,
numItems: numItems,
styleOptions: patchedStyleOptions,
styleSetClassNames: styleSetClassNames
};
}, [dir, height, nonce, numItems, patchedStyleOptions, styleSetClassNames]);
var _useState3 = (0, _react.useState)({
index: 0,
indexFraction: 0,
scrollBarPercentage: '0%',
scrollBarWidth: '0%',
scrolling: false
}),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
viewContext = _useState4[0],
setViewContext = _useState4[1]; // This will setViewContext and reset the "scrolling" flag after a period of time.
var setViewContext2 = (0, _react.useCallback)(function (nextViewContext) {
setViewContext(nextViewContext);
clearTimeout(scrollTimeoutRef.current);
if (nextViewContext.scrolling) {
scrollTimeoutRef.current = setTimeout(function () {
return setViewContext(_objectSpread(_objectSpread({}, nextViewContext), {}, {
scrolling: false
}));
}, // eslint-disable-next-line no-magic-numbers
500);
}
}, [scrollTimeoutRef, setViewContext]);
var handleScroll = (0, _react.useCallback)(function (_ref6) {
var scrollBarPercentage = _ref6.fraction,
initial = _ref6.initial,
scrollBarWidth = _ref6.width;
var view = (0, _getView["default"])(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, scrollLeftRef.current);
if (view) {
var index = view.index,
indexFraction = view.indexFraction;
setViewContext2({
index: index,
indexFraction: indexFraction,
scrolling: !initial,
scrollBarPercentage: scrollBarPercentage,
scrollBarWidth: scrollBarWidth
});
}
}, [dir, itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe, scrollLeftRef, setViewContext2]);
var handleScrollToEnd = (0, _react.useCallback)(function () {
scrollLeftRef.current = null;
forceRender({});
}, [forceRender, scrollLeftRef]);
var legacyContext = (0, _react.useMemo)(function () {
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, functionContext), internalContext), propsContext), viewContext);
}, [functionContext, internalContext, propsContext, viewContext]);
(0, _useAnimateScrollLeft["default"])(typeof scrollLeftRef.current === 'number' && scrollableCallbackRefWithSubscribe.current, scrollLeftRef.current, handleScrollToEnd);
(0, _react.useEffect)(function () {
return scrollableCallbackRefWithSubscribe.subscribe(function (current) {
if (current) {
current.addEventListener('pointerdown', handleScrollToEnd, {
passive: true
});
return function () {
return current.removeEventListener('pointerdown', handleScrollToEnd);
};
}
});
}, [handleScrollToEnd, scrollableCallbackRefWithSubscribe]);
(0, _useObserveScrollLeft["default"])(scrollableCallbackRefWithSubscribe, handleScroll);
return /*#__PURE__*/_react["default"].createElement(_PropsContext["default"].Provider, {
value: propsContext
}, /*#__PURE__*/_react["default"].createElement(_InternalContext["default"].Provider, {
value: internalContext
}, /*#__PURE__*/_react["default"].createElement(_FunctionContext["default"].Provider, {
value: functionContext
}, /*#__PURE__*/_react["default"].createElement(_ViewContext["default"].Provider, {
value: viewContext
}, /*#__PURE__*/_react["default"].createElement(_LegacyContext["default"].Provider, {
value: legacyContext
}, children, patchedStyleOptions.autoCenter && /*#__PURE__*/_react["default"].createElement(_AutoCenter["default"], null))))));
};
Composer.defaultProps = {
children: undefined,
dir: undefined,
height: undefined,
nonce: undefined,
styleOptions: undefined,
styleSet: undefined
};
Composer.propTypes = {
children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].element), _propTypes["default"].element]),
dir: _propTypes["default"].oneOf(['ltr', 'rtl']),
height: _propTypes["default"].number,
nonce: _propTypes["default"].string,
numItems: _propTypes["default"].number.isRequired,
styleOptions: _propTypes["default"].any,
styleSet: _propTypes["default"].any
};
var _default = Composer;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db21wb3Nlci5qcyJdLCJuYW1lcyI6WyJlbW90aW9uUG9vbCIsIkNvbXBvc2VyIiwiY2hpbGRyZW4iLCJkaXIiLCJoZWlnaHQiLCJub25jZSIsIm51bUl0ZW1zIiwic3R5bGVPcHRpb25zIiwic3R5bGVTZXQiLCJ1bmRlZmluZWQiLCJwYXRjaGVkU3R5bGVPcHRpb25zIiwicGF0Y2hlZFN0eWxlU2V0Iiwic3R5bGVTZXRDbGFzc05hbWVzIiwiZW1vdGlvbiIsImtleSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsIm1hcCIsIm5hbWUiLCJzdHlsZSIsImNzcyIsIl8iLCJmb3JjZVJlbmRlciIsIml0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUiLCJzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlIiwic2Nyb2xsTGVmdFJlZiIsInNjcm9sbFRpbWVvdXRSZWYiLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50Iiwic2Nyb2xsVG8iLCJzY3JvbGxGbiIsInZpZXciLCJpbmRleCIsImluZGV4RnJhY3Rpb24iLCJ0YXJnZXRJbmRleCIsInNjcm9sbE9uZUxlZnQiLCJNYXRoIiwiZmxvb3IiLCJjZWlsIiwic2Nyb2xsT25lUmlnaHQiLCJmdW5jdGlvbkNvbnRleHQiLCJpbnRlcm5hbENvbnRleHQiLCJwcm9wc0NvbnRleHQiLCJzY3JvbGxCYXJQZXJjZW50YWdlIiwic2Nyb2xsQmFyV2lkdGgiLCJzY3JvbGxpbmciLCJ2aWV3Q29udGV4dCIsInNldFZpZXdDb250ZXh0Iiwic2V0Vmlld0NvbnRleHQyIiwibmV4dFZpZXdDb250ZXh0Iiwic2V0VGltZW91dCIsImhhbmRsZVNjcm9sbCIsImZyYWN0aW9uIiwiaW5pdGlhbCIsIndpZHRoIiwiaGFuZGxlU2Nyb2xsVG9FbmQiLCJsZWdhY3lDb250ZXh0Iiwic3Vic2NyaWJlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInBhc3NpdmUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYXV0b0NlbnRlciIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9uZU9mVHlwZSIsImFycmF5T2YiLCJlbGVtZW50Iiwib25lT2YiLCJudW1iZXIiLCJzdHJpbmciLCJpc1JlcXVpcmVkIiwiYW55Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVBO0FBQ0EsSUFBTUEsV0FBVyxHQUFHLEVBQXBCOztBQUVBLElBQU1DLFFBQVEsR0FBRyxTQUFYQSxRQUFXLE9BQXdFO0FBQUEsTUFBckVDLFFBQXFFLFFBQXJFQSxRQUFxRTtBQUFBLE1BQTNEQyxHQUEyRCxRQUEzREEsR0FBMkQ7QUFBQSxNQUF0REMsTUFBc0QsUUFBdERBLE1BQXNEO0FBQUEsTUFBOUNDLEtBQThDLFFBQTlDQSxLQUE4QztBQUFBLE1BQXZDQyxRQUF1QyxRQUF2Q0EsUUFBdUM7QUFBQSxNQUE3QkMsWUFBNkIsUUFBN0JBLFlBQTZCO0FBQUEsTUFBZkMsUUFBZSxRQUFmQSxRQUFlO0FBQ3ZGTCxFQUFBQSxHQUFHLEdBQUdBLEdBQUcsS0FBSyxLQUFSLElBQWlCQSxHQUFHLEtBQUssS0FBekIsR0FBaUNBLEdBQWpDLEdBQXVDTSxTQUE3QztBQUVBLE1BQU1DLG1CQUFtQixHQUFHLG9CQUFRO0FBQUEsV0FBTSxtQ0FBa0JILFlBQWxCLENBQU47QUFBQSxHQUFSLEVBQStDLENBQUNBLFlBQUQsQ0FBL0MsQ0FBNUI7QUFDQSxNQUFNSSxlQUFlLEdBQUcsb0JBQ3RCO0FBQUEsV0FBTUgsUUFBUSxJQUFJLHFDQUFvQkUsbUJBQXBCLENBQWxCO0FBQUEsR0FEc0IsRUFFdEIsQ0FBQ0EsbUJBQUQsRUFBc0JGLFFBQXRCLENBRnNCLENBQXhCO0FB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QUFqRCxDQUFwQixDQURTO0FBRW5CakUsRUFBQUEsR0FBRyxFQUFFOEQsc0JBQVVJLEtBQVYsQ0FBZ0IsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUFoQixDQUZjO0FBR25CakUsRUFBQUEsTUFBTSxFQUFFNkQsc0JBQVVLLE1BSEM7QUFJbkJqRSxFQUFBQSxLQUFLLEVBQUU0RCxzQkFBVU0sTUFKRTtBQUtuQmpFLEVBQUFBLFFBQVEsRUFBRTJELHNCQUFVSyxNQUFWLENBQWlCRSxVQUxSO0FBTW5CakUsRUFBQUEsWUFBWSxFQUFFMEQsc0JBQVVRLEdBTkw7QUFPbkJqRSxFQUFBQSxRQUFRLEVBQUV5RCxzQkFBVVE7QUFQRCxDQUFyQjtlQVVleEUsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVFbW90aW9uIGZyb20gJ0BlbW90aW9uL2Nzcy9jcmVhdGUtaW5zdGFuY2UnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQXV0b0NlbnRlciBmcm9tICcuL0F1dG9DZW50ZXInO1xuaW1wb3J0IGNvbXB1dGVTY3JvbGxMZWZ0IGZyb20gJy4vY29tcHV0ZVNjcm9sbExlZnQnO1xuaW1wb3J0IGNyZWF0ZUJhc2ljU3R5bGVTZXQgZnJvbSAnLi9jcmVhdGVCYXNpY1N0eWxlU2V0JztcbmltcG9ydCBjcmVhdGVDU1NLZXkgZnJvbSAnLi91dGlsL2NyZWF0ZUNTU0tleSc7XG5pbXBvcnQgRnVuY3Rpb25Db250ZXh0IGZyb20gJy4vRnVuY3Rpb25Db250ZXh0JztcbmltcG9ydCBnZXRWaWV3IGZyb20gJy4vZ2V0Vmlldyc7XG5pbXBvcnQgSW50ZXJuYWxDb250ZXh0IGZyb20gJy4vSW50ZXJuYWxDb250ZXh0JztcbmltcG9ydCBMZWdhY3lDb250ZXh0IGZyb20gJy4vTGVnYWN5Q29udGV4dCc7XG5pbXBvcnQgcGF0Y2hTdHlsZU9wdGlvbnMgZnJvbSAnLi9wYXRjaFN0eWxlT3B0aW9ucyc7XG5pbXBvcnQgUHJvcHNDb250ZXh0IGZyb20gJy4vUHJvcHNDb250ZXh0JztcbmltcG9ydCB1c2VBbmltYXRlU2Nyb2xsTGVmdCBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZUFuaW1hdGVTY3JvbGxMZWZ0JztcbmltcG9ydCB1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUnO1xuaW1wb3J0IHVzZU9ic2VydmVTY3JvbGxMZWZ0IGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlT2JzZXJ2ZVNjcm9sbExlZnQnO1xuaW1wb3J0IFZpZXdDb250ZXh0IGZyb20gJy4vVmlld0NvbnRleHQnO1xuXG4vLyBXZSBwb29sIHRoZSBlbW90aW9uLCBzbyB3ZSBkb24ndCBjcmVhdGUgYSBuZXcgc2V0IG9mIDxzdHlsZT4gZm9yIGV2ZXJ5IGNvbXBvbmVudCBhbmQgcmV1c2UgYXMgbXVjaCBhcyB3ZSBjb3VsZC5cbmNvbnN0IGVtb3Rpb25Qb29sID0ge307XG5cbmNvbnN0IENvbXBvc2VyID0gKHsgY2hpbGRyZW4sIGRpciwgaGVpZ2h0LCBub25jZSwgbnVtSXRlbXMsIHN0eWxlT3B0aW9ucywgc3R5bGVTZXQgfSkgPT4ge1xuICBkaXIgPSBkaXIgPT09ICdsdHInIHx8IGRpciA9PT0gJ3J0bCcgPyBkaXIgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcGF0Y2hlZFN0eWxlT3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gcGF0Y2hTdHlsZU9wdGlvbnMoc3R5bGVPcHRpb25zKSwgW3N0eWxlT3B0aW9uc10pO1xuICBjb25zdCBwYXRjaGVkU3R5bGVTZXQgPSB1c2VNZW1vKFxuICAgICgpID0+IHN0eWxlU2V0IHx8IGNyZWF0ZUJhc2ljU3R5bGVTZXQocGF0Y2hlZFN0eWxlT3B0aW9ucyksXG4gICAgW3BhdGNoZWRTdHlsZU9wdGlvbnMsIHN0eWxlU2V0XVxuICApO1xuXG4gIGNvbnN0IHN0eWxlU2V0Q2xhc3NOYW1lcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGVtb3Rpb24gPVxuICAgICAgZW1vdGlvblBvb2xbbm9uY2VdIHx8IChlbW90aW9uUG9vbFtub25jZV0gPSBjcmVhdGVFbW90aW9uKHsga2V5OiBgcmVhY3QtZmlsbS0tY3NzLSR7Y3JlYXRlQ1NTS2V5KCl9YCwgbm9uY2UgfSkpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXRjaGVkU3R5bGVTZXQpLm1hcCgoW25hbWUsIHN0eWxlXSkgPT4gW25hbWUsIGVtb3Rpb24uY3NzKHN0eWxlKSArICcnXSkpO1xuICB9LCBbbm9uY2UsIHBhdGNoZWRTdHlsZVNldF0pO1xuXG4gIGNvbnN0IFtfLCBmb3JjZVJlbmRlcl0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlID0gdXNlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlKCk7XG4gIGNvbnN0IHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUgPSB1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUoKTtcbiAgY29uc3Qgc2Nyb2xsTGVmdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2Nyb2xsVGltZW91dFJlZiA9IHVzZVJlZigpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZW91dFJlZi5jdXJyZW50KSwgW3Njcm9sbFRpbWVvdXRSZWZdKTtcblxuICBjb25zdCBzY3JvbGxUbyA9IHVzZUNhbGxiYWNrKFxuICAgIHNjcm9sbEZuID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBnZXRWaWV3KFxuICAgICAgICBkaXIsXG4gICAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnRcbiAgICAgICk7XG5cbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGluZGV4RnJhY3Rpb24gfSA9IHZpZXc7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gc2Nyb2xsRm4oeyBpbmRleCwgaW5kZXhGcmFjdGlvbiB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNjcm9sbExlZnRSZWYuY3VycmVudCA9IGNvbXB1dGVTY3JvbGxMZWZ0KFxuICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2RpciwgZm9yY2VSZW5kZXIsIGl0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbExlZnRSZWZdXG4gICk7XG5cbiAgY29uc3Qgc2Nyb2xsT25lTGVmdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxUbygoeyBpbmRleEZyYWN0aW9uIH0pID0+IChkaXIgPT09ICdydGwnID8gTWF0aC5mbG9vcihpbmRleEZyYWN0aW9uKSArIDEgOiBNYXRoLmNlaWwoaW5kZXhGcmFjdGlvbikgLSAxKSk7XG4gIH0sIFtkaXIsIHNjcm9sbFRvXSk7XG5cbiAgY29uc3Qgc2Nyb2xsT25lUmlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2Nyb2xsVG8oKHsgaW5kZXhGcmFjdGlvbiB9KSA9PiAoZGlyID09PSAncnRsJyA/IE1hdGguY2VpbChpbmRleEZyYWN0aW9uKSAtIDEgOiBNYXRoLmZsb29yKGluZGV4RnJhY3Rpb24pICsgMSkpO1xuICB9LCBbZGlyLCBzY3JvbGxUb10pO1xuXG4gIGNvbnN0IGZ1bmN0aW9uQ29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHNjcm9sbFRvLFxuICAgICAgc2Nyb2xsT25lTGVmdCxcbiAgICAgIHNjcm9sbE9uZVJpZ2h0XG4gICAgfSksXG4gICAgW3Njcm9sbFRvLCBzY3JvbGxPbmVMZWZ0LCBzY3JvbGxPbmVSaWdodF1cbiAgKTtcblxuICBjb25zdCBpbnRlcm5hbENvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLFxuICAgICAgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZVxuICAgIH0pLFxuICAgIFtpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlXVxuICApO1xuXG4gIGNvbnN0IHByb3BzQ29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHsgZGlyLCBoZWlnaHQsIG5vbmNlLCBudW1JdGVtcywgc3R5bGVPcHRpb25zOiBwYXRjaGVkU3R5bGVPcHRpb25zLCBzdHlsZVNldENsYXNzTmFtZXMgfSksXG4gICAgW2RpciwgaGVpZ2h0LCBub25jZSwgbnVtSXRlbXMsIHBhdGNoZWRTdHlsZU9wdGlvbnMsIHN0eWxlU2V0Q2xhc3NOYW1lc11cbiAgKTtcblxuICBjb25zdCBbdmlld0NvbnRleHQsIHNldFZpZXdDb250ZXh0XSA9IHVzZVN0YXRlKHtcbiAgICBpbmRleDogMCxcbiAgICBpbmRleEZyYWN0aW9uOiAwLFxuICAgIHNjcm9sbEJhclBlcmNlbnRhZ2U6ICcwJScsXG4gICAgc2Nyb2xsQmFyV2lkdGg6ICcwJScsXG4gICAgc2Nyb2xsaW5nOiBmYWxzZVxuICB9KTtcblxuICAvLyBUaGlzIHdpbGwgc2V0Vmlld0NvbnRleHQgYW5kIHJlc2V0IHRoZSBcInNjcm9sbGluZ1wiIGZsYWcgYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZS5cbiAgY29uc3Qgc2V0Vmlld0NvbnRleHQyID0gdXNlQ2FsbGJhY2soXG4gICAgbmV4dFZpZXdDb250ZXh0ID0+IHtcbiAgICAgIHNldFZpZXdDb250ZXh0KG5leHRWaWV3Q29udGV4dCk7XG5cbiAgICAgIGNsZWFyVGltZW91dChzY3JvbGxUaW1lb3V0UmVmLmN1cnJlbnQpO1xuXG4gICAgICBpZiAobmV4dFZpZXdDb250ZXh0LnNjcm9sbGluZykge1xuICAgICAgICBzY3JvbGxUaW1lb3V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBzZXRWaWV3Q29udGV4dCh7XG4gICAgICAgICAgICAgIC4uLm5leHRWaWV3Q29udGV4dCxcbiAgICAgICAgICAgICAgc2Nyb2xsaW5nOiBmYWxzZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICA1MDBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzY3JvbGxUaW1lb3V0UmVmLCBzZXRWaWV3Q29udGV4dF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTY3JvbGwgPSB1c2VDYWxsYmFjayhcbiAgICAoeyBmcmFjdGlvbjogc2Nyb2xsQmFyUGVyY2VudGFnZSwgaW5pdGlhbCwgd2lkdGg6IHNjcm9sbEJhcldpZHRoIH0pID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBnZXRWaWV3KFxuICAgICAgICBkaXIsXG4gICAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnRcbiAgICAgICk7XG5cbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGluZGV4RnJhY3Rpb24gfSA9IHZpZXc7XG5cbiAgICAgICAgc2V0Vmlld0NvbnRleHQyKHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpbmRleEZyYWN0aW9uLFxuICAgICAgICAgIHNjcm9sbGluZzogIWluaXRpYWwsXG4gICAgICAgICAgc2Nyb2xsQmFyUGVyY2VudGFnZSxcbiAgICAgICAgICBzY3JvbGxCYXJXaWR0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkaXIsIGl0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbExlZnRSZWYsIHNldFZpZXdDb250ZXh0Ml1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTY3JvbGxUb0VuZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgfSwgW2ZvcmNlUmVuZGVyLCBzY3JvbGxMZWZ0UmVmXSk7XG5cbiAgY29uc3QgbGVnYWN5Q29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIC4uLmZ1bmN0aW9uQ29udGV4dCxcbiAgICAgIC4uLmludGVybmFsQ29udGV4dCxcbiAgICAgIC4uLnByb3BzQ29udGV4dCxcbiAgICAgIC4uLnZpZXdDb250ZXh0XG4gICAgfSksXG4gICAgW2Z1bmN0aW9uQ29udGV4dCwgaW50ZXJuYWxDb250ZXh0LCBwcm9wc0NvbnRleHQsIHZpZXdDb250ZXh0XVxuICApO1xuXG4gIHVzZUFuaW1hdGVTY3JvbGxMZWZ0KFxuICAgIHR5cGVvZiBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQgPT09ICdudW1iZXInICYmIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQsXG4gICAgaGFuZGxlU2Nyb2xsVG9FbmRcbiAgKTtcblxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuc3Vic2NyaWJlKGN1cnJlbnQgPT4ge1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgIGN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVTY3JvbGxUb0VuZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgcmV0dXJuICgpID0+IGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVTY3JvbGxUb0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIFtoYW5kbGVTY3JvbGxUb0VuZCwgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZV1cbiAgKTtcblxuICB1c2VPYnNlcnZlU2Nyb2xsTGVmdChzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBoYW5kbGVTY3JvbGwpO1xuXG4gIHJldHVybiAoXG4gICAgPFByb3BzQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17cHJvcHNDb250ZXh0fT5cbiAgICAgIDxJbnRlcm5hbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ludGVybmFsQ29udGV4dH0+XG4gICAgICAgIDxGdW5jdGlvbkNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2Z1bmN0aW9uQ29udGV4dH0+XG4gICAgICAgICAgPFZpZXdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2aWV3Q29udGV4dH0+XG4gICAgICAgICAgICA8TGVnYWN5Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17bGVnYWN5Q29udGV4dH0+XG4gICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAge3BhdGNoZWRTdHlsZU9wdGlvbnMuYXV0b0NlbnRlciAmJiA8QXV0b0NlbnRlciAvPn1cbiAgICAgICAgICAgIDwvTGVnYWN5Q29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgICA8L1ZpZXdDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICA8L0Z1bmN0aW9uQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvSW50ZXJuYWxDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvUHJvcHNDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuQ29tcG9zZXIuZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICBkaXI6IHVuZGVmaW5lZCxcbiAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gIG5vbmNlOiB1bmRlZmluZWQsXG4gIHN0eWxlT3B0aW9uczogdW5kZWZpbmVkLFxuICBzdHlsZVNldDogdW5kZWZpbmVkXG59O1xuXG5Db21wb3Nlci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuZWxlbWVudCksIFByb3BUeXBlcy5lbGVtZW50XSksXG4gIGRpcjogUHJvcFR5cGVzLm9uZU9mKFsnbHRyJywgJ3J0bCddKSxcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBub25jZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbnVtSXRlbXM6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgc3R5bGVPcHRpb25zOiBQcm9wVHlwZXMuYW55LFxuICBzdHlsZVNldDogUHJvcFR5cGVzLmFueVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9zZXI7XG4iXX0=