UNPKG

scrollscene

Version:

ScrollScene is an extra layer on top of ScrollMagic as well as using IntersectionObserver to achieve similar effects.

232 lines (187 loc) 28.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.ScrollScene = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _scrollmagicWithSsr = _interopRequireDefault(require("./scrollmagic-with-ssr")); var _lodash = _interopRequireDefault(require("lodash.throttle")); var _helpers = require("./helpers"); 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; } var nameSpace = 'ScrollScene'; var updateTweenProgress = function updateTweenProgress(Scene, Tween, gsapForwardSpeed, gsapReverseSpeed) { if (Tween) { var progress = Scene.progress(); var state = Scene.state(); if (Tween.repeat && Tween.repeat() === -1) { if (state === 'DURING' && Tween.paused()) { Tween.timeScale(gsapForwardSpeed).play(); } else if (state !== 'DURING' && !Tween.paused()) { Tween.pause(); } } else if (progress != Tween.progress()) { if (Scene.duration() === 0) { if (progress > 0) { Tween.timeScale(gsapForwardSpeed).play(); } else { Tween.timeScale(gsapReverseSpeed).reverse(); } } else { Tween.progress(progress).pause(); } } } }; var removeTween = function removeTween(Tween) { if (Tween) { Tween.pause(0); Tween.kill(); } }; var setDuration = function setDuration(Scene, duration) { if (duration instanceof HTMLElement) { var previousHeight; var currentHeight; var getHeight = function getHeight() { return duration.offsetHeight; }; var update = function update() { Scene.duration(getHeight()); previousHeight = getHeight(); }; var fn = function fn() { currentHeight = getHeight(); if (currentHeight !== previousHeight) { update(); } }; fn(); window.addEventListener('resize', (0, _lodash["default"])(fn, 700)); currentHeight = getHeight(); update(); } else if ((0, _helpers.isObject)(duration)) { var keys = Object.keys(duration).reverse(); var _fn = function _fn() { for (var index = 0; index < keys.length; index++) { var breakpoint = parseFloat(keys[index]); if (breakpoint <= window.innerWidth) { Scene.duration(duration[breakpoint]); break; } } }; _fn(); window.addEventListener('resize', (0, _lodash["default"])(_fn, 700)); } else { Scene.duration(duration); } }; var setClassName = function setClassName(Scene, options, duration) { var toggle = _objectSpread({ className: null, element: null, reverse: false }, options); if (!toggle.className) { (0, _helpers.errorLog)(nameSpace, "Be sure to set a className in the new ".concat(nameSpace, "({ toggle: { className: \"my-class\" } })")); } if (!toggle.element) { (0, _helpers.errorLog)(nameSpace, "Be sure to set a const toggleElement = (reactRef.current or document.querySelector) in the new ".concat(nameSpace, "({ toggle: { element: toggleElement } })")); } var addClassName = function addClassName() { return !toggle.element.classList.contains(toggle.className) && toggle.element.classList.add(toggle.className); }; var removeClassName = function removeClassName() { return toggle.element.classList.contains(toggle.className) && toggle.element.classList.remove(toggle.className); }; Scene.on('enter', function () { addClassName(); }); Scene.on('add', function () { if (Scene.state() === 'DURING') { addClassName(); } }); Scene.on('leave', function (event) { if (!toggle.reverse && duration) { event.scrollDirection === 'REVERSE' && removeClassName(); } else { removeClassName(); } }); Scene.on('remove', function () { removeClassName(); }); }; var setTween = function setTween(Scene, options) { var gsap = _objectSpread({ forwardSpeed: 1, reverseSpeed: 1, timeline: null }, options); if (!gsap.timeline) { (0, _helpers.errorLog)(nameSpace, "Be sure to set a const tl = gsap.timeline({ paused: true }) in the new ".concat(nameSpace, "({ gsap: { timeline: tl } })")); } Scene.on('progress', function () { updateTweenProgress(Scene, gsap.timeline, gsap.forwardSpeed, gsap.reverseSpeed); }); Scene.on('remove', function () { removeTween(gsap.timeline); }); }; var globalController; var ScrollScene = function ScrollScene(_ref) { var breakpoints = _ref.breakpoints, _ref$controller = _ref.controller, controller = _ref$controller === void 0 ? {} : _ref$controller, duration = _ref.duration, gsap = _ref.gsap, _ref$offset = _ref.offset, offset = _ref$offset === void 0 ? 0 : _ref$offset, _ref$scene = _ref.scene, scene = _ref$scene === void 0 ? {} : _ref$scene, toggle = _ref.toggle, triggerElement = _ref.triggerElement, _ref$triggerHook = _ref.triggerHook, triggerHook = _ref$triggerHook === void 0 ? 'onEnter' : _ref$triggerHook, _ref$useGlobalControl = _ref.useGlobalController, useGlobalController = _ref$useGlobalControl === void 0 ? true : _ref$useGlobalControl; var localController; if (!useGlobalController) { localController = new _scrollmagicWithSsr["default"].Controller(controller); } if (!globalController && useGlobalController) { globalController = new _scrollmagicWithSsr["default"].Controller(controller); } var controllerIsUse = localController ? localController : globalController; if (!triggerElement) { (0, _helpers.errorLog)(nameSpace, "Be sure to set a const triggerElement = (reactRef.current or document.querySelector) in the new ".concat(nameSpace, "({ triggerElement: triggerElement }).")); } var Scene = new _scrollmagicWithSsr["default"].Scene(_objectSpread({ triggerElement: triggerElement, triggerHook: triggerHook, offset: offset }, scene)); if (duration) { setDuration(Scene, duration); } if (toggle && (0, _helpers.isObject)(toggle)) { setClassName(Scene, toggle, duration); } if (gsap && (0, _helpers.isObject)(gsap)) { setTween(Scene, gsap); } this.init = function () { controllerIsUse && Scene.addTo(controllerIsUse); }; this.destroy = function () { Scene.remove(); }; this.Scene = Scene; this.Controller = controllerIsUse; (0, _helpers.scrollAnimationInit)(breakpoints, this.init, this.destroy); }; exports.ScrollScene = ScrollScene; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TY3JvbGxTY2VuZS50cyJdLCJuYW1lcyI6WyJuYW1lU3BhY2UiLCJ1cGRhdGVUd2VlblByb2dyZXNzIiwiU2NlbmUiLCJUd2VlbiIsImdzYXBGb3J3YXJkU3BlZWQiLCJnc2FwUmV2ZXJzZVNwZWVkIiwicHJvZ3Jlc3MiLCJzdGF0ZSIsInJlcGVhdCIsInBhdXNlZCIsInRpbWVTY2FsZSIsInBsYXkiLCJwYXVzZSIsImR1cmF0aW9uIiwicmV2ZXJzZSIsInJlbW92ZVR3ZWVuIiwia2lsbCIsInNldER1cmF0aW9uIiwiSFRNTEVsZW1lbnQiLCJwcmV2aW91c0hlaWdodCIsImN1cnJlbnRIZWlnaHQiLCJnZXRIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJ1cGRhdGUiLCJmbiIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJrZXlzIiwiT2JqZWN0IiwiaW5kZXgiLCJsZW5ndGgiLCJicmVha3BvaW50IiwicGFyc2VGbG9hdCIsImlubmVyV2lkdGgiLCJzZXRDbGFzc05hbWUiLCJvcHRpb25zIiwidG9nZ2xlIiwiY2xhc3NOYW1lIiwiZWxlbWVudCIsImFkZENsYXNzTmFtZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiYWRkIiwicmVtb3ZlQ2xhc3NOYW1lIiwicmVtb3ZlIiwib24iLCJldmVudCIsInNjcm9sbERpcmVjdGlvbiIsInNldFR3ZWVuIiwiZ3NhcCIsImZvcndhcmRTcGVlZCIsInJldmVyc2VTcGVlZCIsInRpbWVsaW5lIiwiZ2xvYmFsQ29udHJvbGxlciIsIlNjcm9sbFNjZW5lIiwiYnJlYWtwb2ludHMiLCJjb250cm9sbGVyIiwib2Zmc2V0Iiwic2NlbmUiLCJ0cmlnZ2VyRWxlbWVudCIsInRyaWdnZXJIb29rIiwidXNlR2xvYmFsQ29udHJvbGxlciIsImxvY2FsQ29udHJvbGxlciIsIlNjcm9sbE1hZ2ljIiwiQ29udHJvbGxlciIsImNvbnRyb2xsZXJJc1VzZSIsImluaXQiLCJhZGRUbyIsImRlc3Ryb3kiXSwibWFwcGlu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QVosQ0FBbkI7QUFDRCxHQUZEOztBQUlBLE9BQUtHLE9BQUwsR0FBZSxZQUFXO0FBQ3hCbEUsSUFBQUEsS0FBSyxDQUFDMEMsTUFBTjtBQUNELEdBRkQ7O0FBSUEsT0FBSzFDLEtBQUwsR0FBYUEsS0FBYjtBQUNBLE9BQUs4RCxVQUFMLEdBQWtCQyxlQUFsQjtBQUVBLG9DQUFvQlYsV0FBcEIsRUFBaUMsS0FBS1csSUFBdEMsRUFBNEMsS0FBS0UsT0FBakQ7QUFDRCxDQW5FRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTY3JvbGxNYWdpYyBmcm9tICcuL3Njcm9sbG1hZ2ljLXdpdGgtc3NyJ1xuaW1wb3J0IHRocm90dGxlIGZyb20gJ2xvZGFzaC50aHJvdHRsZSdcbmltcG9ydCB7IGVycm9yTG9nLCBpc09iamVjdCwgc2Nyb2xsQW5pbWF0aW9uSW5pdCB9IGZyb20gJy4vaGVscGVycydcbmltcG9ydCB7IElTY3JvbGxPYnNlcnZlclRvZ2dsZSwgSVNjcm9sbE9ic2VydmVyR3NhcCB9IGZyb20gJy4vU2Nyb2xsT2JzZXJ2ZXInXG5cbmNvbnN0IG5hbWVTcGFjZSA9ICdTY3JvbGxTY2VuZSdcblxuY29uc3QgdXBkYXRlVHdlZW5Qcm9ncmVzcyA9IGZ1bmN0aW9uKFNjZW5lLCBUd2VlbiwgZ3NhcEZvcndhcmRTcGVlZCwgZ3NhcFJldmVyc2VTcGVlZCkge1xuICBpZiAoVHdlZW4pIHtcbiAgICBjb25zdCBwcm9ncmVzcyA9IFNjZW5lLnByb2dyZXNzKClcbiAgICBjb25zdCBzdGF0ZSA9IFNjZW5lLnN0YXRlKClcbiAgICBpZiAoVHdlZW4ucmVwZWF0ICYmIFR3ZWVuLnJlcGVhdCgpID09PSAtMSkge1xuICAgICAgLy8gaW5maW5pdGUgbG9vcCwgc28gbm90IGluIHJlbGF0aW9uIHRvIHByb2dyZXNzXG4gICAgICBpZiAoc3RhdGUgPT09ICdEVVJJTkcnICYmIFR3ZWVuLnBhdXNlZCgpKSB7XG4gICAgICAgIFR3ZWVuLnRpbWVTY2FsZShnc2FwRm9yd2FyZFNwZWVkKS5wbGF5KClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgIT09ICdEVVJJTkcnICYmICFUd2Vlbi5wYXVzZWQoKSkge1xuICAgICAgICBUd2Vlbi5wYXVzZSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9ncmVzcyAhPSBUd2Vlbi5wcm9ncmVzcygpKSB7XG4gICAgICAvLyBkbyB3ZSBldmVuIG5lZWQgdG8gdXBkYXRlIHRoZSBwcm9ncmVzcz9cbiAgICAgIC8vIG5vIGluZmluaXRlIGxvb3AgLSBzbyBzaG91bGQgd2UganVzdCBwbGF5IG9yIGdvIHRvIGEgc3BlY2lmaWMgcG9pbnQgaW4gdGltZT9cbiAgICAgIGlmIChTY2VuZS5kdXJhdGlvbigpID09PSAwKSB7XG4gICAgICAgIC8vIHBsYXkgdGhlIGFuaW1hdGlvblxuICAgICAgICBpZiAocHJvZ3Jlc3MgPiAwKSB7XG4gICAgICAgICAgLy8gcGxheSBmcm9tIDAgdG8gMVxuICAgICAgICAgIFR3ZWVuLnRpbWVTY2FsZShnc2FwRm9yd2FyZFNwZWVkKS5wbGF5KClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwbGF5IGZyb20gMSB0byAwXG4gICAgICAgICAgVHdlZW4udGltZVNjYWxlKGdzYXBSZXZlcnNlU3BlZWQpLnJldmVyc2UoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnbyB0byBhIHNwZWNpZmljIHBvaW50IGluIHRpbWVcbiAgICAgICAgLy8ganVzdCBoYXJkIHNldCBpdFxuICAgICAgICBUd2Vlbi5wcm9ncmVzcyhwcm9ncmVzcykucGF1c2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCByZW1vdmVUd2VlbiA9IGZ1bmN0aW9uKFR3ZWVuKSB7XG4gIGlmIChUd2Vlbikge1xuICAgIFR3ZWVuLnBhdXNlKDApXG4gICAgVHdlZW4ua2lsbCgpXG4gIH1cbn1cblxuY29uc3Qgc2V0RHVyYXRpb24gPSAoU2NlbmUsIGR1cmF0aW9uKSA9PiB7XG4gIC8qIGNoZWNrIGlmIGR1cmF0aW9uIGlzIHNldCBhcyBhbiBIVE1MRWxlbWVudCAqL1xuICBpZiAoZHVyYXRpb24gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIGxldCBwcmV2aW91c0hlaWdodFxuICAgIGxldCBjdXJyZW50SGVpZ2h0XG5cbiAgICBjb25zdCBnZXRIZWlnaHQgPSAoKSA9PiBkdXJhdGlvbi5vZmZzZXRIZWlnaHRcblxuICAgIGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIFNjZW5lLmR1cmF0aW9uKGdldEhlaWdodCgpKVxuICAgICAgcHJldmlvdXNIZWlnaHQgPSBnZXRIZWlnaHQoKVxuICAgIH1cblxuICAgIGNvbnN0IGZuID0gKCkgPT4ge1xuICAgICAgLyogc2V0IGR1cmF0aW9uIHRvIG1hdGNoIGhlaWdodCBvZiBlbGVtZW50ICovXG4gICAgICBjdXJyZW50SGVpZ2h0ID0gZ2V0SGVpZ2h0KClcblxuICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgIT09IHByZXZpb3VzSGVpZ2h0KSB7XG4gICAgICAgIHVwZGF0ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm4oKVxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlKGZuLCA3MDApKVxuXG4gICAgY3VycmVudEhlaWdodCA9IGdldEhlaWdodCgpXG5cbiAgICB1cGRhdGUoKVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGR1cmF0aW9uKSkge1xuICAgIC8qIGlmIGFuIG9iamVjdCwgbWFrZSBicmVha3BvaW50cyAqL1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbikucmV2ZXJzZSgpXG5cbiAgICBjb25zdCBmbiA9ICgpID0+IHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBrZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gcGFyc2VGbG9hdChrZXlzW2luZGV4XSlcblxuICAgICAgICBpZiAoYnJlYWtwb2ludCA8PSB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgIFNjZW5lLmR1cmF0aW9uKGR1cmF0aW9uW2JyZWFrcG9pbnRdKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbigpXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGUoZm4sIDcwMCkpXG4gIH0gZWxzZSB7XG4gICAgLyogbm90aGluZyBvZiB0aGUgYWJvdmU/IGp1c3Qgc2V0IGl0ICovXG4gICAgU2NlbmUuZHVyYXRpb24oZHVyYXRpb24pXG4gIH1cbn1cblxuY29uc3Qgc2V0Q2xhc3NOYW1lID0gKFNjZW5lLCBvcHRpb25zLCBkdXJhdGlvbikgPT4ge1xuICBjb25zdCB0b2dnbGUgPSB7XG4gICAgY2xhc3NOYW1lOiBudWxsLFxuICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxuXG4gIGlmICghdG9nZ2xlLmNsYXNzTmFtZSkge1xuICAgIGVycm9yTG9nKG5hbWVTcGFjZSwgYEJlIHN1cmUgdG8gc2V0IGEgY2xhc3NOYW1lIGluIHRoZSBuZXcgJHtuYW1lU3BhY2V9KHsgdG9nZ2xlOiB7IGNsYXNzTmFtZTogXCJteS1jbGFzc1wiIH0gfSlgKVxuICB9XG5cbiAgaWYgKCF0b2dnbGUuZWxlbWVudCkge1xuICAgIGVycm9yTG9nKFxuICAgICAgbmFtZVNwYWNlLFxuICAgICAgYEJlIHN1cmUgdG8gc2V0IGEgY29uc3QgdG9nZ2xlRWxlbWVudCA9IChyZWFjdFJlZi5jdXJyZW50IG9yIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IpIGluIHRoZSBuZXcgJHtuYW1lU3BhY2V9KHsgdG9nZ2xlOiB7IGVsZW1lbnQ6IHRvZ2dsZUVsZW1lbnQgfSB9KWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgYWRkQ2xhc3NOYW1lID0gKCkgPT5cbiAgICAhdG9nZ2xlLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHRvZ2dsZS5jbGFzc05hbWUpICYmIHRvZ2dsZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQodG9nZ2xlLmNsYXNzTmFtZSlcblxuICBjb25zdCByZW1vdmVDbGFzc05hbWUgPSAoKSA9PlxuICAgIHRvZ2dsZS5lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyh0b2dnbGUuY2xhc3NOYW1lKSAmJiB0b2dnbGUuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRvZ2dsZS5jbGFzc05hbWUpXG5cbiAgU2NlbmUub24oJ2VudGVyJywgZnVuY3Rpb24oKSB7XG4gICAgYWRkQ2xhc3NOYW1lKClcbiAgfSlcblxuICBTY2VuZS5vbignYWRkJywgZnVuY3Rpb24oKSB7XG4gICAgaWYgKFNjZW5lLnN0YXRlKCkgPT09ICdEVVJJTkcnKSB7XG4gICAgICBhZGRDbGFzc05hbWUoKVxuICAgIH1cbiAgfSlcblxuICBTY2VuZS5vbignbGVhdmUnLCBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICghdG9nZ2xlLnJldmVyc2UgJiYgZHVyYXRpb24pIHtcbiAgICAgIC8vIG5lZWRzIHRvIGJlIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYSBkdXJhdGlvblxuICAgICAgZXZlbnQuc2Nyb2xsRGlyZWN0aW9uID09PSAnUkVWRVJTRScgJiYgcmVtb3ZlQ2xhc3NOYW1lKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlQ2xhc3NOYW1lKClcbiAgICB9XG4gIH0pXG5cbiAgU2NlbmUub24oJ3JlbW92ZScsIGZ1bmN0aW9uKCkge1xuICAgIHJlbW92ZUNsYXNzTmFtZSgpXG4gIH0pXG59XG5cbmNvbnN0IHNldFR3ZWVuID0gKFNjZW5lLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGdzYXAgPSB7XG4gICAgZm9yd2FyZFNwZWVkOiAxLFxuICAgIHJldmVyc2VTcGVlZDogMSxcbiAgICB0aW1lbGluZTogbnVsbCxcbiAgICAuLi5vcHRpb25zLFxuICB9XG5cbiAgaWYgKCFnc2FwLnRpbWVsaW5lKSB7XG4gICAgZXJyb3JMb2coXG4gICAgICBuYW1lU3BhY2UsXG4gICAgICBgQmUgc3VyZSB0byBzZXQgYSBjb25zdCB0bCA9IGdzYXAudGltZWxpbmUoeyBwYXVzZWQ6IHRydWUgfSkgaW4gdGhlIG5ldyAke25hbWVTcGFjZX0oeyBnc2FwOiB7IHRpbWVsaW5lOiB0bCB9IH0pYCxcbiAgICApXG4gIH1cblxuICBTY2VuZS5vbigncHJvZ3Jlc3MnLCBmdW5jdGlvbigpIHtcbiAgICB1cGRhdGVUd2VlblByb2dyZXNzKFNjZW5lLCBnc2FwLnRpbWVsaW5lLCBnc2FwLmZvcndhcmRTcGVlZCwgZ3NhcC5yZXZlcnNlU3BlZWQpXG4gIH0pXG5cbiAgU2NlbmUub24oJ3JlbW92ZScsIGZ1bmN0aW9uKCkge1xuICAgIHJlbW92ZVR3ZWVuKGdzYXAudGltZWxpbmUpXG4gIH0pXG59XG5cbmludGVyZmFjZSBJU2Nyb2xsU2NlbmVUb2dnbGUgZXh0ZW5kcyBJU2Nyb2xsT2JzZXJ2ZXJUb2dnbGUge1xuICAvKipcbiAgICogcmV2ZXJzZVxuICAgKiBAZGVzYyBTcGVjaWZ5IHRoZSBjbGFzc05hbWUgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgdGhlIGR1cmF0aW9uIG9mIHNjZW5lIGlzIG1ldC4gT25seSBhcHBsaWVzIGlmIHNjZW5lIGhhcyBkdXJhdGlvbi5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZXhhbXBsZVxuICAgKiB0b2dnbGU6IHsgcmV2ZXJzZTogdHJ1ZSB9XG4gICAqL1xuICByZXZlcnNlPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSVNjcm9sbFNjZW5lIHtcbiAgLyoqXG4gICAqIGJyZWFrcG9pbnRzXG4gICAqIEBkZXNjIFVzZSB0byBzZXQgcmVzcG9uc2l2ZW5lc3Mgb2YgdGhlIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSwgbW9iaWxlLWZpcnN0XG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiBicmVha3BvaW50czogeyAwOiBmYWxzZSwgNzY4OiB0cnVlIH1cbiAgICovXG4gIGJyZWFrcG9pbnRzPzogb2JqZWN0XG5cbiAgLyoqXG4gICAqIGNvbnRyb2xsZXJcbiAgICogQGRlc2MgRXh0cmEgb3B0aW9ucyB0byBwYXNzIHRoZSBuZXcgU2Nyb2xsTWFnaWMuQ29udHJvbGxlciwgbGlrZSB2ZXJ0aWNhbCwgZXRjLlxuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogY29udHJvbGxlcjogeyB2ZXJ0aWNhbDogZmFsc2UgfVxuICAgKi9cbiAgY29udHJvbGxlcj86IG9iamVjdFxuXG4gIC8qKlxuICAgKiBkdXJhdGlvblxuICAgKiBAZGVzYyBVc2UgdG8gc2V0IHJlc3BvbnNpdmVuZXNzIG9mIHRoZSBuZXcgU2Nyb2xsTWFnaWMuU2NlbmUsIG1vYmlsZS1maXJzdCAoaWYgc2V0dGluZyBicmVha3BvaW50cylcbiAgICogTXVzdCBiZSBzdHJpbmcgZm9yIHBlcmNlbnRhZ2UsIGFuZCBudW1iZXIgZm9yIHBpeGVsLlxuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogZHVyYXRpb246ICcxMDAlJyA9IDEwMHZoXG4gICAqIGR1cmF0aW9uOiAxMDAgPSAxMDBweFxuICAgKiBkdXJhdGlvbjogeyAwOiAnNTAlJywgNzY4OiAnMTAwJSB9IC8vID0gU2Nyb2xsU2NlbmUgbGFzdHMgNTB2aCBvbiBtb2JpbGUsIDEwMCUgYWZ0ZXJcbiAgICovXG4gIGR1cmF0aW9uPzogc3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0XG5cbiAgLyoqXG4gICAqIGdzYXBcbiAgICogQGRlc2MgVXNlIHRvIHNldCBvcHRpb25zIGZvciB0aGUgZ3NhcCBhbmltYXRpb24gb2YgdGhlIFNjcm9sbE9ic2VydmVyLlxuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogZ3NhcDogeyB0aW1lbGluZTogbXlUaW1lbGluZSwgeW95bzogdHJ1ZSwgcmV2ZXJzZVNwZWVkOiAyIH1cbiAgICovXG4gIGdzYXA/OiBJU2Nyb2xsT2JzZXJ2ZXJHc2FwXG5cbiAgLyoqXG4gICAqIHRyaWdnZXJIb29rXG4gICAqIEBkZXNjIFNldCB0aGUgb2Zmc2V0IG9mIHRoZSBTY3JvbGxNYWdpYyBzY2VuZS5cbiAgICogQHR5cGUgIG51bWJlciB8IHN0cmluZ1xuICAgKiBAZGVmYXVsdHZhbHVlIDBcbiAgICogQGV4YW1wbGVcbiAgICogb2Zmc2V0OiAxMDBcbiAgICogb2Zmc2V0OiAnMTAlJ1xuICAgKi9cbiAgb2Zmc2V0PzogbnVtYmVyIHwgc3RyaW5nXG5cbiAgLyoqXG4gICAqIHNjZW5lXG4gICAqIEBkZXNjIEV4dHJhIG9wdGlvbnMgdG8gcGFzcyB0aGUgbmV3IFNjcm9sbE1hZ2ljLlNjZW5lLCBsaWtlIGxvZ0xldmVsLCBldGMuXG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiBzY2VuZTogeyBsb2dMZXZlbDogMiB9XG4gICAqL1xuICBzY2VuZT86IG9iamVjdFxuXG4gIC8qKlxuICAgKiB0b2dnbGVcbiAgICogQGRlc2MgVXNlIHRvIHNldCB0aGUgb3B0aW9ucyBmb3IgdGhlIHRvZ2dsaW5nIG9mIGEgY2xhc3NOYW1lXG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiB0b2dnbGU6IHsgZWxlbWVudDogY29udGFpbmVyUmVmLmN1cnJlbnQsIGNsYXNzTmFtZTogJ2xldHMtZG8tdGhpcycgfVxuICAgKi9cbiAgdG9nZ2xlPzogSVNjcm9sbFNjZW5lVG9nZ2xlXG5cbiAgLyoqXG4gICAqIHRyaWdnZXJFbGVtZW50XG4gICAqIEBkZXNjIFNldCB0aGUgZWxlbWVudCB5b3Ugd2lzaCB0byB0cmlnZ2VyIGV2ZW50cyBiYXNlZCB1cG9uLCB0aGUgb2JzZXJ2ZWQgZWxlbWVudC5cbiAgICogQHR5cGUgIEhUTUxFbGVtZW50IHwgYW55XG4gICAqIEBleGFtcGxlXG4gICAqIHRyaWdnZXJFbGVtZW50OiB0cmlnZ2VyUmVmLmN1cnJlbnRcbiAgICovXG4gIHRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IGFueVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VySG9va1xuICAgKiBAZGVzYyBTZXQgdGhlIHRyaWdnZXJIb29rIG9mIHRoZSBTY3JvbGxNYWdpYyBzY2VuZS5cbiAgICogQHR5cGUgIG51bWJlclxuICAgKiBAZGVmYXVsdHZhbHVlICdvbkVudGVyJ1xuICAgKiBAZXhhbXBsZVxuICAgKiB0cmlnZ2VySG9vazogMC41XG4gICAqL1xuICB0cmlnZ2VySG9vaz86IG51bWJlciB8IHN0cmluZ1xuXG4gIC8qKlxuICAgKiB1c2VHbG9iYWxDb250cm9sbGVyXG4gICAqIEBkZXNjIENob3NlIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgZ2xvYmFsQ29udHJvbGxlciBwcm92aWRlZCBmb3IgeW91LCBvciBhIGZyZXNoIG5ldyBTY3JvbGxNYWdpYy5Db250cm9sbGVyIGluc3RhbmNlLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKiBAZXhhbXBsZVxuICAgKiB1c2VHbG9iYWxDb250cm9sbGVyOiBmYWxzZVxuICAgKi9cbiAgdXNlR2xvYmFsQ29udHJvbGxlcj86IGJvb2xlYW5cbn1cblxuLy8gYWRkIGNvbnRyb2xsZXIgdmFyXG5sZXQgZ2xvYmFsQ29udHJvbGxlclxuXG5jb25zdCBTY3JvbGxTY2VuZSA9IGZ1bmN0aW9uKFxuICB0aGlzOiBhbnksXG4gIHtcbiAgICBicmVha3BvaW50cyxcbiAgICBjb250cm9sbGVyID0ge30sXG4gICAgZHVyYXRpb24sXG4gICAgZ3NhcCxcbiAgICBvZmZzZXQgPSAwLFxuICAgIHNjZW5lID0ge30sXG4gICAgdG9nZ2xlLFxuICAgIHRyaWdnZXJFbGVtZW50LFxuICAgIHRyaWdnZXJIb29rID0gJ29uRW50ZXInLFxuICAgIHVzZUdsb2JhbENvbnRyb2xsZXIgPSB0cnVlLFxuICB9OiBJU2Nyb2xsU2NlbmUsXG4pIHtcbiAgbGV0IGxvY2FsQ29udHJvbGxlclxuXG4gIC8vIGNoZWNrIGlmIHVzaW5nIGEgbG9jYWwgY29udHJvbGxlclxuICBpZiAoIXVzZUdsb2JhbENvbnRyb2xsZXIpIHtcbiAgICBsb2NhbENvbnRyb2xsZXIgPSBuZXcgU2Nyb2xsTWFnaWMuQ29udHJvbGxlcihjb250cm9sbGVyKVxuICB9XG5cbiAgLy8gbW91bnQgY29udHJvbGxlclxuICBpZiAoIWdsb2JhbENvbnRyb2xsZXIgJiYgdXNlR2xvYmFsQ29udHJvbGxlcikge1xuICAgIGdsb2JhbENvbnRyb2xsZXIgPSBuZXcgU2Nyb2xsTWFnaWMuQ29udHJvbGxlcihjb250cm9sbGVyKVxuICB9XG5cbiAgY29uc3QgY29udHJvbGxlcklzVXNlID0gbG9jYWxDb250cm9sbGVyID8gbG9jYWxDb250cm9sbGVyIDogZ2xvYmFsQ29udHJvbGxlclxuXG4gIGlmICghdHJpZ2dlckVsZW1lbnQpIHtcbiAgICBlcnJvckxvZyhcbiAgICAgIG5hbWVTcGFjZSxcbiAgICAgIGBCZSBzdXJlIHRvIHNldCBhIGNvbnN0IHRyaWdnZXJFbGVtZW50ID0gKHJlYWN0UmVmLmN1cnJlbnQgb3IgZG9jdW1lbnQucXVlcnlTZWxlY3RvcikgaW4gdGhlIG5ldyAke25hbWVTcGFjZX0oeyB0cmlnZ2VyRWxlbWVudDogdHJpZ2dlckVsZW1lbnQgfSkuYCxcbiAgICApXG4gIH1cblxuICBjb25zdCBTY2VuZSA9IG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7XG4gICAgdHJpZ2dlckVsZW1lbnQsXG4gICAgdHJpZ2dlckhvb2ssXG4gICAgb2Zmc2V0LFxuICAgIC4uLnNjZW5lLFxuICB9KVxuXG4gIGlmIChkdXJhdGlvbikge1xuICAgIHNldER1cmF0aW9uKFNjZW5lLCBkdXJhdGlvbilcbiAgfVxuXG4gIGlmICh0b2dnbGUgJiYgaXNPYmplY3QodG9nZ2xlKSkge1xuICAgIHNldENsYXNzTmFtZShTY2VuZSwgdG9nZ2xlLCBkdXJhdGlvbilcbiAgfVxuXG4gIGlmIChnc2FwICYmIGlzT2JqZWN0KGdzYXApKSB7XG4gICAgc2V0VHdlZW4oU2NlbmUsIGdzYXApXG4gIH1cblxuICB0aGlzLmluaXQgPSBmdW5jdGlvbigpIHtcbiAgICBjb250cm9sbGVySXNVc2UgJiYgU2NlbmUuYWRkVG8oY29udHJvbGxlcklzVXNlKVxuICB9XG5cbiAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgU2NlbmUucmVtb3ZlKClcbiAgfVxuXG4gIHRoaXMuU2NlbmUgPSBTY2VuZVxuICB0aGlzLkNvbnRyb2xsZXIgPSBjb250cm9sbGVySXNVc2VcblxuICBzY3JvbGxBbmltYXRpb25Jbml0KGJyZWFrcG9pbnRzLCB0aGlzLmluaXQsIHRoaXMuZGVzdHJveSlcbn1cblxuZXhwb3J0IHsgU2Nyb2xsU2NlbmUgfVxuIl19