var blocksyOptions;(()=>{var __webpack_modules__={1314:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "He": () => (/* binding */ getPayload),\n/* harmony export */ "Ld": () => (/* binding */ createHost),\n/* harmony export */ "eC": () => (/* binding */ AnimatedString),\n/* harmony export */ "f3": () => (/* binding */ setAnimated),\n/* harmony export */ "iG": () => (/* binding */ AnimatedValue),\n/* harmony export */ "rS": () => (/* binding */ AnimatedObject),\n/* harmony export */ "sb": () => (/* binding */ getAnimatedType),\n/* harmony export */ "ys": () => (/* binding */ getAnimated)\n/* harmony export */ });\n/* unused harmony exports Animated, AnimatedArray, isAnimated */\n/* harmony import */ var _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4813);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7363);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\n\nconst $node = Symbol.for(\'Animated:node\');\nconst isAnimated = value => !!value && value[$node] === value;\nconst getAnimated = owner => owner && owner[$node];\nconst setAnimated = (owner, node) => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .defineHidden */ .dE)(owner, $node, node);\nconst getPayload = owner => owner && owner[$node] && owner[$node].getPayload();\nclass Animated {\n constructor() {\n this.payload = void 0;\n setAnimated(this, this);\n }\n\n getPayload() {\n return this.payload || [];\n }\n\n}\n\nclass AnimatedValue extends Animated {\n constructor(_value) {\n super();\n this.done = true;\n this.elapsedTime = void 0;\n this.lastPosition = void 0;\n this.lastVelocity = void 0;\n this.v0 = void 0;\n this.durationProgress = 0;\n this._value = _value;\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.num(this._value)) {\n this.lastPosition = this._value;\n }\n }\n\n static create(value) {\n return new AnimatedValue(value);\n }\n\n getPayload() {\n return [this];\n }\n\n getValue() {\n return this._value;\n }\n\n setValue(value, step) {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.num(value)) {\n this.lastPosition = value;\n\n if (step) {\n value = Math.round(value / step) * step;\n\n if (this.done) {\n this.lastPosition = value;\n }\n }\n }\n\n if (this._value === value) {\n return false;\n }\n\n this._value = value;\n return true;\n }\n\n reset() {\n const {\n done\n } = this;\n this.done = false;\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.num(this._value)) {\n this.elapsedTime = 0;\n this.durationProgress = 0;\n this.lastPosition = this._value;\n if (done) this.lastVelocity = null;\n this.v0 = null;\n }\n }\n\n}\n\nclass AnimatedString extends AnimatedValue {\n constructor(value) {\n super(0);\n this._string = null;\n this._toString = void 0;\n this._toString = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .createInterpolator */ .mD)({\n output: [value, value]\n });\n }\n\n static create(value) {\n return new AnimatedString(value);\n }\n\n getValue() {\n let value = this._string;\n return value == null ? this._string = this._toString(this._value) : value;\n }\n\n setValue(value) {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.str(value)) {\n if (value == this._string) {\n return false;\n }\n\n this._string = value;\n this._value = 1;\n } else if (super.setValue(value)) {\n this._string = null;\n } else {\n return false;\n }\n\n return true;\n }\n\n reset(goal) {\n if (goal) {\n this._toString = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .createInterpolator */ .mD)({\n output: [this.getValue(), goal]\n });\n }\n\n this._value = 0;\n super.reset();\n }\n\n}\n\nconst TreeContext = {\n dependencies: null\n};\n\nclass AnimatedObject extends Animated {\n constructor(source) {\n super();\n this.source = source;\n this.setValue(source);\n }\n\n getValue(animated) {\n const values = {};\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(this.source, (source, key) => {\n if (isAnimated(source)) {\n values[key] = source.getValue(animated);\n } else if ((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(source)) {\n values[key] = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(source);\n } else if (!animated) {\n values[key] = source;\n }\n });\n return values;\n }\n\n setValue(source) {\n this.source = source;\n this.payload = this._makePayload(source);\n }\n\n reset() {\n if (this.payload) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(this.payload, node => node.reset());\n }\n }\n\n _makePayload(source) {\n if (source) {\n const payload = new Set();\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(source, this._addToPayload, payload);\n return Array.from(payload);\n }\n }\n\n _addToPayload(source) {\n if (TreeContext.dependencies && (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(source)) {\n TreeContext.dependencies.add(source);\n }\n\n const payload = getPayload(source);\n\n if (payload) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(payload, node => this.add(node));\n }\n }\n\n}\n\nclass AnimatedArray extends AnimatedObject {\n constructor(source) {\n super(source);\n }\n\n static create(source) {\n return new AnimatedArray(source);\n }\n\n getValue() {\n return this.source.map(node => node.getValue());\n }\n\n setValue(source) {\n const payload = this.getPayload();\n\n if (source.length == payload.length) {\n return payload.map((node, i) => node.setValue(source[i])).some(Boolean);\n }\n\n super.setValue(source.map(makeAnimated));\n return true;\n }\n\n}\n\nfunction makeAnimated(value) {\n const nodeType = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isAnimatedString */ .Df)(value) ? AnimatedString : AnimatedValue;\n return nodeType.create(value);\n}\n\nfunction getAnimatedType(value) {\n const parentNode = getAnimated(value);\n return parentNode ? parentNode.constructor : _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(value) ? AnimatedArray : (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isAnimatedString */ .Df)(value) ? AnimatedString : AnimatedValue;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nconst withAnimated = (Component, host) => {\n const hasInstance = !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(Component) || Component.prototype && Component.prototype.isReactComponent;\n return (0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)((givenProps, givenRef) => {\n const instanceRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const ref = hasInstance && (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(value => {\n instanceRef.current = updateRef(givenRef, value);\n }, [givenRef]);\n const [props, deps] = getAnimatedState(givenProps, host);\n const forceUpdate = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useForceUpdate */ .NW)();\n\n const callback = () => {\n const instance = instanceRef.current;\n\n if (hasInstance && !instance) {\n return;\n }\n\n const didUpdate = instance ? host.applyAnimatedValues(instance, props.getValue(true)) : false;\n\n if (didUpdate === false) {\n forceUpdate();\n }\n };\n\n const observer = new PropsObserver(callback, deps);\n const observerRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)();\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useLayoutEffect */ .bt)(() => {\n observerRef.current = observer;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(deps, dep => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .addFluidObserver */ .UI)(dep, observer));\n return () => {\n if (observerRef.current) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(observerRef.current.deps, dep => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .removeFluidObserver */ .iL)(dep, observerRef.current));\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.cancel */ .Wn.cancel(observerRef.current.update);\n }\n };\n });\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(callback, []);\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useOnce */ .tf)(() => () => {\n const observer = observerRef.current;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(observer.deps, dep => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .removeFluidObserver */ .iL)(dep, observer));\n });\n const usedProps = host.getComponentProps(props.getValue());\n return react__WEBPACK_IMPORTED_MODULE_1__.createElement(Component, _extends({}, usedProps, {\n ref: ref\n }));\n });\n};\n\nclass PropsObserver {\n constructor(update, deps) {\n this.update = update;\n this.deps = deps;\n }\n\n eventObserved(event) {\n if (event.type == \'change\') {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.write */ .Wn.write(this.update);\n }\n }\n\n}\n\nfunction getAnimatedState(props, host) {\n const dependencies = new Set();\n TreeContext.dependencies = dependencies;\n if (props.style) props = _extends({}, props, {\n style: host.createAnimatedStyle(props.style)\n });\n props = new AnimatedObject(props);\n TreeContext.dependencies = null;\n return [props, dependencies];\n}\n\nfunction updateRef(ref, value) {\n if (ref) {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(ref)) ref(value);else ref.current = value;\n }\n\n return value;\n}\n\nconst cacheKey = Symbol.for(\'AnimatedComponent\');\nconst createHost = (components, {\n applyAnimatedValues: _applyAnimatedValues = () => false,\n createAnimatedStyle: _createAnimatedStyle = style => new AnimatedObject(style),\n getComponentProps: _getComponentProps = props => props\n} = {}) => {\n const hostConfig = {\n applyAnimatedValues: _applyAnimatedValues,\n createAnimatedStyle: _createAnimatedStyle,\n getComponentProps: _getComponentProps\n };\n\n const animated = Component => {\n const displayName = getDisplayName(Component) || \'Anonymous\';\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.str(Component)) {\n Component = animated[Component] || (animated[Component] = withAnimated(Component, hostConfig));\n } else {\n Component = Component[cacheKey] || (Component[cacheKey] = withAnimated(Component, hostConfig));\n }\n\n Component.displayName = `Animated(${displayName})`;\n return Component;\n };\n\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(components, (Component, key) => {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(components)) {\n key = getDisplayName(Component);\n }\n\n animated[key] = animated(Component);\n });\n return {\n animated\n };\n};\n\nconst getDisplayName = arg => _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.str(arg) ? arg : arg && _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.str(arg.displayName) ? arg.displayName : _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(arg) && arg.name || null;\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMxNC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1zcHJpbmcvYW5pbWF0ZWQvZGlzdC9yZWFjdC1zcHJpbmctYW5pbWF0ZWQuZXNtLmpzPzc1ZjYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lSGlkZGVuLCBpcywgY3JlYXRlSW50ZXJwb2xhdG9yLCBlYWNoUHJvcCwgaGFzRmx1aWRWYWx1ZSwgZ2V0Rmx1aWRWYWx1ZSwgZWFjaCwgaXNBbmltYXRlZFN0cmluZywgdXNlRm9yY2VVcGRhdGUsIHVzZUxheW91dEVmZmVjdCwgYWRkRmx1aWRPYnNlcnZlciwgcmVtb3ZlRmx1aWRPYnNlcnZlciwgcmFmLCB1c2VPbmNlIH0gZnJvbSAnQHJlYWN0LXNwcmluZy9zaGFyZWQnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlUmVmLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuXG5jb25zdCAkbm9kZSA9IFN5bWJvbC5mb3IoJ0FuaW1hdGVkOm5vZGUnKTtcbmNvbnN0IGlzQW5pbWF0ZWQgPSB2YWx1ZSA9PiAhIXZhbHVlICYmIHZhbHVlWyRub2RlXSA9PT0gdmFsdWU7XG5jb25zdCBnZXRBbmltYXRlZCA9IG93bmVyID0+IG93bmVyICYmIG93bmVyWyRub2RlXTtcbmNvbnN0IHNldEFuaW1hdGVkID0gKG93bmVyLCBub2RlKSA9PiBkZWZpbmVIaWRkZW4ob3duZXIsICRub2RlLCBub2RlKTtcbmNvbnN0IGdldFBheWxvYWQgPSBvd25lciA9PiBvd25lciAmJiBvd25lclskbm9kZV0gJiYgb3duZXJbJG5vZGVdLmdldFBheWxvYWQoKTtcbmNsYXNzIEFuaW1hdGVkIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wYXlsb2FkID0gdm9pZCAwO1xuICAgIHNldEFuaW1hdGVkKHRoaXMsIHRoaXMpO1xuICB9XG5cbiAgZ2V0UGF5bG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXlsb2FkIHx8IFtdO1xuICB9XG5cbn1cblxuY2xhc3MgQW5pbWF0ZWRWYWx1ZSBleHRlbmRzIEFuaW1hdGVkIHtcbiAgY29uc3RydWN0b3IoX3ZhbHVlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgIHRoaXMuZWxhcHNlZFRpbWUgPSB2b2lkIDA7XG4gICAgdGhpcy5sYXN0UG9zaXRpb24gPSB2b2lkIDA7XG4gICAgdGhpcy5sYXN0VmVsb2NpdHkgPSB2b2lkIDA7XG4gICAgdGhpcy52MCA9IHZvaWQgMDtcbiAgICB0aGlzLmR1cmF0aW9uUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlO1xuXG4gICAgaWYgKGlzLm51bSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgIHRoaXMubGFzdFBvc2l0aW9uID0gdGhpcy5fdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZSh2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgQW5pbWF0ZWRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXRQYXlsb2FkKCkge1xuICAgIHJldHVybiBbdGhpc107XG4gIH1cblxuICBnZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZSh2YWx1ZSwgc3RlcCkge1xuICAgIGlmIChpcy5udW0odmFsdWUpKSB7XG4gICAgICB0aGlzLmxhc3RQb3NpdGlvbiA9IHZhbHVlO1xuXG4gICAgICBpZiAoc3RlcCkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyBzdGVwKSAqIHN0ZXA7XG5cbiAgICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICAgIHRoaXMubGFzdFBvc2l0aW9uID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRvbmVcbiAgICB9ID0gdGhpcztcbiAgICB0aGlzLmRvbmUgPSBmYWxzZTtcblxuICAgIGlmIChpcy5udW0odGhpcy5fdmFsdWUpKSB7XG4gICAgICB0aGlzLmVsYXBzZWRUaW1lID0gMDtcbiAgICAgIHRoaXMuZHVyYXRpb25Qcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLmxhc3RQb3NpdGlvbiA9IHRoaXMuX3ZhbHVlO1xuICAgICAgaWYgKGRvbmUpIHRoaXMubGFzdFZlbG9jaXR5ID0gbnVsbDtcbiAgICAgIHRoaXMudjAgPSBudWxsO1xuICAgIH1cbiAgfVxuXG59XG5cbmNsYXNzIEFuaW1hdGVkU3RyaW5nIGV4dGVuZHMgQW5pbWF0ZWRWYWx1ZSB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgc3VwZXIoMCk7XG4gICAgdGhpcy5fc3RyaW5nID0gbnVsbDtcbiAgICB0aGlzLl90b1N0cmluZyA9IHZvaWQgMDtcbiAgICB0aGlzLl90b1N0cmluZyA9IGNyZWF0ZUludGVycG9sYXRvcih7XG4gICAgICBvdXRwdXQ6IFt2YWx1ZSwgdmFsdWVdXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRlZFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBnZXRWYWx1ZSgpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLl9zdHJpbmc7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzLl9zdHJpbmcgPSB0aGlzLl90b1N0cmluZyh0aGlzLl92YWx1ZSkgOiB2YWx1ZTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzLnN0cih2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9zdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdHJpbmcgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX3ZhbHVlID0gMTtcbiAgICB9IGVsc2UgaWYgKHN1cGVyLnNldFZhbHVlKHZhbHVlKSkge1xuICAgICAgdGhpcy5fc3RyaW5nID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmVzZXQoZ29hbCkge1xuICAgIGlmIChnb2FsKSB7XG4gICAgICB0aGlzLl90b1N0cmluZyA9IGNyZWF0ZUludGVycG9sYXRvcih7XG4gICAgICAgIG91dHB1dDogW3RoaXMuZ2V0VmFsdWUoKSwgZ29hbF1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlID0gMDtcbiAgICBzdXBlci5yZXNldCgpO1xuICB9XG5cbn1cblxuY29uc3QgVHJlZUNvbnRleHQgPSB7XG4gIGRlcGVuZGVuY2llczogbnVsbFxufTtcblxuY2xhc3MgQW5pbWF0ZWRPYmplY3QgZXh0ZW5kcyBBbmltYXRlZCB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5zZXRWYWx1ZShzb3VyY2UpO1xuICB9XG5cbiAgZ2V0VmFsdWUoYW5pbWF0ZWQpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB7fTtcbiAgICBlYWNoUHJvcCh0aGlzLnNvdXJjZSwgKHNvdXJjZSwga2V5KSA9PiB7XG4gICAgICBpZiAoaXNBbmltYXRlZChzb3VyY2UpKSB7XG4gICAgICAgIHZhbHVlc1trZXldID0gc291cmNlLmdldFZhbHVlKGFuaW1hdGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzRmx1aWRWYWx1ZShzb3VyY2UpKSB7XG4gICAgICAgIHZhbHVlc1trZXldID0gZ2V0Rmx1aWRWYWx1ZShzb3VyY2UpO1xuICAgICAgfSBlbHNlIGlmICghYW5pbWF0ZWQpIHtcbiAgICAgICAgdmFsdWVzW2tleV0gPSBzb3VyY2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHNldFZhbHVlKHNvdXJjZSkge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMucGF5bG9hZCA9IHRoaXMuX21ha2VQYXlsb2FkKHNvdXJjZSk7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICBpZiAodGhpcy5wYXlsb2FkKSB7XG4gICAgICBlYWNoKHRoaXMucGF5bG9hZCwgbm9kZSA9PiBub2RlLnJlc2V0KCkpO1xuICAgIH1cbiAgfVxuXG4gIF9tYWtlUGF5bG9hZChzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gbmV3IFNldCgpO1xuICAgICAgZWFjaFByb3Aoc291cmNlLCB0aGlzLl9hZGRUb1BheWxvYWQsIHBheWxvYWQpO1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20ocGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgX2FkZFRvUGF5bG9hZChzb3VyY2UpIHtcbiAgICBpZiAoVHJlZUNvbnRleHQuZGVwZW5kZW5jaWVzICYmIGhhc0ZsdWlkVmFsdWUoc291cmNlKSkge1xuICAgICAgVHJlZUNvbnRleHQuZGVwZW5kZW5jaWVzLmFkZChzb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQgPSBnZXRQYXlsb2FkKHNvdXJjZSk7XG5cbiAgICBpZiAocGF5bG9hZCkge1xuICAgICAgZWFjaChwYXlsb2FkLCBub2RlID0+IHRoaXMuYWRkKG5vZGUpKTtcbiAgICB9XG4gIH1cblxufVxuXG5jbGFzcyBBbmltYXRlZEFycmF5IGV4dGVuZHMgQW5pbWF0ZWRPYmplY3Qge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICBzdXBlcihzb3VyY2UpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZShzb3VyY2UpIHtcbiAgICByZXR1cm4gbmV3IEFuaW1hdGVkQXJyYXkoc291cmNlKTtcbiAgfVxuXG4gIGdldFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZS5tYXAobm9kZSA9PiBub2RlLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgc2V0VmFsdWUoc291cmNlKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0UGF5bG9hZCgpO1xuXG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPT0gcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLm1hcCgobm9kZSwgaSkgPT4gbm9kZS5zZXRWYWx1ZShzb3VyY2VbaV0pKS5zb21lKEJvb2xlYW4pO1xuICAgIH1cblxuICAgIHN1cGVyLnNldFZhbHVlKHNvdXJjZS5tYXAobWFrZUFuaW1hdGVkKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxufVxuXG5mdW5jdGlvbiBtYWtlQW5pbWF0ZWQodmFsdWUpIHtcbiAgY29uc3Qgbm9kZVR5cGUgPSBpc0FuaW1hdGVkU3RyaW5nKHZhbHVlKSA/IEFuaW1hdGVkU3RyaW5nIDogQW5pbWF0ZWRWYWx1ZTtcbiAgcmV0dXJuIG5vZGVUeXBlLmNyZWF0ZSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldEFuaW1hdGVkVHlwZSh2YWx1ZSkge1xuICBjb25zdCBwYXJlbnROb2RlID0gZ2V0QW5pbWF0ZWQodmFsdWUpO1xuICByZXR1cm4gcGFyZW50Tm9kZSA/IHBhcmVudE5vZGUuY29uc3RydWN0b3IgOiBpcy5hcnIodmFsdWUpID8gQW5pbWF0ZWRBcnJheSA6IGlzQW5pbWF0ZWRTdHJpbmcodmFsdWUpID8gQW5pbWF0ZWRTdHJpbmcgOiBBbmltYXRlZFZhbHVlO1xufVxuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5jb25zdCB3aXRoQW5pbWF0ZWQgPSAoQ29tcG9uZW50LCBob3N0KSA9PiB7XG4gIGNvbnN0IGhhc0luc3RhbmNlID0gIWlzLmZ1bihDb21wb25lbnQpIHx8IENvbXBvbmVudC5wcm90b3R5cGUgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50O1xuICByZXR1cm4gZm9yd2FyZFJlZigoZ2l2ZW5Qcm9wcywgZ2l2ZW5SZWYpID0+IHtcbiAgICBjb25zdCBpbnN0YW5jZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCByZWYgPSBoYXNJbnN0YW5jZSAmJiB1c2VDYWxsYmFjayh2YWx1ZSA9PiB7XG4gICAgICBpbnN0YW5jZVJlZi5jdXJyZW50ID0gdXBkYXRlUmVmKGdpdmVuUmVmLCB2YWx1ZSk7XG4gICAgfSwgW2dpdmVuUmVmXSk7XG4gICAgY29uc3QgW3Byb3BzLCBkZXBzXSA9IGdldEFuaW1hdGVkU3RhdGUoZ2l2ZW5Qcm9wcywgaG9zdCk7XG4gICAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpO1xuXG4gICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlUmVmLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChoYXNJbnN0YW5jZSAmJiAhaW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaWRVcGRhdGUgPSBpbnN0YW5jZSA/IGhvc3QuYXBwbHlBbmltYXRlZFZhbHVlcyhpbnN0YW5jZSwgcHJvcHMuZ2V0VmFsdWUodHJ1ZSkpIDogZmFsc2U7XG5cbiAgICAgIGlmIChkaWRVcGRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFByb3BzT2JzZXJ2ZXIoY2FsbGJhY2ssIGRlcHMpO1xuICAgIGNvbnN0IG9ic2VydmVyUmVmID0gdXNlUmVmKCk7XG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIG9ic2VydmVyUmVmLmN1cnJlbnQgPSBvYnNlcnZlcjtcbiAgICAgIGVhY2goZGVwcywgZGVwID0+IGFkZEZsdWlkT2JzZXJ2ZXIoZGVwLCBvYnNlcnZlcikpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKG9ic2VydmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBlYWNoKG9ic2VydmVyUmVmLmN1cnJlbnQuZGVwcywgZGVwID0+IHJlbW92ZUZsdWlkT2JzZXJ2ZXIoZGVwLCBvYnNlcnZlclJlZi5jdXJyZW50KSk7XG4gICAgICAgICAgcmFmLmNhbmNlbChvYnNlcnZlclJlZi5jdXJyZW50LnVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdXNlRWZmZWN0KGNhbGxiYWNrLCBbXSk7XG4gICAgdXNlT25jZSgoKSA9PiAoKSA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG9ic2VydmVyUmVmLmN1cnJlbnQ7XG4gICAgICBlYWNoKG9ic2VydmVyLmRlcHMsIGRlcCA9PiByZW1vdmVGbHVpZE9ic2VydmVyKGRlcCwgb2JzZXJ2ZXIpKTtcbiAgICB9KTtcbiAgICBjb25zdCB1c2VkUHJvcHMgPSBob3N0LmdldENvbXBvbmVudFByb3BzKHByb3BzLmdldFZhbHVlKCkpO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIHVzZWRQcm9wcywge1xuICAgICAgcmVmOiByZWZcbiAgICB9KSk7XG4gIH0pO1xufTtcblxuY2xhc3MgUHJvcHNPYnNlcnZlciB7XG4gIGNvbnN0cnVjdG9yKHVwZGF0ZSwgZGVwcykge1xuICAgIHRoaXMudXBkYXRlID0gdXBkYXRlO1xuICAgIHRoaXMuZGVwcyA9IGRlcHM7XG4gIH1cblxuICBldmVudE9ic2VydmVkKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT0gJ2NoYW5nZScpIHtcbiAgICAgIHJhZi53cml0ZSh0aGlzLnVwZGF0ZSk7XG4gICAgfVxuICB9XG5cbn1cblxuZnVuY3Rpb24gZ2V0QW5pbWF0ZWRTdGF0ZShwcm9wcywgaG9zdCkge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgU2V0KCk7XG4gIFRyZWVDb250ZXh0LmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgaWYgKHByb3BzLnN0eWxlKSBwcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHN0eWxlOiBob3N0LmNyZWF0ZUFuaW1hdGVkU3R5bGUocHJvcHMuc3R5bGUpXG4gIH0pO1xuICBwcm9wcyA9IG5ldyBBbmltYXRlZE9iamVjdChwcm9wcyk7XG4gIFRyZWVDb250ZXh0LmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIHJldHVybiBbcHJvcHMsIGRlcGVuZGVuY2llc107XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihyZWYsIHZhbHVlKSB7XG4gIGlmIChyZWYpIHtcbiAgICBpZiAoaXMuZnVuKHJlZikpIHJlZih2YWx1ZSk7ZWxzZSByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5jb25zdCBjYWNoZUtleSA9IFN5bWJvbC5mb3IoJ0FuaW1hdGVkQ29tcG9uZW50Jyk7XG5jb25zdCBjcmVhdGVIb3N0ID0gKGNvbXBvbmVudHMsIHtcbiAgYXBwbHlBbmltYXRlZFZhbHVlczogX2FwcGx5QW5pbWF0ZWRWYWx1ZXMgPSAoKSA9PiBmYWxzZSxcbiAgY3JlYXRlQW5pbWF0ZWRTdHlsZTogX2NyZWF0ZUFuaW1hdGVkU3R5bGUgPSBzdHlsZSA9PiBuZXcgQW5pbWF0ZWRPYmplY3Qoc3R5bGUpLFxuICBnZXRDb21wb25lbnRQcm9wczogX2dldENvbXBvbmVudFByb3BzID0gcHJvcHMgPT4gcHJvcHNcbn0gPSB7fSkgPT4ge1xuICBjb25zdCBob3N0Q29uZmlnID0ge1xuICAgIGFwcGx5QW5pbWF0ZWRWYWx1ZXM6IF9hcHBseUFuaW1hdGVkVmFsdWVzLFxuICAgIGNyZWF0ZUFuaW1hdGVkU3R5bGU6IF9jcmVhdGVBbmltYXRlZFN0eWxlLFxuICAgIGdldENvbXBvbmVudFByb3BzOiBfZ2V0Q29tcG9uZW50UHJvcHNcbiAgfTtcblxuICBjb25zdCBhbmltYXRlZCA9IENvbXBvbmVudCA9PiB7XG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShDb21wb25lbnQpIHx8ICdBbm9ueW1vdXMnO1xuXG4gICAgaWYgKGlzLnN0cihDb21wb25lbnQpKSB7XG4gICAgICBDb21wb25lbnQgPSBhbmltYXRlZFtDb21wb25lbnRdIHx8IChhbmltYXRlZFtDb21wb25lbnRdID0gd2l0aEFuaW1hdGVkKENvbXBvbmVudCwgaG9zdENvbmZpZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBDb21wb25lbnQgPSBDb21wb25lbnRbY2FjaGVLZXldIHx8IChDb21wb25lbnRbY2FjaGVLZXldID0gd2l0aEFuaW1hdGVkKENvbXBvbmVudCwgaG9zdENvbmZpZykpO1xuICAgIH1cblxuICAgIENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IGBBbmltYXRlZCgke2Rpc3BsYXlOYW1lfSlgO1xuICAgIHJldHVybiBDb21wb25lbnQ7XG4gIH07XG5cbiAgZWFjaFByb3AoY29tcG9uZW50cywgKENvbXBvbmVudCwga2V5KSA9PiB7XG4gICAgaWYgKGlzLmFycihjb21wb25lbnRzKSkge1xuICAgICAga2V5ID0gZ2V0RGlzcGxheU5hbWUoQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBhbmltYXRlZFtrZXldID0gYW5pbWF0ZWQoQ29tcG9uZW50KTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgYW5pbWF0ZWRcbiAgfTtcbn07XG5cbmNvbnN0IGdldERpc3BsYXlOYW1lID0gYXJnID0+IGlzLnN0cihhcmcpID8gYXJnIDogYXJnICYmIGlzLnN0cihhcmcuZGlzcGxheU5hbWUpID8gYXJnLmRpc3BsYXlOYW1lIDogaXMuZnVuKGFyZykgJiYgYXJnLm5hbWUgfHwgbnVsbDtcblxuZXhwb3J0IHsgQW5pbWF0ZWQsIEFuaW1hdGVkQXJyYXksIEFuaW1hdGVkT2JqZWN0LCBBbmltYXRlZFN0cmluZywgQW5pbWF0ZWRWYWx1ZSwgY3JlYXRlSG9zdCwgZ2V0QW5pbWF0ZWQsIGdldEFuaW1hdGVkVHlwZSwgZ2V0UGF5bG9hZCwgaXNBbmltYXRlZCwgc2V0QW5pbWF0ZWQgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1314\n')},4928:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Globals\": () => (/* reexport safe */ _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.OH),\n/* harmony export */ \"Transition\": () => (/* binding */ Transition)\n/* harmony export */ });\n/* unused harmony exports BailSignal, Controller, FrameValue, Interpolation, Spring, SpringContext, SpringRef, SpringValue, Trail, config, easings, inferTo, interpolate, to, update, useChain, useSpring, useSpringRef, useSprings, useTrail, useTransition */\n/* harmony import */ var _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4813);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7363);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _react_spring_animated__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1314);\n\n\n\n\n\n\n\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction callProp(value, ...args) {\n return _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(value) ? value(...args) : value;\n}\nconst matchProp = (value, key) => value === true || !!(key && value && (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(value) ? value(key) : (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(value).includes(key)));\nconst resolveProp = (prop, key) => _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(prop) ? key && prop[key] : prop;\nconst getDefaultProp = (props, key) => props.default === true ? props[key] : props.default ? props.default[key] : undefined;\n\nconst noopTransform = value => value;\n\nconst getDefaultProps = (props, transform = noopTransform) => {\n let keys = DEFAULT_PROPS;\n\n if (props.default && props.default !== true) {\n props = props.default;\n keys = Object.keys(props);\n }\n\n const defaults = {};\n\n for (const key of keys) {\n const value = transform(props[key], key);\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(value)) {\n defaults[key] = value;\n }\n }\n\n return defaults;\n};\nconst DEFAULT_PROPS = ['config', 'onProps', 'onStart', 'onChange', 'onPause', 'onResume', 'onRest'];\nconst RESERVED_PROPS = {\n config: 1,\n from: 1,\n to: 1,\n ref: 1,\n loop: 1,\n reset: 1,\n pause: 1,\n cancel: 1,\n reverse: 1,\n immediate: 1,\n default: 1,\n delay: 1,\n onProps: 1,\n onStart: 1,\n onChange: 1,\n onPause: 1,\n onResume: 1,\n onRest: 1,\n onResolve: 1,\n items: 1,\n trail: 1,\n sort: 1,\n expires: 1,\n initial: 1,\n enter: 1,\n update: 1,\n leave: 1,\n children: 1,\n onDestroyed: 1,\n keys: 1,\n callId: 1,\n parentId: 1\n};\n\nfunction getForwardProps(props) {\n const forward = {};\n let count = 0;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(props, (value, prop) => {\n if (!RESERVED_PROPS[prop]) {\n forward[prop] = value;\n count++;\n }\n });\n\n if (count) {\n return forward;\n }\n}\n\nfunction inferTo(props) {\n const to = getForwardProps(props);\n\n if (to) {\n const out = {\n to\n };\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(props, (val, key) => key in to || (out[key] = val));\n return out;\n }\n\n return _extends({}, props);\n}\nfunction computeGoal(value) {\n value = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(value);\n return _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(value) ? value.map(computeGoal) : (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isAnimatedString */ .Df)(value) ? _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.createStringInterpolator */ .OH.createStringInterpolator({\n range: [0, 1],\n output: [value, value]\n })(1) : value;\n}\nfunction hasProps(props) {\n for (const _ in props) return true;\n\n return false;\n}\nfunction isAsyncTo(to) {\n return _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(to) || _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(to) && _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(to[0]);\n}\nfunction detachRefs(ctrl, ref) {\n var _ctrl$ref;\n\n (_ctrl$ref = ctrl.ref) == null ? void 0 : _ctrl$ref.delete(ctrl);\n ref == null ? void 0 : ref.delete(ctrl);\n}\nfunction replaceRef(ctrl, ref) {\n if (ref && ctrl.ref !== ref) {\n var _ctrl$ref2;\n\n (_ctrl$ref2 = ctrl.ref) == null ? void 0 : _ctrl$ref2.delete(ctrl);\n ref.add(ctrl);\n ctrl.ref = ref;\n }\n}\n\nfunction useChain(refs, timeSteps, timeFrame = 1000) {\n useLayoutEffect(() => {\n if (timeSteps) {\n let prevDelay = 0;\n each(refs, (ref, i) => {\n const controllers = ref.current;\n\n if (controllers.length) {\n let delay = timeFrame * timeSteps[i];\n if (isNaN(delay)) delay = prevDelay;else prevDelay = delay;\n each(controllers, ctrl => {\n each(ctrl.queue, props => {\n const memoizedDelayProp = props.delay;\n\n props.delay = key => delay + callProp(memoizedDelayProp || 0, key);\n });\n });\n ref.start();\n }\n });\n } else {\n let p = Promise.resolve();\n each(refs, ref => {\n const controllers = ref.current;\n\n if (controllers.length) {\n const queues = controllers.map(ctrl => {\n const q = ctrl.queue;\n ctrl.queue = [];\n return q;\n });\n p = p.then(() => {\n each(controllers, (ctrl, i) => each(queues[i] || [], update => ctrl.queue.push(update)));\n return Promise.all(ref.start());\n });\n }\n });\n }\n });\n}\n\nconst config = {\n default: {\n tension: 170,\n friction: 26\n },\n gentle: {\n tension: 120,\n friction: 14\n },\n wobbly: {\n tension: 180,\n friction: 12\n },\n stiff: {\n tension: 210,\n friction: 20\n },\n slow: {\n tension: 280,\n friction: 60\n },\n molasses: {\n tension: 280,\n friction: 120\n }\n};\nconst c1 = 1.70158;\nconst c2 = c1 * 1.525;\nconst c3 = c1 + 1;\nconst c4 = 2 * Math.PI / 3;\nconst c5 = 2 * Math.PI / 4.5;\n\nconst bounceOut = x => {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n};\n\nconst easings = {\n linear: x => x,\n easeInQuad: x => x * x,\n easeOutQuad: x => 1 - (1 - x) * (1 - x),\n easeInOutQuad: x => x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,\n easeInCubic: x => x * x * x,\n easeOutCubic: x => 1 - Math.pow(1 - x, 3),\n easeInOutCubic: x => x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2,\n easeInQuart: x => x * x * x * x,\n easeOutQuart: x => 1 - Math.pow(1 - x, 4),\n easeInOutQuart: x => x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2,\n easeInQuint: x => x * x * x * x * x,\n easeOutQuint: x => 1 - Math.pow(1 - x, 5),\n easeInOutQuint: x => x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2,\n easeInSine: x => 1 - Math.cos(x * Math.PI / 2),\n easeOutSine: x => Math.sin(x * Math.PI / 2),\n easeInOutSine: x => -(Math.cos(Math.PI * x) - 1) / 2,\n easeInExpo: x => x === 0 ? 0 : Math.pow(2, 10 * x - 10),\n easeOutExpo: x => x === 1 ? 1 : 1 - Math.pow(2, -10 * x),\n easeInOutExpo: x => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? Math.pow(2, 20 * x - 10) / 2 : (2 - Math.pow(2, -20 * x + 10)) / 2,\n easeInCirc: x => 1 - Math.sqrt(1 - Math.pow(x, 2)),\n easeOutCirc: x => Math.sqrt(1 - Math.pow(x - 1, 2)),\n easeInOutCirc: x => x < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2,\n easeInBack: x => c3 * x * x * x - c1 * x * x,\n easeOutBack: x => 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2),\n easeInOutBack: x => x < 0.5 ? Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2) / 2 : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2,\n easeInElastic: x => x === 0 ? 0 : x === 1 ? 1 : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4),\n easeOutElastic: x => x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1,\n easeInOutElastic: x => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2 : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5) / 2 + 1,\n easeInBounce: x => 1 - bounceOut(1 - x),\n easeOutBounce: bounceOut,\n easeInOutBounce: x => x < 0.5 ? (1 - bounceOut(1 - 2 * x)) / 2 : (1 + bounceOut(2 * x - 1)) / 2\n};\n\nconst defaults = _extends({}, config.default, {\n mass: 1,\n damping: 1,\n easing: easings.linear,\n clamp: false\n});\n\nclass AnimationConfig {\n constructor() {\n this.tension = void 0;\n this.friction = void 0;\n this.frequency = void 0;\n this.damping = void 0;\n this.mass = void 0;\n this.velocity = 0;\n this.restVelocity = void 0;\n this.precision = void 0;\n this.progress = void 0;\n this.duration = void 0;\n this.easing = void 0;\n this.clamp = void 0;\n this.bounce = void 0;\n this.decay = void 0;\n this.round = void 0;\n Object.assign(this, defaults);\n }\n\n}\nfunction mergeConfig(config, newConfig, defaultConfig) {\n if (defaultConfig) {\n defaultConfig = _extends({}, defaultConfig);\n sanitizeConfig(defaultConfig, newConfig);\n newConfig = _extends({}, defaultConfig, newConfig);\n }\n\n sanitizeConfig(config, newConfig);\n Object.assign(config, newConfig);\n\n for (const key in defaults) {\n if (config[key] == null) {\n config[key] = defaults[key];\n }\n }\n\n let {\n mass,\n frequency,\n damping\n } = config;\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(frequency)) {\n if (frequency < 0.01) frequency = 0.01;\n if (damping < 0) damping = 0;\n config.tension = Math.pow(2 * Math.PI / frequency, 2) * mass;\n config.friction = 4 * Math.PI * damping * mass / frequency;\n }\n\n return config;\n}\n\nfunction sanitizeConfig(config, props) {\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.decay)) {\n config.duration = undefined;\n } else {\n const isTensionConfig = !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.tension) || !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.friction);\n\n if (isTensionConfig || !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.frequency) || !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.damping) || !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.mass)) {\n config.duration = undefined;\n config.decay = undefined;\n }\n\n if (isTensionConfig) {\n config.frequency = undefined;\n }\n }\n}\n\nconst emptyArray = [];\nclass Animation {\n constructor() {\n this.changed = false;\n this.values = emptyArray;\n this.toValues = null;\n this.fromValues = emptyArray;\n this.to = void 0;\n this.from = void 0;\n this.config = new AnimationConfig();\n this.immediate = false;\n }\n\n}\n\nfunction scheduleProps(callId, {\n key,\n props,\n defaultProps,\n state,\n actions\n}) {\n return new Promise((resolve, reject) => {\n var _props$cancel;\n\n let delay;\n let timeout;\n let cancel = matchProp((_props$cancel = props.cancel) != null ? _props$cancel : defaultProps == null ? void 0 : defaultProps.cancel, key);\n\n if (cancel) {\n onStart();\n } else {\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.pause)) {\n state.paused = matchProp(props.pause, key);\n }\n\n let pause = defaultProps == null ? void 0 : defaultProps.pause;\n\n if (pause !== true) {\n pause = state.paused || matchProp(pause, key);\n }\n\n delay = callProp(props.delay || 0, key);\n\n if (pause) {\n state.resumeQueue.add(onResume);\n actions.pause();\n } else {\n actions.resume();\n onResume();\n }\n }\n\n function onPause() {\n state.resumeQueue.add(onResume);\n state.timeouts.delete(timeout);\n timeout.cancel();\n delay = timeout.time - _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.now */ .Wn.now();\n }\n\n function onResume() {\n if (delay > 0 && !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.skipAnimation */ .OH.skipAnimation) {\n state.delayed = true;\n timeout = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.setTimeout */ .Wn.setTimeout(onStart, delay);\n state.pauseQueue.add(onPause);\n state.timeouts.add(timeout);\n } else {\n onStart();\n }\n }\n\n function onStart() {\n if (state.delayed) {\n state.delayed = false;\n }\n\n state.pauseQueue.delete(onPause);\n state.timeouts.delete(timeout);\n\n if (callId <= (state.cancelId || 0)) {\n cancel = true;\n }\n\n try {\n actions.start(_extends({}, props, {\n callId,\n cancel\n }), resolve);\n } catch (err) {\n reject(err);\n }\n }\n });\n}\n\nconst getCombinedResult = (target, results) => results.length == 1 ? results[0] : results.some(result => result.cancelled) ? getCancelledResult(target.get()) : results.every(result => result.noop) ? getNoopResult(target.get()) : getFinishedResult(target.get(), results.every(result => result.finished));\nconst getNoopResult = value => ({\n value,\n noop: true,\n finished: true,\n cancelled: false\n});\nconst getFinishedResult = (value, finished, cancelled = false) => ({\n value,\n finished,\n cancelled\n});\nconst getCancelledResult = value => ({\n value,\n cancelled: true,\n finished: false\n});\n\nfunction runAsync(to, props, state, target) {\n const {\n callId,\n parentId,\n onRest\n } = props;\n const {\n asyncTo: prevTo,\n promise: prevPromise\n } = state;\n\n if (!parentId && to === prevTo && !props.reset) {\n return prevPromise;\n }\n\n return state.promise = (async () => {\n state.asyncId = callId;\n state.asyncTo = to;\n const defaultProps = getDefaultProps(props, (value, key) => key === 'onRest' ? undefined : value);\n let preventBail;\n let bail;\n const bailPromise = new Promise((resolve, reject) => (preventBail = resolve, bail = reject));\n\n const bailIfEnded = bailSignal => {\n const bailResult = callId <= (state.cancelId || 0) && getCancelledResult(target) || callId !== state.asyncId && getFinishedResult(target, false);\n\n if (bailResult) {\n bailSignal.result = bailResult;\n bail(bailSignal);\n throw bailSignal;\n }\n };\n\n const animate = (arg1, arg2) => {\n const bailSignal = new BailSignal();\n const skipAnimationSignal = new SkipAniamtionSignal();\n return (async () => {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.skipAnimation */ .OH.skipAnimation) {\n stopAsync(state);\n skipAnimationSignal.result = getFinishedResult(target, false);\n bail(skipAnimationSignal);\n throw skipAnimationSignal;\n }\n\n bailIfEnded(bailSignal);\n const props = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(arg1) ? _extends({}, arg1) : _extends({}, arg2, {\n to: arg1\n });\n props.parentId = callId;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(defaultProps, (value, key) => {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props[key])) {\n props[key] = value;\n }\n });\n const result = await target.start(props);\n bailIfEnded(bailSignal);\n\n if (state.paused) {\n await new Promise(resume => {\n state.resumeQueue.add(resume);\n });\n }\n\n return result;\n })();\n };\n\n let result;\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.skipAnimation */ .OH.skipAnimation) {\n stopAsync(state);\n return getFinishedResult(target, false);\n }\n\n try {\n let animating;\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(to)) {\n animating = (async queue => {\n for (const props of queue) {\n await animate(props);\n }\n })(to);\n } else {\n animating = Promise.resolve(to(animate, target.stop.bind(target)));\n }\n\n await Promise.all([animating.then(preventBail), bailPromise]);\n result = getFinishedResult(target.get(), true, false);\n } catch (err) {\n if (err instanceof BailSignal) {\n result = err.result;\n } else if (err instanceof SkipAniamtionSignal) {\n result = err.result;\n } else {\n throw err;\n }\n } finally {\n if (callId == state.asyncId) {\n state.asyncId = parentId;\n state.asyncTo = parentId ? prevTo : undefined;\n state.promise = parentId ? prevPromise : undefined;\n }\n }\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(onRest)) {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.batchedUpdates */ .Wn.batchedUpdates(() => {\n onRest(result, target, target.item);\n });\n }\n\n return result;\n })();\n}\nfunction stopAsync(state, cancelId) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flush */ .yl)(state.timeouts, t => t.cancel());\n state.pauseQueue.clear();\n state.resumeQueue.clear();\n state.asyncId = state.asyncTo = state.promise = undefined;\n if (cancelId) state.cancelId = cancelId;\n}\nclass BailSignal extends Error {\n constructor() {\n super('An async animation has been interrupted. You see this error because you ' + 'forgot to use `await` or `.catch(...)` on its returned promise.');\n this.result = void 0;\n }\n\n}\nclass SkipAniamtionSignal extends Error {\n constructor() {\n super('SkipAnimationSignal');\n this.result = void 0;\n }\n\n}\n\nconst isFrameValue = value => value instanceof FrameValue;\nlet nextId$1 = 1;\nclass FrameValue extends _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .FluidValue */ .B0 {\n constructor(...args) {\n super(...args);\n this.id = nextId$1++;\n this.key = void 0;\n this._priority = 0;\n }\n\n get priority() {\n return this._priority;\n }\n\n set priority(priority) {\n if (this._priority != priority) {\n this._priority = priority;\n\n this._onPriorityChange(priority);\n }\n }\n\n get() {\n const node = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this);\n return node && node.getValue();\n }\n\n to(...args) {\n return _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.to */ .OH.to(this, args);\n }\n\n interpolate(...args) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .deprecateInterpolate */ .LW)();\n return _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.to */ .OH.to(this, args);\n }\n\n toJSON() {\n return this.get();\n }\n\n observerAdded(count) {\n if (count == 1) this._attach();\n }\n\n observerRemoved(count) {\n if (count == 0) this._detach();\n }\n\n _attach() {}\n\n _detach() {}\n\n _onChange(value, idle = false) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .callFluidObservers */ .k0)(this, {\n type: 'change',\n parent: this,\n value,\n idle\n });\n }\n\n _onPriorityChange(priority) {\n if (!this.idle) {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .frameLoop.sort */ .fT.sort(this);\n }\n\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .callFluidObservers */ .k0)(this, {\n type: 'priority',\n parent: this,\n priority\n });\n }\n\n}\n\nconst $P = Symbol.for('SpringPhase');\nconst HAS_ANIMATED = 1;\nconst IS_ANIMATING = 2;\nconst IS_PAUSED = 4;\nconst hasAnimated = target => (target[$P] & HAS_ANIMATED) > 0;\nconst isAnimating = target => (target[$P] & IS_ANIMATING) > 0;\nconst isPaused = target => (target[$P] & IS_PAUSED) > 0;\nconst setActiveBit = (target, active) => active ? target[$P] |= IS_ANIMATING | HAS_ANIMATED : target[$P] &= ~IS_ANIMATING;\nconst setPausedBit = (target, paused) => paused ? target[$P] |= IS_PAUSED : target[$P] &= ~IS_PAUSED;\n\nclass SpringValue extends FrameValue {\n constructor(arg1, arg2) {\n super();\n this.key = void 0;\n this.animation = new Animation();\n this.queue = void 0;\n this.defaultProps = {};\n this._state = {\n paused: false,\n delayed: false,\n pauseQueue: new Set(),\n resumeQueue: new Set(),\n timeouts: new Set()\n };\n this._pendingCalls = new Set();\n this._lastCallId = 0;\n this._lastToId = 0;\n this._memoizedDuration = 0;\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(arg1) || !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(arg2)) {\n const props = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(arg1) ? _extends({}, arg1) : _extends({}, arg2, {\n from: arg1\n });\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.default)) {\n props.default = true;\n }\n\n this.start(props);\n }\n }\n\n get idle() {\n return !(isAnimating(this) || this._state.asyncTo) || isPaused(this);\n }\n\n get goal() {\n return (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(this.animation.to);\n }\n\n get velocity() {\n const node = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this);\n return node instanceof _react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .AnimatedValue */ .iG ? node.lastVelocity || 0 : node.getPayload().map(node => node.lastVelocity || 0);\n }\n\n get hasAnimated() {\n return hasAnimated(this);\n }\n\n get isAnimating() {\n return isAnimating(this);\n }\n\n get isPaused() {\n return isPaused(this);\n }\n\n get isDelayed() {\n return this._state.delayed;\n }\n\n advance(dt) {\n let idle = true;\n let changed = false;\n const anim = this.animation;\n let {\n config,\n toValues\n } = anim;\n const payload = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getPayload */ .He)(anim.to);\n\n if (!payload && (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(anim.to)) {\n toValues = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(anim.to));\n }\n\n anim.values.forEach((node, i) => {\n if (node.done) return;\n const to = node.constructor == _react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .AnimatedString */ .eC ? 1 : payload ? payload[i].lastPosition : toValues[i];\n let finished = anim.immediate;\n let position = to;\n\n if (!finished) {\n position = node.lastPosition;\n\n if (config.tension <= 0) {\n node.done = true;\n return;\n }\n\n let elapsed = node.elapsedTime += dt;\n const from = anim.fromValues[i];\n const v0 = node.v0 != null ? node.v0 : node.v0 = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(config.velocity) ? config.velocity[i] : config.velocity;\n let velocity;\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(config.duration)) {\n let p = 1;\n\n if (config.duration > 0) {\n if (this._memoizedDuration !== config.duration) {\n this._memoizedDuration = config.duration;\n\n if (node.durationProgress > 0) {\n node.elapsedTime = config.duration * node.durationProgress;\n elapsed = node.elapsedTime += dt;\n }\n }\n\n p = (config.progress || 0) + elapsed / this._memoizedDuration;\n p = p > 1 ? 1 : p < 0 ? 0 : p;\n node.durationProgress = p;\n }\n\n position = from + config.easing(p) * (to - from);\n velocity = (position - node.lastPosition) / dt;\n finished = p == 1;\n } else if (config.decay) {\n const decay = config.decay === true ? 0.998 : config.decay;\n const e = Math.exp(-(1 - decay) * elapsed);\n position = from + v0 / (1 - decay) * (1 - e);\n finished = Math.abs(node.lastPosition - position) < 0.1;\n velocity = v0 * e;\n } else {\n velocity = node.lastVelocity == null ? v0 : node.lastVelocity;\n const precision = config.precision || (from == to ? 0.005 : Math.min(1, Math.abs(to - from) * 0.001));\n const restVelocity = config.restVelocity || precision / 10;\n const bounceFactor = config.clamp ? 0 : config.bounce;\n const canBounce = !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(bounceFactor);\n const isGrowing = from == to ? node.v0 > 0 : from < to;\n let isMoving;\n let isBouncing = false;\n const step = 1;\n const numSteps = Math.ceil(dt / step);\n\n for (let n = 0; n < numSteps; ++n) {\n isMoving = Math.abs(velocity) > restVelocity;\n\n if (!isMoving) {\n finished = Math.abs(to - position) <= precision;\n\n if (finished) {\n break;\n }\n }\n\n if (canBounce) {\n isBouncing = position == to || position > to == isGrowing;\n\n if (isBouncing) {\n velocity = -velocity * bounceFactor;\n position = to;\n }\n }\n\n const springForce = -config.tension * 0.000001 * (position - to);\n const dampingForce = -config.friction * 0.001 * velocity;\n const acceleration = (springForce + dampingForce) / config.mass;\n velocity = velocity + acceleration * step;\n position = position + velocity * step;\n }\n }\n\n node.lastVelocity = velocity;\n\n if (Number.isNaN(position)) {\n console.warn(`Got NaN while animating:`, this);\n finished = true;\n }\n }\n\n if (payload && !payload[i].done) {\n finished = false;\n }\n\n if (finished) {\n node.done = true;\n } else {\n idle = false;\n }\n\n if (node.setValue(position, config.round)) {\n changed = true;\n }\n });\n const node = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this);\n const currVal = node.getValue();\n\n if (idle) {\n const finalVal = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(anim.to);\n\n if ((currVal !== finalVal || changed) && !config.decay) {\n node.setValue(finalVal);\n\n this._onChange(finalVal);\n } else if (changed && config.decay) {\n this._onChange(currVal);\n }\n\n this._stop();\n } else if (changed) {\n this._onChange(currVal);\n }\n }\n\n set(value) {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.batchedUpdates */ .Wn.batchedUpdates(() => {\n this._stop();\n\n this._focus(value);\n\n this._set(value);\n });\n return this;\n }\n\n pause() {\n this._update({\n pause: true\n });\n }\n\n resume() {\n this._update({\n pause: false\n });\n }\n\n finish() {\n if (isAnimating(this)) {\n const {\n to,\n config\n } = this.animation;\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.batchedUpdates */ .Wn.batchedUpdates(() => {\n this._onStart();\n\n if (!config.decay) {\n this._set(to, false);\n }\n\n this._stop();\n });\n }\n\n return this;\n }\n\n update(props) {\n const queue = this.queue || (this.queue = []);\n queue.push(props);\n return this;\n }\n\n start(to, arg2) {\n let queue;\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(to)) {\n queue = [_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(to) ? to : _extends({}, arg2, {\n to\n })];\n } else {\n queue = this.queue || [];\n this.queue = [];\n }\n\n return Promise.all(queue.map(props => {\n const up = this._update(props);\n\n return up;\n })).then(results => getCombinedResult(this, results));\n }\n\n stop(cancel) {\n const {\n to\n } = this.animation;\n\n this._focus(this.get());\n\n stopAsync(this._state, cancel && this._lastCallId);\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.batchedUpdates */ .Wn.batchedUpdates(() => this._stop(to, cancel));\n return this;\n }\n\n reset() {\n this._update({\n reset: true\n });\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n this._start();\n } else if (event.type == 'priority') {\n this.priority = event.priority + 1;\n }\n }\n\n _prepareNode(props) {\n const key = this.key || '';\n let {\n to,\n from\n } = props;\n to = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(to) ? to[key] : to;\n\n if (to == null || isAsyncTo(to)) {\n to = undefined;\n }\n\n from = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(from) ? from[key] : from;\n\n if (from == null) {\n from = undefined;\n }\n\n const range = {\n to,\n from\n };\n\n if (!hasAnimated(this)) {\n if (props.reverse) [to, from] = [from, to];\n from = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(from);\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(from)) {\n this._set(from);\n } else if (!(0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this)) {\n this._set(to);\n }\n }\n\n return range;\n }\n\n _update(_ref, isLoop) {\n let props = _extends({}, _ref);\n\n const {\n key,\n defaultProps\n } = this;\n if (props.default) Object.assign(defaultProps, getDefaultProps(props, (value, prop) => /^on/.test(prop) ? resolveProp(value, key) : value));\n mergeActiveFn(this, props, 'onProps');\n sendEvent(this, 'onProps', props, this);\n\n const range = this._prepareNode(props);\n\n if (Object.isFrozen(this)) {\n throw Error('Cannot animate a `SpringValue` object that is frozen. ' + 'Did you forget to pass your component to `animated(...)` before animating its props?');\n }\n\n const state = this._state;\n return scheduleProps(++this._lastCallId, {\n key,\n props,\n defaultProps,\n state,\n actions: {\n pause: () => {\n if (!isPaused(this)) {\n setPausedBit(this, true);\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flushCalls */ .bl)(state.pauseQueue);\n sendEvent(this, 'onPause', getFinishedResult(this, checkFinished(this, this.animation.to)), this);\n }\n },\n resume: () => {\n if (isPaused(this)) {\n setPausedBit(this, false);\n\n if (isAnimating(this)) {\n this._resume();\n }\n\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flushCalls */ .bl)(state.resumeQueue);\n sendEvent(this, 'onResume', getFinishedResult(this, checkFinished(this, this.animation.to)), this);\n }\n },\n start: this._merge.bind(this, range)\n }\n }).then(result => {\n if (props.loop && result.finished && !(isLoop && result.noop)) {\n const nextProps = createLoopUpdate(props);\n\n if (nextProps) {\n return this._update(nextProps, true);\n }\n }\n\n return result;\n });\n }\n\n _merge(range, props, resolve) {\n if (props.cancel) {\n this.stop(true);\n return resolve(getCancelledResult(this));\n }\n\n const hasToProp = !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(range.to);\n const hasFromProp = !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(range.from);\n\n if (hasToProp || hasFromProp) {\n if (props.callId > this._lastToId) {\n this._lastToId = props.callId;\n } else {\n return resolve(getCancelledResult(this));\n }\n }\n\n const {\n key,\n defaultProps,\n animation: anim\n } = this;\n const {\n to: prevTo,\n from: prevFrom\n } = anim;\n let {\n to = prevTo,\n from = prevFrom\n } = range;\n\n if (hasFromProp && !hasToProp && (!props.default || _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(to))) {\n to = from;\n }\n\n if (props.reverse) [to, from] = [from, to];\n const hasFromChanged = !(0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(from, prevFrom);\n\n if (hasFromChanged) {\n anim.from = from;\n }\n\n from = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(from);\n const hasToChanged = !(0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(to, prevTo);\n\n if (hasToChanged) {\n this._focus(to);\n }\n\n const hasAsyncTo = isAsyncTo(props.to);\n const {\n config\n } = anim;\n const {\n decay,\n velocity\n } = config;\n\n if (hasToProp || hasFromProp) {\n config.velocity = 0;\n }\n\n if (props.config && !hasAsyncTo) {\n mergeConfig(config, callProp(props.config, key), props.config !== defaultProps.config ? callProp(defaultProps.config, key) : void 0);\n }\n\n let node = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this);\n\n if (!node || _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(to)) {\n return resolve(getFinishedResult(this, true));\n }\n\n const reset = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.reset) ? hasFromProp && !props.default : !_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(from) && matchProp(props.reset, key);\n const value = reset ? from : this.get();\n const goal = computeGoal(to);\n const isAnimatable = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.num(goal) || _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(goal) || (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isAnimatedString */ .Df)(goal);\n const immediate = !hasAsyncTo && (!isAnimatable || matchProp(defaultProps.immediate || props.immediate, key));\n\n if (hasToChanged) {\n const nodeType = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimatedType */ .sb)(to);\n\n if (nodeType !== node.constructor) {\n if (immediate) {\n node = this._set(goal);\n } else throw Error(`Cannot animate between ${node.constructor.name} and ${nodeType.name}, as the \"to\" prop suggests`);\n }\n }\n\n const goalType = node.constructor;\n let started = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(to);\n let finished = false;\n\n if (!started) {\n const hasValueChanged = reset || !hasAnimated(this) && hasFromChanged;\n\n if (hasToChanged || hasValueChanged) {\n finished = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(computeGoal(value), goal);\n started = !finished;\n }\n\n if (!(0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(anim.immediate, immediate) && !immediate || !(0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(config.decay, decay) || !(0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(config.velocity, velocity)) {\n started = true;\n }\n }\n\n if (finished && isAnimating(this)) {\n if (anim.changed && !reset) {\n started = true;\n } else if (!started) {\n this._stop(prevTo);\n }\n }\n\n if (!hasAsyncTo) {\n if (started || (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(prevTo)) {\n anim.values = node.getPayload();\n anim.toValues = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(to) ? null : goalType == _react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .AnimatedString */ .eC ? [1] : (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(goal);\n }\n\n if (anim.immediate != immediate) {\n anim.immediate = immediate;\n\n if (!immediate && !reset) {\n this._set(prevTo);\n }\n }\n\n if (started) {\n const {\n onRest\n } = anim;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(ACTIVE_EVENTS, type => mergeActiveFn(this, props, type));\n const result = getFinishedResult(this, checkFinished(this, prevTo));\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flushCalls */ .bl)(this._pendingCalls, result);\n\n this._pendingCalls.add(resolve);\n\n if (anim.changed) _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.batchedUpdates */ .Wn.batchedUpdates(() => {\n anim.changed = !reset;\n onRest == null ? void 0 : onRest(result, this);\n\n if (reset) {\n callProp(defaultProps.onRest, result);\n } else {\n anim.onStart == null ? void 0 : anim.onStart(result, this);\n }\n });\n }\n }\n\n if (reset) {\n this._set(value);\n }\n\n if (hasAsyncTo) {\n resolve(runAsync(props.to, props, this._state, this));\n } else if (started) {\n this._start();\n } else if (isAnimating(this) && !hasToChanged) {\n this._pendingCalls.add(resolve);\n } else {\n resolve(getNoopResult(value));\n }\n }\n\n _focus(value) {\n const anim = this.animation;\n\n if (value !== anim.to) {\n if ((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidObservers */ .Ll)(this)) {\n this._detach();\n }\n\n anim.to = value;\n\n if ((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidObservers */ .Ll)(this)) {\n this._attach();\n }\n }\n }\n\n _attach() {\n let priority = 0;\n const {\n to\n } = this.animation;\n\n if ((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(to)) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .addFluidObserver */ .UI)(to, this);\n\n if (isFrameValue(to)) {\n priority = to.priority + 1;\n }\n }\n\n this.priority = priority;\n }\n\n _detach() {\n const {\n to\n } = this.animation;\n\n if ((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(to)) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .removeFluidObserver */ .iL)(to, this);\n }\n }\n\n _set(arg, idle = true) {\n const value = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(arg);\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(value)) {\n const oldNode = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this);\n\n if (!oldNode || !(0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(value, oldNode.getValue())) {\n const nodeType = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimatedType */ .sb)(value);\n\n if (!oldNode || oldNode.constructor != nodeType) {\n (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .setAnimated */ .f3)(this, nodeType.create(value));\n } else {\n oldNode.setValue(value);\n }\n\n if (oldNode) {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.batchedUpdates */ .Wn.batchedUpdates(() => {\n this._onChange(value, idle);\n });\n }\n }\n }\n\n return (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this);\n }\n\n _onStart() {\n const anim = this.animation;\n\n if (!anim.changed) {\n anim.changed = true;\n sendEvent(this, 'onStart', getFinishedResult(this, checkFinished(this, anim.to)), this);\n }\n }\n\n _onChange(value, idle) {\n if (!idle) {\n this._onStart();\n\n callProp(this.animation.onChange, value, this);\n }\n\n callProp(this.defaultProps.onChange, value, this);\n\n super._onChange(value, idle);\n }\n\n _start() {\n const anim = this.animation;\n (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this).reset((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(anim.to));\n\n if (!anim.immediate) {\n anim.fromValues = anim.values.map(node => node.lastPosition);\n }\n\n if (!isAnimating(this)) {\n setActiveBit(this, true);\n\n if (!isPaused(this)) {\n this._resume();\n }\n }\n }\n\n _resume() {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.skipAnimation */ .OH.skipAnimation) {\n this.finish();\n } else {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .frameLoop.start */ .fT.start(this);\n }\n }\n\n _stop(goal, cancel) {\n if (isAnimating(this)) {\n setActiveBit(this, false);\n const anim = this.animation;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(anim.values, node => {\n node.done = true;\n });\n\n if (anim.toValues) {\n anim.onChange = anim.onPause = anim.onResume = undefined;\n }\n\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .callFluidObservers */ .k0)(this, {\n type: 'idle',\n parent: this\n });\n const result = cancel ? getCancelledResult(this.get()) : getFinishedResult(this.get(), checkFinished(this, goal != null ? goal : anim.to));\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flushCalls */ .bl)(this._pendingCalls, result);\n\n if (anim.changed) {\n anim.changed = false;\n sendEvent(this, 'onRest', result, this);\n }\n }\n }\n\n}\n\nfunction checkFinished(target, to) {\n const goal = computeGoal(to);\n const value = computeGoal(target.get());\n return (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(value, goal);\n}\n\nfunction createLoopUpdate(props, loop = props.loop, to = props.to) {\n let loopRet = callProp(loop);\n\n if (loopRet) {\n const overrides = loopRet !== true && inferTo(loopRet);\n const reverse = (overrides || props).reverse;\n const reset = !overrides || overrides.reset;\n return createUpdate(_extends({}, props, {\n loop,\n default: false,\n pause: undefined,\n to: !reverse || isAsyncTo(to) ? to : undefined,\n from: reset ? props.from : undefined,\n reset\n }, overrides));\n }\n}\nfunction createUpdate(props) {\n const {\n to,\n from\n } = props = inferTo(props);\n const keys = new Set();\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(to)) findDefined(to, keys);\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(from)) findDefined(from, keys);\n props.keys = keys.size ? Array.from(keys) : null;\n return props;\n}\nfunction declareUpdate(props) {\n const update = createUpdate(props);\n\n if (is.und(update.default)) {\n update.default = getDefaultProps(update);\n }\n\n return update;\n}\n\nfunction findDefined(values, keys) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(values, (value, key) => value != null && keys.add(key));\n}\n\nconst ACTIVE_EVENTS = ['onStart', 'onRest', 'onChange', 'onPause', 'onResume'];\n\nfunction mergeActiveFn(target, props, type) {\n target.animation[type] = props[type] !== getDefaultProp(props, type) ? resolveProp(props[type], target.key) : undefined;\n}\n\nfunction sendEvent(target, type, ...args) {\n var _target$animation$typ, _target$animation, _target$defaultProps$, _target$defaultProps;\n\n (_target$animation$typ = (_target$animation = target.animation)[type]) == null ? void 0 : _target$animation$typ.call(_target$animation, ...args);\n (_target$defaultProps$ = (_target$defaultProps = target.defaultProps)[type]) == null ? void 0 : _target$defaultProps$.call(_target$defaultProps, ...args);\n}\n\nconst BATCHED_EVENTS = ['onStart', 'onChange', 'onRest'];\nlet nextId = 1;\nclass Controller {\n constructor(props, flush) {\n this.id = nextId++;\n this.springs = {};\n this.queue = [];\n this.ref = void 0;\n this._flush = void 0;\n this._initialProps = void 0;\n this._lastAsyncId = 0;\n this._active = new Set();\n this._changed = new Set();\n this._started = false;\n this._item = void 0;\n this._state = {\n paused: false,\n pauseQueue: new Set(),\n resumeQueue: new Set(),\n timeouts: new Set()\n };\n this._events = {\n onStart: new Map(),\n onChange: new Map(),\n onRest: new Map()\n };\n this._onFrame = this._onFrame.bind(this);\n\n if (flush) {\n this._flush = flush;\n }\n\n if (props) {\n this.start(_extends({\n default: true\n }, props));\n }\n }\n\n get idle() {\n return !this._state.asyncTo && Object.values(this.springs).every(spring => {\n return spring.idle && !spring.isDelayed && !spring.isPaused;\n });\n }\n\n get item() {\n return this._item;\n }\n\n set item(item) {\n this._item = item;\n }\n\n get() {\n const values = {};\n this.each((spring, key) => values[key] = spring.get());\n return values;\n }\n\n set(values) {\n for (const key in values) {\n const value = values[key];\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(value)) {\n this.springs[key].set(value);\n }\n }\n }\n\n update(props) {\n if (props) {\n this.queue.push(createUpdate(props));\n }\n\n return this;\n }\n\n start(props) {\n let {\n queue\n } = this;\n\n if (props) {\n queue = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(props).map(createUpdate);\n } else {\n this.queue = [];\n }\n\n if (this._flush) {\n return this._flush(this, queue);\n }\n\n prepareKeys(this, queue);\n return flushUpdateQueue(this, queue);\n }\n\n stop(arg, keys) {\n if (arg !== !!arg) {\n keys = arg;\n }\n\n if (keys) {\n const springs = this.springs;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(keys), key => springs[key].stop(!!arg));\n } else {\n stopAsync(this._state, this._lastAsyncId);\n this.each(spring => spring.stop(!!arg));\n }\n\n return this;\n }\n\n pause(keys) {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(keys)) {\n this.start({\n pause: true\n });\n } else {\n const springs = this.springs;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(keys), key => springs[key].pause());\n }\n\n return this;\n }\n\n resume(keys) {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(keys)) {\n this.start({\n pause: false\n });\n } else {\n const springs = this.springs;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(keys), key => springs[key].resume());\n }\n\n return this;\n }\n\n each(iterator) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(this.springs, iterator);\n }\n\n _onFrame() {\n const {\n onStart,\n onChange,\n onRest\n } = this._events;\n const active = this._active.size > 0;\n const changed = this._changed.size > 0;\n\n if (active && !this._started || changed && !this._started) {\n this._started = true;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flush */ .yl)(onStart, ([onStart, result]) => {\n result.value = this.get();\n onStart(result, this, this._item);\n });\n }\n\n const idle = !active && this._started;\n const values = changed || idle && onRest.size ? this.get() : null;\n\n if (changed && onChange.size) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flush */ .yl)(onChange, ([onChange, result]) => {\n result.value = values;\n onChange(result, this, this._item);\n });\n }\n\n if (idle) {\n this._started = false;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flush */ .yl)(onRest, ([onRest, result]) => {\n result.value = values;\n onRest(result, this, this._item);\n });\n }\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n this._changed.add(event.parent);\n\n if (!event.idle) {\n this._active.add(event.parent);\n }\n } else if (event.type == 'idle') {\n this._active.delete(event.parent);\n } else return;\n\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.onFrame */ .Wn.onFrame(this._onFrame);\n }\n\n}\nfunction flushUpdateQueue(ctrl, queue) {\n return Promise.all(queue.map(props => flushUpdate(ctrl, props))).then(results => getCombinedResult(ctrl, results));\n}\nasync function flushUpdate(ctrl, props, isLoop) {\n const {\n keys,\n to,\n from,\n loop,\n onRest,\n onResolve\n } = props;\n const defaults = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(props.default) && props.default;\n\n if (loop) {\n props.loop = false;\n }\n\n if (to === false) props.to = null;\n if (from === false) props.from = null;\n const asyncTo = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(to) || _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(to) ? to : undefined;\n\n if (asyncTo) {\n props.to = undefined;\n props.onRest = undefined;\n\n if (defaults) {\n defaults.onRest = undefined;\n }\n } else {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(BATCHED_EVENTS, key => {\n const handler = props[key];\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(handler)) {\n const queue = ctrl['_events'][key];\n\n props[key] = ({\n finished,\n cancelled\n }) => {\n const result = queue.get(handler);\n\n if (result) {\n if (!finished) result.finished = false;\n if (cancelled) result.cancelled = true;\n } else {\n queue.set(handler, {\n value: null,\n finished: finished || false,\n cancelled: cancelled || false\n });\n }\n };\n\n if (defaults) {\n defaults[key] = props[key];\n }\n }\n });\n }\n\n const state = ctrl['_state'];\n\n if (props.pause === !state.paused) {\n state.paused = props.pause;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .flushCalls */ .bl)(props.pause ? state.pauseQueue : state.resumeQueue);\n } else if (state.paused) {\n props.pause = true;\n }\n\n const promises = (keys || Object.keys(ctrl.springs)).map(key => ctrl.springs[key].start(props));\n const cancel = props.cancel === true || getDefaultProp(props, 'cancel') === true;\n\n if (asyncTo || cancel && state.asyncId) {\n promises.push(scheduleProps(++ctrl['_lastAsyncId'], {\n props,\n state,\n actions: {\n pause: _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .noop */ .ZT,\n resume: _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .noop */ .ZT,\n\n start(props, resolve) {\n if (cancel) {\n stopAsync(state, ctrl['_lastAsyncId']);\n resolve(getCancelledResult(ctrl));\n } else {\n props.onRest = onRest;\n resolve(runAsync(asyncTo, props, state, ctrl));\n }\n }\n\n }\n }));\n }\n\n if (state.paused) {\n await new Promise(resume => {\n state.resumeQueue.add(resume);\n });\n }\n\n const result = getCombinedResult(ctrl, await Promise.all(promises));\n\n if (loop && result.finished && !(isLoop && result.noop)) {\n const nextProps = createLoopUpdate(props, loop, to);\n\n if (nextProps) {\n prepareKeys(ctrl, [nextProps]);\n return flushUpdate(ctrl, nextProps, true);\n }\n }\n\n if (onResolve) {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.batchedUpdates */ .Wn.batchedUpdates(() => onResolve(result, ctrl, ctrl.item));\n }\n\n return result;\n}\nfunction getSprings(ctrl, props) {\n const springs = _extends({}, ctrl.springs);\n\n if (props) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(props), props => {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props.keys)) {\n props = createUpdate(props);\n }\n\n if (!_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(props.to)) {\n props = _extends({}, props, {\n to: undefined\n });\n }\n\n prepareSprings(springs, props, key => {\n return createSpring(key);\n });\n });\n }\n\n setSprings(ctrl, springs);\n return springs;\n}\nfunction setSprings(ctrl, springs) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .eachProp */ .rU)(springs, (spring, key) => {\n if (!ctrl.springs[key]) {\n ctrl.springs[key] = spring;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .addFluidObserver */ .UI)(spring, ctrl);\n }\n });\n}\n\nfunction createSpring(key, observer) {\n const spring = new SpringValue();\n spring.key = key;\n\n if (observer) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .addFluidObserver */ .UI)(spring, observer);\n }\n\n return spring;\n}\n\nfunction prepareSprings(springs, props, create) {\n if (props.keys) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(props.keys, key => {\n const spring = springs[key] || (springs[key] = create(key));\n spring['_prepareNode'](props);\n });\n }\n}\n\nfunction prepareKeys(ctrl, queue) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(queue, props => {\n prepareSprings(ctrl.springs, props, key => {\n return createSpring(key, ctrl);\n });\n });\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nconst _excluded$3 = [\"children\"];\nconst SpringContext = _ref => {\n let {\n children\n } = _ref,\n props = _objectWithoutPropertiesLoose(_ref, _excluded$3);\n\n const inherited = (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ctx);\n const pause = props.pause || !!inherited.pause,\n immediate = props.immediate || !!inherited.immediate;\n props = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useMemoOne */ .Pr)(() => ({\n pause,\n immediate\n }), [pause, immediate]);\n const {\n Provider\n } = ctx;\n return react__WEBPACK_IMPORTED_MODULE_1__.createElement(Provider, {\n value: props\n }, children);\n};\nconst ctx = makeContext(SpringContext, {});\nSpringContext.Provider = ctx.Provider;\nSpringContext.Consumer = ctx.Consumer;\n\nfunction makeContext(target, init) {\n Object.assign(target, react__WEBPACK_IMPORTED_MODULE_1__.createContext(init));\n target.Provider._context = target;\n target.Consumer._context = target;\n return target;\n}\n\nconst SpringRef = () => {\n const current = [];\n\n const SpringRef = function SpringRef(props) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .deprecateDirectCall */ .ZR)();\n const results = [];\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(current, (ctrl, i) => {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props)) {\n results.push(ctrl.start());\n } else {\n const update = _getProps(props, ctrl, i);\n\n if (update) {\n results.push(ctrl.start(update));\n }\n }\n });\n return results;\n };\n\n SpringRef.current = current;\n\n SpringRef.add = function (ctrl) {\n if (!current.includes(ctrl)) {\n current.push(ctrl);\n }\n };\n\n SpringRef.delete = function (ctrl) {\n const i = current.indexOf(ctrl);\n if (~i) current.splice(i, 1);\n };\n\n SpringRef.pause = function () {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(current, ctrl => ctrl.pause(...arguments));\n return this;\n };\n\n SpringRef.resume = function () {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(current, ctrl => ctrl.resume(...arguments));\n return this;\n };\n\n SpringRef.set = function (values) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(current, ctrl => ctrl.set(values));\n };\n\n SpringRef.start = function (props) {\n const results = [];\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(current, (ctrl, i) => {\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(props)) {\n results.push(ctrl.start());\n } else {\n const update = this._getProps(props, ctrl, i);\n\n if (update) {\n results.push(ctrl.start(update));\n }\n }\n });\n return results;\n };\n\n SpringRef.stop = function () {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(current, ctrl => ctrl.stop(...arguments));\n return this;\n };\n\n SpringRef.update = function (props) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(current, (ctrl, i) => ctrl.update(this._getProps(props, ctrl, i)));\n return this;\n };\n\n const _getProps = function _getProps(arg, ctrl, index) {\n return _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(arg) ? arg(index, ctrl) : arg;\n };\n\n SpringRef._getProps = _getProps;\n return SpringRef;\n};\n\nfunction useSprings(length, props, deps) {\n const propsFn = is.fun(props) && props;\n if (propsFn && !deps) deps = [];\n const ref = useMemo(() => propsFn || arguments.length == 3 ? SpringRef() : void 0, []);\n const layoutId = useRef(0);\n const forceUpdate = useForceUpdate();\n const state = useMemo(() => ({\n ctrls: [],\n queue: [],\n\n flush(ctrl, updates) {\n const springs = getSprings(ctrl, updates);\n const canFlushSync = layoutId.current > 0 && !state.queue.length && !Object.keys(springs).some(key => !ctrl.springs[key]);\n return canFlushSync ? flushUpdateQueue(ctrl, updates) : new Promise(resolve => {\n setSprings(ctrl, springs);\n state.queue.push(() => {\n resolve(flushUpdateQueue(ctrl, updates));\n });\n forceUpdate();\n });\n }\n\n }), []);\n const ctrls = useRef([...state.ctrls]);\n const updates = [];\n const prevLength = usePrev(length) || 0;\n useMemo(() => {\n each(ctrls.current.slice(length, prevLength), ctrl => {\n detachRefs(ctrl, ref);\n ctrl.stop(true);\n });\n ctrls.current.length = length;\n declareUpdates(prevLength, length);\n }, [length]);\n useMemo(() => {\n declareUpdates(0, Math.min(prevLength, length));\n }, deps);\n\n function declareUpdates(startIndex, endIndex) {\n for (let i = startIndex; i < endIndex; i++) {\n const ctrl = ctrls.current[i] || (ctrls.current[i] = new Controller(null, state.flush));\n const update = propsFn ? propsFn(i, ctrl) : props[i];\n\n if (update) {\n updates[i] = declareUpdate(update);\n }\n }\n }\n\n const springs = ctrls.current.map((ctrl, i) => getSprings(ctrl, updates[i]));\n const context = useContext(SpringContext);\n const prevContext = usePrev(context);\n const hasContext = context !== prevContext && hasProps(context);\n useLayoutEffect(() => {\n layoutId.current++;\n state.ctrls = ctrls.current;\n const {\n queue\n } = state;\n\n if (queue.length) {\n state.queue = [];\n each(queue, cb => cb());\n }\n\n each(ctrls.current, (ctrl, i) => {\n ref == null ? void 0 : ref.add(ctrl);\n\n if (hasContext) {\n ctrl.start({\n default: context\n });\n }\n\n const update = updates[i];\n\n if (update) {\n replaceRef(ctrl, update.ref);\n\n if (ctrl.ref) {\n ctrl.queue.push(update);\n } else {\n ctrl.start(update);\n }\n }\n });\n });\n useOnce(() => () => {\n each(state.ctrls, ctrl => ctrl.stop(true));\n });\n const values = springs.map(x => _extends({}, x));\n return ref ? [values, ref] : values;\n}\n\nfunction useSpring(props, deps) {\n const isFn = is.fun(props);\n const [[values], ref] = useSprings(1, isFn ? props : [props], isFn ? deps || [] : deps);\n return isFn || arguments.length == 2 ? [values, ref] : values;\n}\n\nconst initSpringRef = () => SpringRef();\n\nconst useSpringRef = () => useState(initSpringRef)[0];\n\nfunction useTrail(length, propsArg, deps) {\n var _passedRef;\n\n const propsFn = is.fun(propsArg) && propsArg;\n if (propsFn && !deps) deps = [];\n let reverse = true;\n let passedRef = undefined;\n const result = useSprings(length, (i, ctrl) => {\n const props = propsFn ? propsFn(i, ctrl) : propsArg;\n passedRef = props.ref;\n reverse = reverse && props.reverse;\n return props;\n }, deps || [{}]);\n const ref = (_passedRef = passedRef) != null ? _passedRef : result[1];\n useLayoutEffect(() => {\n each(ref.current, (ctrl, i) => {\n const parent = ref.current[i + (reverse ? 1 : -1)];\n\n if (parent) {\n ctrl.start({\n to: parent.springs\n });\n } else {\n ctrl.start();\n }\n });\n }, deps);\n\n if (propsFn || arguments.length == 3) {\n ref['_getProps'] = (propsArg, ctrl, i) => {\n const props = is.fun(propsArg) ? propsArg(i, ctrl) : propsArg;\n\n if (props) {\n const parent = ref.current[i + (props.reverse ? 1 : -1)];\n if (parent) props.to = parent.springs;\n return props;\n }\n };\n\n return result;\n }\n\n ref['start'] = propsArg => {\n const results = [];\n each(ref.current, (ctrl, i) => {\n const props = is.fun(propsArg) ? propsArg(i, ctrl) : propsArg;\n const parent = ref.current[i + (reverse ? 1 : -1)];\n\n if (parent) {\n results.push(ctrl.start(_extends({}, props, {\n to: parent.springs\n })));\n } else {\n results.push(ctrl.start(_extends({}, props)));\n }\n });\n return results;\n };\n\n return result[0];\n}\n\nlet TransitionPhase;\n\n(function (TransitionPhase) {\n TransitionPhase[\"MOUNT\"] = \"mount\";\n TransitionPhase[\"ENTER\"] = \"enter\";\n TransitionPhase[\"UPDATE\"] = \"update\";\n TransitionPhase[\"LEAVE\"] = \"leave\";\n})(TransitionPhase || (TransitionPhase = {}));\n\nfunction useTransition(data, props, deps) {\n const propsFn = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(props) && props;\n const {\n reset,\n sort,\n trail = 0,\n expires = true,\n exitBeforeEnter = false,\n onDestroyed,\n ref: propsRef,\n config: propsConfig\n } = propsFn ? propsFn() : props;\n const ref = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => propsFn || arguments.length == 3 ? SpringRef() : void 0, []);\n const items = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(data);\n const transitions = [];\n const usedTransitions = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const prevTransitions = reset ? null : usedTransitions.current;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useLayoutEffect */ .bt)(() => {\n usedTransitions.current = transitions;\n });\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useOnce */ .tf)(() => {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(usedTransitions.current, t => {\n var _t$ctrl$ref;\n\n (_t$ctrl$ref = t.ctrl.ref) == null ? void 0 : _t$ctrl$ref.add(t.ctrl);\n const change = changes.get(t);\n\n if (change) {\n t.ctrl.start(change.payload);\n }\n });\n return () => {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(usedTransitions.current, t => {\n if (t.expired) {\n clearTimeout(t.expirationId);\n }\n\n detachRefs(t.ctrl, ref);\n t.ctrl.stop(true);\n });\n };\n });\n const keys = getKeys(items, propsFn ? propsFn() : props, prevTransitions);\n const expired = reset && usedTransitions.current || [];\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useLayoutEffect */ .bt)(() => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(expired, ({\n ctrl,\n item,\n key\n }) => {\n detachRefs(ctrl, ref);\n callProp(onDestroyed, item, key);\n }));\n const reused = [];\n if (prevTransitions) (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(prevTransitions, (t, i) => {\n if (t.expired) {\n clearTimeout(t.expirationId);\n expired.push(t);\n } else {\n i = reused[i] = keys.indexOf(t.key);\n if (~i) transitions[i] = t;\n }\n });\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(items, (item, i) => {\n if (!transitions[i]) {\n transitions[i] = {\n key: keys[i],\n item,\n phase: TransitionPhase.MOUNT,\n ctrl: new Controller()\n };\n transitions[i].ctrl.item = item;\n }\n });\n\n if (reused.length) {\n let i = -1;\n const {\n leave\n } = propsFn ? propsFn() : props;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(reused, (keyIndex, prevIndex) => {\n const t = prevTransitions[prevIndex];\n\n if (~keyIndex) {\n i = transitions.indexOf(t);\n transitions[i] = _extends({}, t, {\n item: items[keyIndex]\n });\n } else if (leave) {\n transitions.splice(++i, 0, t);\n }\n });\n }\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(sort)) {\n transitions.sort((a, b) => sort(a.item, b.item));\n }\n\n let delay = -trail;\n const forceUpdate = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useForceUpdate */ .NW)();\n const defaultProps = getDefaultProps(props);\n const changes = new Map();\n const exitingTransitions = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(new Map());\n const forceChange = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false);\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(transitions, (t, i) => {\n const key = t.key;\n const prevPhase = t.phase;\n const p = propsFn ? propsFn() : props;\n let to;\n let phase;\n let propsDelay = callProp(p.delay || 0, key);\n\n if (prevPhase == TransitionPhase.MOUNT) {\n to = p.enter;\n phase = TransitionPhase.ENTER;\n } else {\n const isLeave = keys.indexOf(key) < 0;\n\n if (prevPhase != TransitionPhase.LEAVE) {\n if (isLeave) {\n to = p.leave;\n phase = TransitionPhase.LEAVE;\n } else if (to = p.update) {\n phase = TransitionPhase.UPDATE;\n } else return;\n } else if (!isLeave) {\n to = p.enter;\n phase = TransitionPhase.ENTER;\n } else return;\n }\n\n to = callProp(to, t.item, i);\n to = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.obj(to) ? inferTo(to) : {\n to\n };\n\n if (!to.config) {\n const config = propsConfig || defaultProps.config;\n to.config = callProp(config, t.item, i, phase);\n }\n\n delay += trail;\n\n const payload = _extends({}, defaultProps, {\n delay: propsDelay + delay,\n ref: propsRef,\n immediate: p.immediate,\n reset: false\n }, to);\n\n if (phase == TransitionPhase.ENTER && _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(payload.from)) {\n const _p = propsFn ? propsFn() : props;\n\n const from = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(_p.initial) || prevTransitions ? _p.from : _p.initial;\n payload.from = callProp(from, t.item, i);\n }\n\n const {\n onResolve\n } = payload;\n\n payload.onResolve = result => {\n callProp(onResolve, result);\n const transitions = usedTransitions.current;\n const t = transitions.find(t => t.key === key);\n if (!t) return;\n\n if (result.cancelled && t.phase != TransitionPhase.UPDATE) {\n return;\n }\n\n if (t.ctrl.idle) {\n const idle = transitions.every(t => t.ctrl.idle);\n\n if (t.phase == TransitionPhase.LEAVE) {\n const expiry = callProp(expires, t.item);\n\n if (expiry !== false) {\n const expiryMs = expiry === true ? 0 : expiry;\n t.expired = true;\n\n if (!idle && expiryMs > 0) {\n if (expiryMs <= 0x7fffffff) t.expirationId = setTimeout(forceUpdate, expiryMs);\n return;\n }\n }\n }\n\n if (idle && transitions.some(t => t.expired)) {\n exitingTransitions.current.delete(t);\n\n if (exitBeforeEnter) {\n forceChange.current = true;\n }\n\n forceUpdate();\n }\n }\n };\n\n const springs = getSprings(t.ctrl, payload);\n\n if (phase === TransitionPhase.LEAVE && exitBeforeEnter) {\n exitingTransitions.current.set(t, {\n phase,\n springs,\n payload\n });\n } else {\n changes.set(t, {\n phase,\n springs,\n payload\n });\n }\n });\n const context = (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(SpringContext);\n const prevContext = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .usePrev */ .zH)(context);\n const hasContext = context !== prevContext && hasProps(context);\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useLayoutEffect */ .bt)(() => {\n if (hasContext) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(transitions, t => {\n t.ctrl.start({\n default: context\n });\n });\n }\n }, [context]);\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(changes, (_, t) => {\n if (exitingTransitions.current.size) {\n const ind = transitions.findIndex(state => state.key === t.key);\n transitions.splice(ind, 1);\n }\n });\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .useLayoutEffect */ .bt)(() => {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)(exitingTransitions.current.size ? exitingTransitions.current : changes, ({\n phase,\n payload\n }, t) => {\n const {\n ctrl\n } = t;\n t.phase = phase;\n ref == null ? void 0 : ref.add(ctrl);\n\n if (hasContext && phase == TransitionPhase.ENTER) {\n ctrl.start({\n default: context\n });\n }\n\n if (payload) {\n replaceRef(ctrl, payload.ref);\n\n if (ctrl.ref && !forceChange.current) {\n ctrl.update(payload);\n } else {\n ctrl.start(payload);\n\n if (forceChange.current) {\n forceChange.current = false;\n }\n }\n }\n });\n }, reset ? void 0 : deps);\n\n const renderTransitions = render => react__WEBPACK_IMPORTED_MODULE_1__.createElement(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, transitions.map((t, i) => {\n const {\n springs\n } = changes.get(t) || t.ctrl;\n const elem = render(_extends({}, springs), t.item, t, i);\n return elem && elem.type ? react__WEBPACK_IMPORTED_MODULE_1__.createElement(elem.type, _extends({}, elem.props, {\n key: _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.str(t.key) || _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.num(t.key) ? t.key : t.ctrl.id,\n ref: elem.ref\n })) : elem;\n }));\n\n return ref ? [renderTransitions, ref] : renderTransitions;\n}\nlet nextKey = 1;\n\nfunction getKeys(items, {\n key,\n keys = key\n}, prevTransitions) {\n if (keys === null) {\n const reused = new Set();\n return items.map(item => {\n const t = prevTransitions && prevTransitions.find(t => t.item === item && t.phase !== TransitionPhase.LEAVE && !reused.has(t));\n\n if (t) {\n reused.add(t);\n return t.key;\n }\n\n return nextKey++;\n });\n }\n\n return _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.und(keys) ? items : _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.fun(keys) ? items.map(keys) : (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(keys);\n}\n\nconst _excluded$2 = (/* unused pure expression or super */ null && ([\"children\"]));\nfunction Spring(_ref) {\n let {\n children\n } = _ref,\n props = _objectWithoutPropertiesLoose(_ref, _excluded$2);\n\n return children(useSpring(props));\n}\n\nconst _excluded$1 = (/* unused pure expression or super */ null && ([\"items\", \"children\"]));\nfunction Trail(_ref) {\n let {\n items,\n children\n } = _ref,\n props = _objectWithoutPropertiesLoose(_ref, _excluded$1);\n\n const trails = useTrail(items.length, props);\n return items.map((item, index) => {\n const result = children(item, index);\n return is.fun(result) ? result(trails[index]) : result;\n });\n}\n\nconst _excluded = [\"items\", \"children\"];\nfunction Transition(_ref) {\n let {\n items,\n children\n } = _ref,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n return useTransition(items, props)(children);\n}\n\nclass Interpolation extends FrameValue {\n constructor(source, args) {\n super();\n this.key = void 0;\n this.idle = true;\n this.calc = void 0;\n this._active = new Set();\n this.source = source;\n this.calc = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .createInterpolator */ .mD)(...args);\n\n const value = this._get();\n\n const nodeType = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimatedType */ .sb)(value);\n (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .setAnimated */ .f3)(this, nodeType.create(value));\n }\n\n advance(_dt) {\n const value = this._get();\n\n const oldValue = this.get();\n\n if (!(0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .isEqual */ .Xy)(value, oldValue)) {\n (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getAnimated */ .ys)(this).setValue(value);\n\n this._onChange(value, this.idle);\n }\n\n if (!this.idle && checkIdle(this._active)) {\n becomeIdle(this);\n }\n }\n\n _get() {\n const inputs = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__.is.arr(this.source) ? this.source.map(_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je) : (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .getFluidValue */ .je)(this.source));\n return this.calc(...inputs);\n }\n\n _start() {\n if (this.idle && !checkIdle(this._active)) {\n this.idle = false;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)((0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getPayload */ .He)(this), node => {\n node.done = false;\n });\n\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.skipAnimation */ .OH.skipAnimation) {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .raf.batchedUpdates */ .Wn.batchedUpdates(() => this.advance());\n becomeIdle(this);\n } else {\n _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .frameLoop.start */ .fT.start(this);\n }\n }\n }\n\n _attach() {\n let priority = 1;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(this.source), source => {\n if ((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(source)) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .addFluidObserver */ .UI)(source, this);\n }\n\n if (isFrameValue(source)) {\n if (!source.idle) {\n this._active.add(source);\n }\n\n priority = Math.max(priority, source.priority + 1);\n }\n });\n this.priority = priority;\n\n this._start();\n }\n\n _detach() {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(this.source), source => {\n if ((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .hasFluidValue */ .j$)(source)) {\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .removeFluidObserver */ .iL)(source, this);\n }\n });\n\n this._active.clear();\n\n becomeIdle(this);\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n if (event.idle) {\n this.advance();\n } else {\n this._active.add(event.parent);\n\n this._start();\n }\n } else if (event.type == 'idle') {\n this._active.delete(event.parent);\n } else if (event.type == 'priority') {\n this.priority = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .toArray */ .qo)(this.source).reduce((highest, parent) => Math.max(highest, (isFrameValue(parent) ? parent.priority : 0) + 1), 0);\n }\n }\n\n}\n\nfunction isIdle(source) {\n return source.idle !== false;\n}\n\nfunction checkIdle(active) {\n return !active.size || Array.from(active).every(isIdle);\n}\n\nfunction becomeIdle(self) {\n if (!self.idle) {\n self.idle = true;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .each */ .S6)((0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_2__/* .getPayload */ .He)(self), node => {\n node.done = true;\n });\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .callFluidObservers */ .k0)(self, {\n type: 'idle',\n parent: self\n });\n }\n}\n\nconst to = (source, ...args) => new Interpolation(source, args);\nconst interpolate = (source, ...args) => (deprecateInterpolate(), new Interpolation(source, args));\n\n_react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .Globals.assign */ .OH.assign({\n createStringInterpolator: _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .createStringInterpolator */ .qS,\n to: (source, args) => new Interpolation(source, args)\n});\nconst update = _react_spring_shared__WEBPACK_IMPORTED_MODULE_0__/* .frameLoop.advance */ .fT.advance;\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkyOC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQHJlYWN0LXNwcmluZy9jb3JlL2Rpc3QvcmVhY3Qtc3ByaW5nLWNvcmUuZXNtLmpzPzkyNmEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZWFjaFByb3AsIGlzLCB0b0FycmF5LCBpc0FuaW1hdGVkU3RyaW5nLCBHbG9iYWxzLCBnZXRGbHVpZFZhbHVlLCB1c2VMYXlvdXRFZmZlY3QsIGVhY2gsIHJhZiwgZmx1c2gsIEZsdWlkVmFsdWUsIGRlcHJlY2F0ZUludGVycG9sYXRlLCBjYWxsRmx1aWRPYnNlcnZlcnMsIGZyYW1lTG9vcCwgaGFzRmx1aWRWYWx1ZSwgZmx1c2hDYWxscywgaXNFcXVhbCwgZ2V0Rmx1aWRPYnNlcnZlcnMsIGFkZEZsdWlkT2JzZXJ2ZXIsIHJlbW92ZUZsdWlkT2JzZXJ2ZXIsIG5vb3AsIHVzZU1lbW9PbmUsIGRlcHJlY2F0ZURpcmVjdENhbGwsIHVzZUZvcmNlVXBkYXRlLCB1c2VQcmV2LCB1c2VPbmNlLCBjcmVhdGVJbnRlcnBvbGF0b3IsIGNyZWF0ZVN0cmluZ0ludGVycG9sYXRvciB9IGZyb20gJ0ByZWFjdC1zcHJpbmcvc2hhcmVkJztcbmV4cG9ydCB7IEdsb2JhbHMsIGNyZWF0ZUludGVycG9sYXRvciB9IGZyb20gJ0ByZWFjdC1zcHJpbmcvc2hhcmVkJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRBbmltYXRlZCwgQW5pbWF0ZWRWYWx1ZSwgZ2V0UGF5bG9hZCwgQW5pbWF0ZWRTdHJpbmcsIGdldEFuaW1hdGVkVHlwZSwgc2V0QW5pbWF0ZWQgfSBmcm9tICdAcmVhY3Qtc3ByaW5nL2FuaW1hdGVkJztcbmV4cG9ydCAqIGZyb20gJ0ByZWFjdC1zcHJpbmcvdHlwZXMvYW5pbWF0ZWQnO1xuZXhwb3J0ICogZnJvbSAnQHJlYWN0LXNwcmluZy90eXBlcy9pbnRlcnBvbGF0aW9uJztcblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gY2FsbFByb3AodmFsdWUsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGlzLmZ1bih2YWx1ZSkgPyB2YWx1ZSguLi5hcmdzKSA6IHZhbHVlO1xufVxuY29uc3QgbWF0Y2hQcm9wID0gKHZhbHVlLCBrZXkpID0+IHZhbHVlID09PSB0cnVlIHx8ICEhKGtleSAmJiB2YWx1ZSAmJiAoaXMuZnVuKHZhbHVlKSA/IHZhbHVlKGtleSkgOiB0b0FycmF5KHZhbHVlKS5pbmNsdWRlcyhrZXkpKSk7XG5jb25zdCByZXNvbHZlUHJvcCA9IChwcm9wLCBrZXkpID0+IGlzLm9iaihwcm9wKSA/IGtleSAmJiBwcm9wW2tleV0gOiBwcm9wO1xuY29uc3QgZ2V0RGVmYXVsdFByb3AgPSAocHJvcHMsIGtleSkgPT4gcHJvcHMuZGVmYXVsdCA9PT0gdHJ1ZSA/IHByb3BzW2tleV0gOiBwcm9wcy5kZWZhdWx0ID8gcHJvcHMuZGVmYXVsdFtrZXldIDogdW5kZWZpbmVkO1xuXG5jb25zdCBub29wVHJhbnNmb3JtID0gdmFsdWUgPT4gdmFsdWU7XG5cbmNvbnN0IGdldERlZmF1bHRQcm9wcyA9IChwcm9wcywgdHJhbnNmb3JtID0gbm9vcFRyYW5zZm9ybSkgPT4ge1xuICBsZXQga2V5cyA9IERFRkFVTFRfUFJPUFM7XG5cbiAgaWYgKHByb3BzLmRlZmF1bHQgJiYgcHJvcHMuZGVmYXVsdCAhPT0gdHJ1ZSkge1xuICAgIHByb3BzID0gcHJvcHMuZGVmYXVsdDtcbiAgICBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpO1xuICB9XG5cbiAgY29uc3QgZGVmYXVsdHMgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0cmFuc2Zvcm0ocHJvcHNba2V5XSwga2V5KTtcblxuICAgIGlmICghaXMudW5kKHZhbHVlKSkge1xuICAgICAgZGVmYXVsdHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZWZhdWx0cztcbn07XG5jb25zdCBERUZBVUxUX1BST1BTID0gWydjb25maWcnLCAnb25Qcm9wcycsICdvblN0YXJ0JywgJ29uQ2hhbmdlJywgJ29uUGF1c2UnLCAnb25SZXN1bWUnLCAnb25SZXN0J107XG5jb25zdCBSRVNFUlZFRF9QUk9QUyA9IHtcbiAgY29uZmlnOiAxLFxuICBmcm9tOiAxLFxuICB0bzogMSxcbiAgcmVmOiAxLFxuICBsb29wOiAxLFxuICByZXNldDogMSxcbiAgcGF1c2U6IDEsXG4gIGNhbmNlbDogMSxcbiAgcmV2ZXJzZTogMSxcbiAgaW1tZWRpYXRlOiAxLFxuICBkZWZhdWx0OiAxLFxuICBkZWxheTogMSxcbiAgb25Qcm9wczogMSxcbiAgb25TdGFydDogMSxcbiAgb25DaGFuZ2U6IDEsXG4gIG9uUGF1c2U6IDEsXG4gIG9uUmVzdW1lOiAxLFxuICBvblJlc3Q6IDEsXG4gIG9uUmVzb2x2ZTogMSxcbiAgaXRlbXM6IDEsXG4gIHRyYWlsOiAxLFxuICBzb3J0OiAxLFxuICBleHBpcmVzOiAxLFxuICBpbml0aWFsOiAxLFxuICBlbnRlcjogMSxcbiAgdXBkYXRlOiAxLFxuICBsZWF2ZTogMSxcbiAgY2hpbGRyZW46IDEsXG4gIG9uRGVzdHJveWVkOiAxLFxuICBrZXlzOiAxLFxuICBjYWxsSWQ6IDEsXG4gIHBhcmVudElkOiAxXG59O1xuXG5mdW5jdGlvbiBnZXRGb3J3YXJkUHJvcHMocHJvcHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IHt9O1xuICBsZXQgY291bnQgPSAwO1xuICBlYWNoUHJvcChwcm9wcywgKHZhbHVlLCBwcm9wKSA9PiB7XG4gICAgaWYgKCFSRVNFUlZFRF9QUk9QU1twcm9wXSkge1xuICAgICAgZm9yd2FyZFtwcm9wXSA9IHZhbHVlO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChjb3VudCkge1xuICAgIHJldHVybiBmb3J3YXJkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZmVyVG8ocHJvcHMpIHtcbiAgY29uc3QgdG8gPSBnZXRGb3J3YXJkUHJvcHMocHJvcHMpO1xuXG4gIGlmICh0bykge1xuICAgIGNvbnN0IG91dCA9IHtcbiAgICAgIHRvXG4gICAgfTtcbiAgICBlYWNoUHJvcChwcm9wcywgKHZhbCwga2V5KSA9PiBrZXkgaW4gdG8gfHwgKG91dFtrZXldID0gdmFsKSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY29tcHV0ZUdvYWwodmFsdWUpIHtcbiAgdmFsdWUgPSBnZXRGbHVpZFZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIGlzLmFycih2YWx1ZSkgPyB2YWx1ZS5tYXAoY29tcHV0ZUdvYWwpIDogaXNBbmltYXRlZFN0cmluZyh2YWx1ZSkgPyBHbG9iYWxzLmNyZWF0ZVN0cmluZ0ludGVycG9sYXRvcih7XG4gICAgcmFuZ2U6IFswLCAxXSxcbiAgICBvdXRwdXQ6IFt2YWx1ZSwgdmFsdWVdXG4gIH0pKDEpIDogdmFsdWU7XG59XG5mdW5jdGlvbiBoYXNQcm9wcyhwcm9wcykge1xuICBmb3IgKGNvbnN0IF8gaW4gcHJvcHMpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQXN5bmNUbyh0bykge1xuICByZXR1cm4gaXMuZnVuKHRvKSB8fCBpcy5hcnIodG8pICYmIGlzLm9iaih0b1swXSk7XG59XG5mdW5jdGlvbiBkZXRhY2hSZWZzKGN0cmwsIHJlZikge1xuICB2YXIgX2N0cmwkcmVmO1xuXG4gIChfY3RybCRyZWYgPSBjdHJsLnJlZikgPT0gbnVsbCA/IHZvaWQgMCA6IF9jdHJsJHJlZi5kZWxldGUoY3RybCk7XG4gIHJlZiA9PSBudWxsID8gdm9pZCAwIDogcmVmLmRlbGV0ZShjdHJsKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VSZWYoY3RybCwgcmVmKSB7XG4gIGlmIChyZWYgJiYgY3RybC5yZWYgIT09IHJlZikge1xuICAgIHZhciBfY3RybCRyZWYyO1xuXG4gICAgKF9jdHJsJHJlZjIgPSBjdHJsLnJlZikgPT0gbnVsbCA/IHZvaWQgMCA6IF9jdHJsJHJlZjIuZGVsZXRlKGN0cmwpO1xuICAgIHJlZi5hZGQoY3RybCk7XG4gICAgY3RybC5yZWYgPSByZWY7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlQ2hhaW4ocmVmcywgdGltZVN0ZXBzLCB0aW1lRnJhbWUgPSAxMDAwKSB7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRpbWVTdGVwcykge1xuICAgICAgbGV0IHByZXZEZWxheSA9IDA7XG4gICAgICBlYWNoKHJlZnMsIChyZWYsIGkpID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlcnMgPSByZWYuY3VycmVudDtcblxuICAgICAgICBpZiAoY29udHJvbGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgbGV0IGRlbGF5ID0gdGltZUZyYW1lICogdGltZVN0ZXBzW2ldO1xuICAgICAgICAgIGlmIChpc05hTihkZWxheSkpIGRlbGF5ID0gcHJldkRlbGF5O2Vsc2UgcHJldkRlbGF5ID0gZGVsYXk7XG4gICAgICAgICAgZWFjaChjb250cm9sbGVycywgY3RybCA9PiB7XG4gICAgICAgICAgICBlYWNoKGN0cmwucXVldWUsIHByb3BzID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbWVtb2l6ZWREZWxheVByb3AgPSBwcm9wcy5kZWxheTtcblxuICAgICAgICAgICAgICBwcm9wcy5kZWxheSA9IGtleSA9PiBkZWxheSArIGNhbGxQcm9wKG1lbW9pemVkRGVsYXlQcm9wIHx8IDAsIGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZWYuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICBlYWNoKHJlZnMsIHJlZiA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gcmVmLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKGNvbnRyb2xsZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlcyA9IGNvbnRyb2xsZXJzLm1hcChjdHJsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHEgPSBjdHJsLnF1ZXVlO1xuICAgICAgICAgICAgY3RybC5xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHE7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcCA9IHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBlYWNoKGNvbnRyb2xsZXJzLCAoY3RybCwgaSkgPT4gZWFjaChxdWV1ZXNbaV0gfHwgW10sIHVwZGF0ZSA9PiBjdHJsLnF1ZXVlLnB1c2godXBkYXRlKSkpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlZi5zdGFydCgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgY29uZmlnID0ge1xuICBkZWZhdWx0OiB7XG4gICAgdGVuc2lvbjogMTcwLFxuICAgIGZyaWN0aW9uOiAyNlxuICB9LFxuICBnZW50bGU6IHtcbiAgICB0ZW5zaW9uOiAxMjAsXG4gICAgZnJpY3Rpb246IDE0XG4gIH0sXG4gIHdvYmJseToge1xuICAgIHRlbnNpb246IDE4MCxcbiAgICBmcmljdGlvbjogMTJcbiAgfSxcbiAgc3RpZmY6IHtcbiAgICB0ZW5zaW9uOiAyMTAsXG4gICAgZnJpY3Rpb246IDIwXG4gIH0sXG4gIHNsb3c6IHtcbiAgICB0ZW5zaW9uOiAyODAsXG4gICAgZnJpY3Rpb246IDYwXG4gIH0sXG4gIG1vbGFzc2VzOiB7XG4gICAgdGVuc2lvbjogMjgwLFxuICAgIGZyaWN0aW9uOiAxMjBcbiAgfVxufTtcbmNvbnN0IGMxID0gMS43MDE1ODtcbmNvbnN0IGMyID0gYzEgKiAxLjUyNTtcbmNvbnN0IGMzID0gYzEgKyAxO1xuY29uc3QgYzQgPSAyICogTWF0aC5QSSAvIDM7XG5jb25zdCBjNSA9IDIgKiBNYXRoLlBJIC8gNC41O1xuXG5jb25zdCBib3VuY2VPdXQgPSB4ID0+IHtcbiAgY29uc3QgbjEgPSA3LjU2MjU7XG4gIGNvbnN0IGQxID0gMi43NTtcblxuICBpZiAoeCA8IDEgLyBkMSkge1xuICAgIHJldHVybiBuMSAqIHggKiB4O1xuICB9IGVsc2UgaWYgKHggPCAyIC8gZDEpIHtcbiAgICByZXR1cm4gbjEgKiAoeCAtPSAxLjUgLyBkMSkgKiB4ICsgMC43NTtcbiAgfSBlbHNlIGlmICh4IDwgMi41IC8gZDEpIHtcbiAgICByZXR1cm4gbjEgKiAoeCAtPSAyLjI1IC8gZDEpICogeCArIDAuOTM3NTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbjEgKiAoeCAtPSAyLjYyNSAvIGQxKSAqIHggKyAwLjk4NDM3NTtcbiAgfVxufTtcblxuY29uc3QgZWFzaW5ncyA9IHtcbiAgbGluZWFyOiB4ID0+IHgsXG4gIGVhc2VJblF1YWQ6IHggPT4geCAqIHgsXG4gIGVhc2VPdXRRdWFkOiB4ID0+IDEgLSAoMSAtIHgpICogKDEgLSB4KSxcbiAgZWFzZUluT3V0UXVhZDogeCA9PiB4IDwgMC41ID8gMiAqIHggKiB4IDogMSAtIE1hdGgucG93KC0yICogeCArIDIsIDIpIC8gMixcbiAgZWFzZUluQ3ViaWM6IHggPT4geCAqIHggKiB4LFxuICBlYXNlT3V0Q3ViaWM6IHggPT4gMSAtIE1hdGgucG93KDEgLSB4LCAzKSxcbiAgZWFzZUluT3V0Q3ViaWM6IHggPT4geCA8IDAuNSA/IDQgKiB4ICogeCAqIHggOiAxIC0gTWF0aC5wb3coLTIgKiB4ICsgMiwgMykgLyAyLFxuICBlYXNlSW5RdWFydDogeCA9PiB4ICogeCAqIHggKiB4LFxuICBlYXNlT3V0UXVhcnQ6IHggPT4gMSAtIE1hdGgucG93KDEgLSB4LCA0KSxcbiAgZWFzZUluT3V0UXVhcnQ6IHggPT4geCA8IDAuNSA/IDggKiB4ICogeCAqIHggKiB4IDogMSAtIE1hdGgucG93KC0yICogeCArIDIsIDQpIC8gMixcbiAgZWFzZUluUXVpbnQ6IHggPT4geCAqIHggKiB4ICogeCAqIHgsXG4gIGVhc2VPdXRRdWludDogeCA9PiAxIC0gTWF0aC5wb3coMSAtIHgsIDUpLFxuICBlYXNlSW5PdXRRdWludDogeCA9PiB4IDwgMC41ID8gMTYgKiB4ICogeCAqIHggKiB4ICogeCA6IDEgLSBNYXRoLnBvdygtMiAqIHggKyAyLCA1KSAvIDIsXG4gIGVhc2VJblNpbmU6IHggPT4gMSAtIE1hdGguY29zKHggKiBNYXRoLlBJIC8gMiksXG4gIGVhc2VPdXRTaW5lOiB4ID0+IE1hdGguc2luKHggKiBNYXRoLlBJIC8gMiksXG4gIGVhc2VJbk91dFNpbmU6IHggPT4gLShNYXRoLmNvcyhNYXRoLlBJICogeCkgLSAxKSAvIDIsXG4gIGVhc2VJbkV4cG86IHggPT4geCA9PT0gMCA/IDAgOiBNYXRoLnBvdygyLCAxMCAqIHggLSAxMCksXG4gIGVhc2VPdXRFeHBvOiB4ID0+IHggPT09IDEgPyAxIDogMSAtIE1hdGgucG93KDIsIC0xMCAqIHgpLFxuICBlYXNlSW5PdXRFeHBvOiB4ID0+IHggPT09IDAgPyAwIDogeCA9PT0gMSA/IDEgOiB4IDwgMC41ID8gTWF0aC5wb3coMiwgMjAgKiB4IC0gMTApIC8gMiA6ICgyIC0gTWF0aC5wb3coMiwgLTIwICogeCArIDEwKSkgLyAyLFxuICBlYXNlSW5DaXJjOiB4ID0+IDEgLSBNYXRoLnNxcnQoMSAtIE1hdGgucG93KHgsIDIpKSxcbiAgZWFzZU91dENpcmM6IHggPT4gTWF0aC5zcXJ0KDEgLSBNYXRoLnBvdyh4IC0gMSwgMikpLFxuICBlYXNlSW5PdXRDaXJjOiB4ID0+IHggPCAwLjUgPyAoMSAtIE1hdGguc3FydCgxIC0gTWF0aC5wb3coMiAqIHgsIDIpKSkgLyAyIDogKE1hdGguc3FydCgxIC0gTWF0aC5wb3coLTIgKiB4ICsgMiwgMikpICsgMSkgLyAyLFxuICBlYXNlSW5CYWNrOiB4ID0+IGMzICogeCAqIHggKiB4IC0gYzEgKiB4ICogeCxcbiAgZWFzZU91dEJhY2s6IHggPT4gMSArIGMzICogTWF0aC5wb3coeCAtIDEsIDMpICsgYzEgKiBNYXRoLnBvdyh4IC0gMSwgMiksXG4gIGVhc2VJbk91dEJhY2s6IHggPT4geCA8IDAuNSA/IE1hdGgucG93KDIgKiB4LCAyKSAqICgoYzIgKyAxKSAqIDIgKiB4IC0gYzIpIC8gMiA6IChNYXRoLnBvdygyICogeCAtIDIsIDIpICogKChjMiArIDEpICogKHggKiAyIC0gMikgKyBjMikgKyAyKSAvIDIsXG4gIGVhc2VJbkVsYXN0aWM6IHggPT4geCA9PT0gMCA/IDAgOiB4ID09PSAxID8gMSA6IC1NYXRoLnBvdygyLCAxMCAqIHggLSAxMCkgKiBNYXRoLnNpbigoeCAqIDEwIC0gMTAuNzUpICogYzQpLFxuICBlYXNlT3V0RWxhc3RpYzogeCA9PiB4ID09PSAwID8gMCA6IHggPT09IDEgPyAxIDogTWF0aC5wb3coMiwgLTEwICogeCkgKiBNYXRoLnNpbigoeCAqIDEwIC0gMC43NSkgKiBjNCkgKyAxLFxuICBlYXNlSW5PdXRFbGFzdGljOiB4ID0+IHggPT09IDAgPyAwIDogeCA9PT0gMSA/IDEgOiB4IDwgMC41ID8gLShNYXRoLnBvdygyLCAyMCAqIHggLSAxMCkgKiBNYXRoLnNpbigoMjAgKiB4IC0gMTEuMTI1KSAqIGM1KSkgLyAyIDogTWF0aC5wb3coMiwgLTIwICogeCArIDEwKSAqIE1hdGguc2luKCgyMCAqIHggLSAxMS4xMjUpICogYzUpIC8gMiArIDEsXG4gIGVhc2VJbkJvdW5jZTogeCA9PiAxIC0gYm91bmNlT3V0KDEgLSB4KSxcbiAgZWFzZU91dEJvdW5jZTogYm91bmNlT3V0LFxuICBlYXNlSW5PdXRCb3VuY2U6IHggPT4geCA8IDAuNSA/ICgxIC0gYm91bmNlT3V0KDEgLSAyICogeCkpIC8gMiA6ICgxICsgYm91bmNlT3V0KDIgKiB4IC0gMSkpIC8gMlxufTtcblxuY29uc3QgZGVmYXVsdHMgPSBfZXh0ZW5kcyh7fSwgY29uZmlnLmRlZmF1bHQsIHtcbiAgbWFzczogMSxcbiAgZGFtcGluZzogMSxcbiAgZWFzaW5nOiBlYXNpbmdzLmxpbmVhcixcbiAgY2xhbXA6IGZhbHNlXG59KTtcblxuY2xhc3MgQW5pbWF0aW9uQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50ZW5zaW9uID0gdm9pZCAwO1xuICAgIHRoaXMuZnJpY3Rpb24gPSB2b2lkIDA7XG4gICAgdGhpcy5mcmVxdWVuY3kgPSB2b2lkIDA7XG4gICAgdGhpcy5kYW1waW5nID0gdm9pZCAwO1xuICAgIHRoaXMubWFzcyA9IHZvaWQgMDtcbiAgICB0aGlzLnZlbG9jaXR5ID0gMDtcbiAgICB0aGlzLnJlc3RWZWxvY2l0eSA9IHZvaWQgMDtcbiAgICB0aGlzLnByZWNpc2lvbiA9IHZvaWQgMDtcbiAgICB0aGlzLnByb2dyZXNzID0gdm9pZCAwO1xuICAgIHRoaXMuZHVyYXRpb24gPSB2b2lkIDA7XG4gICAgdGhpcy5lYXNpbmcgPSB2b2lkIDA7XG4gICAgdGhpcy5jbGFtcCA9IHZvaWQgMDtcbiAgICB0aGlzLmJvdW5jZSA9IHZvaWQgMDtcbiAgICB0aGlzLmRlY2F5ID0gdm9pZCAwO1xuICAgIHRoaXMucm91bmQgPSB2b2lkIDA7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkZWZhdWx0cyk7XG4gIH1cblxufVxuZnVuY3Rpb24gbWVyZ2VDb25maWcoY29uZmlnLCBuZXdDb25maWcsIGRlZmF1bHRDb25maWcpIHtcbiAgaWYgKGRlZmF1bHRDb25maWcpIHtcbiAgICBkZWZhdWx0Q29uZmlnID0gX2V4dGVuZHMoe30sIGRlZmF1bHRDb25maWcpO1xuICAgIHNhbml0aXplQ29uZmlnKGRlZmF1bHRDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgbmV3Q29uZmlnID0gX2V4dGVuZHMoe30sIGRlZmF1bHRDb25maWcsIG5ld0NvbmZpZyk7XG4gIH1cblxuICBzYW5pdGl6ZUNvbmZpZyhjb25maWcsIG5ld0NvbmZpZyk7XG4gIE9iamVjdC5hc3NpZ24oY29uZmlnLCBuZXdDb25maWcpO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG4gICAgaWYgKGNvbmZpZ1trZXldID09IG51bGwpIHtcbiAgICAgIGNvbmZpZ1trZXldID0gZGVmYXVsdHNba2V5XTtcbiAgICB9XG4gIH1cblxuICBsZXQge1xuICAgIG1hc3MsXG4gICAgZnJlcXVlbmN5LFxuICAgIGRhbXBpbmdcbiAgfSA9IGNvbmZpZztcblxuICBpZiAoIWlzLnVuZChmcmVxdWVuY3kpKSB7XG4gICAgaWYgKGZyZXF1ZW5jeSA8IDAuMDEpIGZyZXF1ZW5jeSA9IDAuMDE7XG4gICAgaWYgKGRhbXBpbmcgPCAwKSBkYW1waW5nID0gMDtcbiAgICBjb25maWcudGVuc2lvbiA9IE1hdGgucG93KDIgKiBNYXRoLlBJIC8gZnJlcXVlbmN5LCAyKSAqIG1hc3M7XG4gICAgY29uZmlnLmZyaWN0aW9uID0gNCAqIE1hdGguUEkgKiBkYW1waW5nICogbWFzcyAvIGZyZXF1ZW5jeTtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cbmZ1bmN0aW9uIHNhbml0aXplQ29uZmlnKGNvbmZpZywgcHJvcHMpIHtcbiAgaWYgKCFpcy51bmQocHJvcHMuZGVjYXkpKSB7XG4gICAgY29uZmlnLmR1cmF0aW9uID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlzVGVuc2lvbkNvbmZpZyA9ICFpcy51bmQocHJvcHMudGVuc2lvbikgfHwgIWlzLnVuZChwcm9wcy5mcmljdGlvbik7XG5cbiAgICBpZiAoaXNUZW5zaW9uQ29uZmlnIHx8ICFpcy51bmQocHJvcHMuZnJlcXVlbmN5KSB8fCAhaXMudW5kKHByb3BzLmRhbXBpbmcpIHx8ICFpcy51bmQocHJvcHMubWFzcykpIHtcbiAgICAgIGNvbmZpZy5kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbmZpZy5kZWNheSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoaXNUZW5zaW9uQ29uZmlnKSB7XG4gICAgICBjb25maWcuZnJlcXVlbmN5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBlbXB0eUFycmF5ID0gW107XG5jbGFzcyBBbmltYXRpb24ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZhbHVlcyA9IGVtcHR5QXJyYXk7XG4gICAgdGhpcy50b1ZhbHVlcyA9IG51bGw7XG4gICAgdGhpcy5mcm9tVmFsdWVzID0gZW1wdHlBcnJheTtcbiAgICB0aGlzLnRvID0gdm9pZCAwO1xuICAgIHRoaXMuZnJvbSA9IHZvaWQgMDtcbiAgICB0aGlzLmNvbmZpZyA9IG5ldyBBbmltYXRpb25Db25maWcoKTtcbiAgICB0aGlzLmltbWVkaWF0ZSA9IGZhbHNlO1xuICB9XG5cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVQcm9wcyhjYWxsSWQsIHtcbiAga2V5LFxuICBwcm9wcyxcbiAgZGVmYXVsdFByb3BzLFxuICBzdGF0ZSxcbiAgYWN0aW9uc1xufSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHZhciBfcHJvcHMkY2FuY2VsO1xuXG4gICAgbGV0IGRlbGF5O1xuICAgIGxldCB0aW1lb3V0O1xuICAgIGxldCBjYW5jZWwgPSBtYXRjaFByb3AoKF9wcm9wcyRjYW5jZWwgPSBwcm9wcy5jYW5jZWwpICE9IG51bGwgPyBfcHJvcHMkY2FuY2VsIDogZGVmYXVsdFByb3BzID09IG51bGwgPyB2b2lkIDAgOiBkZWZhdWx0UHJvcHMuY2FuY2VsLCBrZXkpO1xuXG4gICAgaWYgKGNhbmNlbCkge1xuICAgICAgb25TdGFydCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWlzLnVuZChwcm9wcy5wYXVzZSkpIHtcbiAgICAgICAgc3RhdGUucGF1c2VkID0gbWF0Y2hQcm9wKHByb3BzLnBhdXNlLCBrZXkpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcGF1c2UgPSBkZWZhdWx0UHJvcHMgPT0gbnVsbCA/IHZvaWQgMCA6IGRlZmF1bHRQcm9wcy5wYXVzZTtcblxuICAgICAgaWYgKHBhdXNlICE9PSB0cnVlKSB7XG4gICAgICAgIHBhdXNlID0gc3RhdGUucGF1c2VkIHx8IG1hdGNoUHJvcChwYXVzZSwga2V5KTtcbiAgICAgIH1cblxuICAgICAgZGVsYXkgPSBjYWxsUHJvcChwcm9wcy5kZWxheSB8fCAwLCBrZXkpO1xuXG4gICAgICBpZiAocGF1c2UpIHtcbiAgICAgICAgc3RhdGUucmVzdW1lUXVldWUuYWRkKG9uUmVzdW1lKTtcbiAgICAgICAgYWN0aW9ucy5wYXVzZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9ucy5yZXN1bWUoKTtcbiAgICAgICAgb25SZXN1bWUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblBhdXNlKCkge1xuICAgICAgc3RhdGUucmVzdW1lUXVldWUuYWRkKG9uUmVzdW1lKTtcbiAgICAgIHN0YXRlLnRpbWVvdXRzLmRlbGV0ZSh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQuY2FuY2VsKCk7XG4gICAgICBkZWxheSA9IHRpbWVvdXQudGltZSAtIHJhZi5ub3coKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblJlc3VtZSgpIHtcbiAgICAgIGlmIChkZWxheSA+IDAgJiYgIUdsb2JhbHMuc2tpcEFuaW1hdGlvbikge1xuICAgICAgICBzdGF0ZS5kZWxheWVkID0gdHJ1ZTtcbiAgICAgICAgdGltZW91dCA9IHJhZi5zZXRUaW1lb3V0KG9uU3RhcnQsIGRlbGF5KTtcbiAgICAgICAgc3RhdGUucGF1c2VRdWV1ZS5hZGQob25QYXVzZSk7XG4gICAgICAgIHN0YXRlLnRpbWVvdXRzLmFkZCh0aW1lb3V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uU3RhcnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblN0YXJ0KCkge1xuICAgICAgaWYgKHN0YXRlLmRlbGF5ZWQpIHtcbiAgICAgICAgc3RhdGUuZGVsYXllZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wYXVzZVF1ZXVlLmRlbGV0ZShvblBhdXNlKTtcbiAgICAgIHN0YXRlLnRpbWVvdXRzLmRlbGV0ZSh0aW1lb3V0KTtcblxuICAgICAgaWYgKGNhbGxJZCA8PSAoc3RhdGUuY2FuY2VsSWQgfHwgMCkpIHtcbiAgICAgICAgY2FuY2VsID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0aW9ucy5zdGFydChfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgY2FuY2VsXG4gICAgICAgIH0pLCByZXNvbHZlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBnZXRDb21iaW5lZFJlc3VsdCA9ICh0YXJnZXQsIHJlc3VsdHMpID0+IHJlc3VsdHMubGVuZ3RoID09IDEgPyByZXN1bHRzWzBdIDogcmVzdWx0cy5zb21lKHJlc3VsdCA9PiByZXN1bHQuY2FuY2VsbGVkKSA/IGdldENhbmNlbGxlZFJlc3VsdCh0YXJnZXQuZ2V0KCkpIDogcmVzdWx0cy5ldmVyeShyZXN1bHQgPT4gcmVzdWx0Lm5vb3ApID8gZ2V0Tm9vcFJlc3VsdCh0YXJnZXQuZ2V0KCkpIDogZ2V0RmluaXNoZWRSZXN1bHQodGFyZ2V0LmdldCgpLCByZXN1bHRzLmV2ZXJ5KHJlc3VsdCA9PiByZXN1bHQuZmluaXNoZWQpKTtcbmNvbnN0IGdldE5vb3BSZXN1bHQgPSB2YWx1ZSA9PiAoe1xuICB2YWx1ZSxcbiAgbm9vcDogdHJ1ZSxcbiAgZmluaXNoZWQ6IHRydWUsXG4gIGNhbmNlbGxlZDogZmFsc2Vcbn0pO1xuY29uc3QgZ2V0RmluaXNoZWRSZXN1bHQgPSAodmFsdWUsIGZpbmlzaGVkLCBjYW5jZWxsZWQgPSBmYWxzZSkgPT4gKHtcbiAgdmFsdWUsXG4gIGZpbmlzaGVkLFxuICBjYW5jZWxsZWRcbn0pO1xuY29uc3QgZ2V0Q2FuY2VsbGVkUmVzdWx0ID0gdmFsdWUgPT4gKHtcbiAgdmFsdWUsXG4gIGNhbmNlbGxlZDogdHJ1ZSxcbiAgZmluaXNoZWQ6IGZhbHNlXG59KTtcblxuZnVuY3Rpb24gcnVuQXN5bmModG8sIHByb3BzLCBzdGF0ZSwgdGFyZ2V0KSB7XG4gIGNvbnN0IHtcbiAgICBjYWxsSWQsXG4gICAgcGFyZW50SWQsXG4gICAgb25SZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIGFzeW5jVG86IHByZXZUbyxcbiAgICBwcm9taXNlOiBwcmV2UHJvbWlzZVxuICB9ID0gc3RhdGU7XG5cbiAgaWYgKCFwYXJlbnRJZCAmJiB0byA9PT0gcHJldlRvICYmICFwcm9wcy5yZXNldCkge1xuICAgIHJldHVybiBwcmV2UHJvbWlzZTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5wcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICBzdGF0ZS5hc3luY0lkID0gY2FsbElkO1xuICAgIHN0YXRlLmFzeW5jVG8gPSB0bztcbiAgICBjb25zdCBkZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJvcHMocHJvcHMsICh2YWx1ZSwga2V5KSA9PiBrZXkgPT09ICdvblJlc3QnID8gdW5kZWZpbmVkIDogdmFsdWUpO1xuICAgIGxldCBwcmV2ZW50QmFpbDtcbiAgICBsZXQgYmFpbDtcbiAgICBjb25zdCBiYWlsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IChwcmV2ZW50QmFpbCA9IHJlc29sdmUsIGJhaWwgPSByZWplY3QpKTtcblxuICAgIGNvbnN0IGJhaWxJZkVuZGVkID0gYmFpbFNpZ25hbCA9PiB7XG4gICAgICBjb25zdCBiYWlsUmVzdWx0ID0gY2FsbElkIDw9IChzdGF0ZS5jYW5jZWxJZCB8fCAwKSAmJiBnZXRDYW5jZWxsZWRSZXN1bHQodGFyZ2V0KSB8fCBjYWxsSWQgIT09IHN0YXRlLmFzeW5jSWQgJiYgZ2V0RmluaXNoZWRSZXN1bHQodGFyZ2V0LCBmYWxzZSk7XG5cbiAgICAgIGlmIChiYWlsUmVzdWx0KSB7XG4gICAgICAgIGJhaWxTaWduYWwucmVzdWx0ID0gYmFpbFJlc3VsdDtcbiAgICAgICAgYmFpbChiYWlsU2lnbmFsKTtcbiAgICAgICAgdGhyb3cgYmFpbFNpZ25hbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYW5pbWF0ZSA9IChhcmcxLCBhcmcyKSA9PiB7XG4gICAgICBjb25zdCBiYWlsU2lnbmFsID0gbmV3IEJhaWxTaWduYWwoKTtcbiAgICAgIGNvbnN0IHNraXBBbmltYXRpb25TaWduYWwgPSBuZXcgU2tpcEFuaWFtdGlvblNpZ25hbCgpO1xuICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChHbG9iYWxzLnNraXBBbmltYXRpb24pIHtcbiAgICAgICAgICBzdG9wQXN5bmMoc3RhdGUpO1xuICAgICAgICAgIHNraXBBbmltYXRpb25TaWduYWwucmVzdWx0ID0gZ2V0RmluaXNoZWRSZXN1bHQodGFyZ2V0LCBmYWxzZSk7XG4gICAgICAgICAgYmFpbChza2lwQW5pbWF0aW9uU2lnbmFsKTtcbiAgICAgICAgICB0aHJvdyBza2lwQW5pbWF0aW9uU2lnbmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgYmFpbElmRW5kZWQoYmFpbFNpZ25hbCk7XG4gICAgICAgIGNvbnN0IHByb3BzID0gaXMub2JqKGFyZzEpID8gX2V4dGVuZHMoe30sIGFyZzEpIDogX2V4dGVuZHMoe30sIGFyZzIsIHtcbiAgICAgICAgICB0bzogYXJnMVxuICAgICAgICB9KTtcbiAgICAgICAgcHJvcHMucGFyZW50SWQgPSBjYWxsSWQ7XG4gICAgICAgIGVhY2hQcm9wKGRlZmF1bHRQcm9wcywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoaXMudW5kKHByb3BzW2tleV0pKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFyZ2V0LnN0YXJ0KHByb3BzKTtcbiAgICAgICAgYmFpbElmRW5kZWQoYmFpbFNpZ25hbCk7XG5cbiAgICAgICAgaWYgKHN0YXRlLnBhdXNlZCkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc3VtZSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5yZXN1bWVRdWV1ZS5hZGQocmVzdW1lKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSgpO1xuICAgIH07XG5cbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgaWYgKEdsb2JhbHMuc2tpcEFuaW1hdGlvbikge1xuICAgICAgc3RvcEFzeW5jKHN0YXRlKTtcbiAgICAgIHJldHVybiBnZXRGaW5pc2hlZFJlc3VsdCh0YXJnZXQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IGFuaW1hdGluZztcblxuICAgICAgaWYgKGlzLmFycih0bykpIHtcbiAgICAgICAgYW5pbWF0aW5nID0gKGFzeW5jIHF1ZXVlID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHByb3BzIG9mIHF1ZXVlKSB7XG4gICAgICAgICAgICBhd2FpdCBhbmltYXRlKHByb3BzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKHRvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYW5pbWF0aW5nID0gUHJvbWlzZS5yZXNvbHZlKHRvKGFuaW1hdGUsIHRhcmdldC5zdG9wLmJpbmQodGFyZ2V0KSkpO1xuICAgICAgICB9XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFthbmltYXRpbmcudGhlbihwcmV2ZW50QmFpbCksIGJhaWxQcm9taXNlXSk7XG4gICAgICByZXN1bHQgPSBnZXRGaW5pc2hlZFJlc3VsdCh0YXJnZXQuZ2V0KCksIHRydWUsIGZhbHNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYWlsU2lnbmFsKSB7XG4gICAgICAgIHJlc3VsdCA9IGVyci5yZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIFNraXBBbmlhbXRpb25TaWduYWwpIHtcbiAgICAgICAgcmVzdWx0ID0gZXJyLnJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGNhbGxJZCA9PSBzdGF0ZS5hc3luY0lkKSB7XG4gICAgICAgIHN0YXRlLmFzeW5jSWQgPSBwYXJlbnRJZDtcbiAgICAgICAgc3RhdGUuYXN5bmNUbyA9IHBhcmVudElkID8gcHJldlRvIDogdW5kZWZpbmVkO1xuICAgICAgICBzdGF0ZS5wcm9taXNlID0gcGFyZW50SWQgPyBwcmV2UHJvbWlzZSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXMuZnVuKG9uUmVzdCkpIHtcbiAgICAgIHJhZi5iYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgICAgIG9uUmVzdChyZXN1bHQsIHRhcmdldCwgdGFyZ2V0Lml0ZW0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSkoKTtcbn1cbmZ1bmN0aW9uIHN0b3BBc3luYyhzdGF0ZSwgY2FuY2VsSWQpIHtcbiAgZmx1c2goc3RhdGUudGltZW91dHMsIHQgPT4gdC5jYW5jZWwoKSk7XG4gIHN0YXRlLnBhdXNlUXVldWUuY2xlYXIoKTtcbiAgc3RhdGUucmVzdW1lUXVldWUuY2xlYXIoKTtcbiAgc3RhdGUuYXN5bmNJZCA9IHN0YXRlLmFzeW5jVG8gPSBzdGF0ZS5wcm9taXNlID0gdW5kZWZpbmVkO1xuICBpZiAoY2FuY2VsSWQpIHN0YXRlLmNhbmNlbElkID0gY2FuY2VsSWQ7XG59XG5jbGFzcyBCYWlsU2lnbmFsIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignQW4gYXN5bmMgYW5pbWF0aW9uIGhhcyBiZWVuIGludGVycnVwdGVkLiBZb3Ugc2VlIHRoaXMgZXJyb3IgYmVjYXVzZSB5b3UgJyArICdmb3Jnb3QgdG8gdXNlIGBhd2FpdGAgb3IgYC5jYXRjaCguLi4pYCBvbiBpdHMgcmV0dXJuZWQgcHJvbWlzZS4nKTtcbiAgICB0aGlzLnJlc3VsdCA9IHZvaWQgMDtcbiAgfVxuXG59XG5jbGFzcyBTa2lwQW5pYW10aW9uU2lnbmFsIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignU2tpcEFuaW1hdGlvblNpZ25hbCcpO1xuICAgIHRoaXMucmVzdWx0ID0gdm9pZCAwO1xuICB9XG5cbn1cblxuY29uc3QgaXNGcmFtZVZhbHVlID0gdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBGcmFtZVZhbHVlO1xubGV0IG5leHRJZCQxID0gMTtcbmNsYXNzIEZyYW1lVmFsdWUgZXh0ZW5kcyBGbHVpZFZhbHVlIHtcbiAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgIHRoaXMuaWQgPSBuZXh0SWQkMSsrO1xuICAgIHRoaXMua2V5ID0gdm9pZCAwO1xuICAgIHRoaXMuX3ByaW9yaXR5ID0gMDtcbiAgfVxuXG4gIGdldCBwcmlvcml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpb3JpdHk7XG4gIH1cblxuICBzZXQgcHJpb3JpdHkocHJpb3JpdHkpIHtcbiAgICBpZiAodGhpcy5fcHJpb3JpdHkgIT0gcHJpb3JpdHkpIHtcbiAgICAgIHRoaXMuX3ByaW9yaXR5ID0gcHJpb3JpdHk7XG5cbiAgICAgIHRoaXMuX29uUHJpb3JpdHlDaGFuZ2UocHJpb3JpdHkpO1xuICAgIH1cbiAgfVxuXG4gIGdldCgpIHtcbiAgICBjb25zdCBub2RlID0gZ2V0QW5pbWF0ZWQodGhpcyk7XG4gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgdG8oLi4uYXJncykge1xuICAgIHJldHVybiBHbG9iYWxzLnRvKHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgaW50ZXJwb2xhdGUoLi4uYXJncykge1xuICAgIGRlcHJlY2F0ZUludGVycG9sYXRlKCk7XG4gICAgcmV0dXJuIEdsb2JhbHMudG8odGhpcywgYXJncyk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCk7XG4gIH1cblxuICBvYnNlcnZlckFkZGVkKGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09IDEpIHRoaXMuX2F0dGFjaCgpO1xuICB9XG5cbiAgb2JzZXJ2ZXJSZW1vdmVkKGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09IDApIHRoaXMuX2RldGFjaCgpO1xuICB9XG5cbiAgX2F0dGFjaCgpIHt9XG5cbiAgX2RldGFjaCgpIHt9XG5cbiAgX29uQ2hhbmdlKHZhbHVlLCBpZGxlID0gZmFsc2UpIHtcbiAgICBjYWxsRmx1aWRPYnNlcnZlcnModGhpcywge1xuICAgICAgdHlwZTogJ2NoYW5nZScsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICB2YWx1ZSxcbiAgICAgIGlkbGVcbiAgICB9KTtcbiAgfVxuXG4gIF9vblByaW9yaXR5Q2hhbmdlKHByaW9yaXR5KSB7XG4gICAgaWYgKCF0aGlzLmlkbGUpIHtcbiAgICAgIGZyYW1lTG9vcC5zb3J0KHRoaXMpO1xuICAgIH1cblxuICAgIGNhbGxGbHVpZE9ic2VydmVycyh0aGlzLCB7XG4gICAgICB0eXBlOiAncHJpb3JpdHknLFxuICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgcHJpb3JpdHlcbiAgICB9KTtcbiAgfVxuXG59XG5cbmNvbnN0ICRQID0gU3ltYm9sLmZvcignU3ByaW5nUGhhc2UnKTtcbmNvbnN0IEhBU19BTklNQVRFRCA9IDE7XG5jb25zdCBJU19BTklNQVRJTkcgPSAyO1xuY29uc3QgSVNfUEFVU0VEID0gNDtcbmNvbnN0IGhhc0FuaW1hdGVkID0gdGFyZ2V0ID0+ICh0YXJnZXRbJFBdICYgSEFTX0FOSU1BVEVEKSA+IDA7XG5jb25zdCBpc0FuaW1hdGluZyA9IHRhcmdldCA9PiAodGFyZ2V0WyRQXSAmIElTX0FOSU1BVElORykgPiAwO1xuY29uc3QgaXNQYXVzZWQgPSB0YXJnZXQgPT4gKHRhcmdldFskUF0gJiBJU19QQVVTRUQpID4gMDtcbmNvbnN0IHNldEFjdGl2ZUJpdCA9ICh0YXJnZXQsIGFjdGl2ZSkgPT4gYWN0aXZlID8gdGFyZ2V0WyRQXSB8PSBJU19BTklNQVRJTkcgfCBIQVNfQU5JTUFURUQgOiB0YXJnZXRbJFBdICY9IH5JU19BTklNQVRJTkc7XG5jb25zdCBzZXRQYXVzZWRCaXQgPSAodGFyZ2V0LCBwYXVzZWQpID0+IHBhdXNlZCA/IHRhcmdldFskUF0gfD0gSVNfUEFVU0VEIDogdGFyZ2V0WyRQXSAmPSB+SVNfUEFVU0VEO1xuXG5jbGFzcyBTcHJpbmdWYWx1ZSBleHRlbmRzIEZyYW1lVmFsdWUge1xuICBjb25zdHJ1Y3RvcihhcmcxLCBhcmcyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmtleSA9IHZvaWQgMDtcbiAgICB0aGlzLmFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24oKTtcbiAgICB0aGlzLnF1ZXVlID0gdm9pZCAwO1xuICAgIHRoaXMuZGVmYXVsdFByb3BzID0ge307XG4gICAgdGhpcy5fc3RhdGUgPSB7XG4gICAgICBwYXVzZWQ6IGZhbHNlLFxuICAgICAgZGVsYXllZDogZmFsc2UsXG4gICAgICBwYXVzZVF1ZXVlOiBuZXcgU2V0KCksXG4gICAgICByZXN1bWVRdWV1ZTogbmV3IFNldCgpLFxuICAgICAgdGltZW91dHM6IG5ldyBTZXQoKVxuICAgIH07XG4gICAgdGhpcy5fcGVuZGluZ0NhbGxzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuX2xhc3RDYWxsSWQgPSAwO1xuICAgIHRoaXMuX2xhc3RUb0lkID0gMDtcbiAgICB0aGlzLl9tZW1vaXplZER1cmF0aW9uID0gMDtcblxuICAgIGlmICghaXMudW5kKGFyZzEpIHx8ICFpcy51bmQoYXJnMikpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gaXMub2JqKGFyZzEpID8gX2V4dGVuZHMoe30sIGFyZzEpIDogX2V4dGVuZHMoe30sIGFyZzIsIHtcbiAgICAgICAgZnJvbTogYXJnMVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpcy51bmQocHJvcHMuZGVmYXVsdCkpIHtcbiAgICAgICAgcHJvcHMuZGVmYXVsdCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhcnQocHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpZGxlKCkge1xuICAgIHJldHVybiAhKGlzQW5pbWF0aW5nKHRoaXMpIHx8IHRoaXMuX3N0YXRlLmFzeW5jVG8pIHx8IGlzUGF1c2VkKHRoaXMpO1xuICB9XG5cbiAgZ2V0IGdvYWwoKSB7XG4gICAgcmV0dXJuIGdldEZsdWlkVmFsdWUodGhpcy5hbmltYXRpb24udG8pO1xuICB9XG5cbiAgZ2V0IHZlbG9jaXR5KCkge1xuICAgIGNvbnN0IG5vZGUgPSBnZXRBbmltYXRlZCh0aGlzKTtcbiAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEFuaW1hdGVkVmFsdWUgPyBub2RlLmxhc3RWZWxvY2l0eSB8fCAwIDogbm9kZS5nZXRQYXlsb2FkKCkubWFwKG5vZGUgPT4gbm9kZS5sYXN0VmVsb2NpdHkgfHwgMCk7XG4gIH1cblxuICBnZXQgaGFzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIGhhc0FuaW1hdGVkKHRoaXMpO1xuICB9XG5cbiAgZ2V0IGlzQW5pbWF0aW5nKCkge1xuICAgIHJldHVybiBpc0FuaW1hdGluZyh0aGlzKTtcbiAgfVxuXG4gIGdldCBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gaXNQYXVzZWQodGhpcyk7XG4gIH1cblxuICBnZXQgaXNEZWxheWVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZS5kZWxheWVkO1xuICB9XG5cbiAgYWR2YW5jZShkdCkge1xuICAgIGxldCBpZGxlID0gdHJ1ZTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFuaW0gPSB0aGlzLmFuaW1hdGlvbjtcbiAgICBsZXQge1xuICAgICAgY29uZmlnLFxuICAgICAgdG9WYWx1ZXNcbiAgICB9ID0gYW5pbTtcbiAgICBjb25zdCBwYXlsb2FkID0gZ2V0UGF5bG9hZChhbmltLnRvKTtcblxuICAgIGlmICghcGF5bG9hZCAmJiBoYXNGbHVpZFZhbHVlKGFuaW0udG8pKSB7XG4gICAgICB0b1ZhbHVlcyA9IHRvQXJyYXkoZ2V0Rmx1aWRWYWx1ZShhbmltLnRvKSk7XG4gICAgfVxuXG4gICAgYW5pbS52YWx1ZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgaWYgKG5vZGUuZG9uZSkgcmV0dXJuO1xuICAgICAgY29uc3QgdG8gPSBub2RlLmNvbnN0cnVjdG9yID09IEFuaW1hdGVkU3RyaW5nID8gMSA6IHBheWxvYWQgPyBwYXlsb2FkW2ldLmxhc3RQb3NpdGlvbiA6IHRvVmFsdWVzW2ldO1xuICAgICAgbGV0IGZpbmlzaGVkID0gYW5pbS5pbW1lZGlhdGU7XG4gICAgICBsZXQgcG9zaXRpb24gPSB0bztcblxuICAgICAgaWYgKCFmaW5pc2hlZCkge1xuICAgICAgICBwb3NpdGlvbiA9IG5vZGUubGFzdFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChjb25maWcudGVuc2lvbiA8PSAwKSB7XG4gICAgICAgICAgbm9kZS5kb25lID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxhcHNlZCA9IG5vZGUuZWxhcHNlZFRpbWUgKz0gZHQ7XG4gICAgICAgIGNvbnN0IGZyb20gPSBhbmltLmZyb21WYWx1ZXNbaV07XG4gICAgICAgIGNvbnN0IHYwID0gbm9kZS52MCAhPSBudWxsID8gbm9kZS52MCA6IG5vZGUudjAgPSBpcy5hcnIoY29uZmlnLnZlbG9jaXR5KSA/IGNvbmZpZy52ZWxvY2l0eVtpXSA6IGNvbmZpZy52ZWxvY2l0eTtcbiAgICAgICAgbGV0IHZlbG9jaXR5O1xuXG4gICAgICAgIGlmICghaXMudW5kKGNvbmZpZy5kdXJhdGlvbikpIHtcbiAgICAgICAgICBsZXQgcCA9IDE7XG5cbiAgICAgICAgICBpZiAoY29uZmlnLmR1cmF0aW9uID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21lbW9pemVkRHVyYXRpb24gIT09IGNvbmZpZy5kdXJhdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLl9tZW1vaXplZER1cmF0aW9uID0gY29uZmlnLmR1cmF0aW9uO1xuXG4gICAgICAgICAgICAgIGlmIChub2RlLmR1cmF0aW9uUHJvZ3Jlc3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5lbGFwc2VkVGltZSA9IGNvbmZpZy5kdXJhdGlvbiAqIG5vZGUuZHVyYXRpb25Qcm9ncmVzcztcbiAgICAgICAgICAgICAgICBlbGFwc2VkID0gbm9kZS5lbGFwc2VkVGltZSArPSBkdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwID0gKGNvbmZpZy5wcm9ncmVzcyB8fCAwKSArIGVsYXBzZWQgLyB0aGlzLl9tZW1vaXplZER1cmF0aW9uO1xuICAgICAgICAgICAgcCA9IHAgPiAxID8gMSA6IHAgPCAwID8gMCA6IHA7XG4gICAgICAgICAgICBub2RlLmR1cmF0aW9uUHJvZ3Jlc3MgPSBwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBvc2l0aW9uID0gZnJvbSArIGNvbmZpZy5lYXNpbmcocCkgKiAodG8gLSBmcm9tKTtcbiAgICAgICAgICB2ZWxvY2l0eSA9IChwb3NpdGlvbiAtIG5vZGUubGFzdFBvc2l0aW9uKSAvIGR0O1xuICAgICAgICAgIGZpbmlzaGVkID0gcCA9PSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZWNheSkge1xuICAgICAgICAgICAgY29uc3QgZGVjYXkgPSBjb25maWcuZGVjYXkgPT09IHRydWUgPyAwLjk5OCA6IGNvbmZpZy5kZWNheTtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBNYXRoLmV4cCgtKDEgLSBkZWNheSkgKiBlbGFwc2VkKTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gZnJvbSArIHYwIC8gKDEgLSBkZWNheSkgKiAoMSAtIGUpO1xuICAgICAgICAgICAgZmluaXNoZWQgPSBNYXRoLmFicyhub2RlLmxhc3RQb3NpdGlvbiAtIHBvc2l0aW9uKSA8IDAuMTtcbiAgICAgICAgICAgIHZlbG9jaXR5ID0gdjAgKiBlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZlbG9jaXR5ID0gbm9kZS5sYXN0VmVsb2NpdHkgPT0gbnVsbCA/IHYwIDogbm9kZS5sYXN0VmVsb2NpdHk7XG4gICAgICAgICAgICAgIGNvbnN0IHByZWNpc2lvbiA9IGNvbmZpZy5wcmVjaXNpb24gfHwgKGZyb20gPT0gdG8gPyAwLjAwNSA6IE1hdGgubWluKDEsIE1hdGguYWJzKHRvIC0gZnJvbSkgKiAwLjAwMSkpO1xuICAgICAgICAgICAgICBjb25zdCByZXN0VmVsb2NpdHkgPSBjb25maWcucmVzdFZlbG9jaXR5IHx8IHByZWNpc2lvbiAvIDEwO1xuICAgICAgICAgICAgICBjb25zdCBib3VuY2VGYWN0b3IgPSBjb25maWcuY2xhbXAgPyAwIDogY29uZmlnLmJvdW5jZTtcbiAgICAgICAgICAgICAgY29uc3QgY2FuQm91bmNlID0gIWlzLnVuZChib3VuY2VGYWN0b3IpO1xuICAgICAgICAgICAgICBjb25zdCBpc0dyb3dpbmcgPSBmcm9tID09IHRvID8gbm9kZS52MCA+IDAgOiBmcm9tIDwgdG87XG4gICAgICAgICAgICAgIGxldCBpc01vdmluZztcbiAgICAgICAgICAgICAgbGV0IGlzQm91bmNpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IDE7XG4gICAgICAgICAgICAgIGNvbnN0IG51bVN0ZXBzID0gTWF0aC5jZWlsKGR0IC8gc3RlcCk7XG5cbiAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBudW1TdGVwczsgKytuKSB7XG4gICAgICAgICAgICAgICAgaXNNb3ZpbmcgPSBNYXRoLmFicyh2ZWxvY2l0eSkgPiByZXN0VmVsb2NpdHk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzTW92aW5nKSB7XG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IE1hdGguYWJzKHRvIC0gcG9zaXRpb24pIDw9IHByZWNpc2lvbjtcblxuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYW5Cb3VuY2UpIHtcbiAgICAgICAgICAgICAgICAgIGlzQm91bmNpbmcgPSBwb3NpdGlvbiA9PSB0byB8fCBwb3NpdGlvbiA+IHRvID09IGlzR3Jvd2luZztcblxuICAgICAgICAgICAgICAgICAgaWYgKGlzQm91bmNpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHkgPSAtdmVsb2NpdHkgKiBib3VuY2VGYWN0b3I7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdG87XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ByaW5nRm9yY2UgPSAtY29uZmlnLnRlbnNpb24gKiAwLjAwMDAwMSAqIChwb3NpdGlvbiAtIHRvKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYW1waW5nRm9yY2UgPSAtY29uZmlnLmZyaWN0aW9uICogMC4wMDEgKiB2ZWxvY2l0eTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2NlbGVyYXRpb24gPSAoc3ByaW5nRm9yY2UgKyBkYW1waW5nRm9yY2UpIC8gY29uZmlnLm1hc3M7XG4gICAgICAgICAgICAgICAgdmVsb2NpdHkgPSB2ZWxvY2l0eSArIGFjY2VsZXJhdGlvbiAqIHN0ZXA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIHZlbG9jaXR5ICogc3RlcDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIG5vZGUubGFzdFZlbG9jaXR5ID0gdmVsb2NpdHk7XG5cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwb3NpdGlvbikpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEdvdCBOYU4gd2hpbGUgYW5pbWF0aW5nOmAsIHRoaXMpO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocGF5bG9hZCAmJiAhcGF5bG9hZFtpXS5kb25lKSB7XG4gICAgICAgIGZpbmlzaGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICBub2RlLmRvbmUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWRsZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5zZXRWYWx1ZShwb3NpdGlvbiwgY29uZmlnLnJvdW5kKSkge1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBub2RlID0gZ2V0QW5pbWF0ZWQodGhpcyk7XG4gICAgY29uc3QgY3VyclZhbCA9IG5vZGUuZ2V0VmFsdWUoKTtcblxuICAgIGlmIChpZGxlKSB7XG4gICAgICBjb25zdCBmaW5hbFZhbCA9IGdldEZsdWlkVmFsdWUoYW5pbS50byk7XG5cbiAgICAgIGlmICgoY3VyclZhbCAhPT0gZmluYWxWYWwgfHwgY2hhbmdlZCkgJiYgIWNvbmZpZy5kZWNheSkge1xuICAgICAgICBub2RlLnNldFZhbHVlKGZpbmFsVmFsKTtcblxuICAgICAgICB0aGlzLl9vbkNoYW5nZShmaW5hbFZhbCk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZWQgJiYgY29uZmlnLmRlY2F5KSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKGN1cnJWYWwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdG9wKCk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9vbkNoYW5nZShjdXJyVmFsKTtcbiAgICB9XG4gIH1cblxuICBzZXQodmFsdWUpIHtcbiAgICByYWYuYmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgICAgdGhpcy5fc3RvcCgpO1xuXG4gICAgICB0aGlzLl9mb2N1cyh2YWx1ZSk7XG5cbiAgICAgIHRoaXMuX3NldCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwYXVzZSgpIHtcbiAgICB0aGlzLl91cGRhdGUoe1xuICAgICAgcGF1c2U6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHJlc3VtZSgpIHtcbiAgICB0aGlzLl91cGRhdGUoe1xuICAgICAgcGF1c2U6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBmaW5pc2goKSB7XG4gICAgaWYgKGlzQW5pbWF0aW5nKHRoaXMpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHRvLFxuICAgICAgICBjb25maWdcbiAgICAgIH0gPSB0aGlzLmFuaW1hdGlvbjtcbiAgICAgIHJhZi5iYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgICAgIHRoaXMuX29uU3RhcnQoKTtcblxuICAgICAgICBpZiAoIWNvbmZpZy5kZWNheSkge1xuICAgICAgICAgIHRoaXMuX3NldCh0bywgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RvcCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGUocHJvcHMpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMucXVldWUgfHwgKHRoaXMucXVldWUgPSBbXSk7XG4gICAgcXVldWUucHVzaChwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGFydCh0bywgYXJnMikge1xuICAgIGxldCBxdWV1ZTtcblxuICAgIGlmICghaXMudW5kKHRvKSkge1xuICAgICAgcXVldWUgPSBbaXMub2JqKHRvKSA/IHRvIDogX2V4dGVuZHMoe30sIGFyZzIsIHtcbiAgICAgICAgdG9cbiAgICAgIH0pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVldWUgPSB0aGlzLnF1ZXVlIHx8IFtdO1xuICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChxdWV1ZS5tYXAocHJvcHMgPT4ge1xuICAgICAgY29uc3QgdXAgPSB0aGlzLl91cGRhdGUocHJvcHMpO1xuXG4gICAgICByZXR1cm4gdXA7XG4gICAgfSkpLnRoZW4ocmVzdWx0cyA9PiBnZXRDb21iaW5lZFJlc3VsdCh0aGlzLCByZXN1bHRzKSk7XG4gIH1cblxuICBzdG9wKGNhbmNlbCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRvXG4gICAgfSA9IHRoaXMuYW5pbWF0aW9uO1xuXG4gICAgdGhpcy5fZm9jdXModGhpcy5nZXQoKSk7XG5cbiAgICBzdG9wQXN5bmModGhpcy5fc3RhdGUsIGNhbmNlbCAmJiB0aGlzLl9sYXN0Q2FsbElkKTtcbiAgICByYWYuYmF0Y2hlZFVwZGF0ZXMoKCkgPT4gdGhpcy5fc3RvcCh0bywgY2FuY2VsKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl91cGRhdGUoe1xuICAgICAgcmVzZXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIGV2ZW50T2JzZXJ2ZWQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PSAnY2hhbmdlJykge1xuICAgICAgdGhpcy5fc3RhcnQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT0gJ3ByaW9yaXR5Jykge1xuICAgICAgdGhpcy5wcmlvcml0eSA9IGV2ZW50LnByaW9yaXR5ICsgMTtcbiAgICB9XG4gIH1cblxuICBfcHJlcGFyZU5vZGUocHJvcHMpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmtleSB8fCAnJztcbiAgICBsZXQge1xuICAgICAgdG8sXG4gICAgICBmcm9tXG4gICAgfSA9IHByb3BzO1xuICAgIHRvID0gaXMub2JqKHRvKSA/IHRvW2tleV0gOiB0bztcblxuICAgIGlmICh0byA9PSBudWxsIHx8IGlzQXN5bmNUbyh0bykpIHtcbiAgICAgIHRvID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZyb20gPSBpcy5vYmooZnJvbSkgPyBmcm9tW2tleV0gOiBmcm9tO1xuXG4gICAgaWYgKGZyb20gPT0gbnVsbCkge1xuICAgICAgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZSA9IHtcbiAgICAgIHRvLFxuICAgICAgZnJvbVxuICAgIH07XG5cbiAgICBpZiAoIWhhc0FuaW1hdGVkKHRoaXMpKSB7XG4gICAgICBpZiAocHJvcHMucmV2ZXJzZSkgW3RvLCBmcm9tXSA9IFtmcm9tLCB0b107XG4gICAgICBmcm9tID0gZ2V0Rmx1aWRWYWx1ZShmcm9tKTtcblxuICAgICAgaWYgKCFpcy51bmQoZnJvbSkpIHtcbiAgICAgICAgdGhpcy5fc2V0KGZyb20pO1xuICAgICAgfSBlbHNlIGlmICghZ2V0QW5pbWF0ZWQodGhpcykpIHtcbiAgICAgICAgICB0aGlzLl9zZXQodG8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG5cbiAgX3VwZGF0ZShfcmVmLCBpc0xvb3ApIHtcbiAgICBsZXQgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgX3JlZik7XG5cbiAgICBjb25zdCB7XG4gICAgICBrZXksXG4gICAgICBkZWZhdWx0UHJvcHNcbiAgICB9ID0gdGhpcztcbiAgICBpZiAocHJvcHMuZGVmYXVsdCkgT2JqZWN0LmFzc2lnbihkZWZhdWx0UHJvcHMsIGdldERlZmF1bHRQcm9wcyhwcm9wcywgKHZhbHVlLCBwcm9wKSA9PiAvXm9uLy50ZXN0KHByb3ApID8gcmVzb2x2ZVByb3AodmFsdWUsIGtleSkgOiB2YWx1ZSkpO1xuICAgIG1lcmdlQWN0aXZlRm4odGhpcywgcHJvcHMsICdvblByb3BzJyk7XG4gICAgc2VuZEV2ZW50KHRoaXMsICdvblByb3BzJywgcHJvcHMsIHRoaXMpO1xuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9wcmVwYXJlTm9kZShwcm9wcyk7XG5cbiAgICBpZiAoT2JqZWN0LmlzRnJvemVuKHRoaXMpKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2Fubm90IGFuaW1hdGUgYSBgU3ByaW5nVmFsdWVgIG9iamVjdCB0aGF0IGlzIGZyb3plbi4gJyArICdEaWQgeW91IGZvcmdldCB0byBwYXNzIHlvdXIgY29tcG9uZW50IHRvIGBhbmltYXRlZCguLi4pYCBiZWZvcmUgYW5pbWF0aW5nIGl0cyBwcm9wcz8nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgIHJldHVybiBzY2hlZHVsZVByb3BzKCsrdGhpcy5fbGFzdENhbGxJZCwge1xuICAgICAga2V5LFxuICAgICAgcHJvcHMsXG4gICAgICBkZWZhdWx0UHJvcHMsXG4gICAgICBzdGF0ZSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgcGF1c2U6ICgpID0+IHtcbiAgICAgICAgICBpZiAoIWlzUGF1c2VkKHRoaXMpKSB7XG4gICAgICAgICAgICBzZXRQYXVzZWRCaXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICBmbHVzaENhbGxzKHN0YXRlLnBhdXNlUXVldWUpO1xuICAgICAgICAgICAgc2VuZEV2ZW50KHRoaXMsICdvblBhdXNlJywgZ2V0RmluaXNoZWRSZXN1bHQodGhpcywgY2hlY2tGaW5pc2hlZCh0aGlzLCB0aGlzLmFuaW1hdGlvbi50bykpLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VtZTogKCkgPT4ge1xuICAgICAgICAgIGlmIChpc1BhdXNlZCh0aGlzKSkge1xuICAgICAgICAgICAgc2V0UGF1c2VkQml0KHRoaXMsIGZhbHNlKTtcblxuICAgICAgICAgICAgaWYgKGlzQW5pbWF0aW5nKHRoaXMpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Jlc3VtZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbHVzaENhbGxzKHN0YXRlLnJlc3VtZVF1ZXVlKTtcbiAgICAgICAgICAgIHNlbmRFdmVudCh0aGlzLCAnb25SZXN1bWUnLCBnZXRGaW5pc2hlZFJlc3VsdCh0aGlzLCBjaGVja0ZpbmlzaGVkKHRoaXMsIHRoaXMuYW5pbWF0aW9uLnRvKSksIHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnQ6IHRoaXMuX21lcmdlLmJpbmQodGhpcywgcmFuZ2UpXG4gICAgICB9XG4gICAgfSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgaWYgKHByb3BzLmxvb3AgJiYgcmVzdWx0LmZpbmlzaGVkICYmICEoaXNMb29wICYmIHJlc3VsdC5ub29wKSkge1xuICAgICAgICBjb25zdCBuZXh0UHJvcHMgPSBjcmVhdGVMb29wVXBkYXRlKHByb3BzKTtcblxuICAgICAgICBpZiAobmV4dFByb3BzKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZShuZXh0UHJvcHMsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBfbWVyZ2UocmFuZ2UsIHByb3BzLCByZXNvbHZlKSB7XG4gICAgaWYgKHByb3BzLmNhbmNlbCkge1xuICAgICAgdGhpcy5zdG9wKHRydWUpO1xuICAgICAgcmV0dXJuIHJlc29sdmUoZ2V0Q2FuY2VsbGVkUmVzdWx0KHRoaXMpKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNUb1Byb3AgPSAhaXMudW5kKHJhbmdlLnRvKTtcbiAgICBjb25zdCBoYXNGcm9tUHJvcCA9ICFpcy51bmQocmFuZ2UuZnJvbSk7XG5cbiAgICBpZiAoaGFzVG9Qcm9wIHx8IGhhc0Zyb21Qcm9wKSB7XG4gICAgICBpZiAocHJvcHMuY2FsbElkID4gdGhpcy5fbGFzdFRvSWQpIHtcbiAgICAgICAgdGhpcy5fbGFzdFRvSWQgPSBwcm9wcy5jYWxsSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShnZXRDYW5jZWxsZWRSZXN1bHQodGhpcykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGtleSxcbiAgICAgIGRlZmF1bHRQcm9wcyxcbiAgICAgIGFuaW1hdGlvbjogYW5pbVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIHRvOiBwcmV2VG8sXG4gICAgICBmcm9tOiBwcmV2RnJvbVxuICAgIH0gPSBhbmltO1xuICAgIGxldCB7XG4gICAgICB0byA9IHByZXZUbyxcbiAgICAgIGZyb20gPSBwcmV2RnJvbVxuICAgIH0gPSByYW5nZTtcblxuICAgIGlmIChoYXNGcm9tUHJvcCAmJiAhaGFzVG9Qcm9wICYmICghcHJvcHMuZGVmYXVsdCB8fCBpcy51bmQodG8pKSkge1xuICAgICAgdG8gPSBmcm9tO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5yZXZlcnNlKSBbdG8sIGZyb21dID0gW2Zyb20sIHRvXTtcbiAgICBjb25zdCBoYXNGcm9tQ2hhbmdlZCA9ICFpc0VxdWFsKGZyb20sIHByZXZGcm9tKTtcblxuICAgIGlmIChoYXNGcm9tQ2hhbmdlZCkge1xuICAgICAgYW5pbS5mcm9tID0gZnJvbTtcbiAgICB9XG5cbiAgICBmcm9tID0gZ2V0Rmx1aWRWYWx1ZShmcm9tKTtcbiAgICBjb25zdCBoYXNUb0NoYW5nZWQgPSAhaXNFcXVhbCh0bywgcHJldlRvKTtcblxuICAgIGlmIChoYXNUb0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2ZvY3VzKHRvKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNBc3luY1RvID0gaXNBc3luY1RvKHByb3BzLnRvKTtcbiAgICBjb25zdCB7XG4gICAgICBjb25maWdcbiAgICB9ID0gYW5pbTtcbiAgICBjb25zdCB7XG4gICAgICBkZWNheSxcbiAgICAgIHZlbG9jaXR5XG4gICAgfSA9IGNvbmZpZztcblxuICAgIGlmIChoYXNUb1Byb3AgfHwgaGFzRnJvbVByb3ApIHtcbiAgICAgIGNvbmZpZy52ZWxvY2l0eSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmNvbmZpZyAmJiAhaGFzQXN5bmNUbykge1xuICAgICAgbWVyZ2VDb25maWcoY29uZmlnLCBjYWxsUHJvcChwcm9wcy5jb25maWcsIGtleSksIHByb3BzLmNvbmZpZyAhPT0gZGVmYXVsdFByb3BzLmNvbmZpZyA/IGNhbGxQcm9wKGRlZmF1bHRQcm9wcy5jb25maWcsIGtleSkgOiB2b2lkIDApO1xuICAgIH1cblxuICAgIGxldCBub2RlID0gZ2V0QW5pbWF0ZWQodGhpcyk7XG5cbiAgICBpZiAoIW5vZGUgfHwgaXMudW5kKHRvKSkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZ2V0RmluaXNoZWRSZXN1bHQodGhpcywgdHJ1ZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc2V0ID0gaXMudW5kKHByb3BzLnJlc2V0KSA/IGhhc0Zyb21Qcm9wICYmICFwcm9wcy5kZWZhdWx0IDogIWlzLnVuZChmcm9tKSAmJiBtYXRjaFByb3AocHJvcHMucmVzZXQsIGtleSk7XG4gICAgY29uc3QgdmFsdWUgPSByZXNldCA/IGZyb20gOiB0aGlzLmdldCgpO1xuICAgIGNvbnN0IGdvYWwgPSBjb21wdXRlR29hbCh0byk7XG4gICAgY29uc3QgaXNBbmltYXRhYmxlID0gaXMubnVtKGdvYWwpIHx8IGlzLmFycihnb2FsKSB8fCBpc0FuaW1hdGVkU3RyaW5nKGdvYWwpO1xuICAgIGNvbnN0IGltbWVkaWF0ZSA9ICFoYXNBc3luY1RvICYmICghaXNBbmltYXRhYmxlIHx8IG1hdGNoUHJvcChkZWZhdWx0UHJvcHMuaW1tZWRpYXRlIHx8IHByb3BzLmltbWVkaWF0ZSwga2V5KSk7XG5cbiAgICBpZiAoaGFzVG9DaGFuZ2VkKSB7XG4gICAgICBjb25zdCBub2RlVHlwZSA9IGdldEFuaW1hdGVkVHlwZSh0byk7XG5cbiAgICAgIGlmIChub2RlVHlwZSAhPT0gbm9kZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICAgICAgbm9kZSA9IHRoaXMuX3NldChnb2FsKTtcbiAgICAgICAgfSBlbHNlIHRocm93IEVycm9yKGBDYW5ub3QgYW5pbWF0ZSBiZXR3ZWVuICR7bm9kZS5jb25zdHJ1Y3Rvci5uYW1lfSBhbmQgJHtub2RlVHlwZS5uYW1lfSwgYXMgdGhlIFwidG9cIiBwcm9wIHN1Z2dlc3RzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZ29hbFR5cGUgPSBub2RlLmNvbnN0cnVjdG9yO1xuICAgIGxldCBzdGFydGVkID0gaGFzRmx1aWRWYWx1ZSh0byk7XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIXN0YXJ0ZWQpIHtcbiAgICAgIGNvbnN0IGhhc1ZhbHVlQ2hhbmdlZCA9IHJlc2V0IHx8ICFoYXNBbmltYXRlZCh0aGlzKSAmJiBoYXNGcm9tQ2hhbmdlZDtcblxuICAgICAgaWYgKGhhc1RvQ2hhbmdlZCB8fCBoYXNWYWx1ZUNoYW5nZWQpIHtcbiAgICAgICAgZmluaXNoZWQgPSBpc0VxdWFsKGNvbXB1dGVHb2FsKHZhbHVlKSwgZ29hbCk7XG4gICAgICAgIHN0YXJ0ZWQgPSAhZmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNFcXVhbChhbmltLmltbWVkaWF0ZSwgaW1tZWRpYXRlKSAmJiAhaW1tZWRpYXRlIHx8ICFpc0VxdWFsKGNvbmZpZy5kZWNheSwgZGVjYXkpIHx8ICFpc0VxdWFsKGNvbmZpZy52ZWxvY2l0eSwgdmVsb2NpdHkpKSB7XG4gICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmaW5pc2hlZCAmJiBpc0FuaW1hdGluZyh0aGlzKSkge1xuICAgICAgaWYgKGFuaW0uY2hhbmdlZCAmJiAhcmVzZXQpIHtcbiAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFzdGFydGVkKSB7XG4gICAgICAgICAgdGhpcy5fc3RvcChwcmV2VG8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFoYXNBc3luY1RvKSB7XG4gICAgICBpZiAoc3RhcnRlZCB8fCBoYXNGbHVpZFZhbHVlKHByZXZUbykpIHtcbiAgICAgICAgYW5pbS52YWx1ZXMgPSBub2RlLmdldFBheWxvYWQoKTtcbiAgICAgICAgYW5pbS50b1ZhbHVlcyA9IGhhc0ZsdWlkVmFsdWUodG8pID8gbnVsbCA6IGdvYWxUeXBlID09IEFuaW1hdGVkU3RyaW5nID8gWzFdIDogdG9BcnJheShnb2FsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFuaW0uaW1tZWRpYXRlICE9IGltbWVkaWF0ZSkge1xuICAgICAgICBhbmltLmltbWVkaWF0ZSA9IGltbWVkaWF0ZTtcblxuICAgICAgICBpZiAoIWltbWVkaWF0ZSAmJiAhcmVzZXQpIHtcbiAgICAgICAgICB0aGlzLl9zZXQocHJldlRvKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgb25SZXN0XG4gICAgICAgIH0gPSBhbmltO1xuICAgICAgICBlYWNoKEFDVElWRV9FVkVOVFMsIHR5cGUgPT4gbWVyZ2VBY3RpdmVGbih0aGlzLCBwcm9wcywgdHlwZSkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRGaW5pc2hlZFJlc3VsdCh0aGlzLCBjaGVja0ZpbmlzaGVkKHRoaXMsIHByZXZUbykpO1xuICAgICAgICBmbHVzaENhbGxzKHRoaXMuX3BlbmRpbmdDYWxscywgcmVzdWx0KTtcblxuICAgICAgICB0aGlzLl9wZW5kaW5nQ2FsbHMuYWRkKHJlc29sdmUpO1xuXG4gICAgICAgIGlmIChhbmltLmNoYW5nZWQpIHJhZi5iYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgICAgICAgYW5pbS5jaGFuZ2VkID0gIXJlc2V0O1xuICAgICAgICAgIG9uUmVzdCA9PSBudWxsID8gdm9pZCAwIDogb25SZXN0KHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgICAgIGNhbGxQcm9wKGRlZmF1bHRQcm9wcy5vblJlc3QsIHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYW5pbS5vblN0YXJ0ID09IG51bGwgPyB2b2lkIDAgOiBhbmltLm9uU3RhcnQocmVzdWx0LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICB0aGlzLl9zZXQodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChoYXNBc3luY1RvKSB7XG4gICAgICByZXNvbHZlKHJ1bkFzeW5jKHByb3BzLnRvLCBwcm9wcywgdGhpcy5fc3RhdGUsIHRoaXMpKTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgdGhpcy5fc3RhcnQoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBbmltYXRpbmcodGhpcykgJiYgIWhhc1RvQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdDYWxscy5hZGQocmVzb2x2ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGdldE5vb3BSZXN1bHQodmFsdWUpKTtcbiAgICAgICAgICB9XG4gIH1cblxuICBfZm9jdXModmFsdWUpIHtcbiAgICBjb25zdCBhbmltID0gdGhpcy5hbmltYXRpb247XG5cbiAgICBpZiAodmFsdWUgIT09IGFuaW0udG8pIHtcbiAgICAgIGlmIChnZXRGbHVpZE9ic2VydmVycyh0aGlzKSkge1xuICAgICAgICB0aGlzLl9kZXRhY2goKTtcbiAgICAgIH1cblxuICAgICAgYW5pbS50byA9IHZhbHVlO1xuXG4gICAgICBpZiAoZ2V0Rmx1aWRPYnNlcnZlcnModGhpcykpIHtcbiAgICAgICAgdGhpcy5fYXR0YWNoKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2F0dGFjaCgpIHtcbiAgICBsZXQgcHJpb3JpdHkgPSAwO1xuICAgIGNvbnN0IHtcbiAgICAgIHRvXG4gICAgfSA9IHRoaXMuYW5pbWF0aW9uO1xuXG4gICAgaWYgKGhhc0ZsdWlkVmFsdWUodG8pKSB7XG4gICAgICBhZGRGbHVpZE9ic2VydmVyKHRvLCB0aGlzKTtcblxuICAgICAgaWYgKGlzRnJhbWVWYWx1ZSh0bykpIHtcbiAgICAgICAgcHJpb3JpdHkgPSB0by5wcmlvcml0eSArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xuICB9XG5cbiAgX2RldGFjaCgpIHtcbiAgICBjb25zdCB7XG4gICAgICB0b1xuICAgIH0gPSB0aGlzLmFuaW1hdGlvbjtcblxuICAgIGlmIChoYXNGbHVpZFZhbHVlKHRvKSkge1xuICAgICAgcmVtb3ZlRmx1aWRPYnNlcnZlcih0bywgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgX3NldChhcmcsIGlkbGUgPSB0cnVlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRGbHVpZFZhbHVlKGFyZyk7XG5cbiAgICBpZiAoIWlzLnVuZCh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG9sZE5vZGUgPSBnZXRBbmltYXRlZCh0aGlzKTtcblxuICAgICAgaWYgKCFvbGROb2RlIHx8ICFpc0VxdWFsKHZhbHVlLCBvbGROb2RlLmdldFZhbHVlKCkpKSB7XG4gICAgICAgIGNvbnN0IG5vZGVUeXBlID0gZ2V0QW5pbWF0ZWRUeXBlKHZhbHVlKTtcblxuICAgICAgICBpZiAoIW9sZE5vZGUgfHwgb2xkTm9kZS5jb25zdHJ1Y3RvciAhPSBub2RlVHlwZSkge1xuICAgICAgICAgIHNldEFuaW1hdGVkKHRoaXMsIG5vZGVUeXBlLmNyZWF0ZSh2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9sZE5vZGUuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9sZE5vZGUpIHtcbiAgICAgICAgICByYWYuYmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUsIGlkbGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldEFuaW1hdGVkKHRoaXMpO1xuICB9XG5cbiAgX29uU3RhcnQoKSB7XG4gICAgY29uc3QgYW5pbSA9IHRoaXMuYW5pbWF0aW9uO1xuXG4gICAgaWYgKCFhbmltLmNoYW5nZWQpIHtcbiAgICAgIGFuaW0uY2hhbmdlZCA9IHRydWU7XG4gICAgICBzZW5kRXZlbnQodGhpcywgJ29uU3RhcnQnLCBnZXRGaW5pc2hlZFJlc3VsdCh0aGlzLCBjaGVja0ZpbmlzaGVkKHRoaXMsIGFuaW0udG8pKSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgX29uQ2hhbmdlKHZhbHVlLCBpZGxlKSB7XG4gICAgaWYgKCFpZGxlKSB7XG4gICAgICB0aGlzLl9vblN0YXJ0KCk7XG5cbiAgICAgIGNhbGxQcm9wKHRoaXMuYW5pbWF0aW9uLm9uQ2hhbmdlLCB2YWx1ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgY2FsbFByb3AodGhpcy5kZWZhdWx0UHJvcHMub25DaGFuZ2UsIHZhbHVlLCB0aGlzKTtcblxuICAgIHN1cGVyLl9vbkNoYW5nZSh2YWx1ZSwgaWRsZSk7XG4gIH1cblxuICBfc3RhcnQoKSB7XG4gICAgY29uc3QgYW5pbSA9IHRoaXMuYW5pbWF0aW9uO1xuICAgIGdldEFuaW1hdGVkKHRoaXMpLnJlc2V0KGdldEZsdWlkVmFsdWUoYW5pbS50bykpO1xuXG4gICAgaWYgKCFhbmltLmltbWVkaWF0ZSkge1xuICAgICAgYW5pbS5mcm9tVmFsdWVzID0gYW5pbS52YWx1ZXMubWFwKG5vZGUgPT4gbm9kZS5sYXN0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICghaXNBbmltYXRpbmcodGhpcykpIHtcbiAgICAgIHNldEFjdGl2ZUJpdCh0aGlzLCB0cnVlKTtcblxuICAgICAgaWYgKCFpc1BhdXNlZCh0aGlzKSkge1xuICAgICAgICB0aGlzLl9yZXN1bWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfcmVzdW1lKCkge1xuICAgIGlmIChHbG9iYWxzLnNraXBBbmltYXRpb24pIHtcbiAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyYW1lTG9vcC5zdGFydCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBfc3RvcChnb2FsLCBjYW5jZWwpIHtcbiAgICBpZiAoaXNBbmltYXRpbmcodGhpcykpIHtcbiAgICAgIHNldEFjdGl2ZUJpdCh0aGlzLCBmYWxzZSk7XG4gICAgICBjb25zdCBhbmltID0gdGhpcy5hbmltYXRpb247XG4gICAgICBlYWNoKGFuaW0udmFsdWVzLCBub2RlID0+IHtcbiAgICAgICAgbm9kZS5kb25lID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYW5pbS50b1ZhbHVlcykge1xuICAgICAgICBhbmltLm9uQ2hhbmdlID0gYW5pbS5vblBhdXNlID0gYW5pbS5vblJlc3VtZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY2FsbEZsdWlkT2JzZXJ2ZXJzKHRoaXMsIHtcbiAgICAgICAgdHlwZTogJ2lkbGUnLFxuICAgICAgICBwYXJlbnQ6IHRoaXNcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY2FuY2VsID8gZ2V0Q2FuY2VsbGVkUmVzdWx0KHRoaXMuZ2V0KCkpIDogZ2V0RmluaXNoZWRSZXN1bHQodGhpcy5nZXQoKSwgY2hlY2tGaW5pc2hlZCh0aGlzLCBnb2FsICE9IG51bGwgPyBnb2FsIDogYW5pbS50bykpO1xuICAgICAgZmx1c2hDYWxscyh0aGlzLl9wZW5kaW5nQ2FsbHMsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChhbmltLmNoYW5nZWQpIHtcbiAgICAgICAgYW5pbS5jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHNlbmRFdmVudCh0aGlzLCAnb25SZXN0JywgcmVzdWx0LCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuXG5mdW5jdGlvbiBjaGVja0ZpbmlzaGVkKHRhcmdldCwgdG8pIHtcbiAgY29uc3QgZ29hbCA9IGNvbXB1dGVHb2FsKHRvKTtcbiAgY29uc3QgdmFsdWUgPSBjb21wdXRlR29hbCh0YXJnZXQuZ2V0KCkpO1xuICByZXR1cm4gaXNFcXVhbCh2YWx1ZSwgZ29hbCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvb3BVcGRhdGUocHJvcHMsIGxvb3AgPSBwcm9wcy5sb29wLCB0byA9IHByb3BzLnRvKSB7XG4gIGxldCBsb29wUmV0ID0gY2FsbFByb3AobG9vcCk7XG5cbiAgaWYgKGxvb3BSZXQpIHtcbiAgICBjb25zdCBvdmVycmlkZXMgPSBsb29wUmV0ICE9PSB0cnVlICYmIGluZmVyVG8obG9vcFJldCk7XG4gICAgY29uc3QgcmV2ZXJzZSA9IChvdmVycmlkZXMgfHwgcHJvcHMpLnJldmVyc2U7XG4gICAgY29uc3QgcmVzZXQgPSAhb3ZlcnJpZGVzIHx8IG92ZXJyaWRlcy5yZXNldDtcbiAgICByZXR1cm4gY3JlYXRlVXBkYXRlKF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgbG9vcCxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgcGF1c2U6IHVuZGVmaW5lZCxcbiAgICAgIHRvOiAhcmV2ZXJzZSB8fCBpc0FzeW5jVG8odG8pID8gdG8gOiB1bmRlZmluZWQsXG4gICAgICBmcm9tOiByZXNldCA/IHByb3BzLmZyb20gOiB1bmRlZmluZWQsXG4gICAgICByZXNldFxuICAgIH0sIG92ZXJyaWRlcykpO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVVcGRhdGUocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIHRvLFxuICAgIGZyb21cbiAgfSA9IHByb3BzID0gaW5mZXJUbyhwcm9wcyk7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KCk7XG4gIGlmIChpcy5vYmoodG8pKSBmaW5kRGVmaW5lZCh0bywga2V5cyk7XG4gIGlmIChpcy5vYmooZnJvbSkpIGZpbmREZWZpbmVkKGZyb20sIGtleXMpO1xuICBwcm9wcy5rZXlzID0ga2V5cy5zaXplID8gQXJyYXkuZnJvbShrZXlzKSA6IG51bGw7XG4gIHJldHVybiBwcm9wcztcbn1cbmZ1bmN0aW9uIGRlY2xhcmVVcGRhdGUocHJvcHMpIHtcbiAgY29uc3QgdXBkYXRlID0gY3JlYXRlVXBkYXRlKHByb3BzKTtcblxuICBpZiAoaXMudW5kKHVwZGF0ZS5kZWZhdWx0KSkge1xuICAgIHVwZGF0ZS5kZWZhdWx0ID0gZ2V0RGVmYXVsdFByb3BzKHVwZGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBmaW5kRGVmaW5lZCh2YWx1ZXMsIGtleXMpIHtcbiAgZWFjaFByb3AodmFsdWVzLCAodmFsdWUsIGtleSkgPT4gdmFsdWUgIT0gbnVsbCAmJiBrZXlzLmFkZChrZXkpKTtcbn1cblxuY29uc3QgQUNUSVZFX0VWRU5UUyA9IFsnb25TdGFydCcsICdvblJlc3QnLCAnb25DaGFuZ2UnLCAnb25QYXVzZScsICdvblJlc3VtZSddO1xuXG5mdW5jdGlvbiBtZXJnZUFjdGl2ZUZuKHRhcmdldCwgcHJvcHMsIHR5cGUpIHtcbiAgdGFyZ2V0LmFuaW1hdGlvblt0eXBlXSA9IHByb3BzW3R5cGVdICE9PSBnZXREZWZhdWx0UHJvcChwcm9wcywgdHlwZSkgPyByZXNvbHZlUHJvcChwcm9wc1t0eXBlXSwgdGFyZ2V0LmtleSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNlbmRFdmVudCh0YXJnZXQsIHR5cGUsIC4uLmFyZ3MpIHtcbiAgdmFyIF90YXJnZXQkYW5pbWF0aW9uJHR5cCwgX3RhcmdldCRhbmltYXRpb24sIF90YXJnZXQkZGVmYXVsdFByb3BzJCwgX3RhcmdldCRkZWZhdWx0UHJvcHM7XG5cbiAgKF90YXJnZXQkYW5pbWF0aW9uJHR5cCA9IChfdGFyZ2V0JGFuaW1hdGlvbiA9IHRhcmdldC5hbmltYXRpb24pW3R5cGVdKSA9PSBudWxsID8gdm9pZCAwIDogX3RhcmdldCRhbmltYXRpb24kdHlwLmNhbGwoX3RhcmdldCRhbmltYXRpb24sIC4uLmFyZ3MpO1xuICAoX3RhcmdldCRkZWZhdWx0UHJvcHMkID0gKF90YXJnZXQkZGVmYXVsdFByb3BzID0gdGFyZ2V0LmRlZmF1bHRQcm9wcylbdHlwZV0pID09IG51bGwgPyB2b2lkIDAgOiBfdGFyZ2V0JGRlZmF1bHRQcm9wcyQuY2FsbChfdGFyZ2V0JGRlZmF1bHRQcm9wcywgLi4uYXJncyk7XG59XG5cbmNvbnN0IEJBVENIRURfRVZFTlRTID0gWydvblN0YXJ0JywgJ29uQ2hhbmdlJywgJ29uUmVzdCddO1xubGV0IG5leHRJZCA9IDE7XG5jbGFzcyBDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMsIGZsdXNoKSB7XG4gICAgdGhpcy5pZCA9IG5leHRJZCsrO1xuICAgIHRoaXMuc3ByaW5ncyA9IHt9O1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICB0aGlzLnJlZiA9IHZvaWQgMDtcbiAgICB0aGlzLl9mbHVzaCA9IHZvaWQgMDtcbiAgICB0aGlzLl9pbml0aWFsUHJvcHMgPSB2b2lkIDA7XG4gICAgdGhpcy5fbGFzdEFzeW5jSWQgPSAwO1xuICAgIHRoaXMuX2FjdGl2ZSA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9jaGFuZ2VkID0gbmV3IFNldCgpO1xuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pdGVtID0gdm9pZCAwO1xuICAgIHRoaXMuX3N0YXRlID0ge1xuICAgICAgcGF1c2VkOiBmYWxzZSxcbiAgICAgIHBhdXNlUXVldWU6IG5ldyBTZXQoKSxcbiAgICAgIHJlc3VtZVF1ZXVlOiBuZXcgU2V0KCksXG4gICAgICB0aW1lb3V0czogbmV3IFNldCgpXG4gICAgfTtcbiAgICB0aGlzLl9ldmVudHMgPSB7XG4gICAgICBvblN0YXJ0OiBuZXcgTWFwKCksXG4gICAgICBvbkNoYW5nZTogbmV3IE1hcCgpLFxuICAgICAgb25SZXN0OiBuZXcgTWFwKClcbiAgICB9O1xuICAgIHRoaXMuX29uRnJhbWUgPSB0aGlzLl9vbkZyYW1lLmJpbmQodGhpcyk7XG5cbiAgICBpZiAoZmx1c2gpIHtcbiAgICAgIHRoaXMuX2ZsdXNoID0gZmx1c2g7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnN0YXJ0KF9leHRlbmRzKHtcbiAgICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgICAgfSwgcHJvcHMpKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaWRsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMuX3N0YXRlLmFzeW5jVG8gJiYgT2JqZWN0LnZhbHVlcyh0aGlzLnNwcmluZ3MpLmV2ZXJ5KHNwcmluZyA9PiB7XG4gICAgICByZXR1cm4gc3ByaW5nLmlkbGUgJiYgIXNwcmluZy5pc0RlbGF5ZWQgJiYgIXNwcmluZy5pc1BhdXNlZDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBpdGVtKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtO1xuICB9XG5cbiAgc2V0IGl0ZW0oaXRlbSkge1xuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICB9XG5cbiAgZ2V0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHt9O1xuICAgIHRoaXMuZWFjaCgoc3ByaW5nLCBrZXkpID0+IHZhbHVlc1trZXldID0gc3ByaW5nLmdldCgpKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgc2V0KHZhbHVlcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNba2V5XTtcblxuICAgICAgaWYgKCFpcy51bmQodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuc3ByaW5nc1trZXldLnNldCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKHByb3BzKSB7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goY3JlYXRlVXBkYXRlKHByb3BzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGFydChwcm9wcykge1xuICAgIGxldCB7XG4gICAgICBxdWV1ZVxuICAgIH0gPSB0aGlzO1xuXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBxdWV1ZSA9IHRvQXJyYXkocHJvcHMpLm1hcChjcmVhdGVVcGRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZsdXNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmx1c2godGhpcywgcXVldWUpO1xuICAgIH1cblxuICAgIHByZXBhcmVLZXlzKHRoaXMsIHF1ZXVlKTtcbiAgICByZXR1cm4gZmx1c2hVcGRhdGVRdWV1ZSh0aGlzLCBxdWV1ZSk7XG4gIH1cblxuICBzdG9wKGFyZywga2V5cykge1xuICAgIGlmIChhcmcgIT09ICEhYXJnKSB7XG4gICAgICBrZXlzID0gYXJnO1xuICAgIH1cblxuICAgIGlmIChrZXlzKSB7XG4gICAgICBjb25zdCBzcHJpbmdzID0gdGhpcy5zcHJpbmdzO1xuICAgICAgZWFjaCh0b0FycmF5KGtleXMpLCBrZXkgPT4gc3ByaW5nc1trZXldLnN0b3AoISFhcmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcEFzeW5jKHRoaXMuX3N0YXRlLCB0aGlzLl9sYXN0QXN5bmNJZCk7XG4gICAgICB0aGlzLmVhY2goc3ByaW5nID0+IHNwcmluZy5zdG9wKCEhYXJnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwYXVzZShrZXlzKSB7XG4gICAgaWYgKGlzLnVuZChrZXlzKSkge1xuICAgICAgdGhpcy5zdGFydCh7XG4gICAgICAgIHBhdXNlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ByaW5ncyA9IHRoaXMuc3ByaW5ncztcbiAgICAgIGVhY2godG9BcnJheShrZXlzKSwga2V5ID0+IHNwcmluZ3Nba2V5XS5wYXVzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJlc3VtZShrZXlzKSB7XG4gICAgaWYgKGlzLnVuZChrZXlzKSkge1xuICAgICAgdGhpcy5zdGFydCh7XG4gICAgICAgIHBhdXNlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNwcmluZ3MgPSB0aGlzLnNwcmluZ3M7XG4gICAgICBlYWNoKHRvQXJyYXkoa2V5cyksIGtleSA9PiBzcHJpbmdzW2tleV0ucmVzdW1lKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZWFjaChpdGVyYXRvcikge1xuICAgIGVhY2hQcm9wKHRoaXMuc3ByaW5ncywgaXRlcmF0b3IpO1xuICB9XG5cbiAgX29uRnJhbWUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgb25TdGFydCxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgb25SZXN0XG4gICAgfSA9IHRoaXMuX2V2ZW50cztcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9hY3RpdmUuc2l6ZSA+IDA7XG4gICAgY29uc3QgY2hhbmdlZCA9IHRoaXMuX2NoYW5nZWQuc2l6ZSA+IDA7XG5cbiAgICBpZiAoYWN0aXZlICYmICF0aGlzLl9zdGFydGVkIHx8IGNoYW5nZWQgJiYgIXRoaXMuX3N0YXJ0ZWQpIHtcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgZmx1c2gob25TdGFydCwgKFtvblN0YXJ0LCByZXN1bHRdKSA9PiB7XG4gICAgICAgIHJlc3VsdC52YWx1ZSA9IHRoaXMuZ2V0KCk7XG4gICAgICAgIG9uU3RhcnQocmVzdWx0LCB0aGlzLCB0aGlzLl9pdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGlkbGUgPSAhYWN0aXZlICYmIHRoaXMuX3N0YXJ0ZWQ7XG4gICAgY29uc3QgdmFsdWVzID0gY2hhbmdlZCB8fCBpZGxlICYmIG9uUmVzdC5zaXplID8gdGhpcy5nZXQoKSA6IG51bGw7XG5cbiAgICBpZiAoY2hhbmdlZCAmJiBvbkNoYW5nZS5zaXplKSB7XG4gICAgICBmbHVzaChvbkNoYW5nZSwgKFtvbkNoYW5nZSwgcmVzdWx0XSkgPT4ge1xuICAgICAgICByZXN1bHQudmFsdWUgPSB2YWx1ZXM7XG4gICAgICAgIG9uQ2hhbmdlKHJlc3VsdCwgdGhpcywgdGhpcy5faXRlbSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaWRsZSkge1xuICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgZmx1c2gob25SZXN0LCAoW29uUmVzdCwgcmVzdWx0XSkgPT4ge1xuICAgICAgICByZXN1bHQudmFsdWUgPSB2YWx1ZXM7XG4gICAgICAgIG9uUmVzdChyZXN1bHQsIHRoaXMsIHRoaXMuX2l0ZW0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZXZlbnRPYnNlcnZlZChldmVudCkge1xuICAgIGlmIChldmVudC50eXBlID09ICdjaGFuZ2UnKSB7XG4gICAgICB0aGlzLl9jaGFuZ2VkLmFkZChldmVudC5wYXJlbnQpO1xuXG4gICAgICBpZiAoIWV2ZW50LmlkbGUpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlLmFkZChldmVudC5wYXJlbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PSAnaWRsZScpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZS5kZWxldGUoZXZlbnQucGFyZW50KTtcbiAgICB9IGVsc2UgcmV0dXJuO1xuXG4gICAgcmFmLm9uRnJhbWUodGhpcy5fb25GcmFtZSk7XG4gIH1cblxufVxuZnVuY3Rpb24gZmx1c2hVcGRhdGVRdWV1ZShjdHJsLCBxdWV1ZSkge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocXVldWUubWFwKHByb3BzID0+IGZsdXNoVXBkYXRlKGN0cmwsIHByb3BzKSkpLnRoZW4ocmVzdWx0cyA9PiBnZXRDb21iaW5lZFJlc3VsdChjdHJsLCByZXN1bHRzKSk7XG59XG5hc3luYyBmdW5jdGlvbiBmbHVzaFVwZGF0ZShjdHJsLCBwcm9wcywgaXNMb29wKSB7XG4gIGNvbnN0IHtcbiAgICBrZXlzLFxuICAgIHRvLFxuICAgIGZyb20sXG4gICAgbG9vcCxcbiAgICBvblJlc3QsXG4gICAgb25SZXNvbHZlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZGVmYXVsdHMgPSBpcy5vYmoocHJvcHMuZGVmYXVsdCkgJiYgcHJvcHMuZGVmYXVsdDtcblxuICBpZiAobG9vcCkge1xuICAgIHByb3BzLmxvb3AgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICh0byA9PT0gZmFsc2UpIHByb3BzLnRvID0gbnVsbDtcbiAgaWYgKGZyb20gPT09IGZhbHNlKSBwcm9wcy5mcm9tID0gbnVsbDtcbiAgY29uc3QgYXN5bmNUbyA9IGlzLmFycih0bykgfHwgaXMuZnVuKHRvKSA/IHRvIDogdW5kZWZpbmVkO1xuXG4gIGlmIChhc3luY1RvKSB7XG4gICAgcHJvcHMudG8gPSB1bmRlZmluZWQ7XG4gICAgcHJvcHMub25SZXN0ID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGRlZmF1bHRzKSB7XG4gICAgICBkZWZhdWx0cy5vblJlc3QgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgICAgZWFjaChCQVRDSEVEX0VWRU5UUywga2V5ID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb3BzW2tleV07XG5cbiAgICAgICAgaWYgKGlzLmZ1bihoYW5kbGVyKSkge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlID0gY3RybFsnX2V2ZW50cyddW2tleV07XG5cbiAgICAgICAgICBwcm9wc1trZXldID0gKHtcbiAgICAgICAgICAgIGZpbmlzaGVkLFxuICAgICAgICAgICAgY2FuY2VsbGVkXG4gICAgICAgICAgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVldWUuZ2V0KGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIGlmICghZmluaXNoZWQpIHJlc3VsdC5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkKSByZXN1bHQuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHF1ZXVlLnNldChoYW5kbGVyLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IGZpbmlzaGVkIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNhbmNlbGxlZDogY2FuY2VsbGVkIHx8IGZhbHNlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoZGVmYXVsdHMpIHtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBwcm9wc1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gIGNvbnN0IHN0YXRlID0gY3RybFsnX3N0YXRlJ107XG5cbiAgaWYgKHByb3BzLnBhdXNlID09PSAhc3RhdGUucGF1c2VkKSB7XG4gICAgc3RhdGUucGF1c2VkID0gcHJvcHMucGF1c2U7XG4gICAgZmx1c2hDYWxscyhwcm9wcy5wYXVzZSA/IHN0YXRlLnBhdXNlUXVldWUgOiBzdGF0ZS5yZXN1bWVRdWV1ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUucGF1c2VkKSB7XG4gICAgICBwcm9wcy5wYXVzZSA9IHRydWU7XG4gICAgfVxuXG4gIGNvbnN0IHByb21pc2VzID0gKGtleXMgfHwgT2JqZWN0LmtleXMoY3RybC5zcHJpbmdzKSkubWFwKGtleSA9PiBjdHJsLnNwcmluZ3Nba2V5XS5zdGFydChwcm9wcykpO1xuICBjb25zdCBjYW5jZWwgPSBwcm9wcy5jYW5jZWwgPT09IHRydWUgfHwgZ2V0RGVmYXVsdFByb3AocHJvcHMsICdjYW5jZWwnKSA9PT0gdHJ1ZTtcblxuICBpZiAoYXN5bmNUbyB8fCBjYW5jZWwgJiYgc3RhdGUuYXN5bmNJZCkge1xuICAgIHByb21pc2VzLnB1c2goc2NoZWR1bGVQcm9wcygrK2N0cmxbJ19sYXN0QXN5bmNJZCddLCB7XG4gICAgICBwcm9wcyxcbiAgICAgIHN0YXRlLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICBwYXVzZTogbm9vcCxcbiAgICAgICAgcmVzdW1lOiBub29wLFxuXG4gICAgICAgIHN0YXJ0KHByb3BzLCByZXNvbHZlKSB7XG4gICAgICAgICAgaWYgKGNhbmNlbCkge1xuICAgICAgICAgICAgc3RvcEFzeW5jKHN0YXRlLCBjdHJsWydfbGFzdEFzeW5jSWQnXSk7XG4gICAgICAgICAgICByZXNvbHZlKGdldENhbmNlbGxlZFJlc3VsdChjdHJsKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb3BzLm9uUmVzdCA9IG9uUmVzdDtcbiAgICAgICAgICAgIHJlc29sdmUocnVuQXN5bmMoYXN5bmNUbywgcHJvcHMsIHN0YXRlLCBjdHJsKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBpZiAoc3RhdGUucGF1c2VkKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzdW1lID0+IHtcbiAgICAgIHN0YXRlLnJlc3VtZVF1ZXVlLmFkZChyZXN1bWUpO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gZ2V0Q29tYmluZWRSZXN1bHQoY3RybCwgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcblxuICBpZiAobG9vcCAmJiByZXN1bHQuZmluaXNoZWQgJiYgIShpc0xvb3AgJiYgcmVzdWx0Lm5vb3ApKSB7XG4gICAgY29uc3QgbmV4dFByb3BzID0gY3JlYXRlTG9vcFVwZGF0ZShwcm9wcywgbG9vcCwgdG8pO1xuXG4gICAgaWYgKG5leHRQcm9wcykge1xuICAgICAgcHJlcGFyZUtleXMoY3RybCwgW25leHRQcm9wc10pO1xuICAgICAgcmV0dXJuIGZsdXNoVXBkYXRlKGN0cmwsIG5leHRQcm9wcywgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9uUmVzb2x2ZSkge1xuICAgIHJhZi5iYXRjaGVkVXBkYXRlcygoKSA9PiBvblJlc29sdmUocmVzdWx0LCBjdHJsLCBjdHJsLml0ZW0pKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRTcHJpbmdzKGN0cmwsIHByb3BzKSB7XG4gIGNvbnN0IHNwcmluZ3MgPSBfZXh0ZW5kcyh7fSwgY3RybC5zcHJpbmdzKTtcblxuICBpZiAocHJvcHMpIHtcbiAgICBlYWNoKHRvQXJyYXkocHJvcHMpLCBwcm9wcyA9PiB7XG4gICAgICBpZiAoaXMudW5kKHByb3BzLmtleXMpKSB7XG4gICAgICAgIHByb3BzID0gY3JlYXRlVXBkYXRlKHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpcy5vYmoocHJvcHMudG8pKSB7XG4gICAgICAgIHByb3BzID0gX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgICAgdG86IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcHJlcGFyZVNwcmluZ3Moc3ByaW5ncywgcHJvcHMsIGtleSA9PiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTcHJpbmcoa2V5KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U3ByaW5ncyhjdHJsLCBzcHJpbmdzKTtcbiAgcmV0dXJuIHNwcmluZ3M7XG59XG5mdW5jdGlvbiBzZXRTcHJpbmdzKGN0cmwsIHNwcmluZ3MpIHtcbiAgZWFjaFByb3Aoc3ByaW5ncywgKHNwcmluZywga2V5KSA9PiB7XG4gICAgaWYgKCFjdHJsLnNwcmluZ3Nba2V5XSkge1xuICAgICAgY3RybC5zcHJpbmdzW2tleV0gPSBzcHJpbmc7XG4gICAgICBhZGRGbHVpZE9ic2VydmVyKHNwcmluZywgY3RybCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ByaW5nKGtleSwgb2JzZXJ2ZXIpIHtcbiAgY29uc3Qgc3ByaW5nID0gbmV3IFNwcmluZ1ZhbHVlKCk7XG4gIHNwcmluZy5rZXkgPSBrZXk7XG5cbiAgaWYgKG9ic2VydmVyKSB7XG4gICAgYWRkRmx1aWRPYnNlcnZlcihzcHJpbmcsIG9ic2VydmVyKTtcbiAgfVxuXG4gIHJldHVybiBzcHJpbmc7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVTcHJpbmdzKHNwcmluZ3MsIHByb3BzLCBjcmVhdGUpIHtcbiAgaWYgKHByb3BzLmtleXMpIHtcbiAgICBlYWNoKHByb3BzLmtleXMsIGtleSA9PiB7XG4gICAgICBjb25zdCBzcHJpbmcgPSBzcHJpbmdzW2tleV0gfHwgKHNwcmluZ3Nba2V5XSA9IGNyZWF0ZShrZXkpKTtcbiAgICAgIHNwcmluZ1snX3ByZXBhcmVOb2RlJ10ocHJvcHMpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVLZXlzKGN0cmwsIHF1ZXVlKSB7XG4gIGVhY2gocXVldWUsIHByb3BzID0+IHtcbiAgICBwcmVwYXJlU3ByaW5ncyhjdHJsLnNwcmluZ3MsIHByb3BzLCBrZXkgPT4ge1xuICAgICAgcmV0dXJuIGNyZWF0ZVNwcmluZyhrZXksIGN0cmwpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmNvbnN0IF9leGNsdWRlZCQzID0gW1wiY2hpbGRyZW5cIl07XG5jb25zdCBTcHJpbmdDb250ZXh0ID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCQzKTtcblxuICBjb25zdCBpbmhlcml0ZWQgPSB1c2VDb250ZXh0KGN0eCk7XG4gIGNvbnN0IHBhdXNlID0gcHJvcHMucGF1c2UgfHwgISFpbmhlcml0ZWQucGF1c2UsXG4gICAgICAgIGltbWVkaWF0ZSA9IHByb3BzLmltbWVkaWF0ZSB8fCAhIWluaGVyaXRlZC5pbW1lZGlhdGU7XG4gIHByb3BzID0gdXNlTWVtb09uZSgoKSA9PiAoe1xuICAgIHBhdXNlLFxuICAgIGltbWVkaWF0ZVxuICB9KSwgW3BhdXNlLCBpbW1lZGlhdGVdKTtcbiAgY29uc3Qge1xuICAgIFByb3ZpZGVyXG4gIH0gPSBjdHg7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHByb3BzXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5jb25zdCBjdHggPSBtYWtlQ29udGV4dChTcHJpbmdDb250ZXh0LCB7fSk7XG5TcHJpbmdDb250ZXh0LlByb3ZpZGVyID0gY3R4LlByb3ZpZGVyO1xuU3ByaW5nQ29udGV4dC5Db25zdW1lciA9IGN0eC5Db25zdW1lcjtcblxuZnVuY3Rpb24gbWFrZUNvbnRleHQodGFyZ2V0LCBpbml0KSB7XG4gIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBSZWFjdC5jcmVhdGVDb250ZXh0KGluaXQpKTtcbiAgdGFyZ2V0LlByb3ZpZGVyLl9jb250ZXh0ID0gdGFyZ2V0O1xuICB0YXJnZXQuQ29uc3VtZXIuX2NvbnRleHQgPSB0YXJnZXQ7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmNvbnN0IFNwcmluZ1JlZiA9ICgpID0+IHtcbiAgY29uc3QgY3VycmVudCA9IFtdO1xuXG4gIGNvbnN0IFNwcmluZ1JlZiA9IGZ1bmN0aW9uIFNwcmluZ1JlZihwcm9wcykge1xuICAgIGRlcHJlY2F0ZURpcmVjdENhbGwoKTtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgZWFjaChjdXJyZW50LCAoY3RybCwgaSkgPT4ge1xuICAgICAgaWYgKGlzLnVuZChwcm9wcykpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGN0cmwuc3RhcnQoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBfZ2V0UHJvcHMocHJvcHMsIGN0cmwsIGkpO1xuXG4gICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goY3RybC5zdGFydCh1cGRhdGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIFNwcmluZ1JlZi5jdXJyZW50ID0gY3VycmVudDtcblxuICBTcHJpbmdSZWYuYWRkID0gZnVuY3Rpb24gKGN0cmwpIHtcbiAgICBpZiAoIWN1cnJlbnQuaW5jbHVkZXMoY3RybCkpIHtcbiAgICAgIGN1cnJlbnQucHVzaChjdHJsKTtcbiAgICB9XG4gIH07XG5cbiAgU3ByaW5nUmVmLmRlbGV0ZSA9IGZ1bmN0aW9uIChjdHJsKSB7XG4gICAgY29uc3QgaSA9IGN1cnJlbnQuaW5kZXhPZihjdHJsKTtcbiAgICBpZiAofmkpIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICB9O1xuXG4gIFNwcmluZ1JlZi5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBlYWNoKGN1cnJlbnQsIGN0cmwgPT4gY3RybC5wYXVzZSguLi5hcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBTcHJpbmdSZWYucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGVhY2goY3VycmVudCwgY3RybCA9PiBjdHJsLnJlc3VtZSguLi5hcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBTcHJpbmdSZWYuc2V0ID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgIGVhY2goY3VycmVudCwgY3RybCA9PiBjdHJsLnNldCh2YWx1ZXMpKTtcbiAgfTtcblxuICBTcHJpbmdSZWYuc3RhcnQgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgZWFjaChjdXJyZW50LCAoY3RybCwgaSkgPT4ge1xuICAgICAgaWYgKGlzLnVuZChwcm9wcykpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGN0cmwuc3RhcnQoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB1cGRhdGUgPSB0aGlzLl9nZXRQcm9wcyhwcm9wcywgY3RybCwgaSk7XG5cbiAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChjdHJsLnN0YXJ0KHVwZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgU3ByaW5nUmVmLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgZWFjaChjdXJyZW50LCBjdHJsID0+IGN0cmwuc3RvcCguLi5hcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBTcHJpbmdSZWYudXBkYXRlID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgZWFjaChjdXJyZW50LCAoY3RybCwgaSkgPT4gY3RybC51cGRhdGUodGhpcy5fZ2V0UHJvcHMocHJvcHMsIGN0cmwsIGkpKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uc3QgX2dldFByb3BzID0gZnVuY3Rpb24gX2dldFByb3BzKGFyZywgY3RybCwgaW5kZXgpIHtcbiAgICByZXR1cm4gaXMuZnVuKGFyZykgPyBhcmcoaW5kZXgsIGN0cmwpIDogYXJnO1xuICB9O1xuXG4gIFNwcmluZ1JlZi5fZ2V0UHJvcHMgPSBfZ2V0UHJvcHM7XG4gIHJldHVybiBTcHJpbmdSZWY7XG59O1xuXG5mdW5jdGlvbiB1c2VTcHJpbmdzKGxlbmd0aCwgcHJvcHMsIGRlcHMpIHtcbiAgY29uc3QgcHJvcHNGbiA9IGlzLmZ1bihwcm9wcykgJiYgcHJvcHM7XG4gIGlmIChwcm9wc0ZuICYmICFkZXBzKSBkZXBzID0gW107XG4gIGNvbnN0IHJlZiA9IHVzZU1lbW8oKCkgPT4gcHJvcHNGbiB8fCBhcmd1bWVudHMubGVuZ3RoID09IDMgPyBTcHJpbmdSZWYoKSA6IHZvaWQgMCwgW10pO1xuICBjb25zdCBsYXlvdXRJZCA9IHVzZVJlZigwKTtcbiAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpO1xuICBjb25zdCBzdGF0ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBjdHJsczogW10sXG4gICAgcXVldWU6IFtdLFxuXG4gICAgZmx1c2goY3RybCwgdXBkYXRlcykge1xuICAgICAgY29uc3Qgc3ByaW5ncyA9IGdldFNwcmluZ3MoY3RybCwgdXBkYXRlcyk7XG4gICAgICBjb25zdCBjYW5GbHVzaFN5bmMgPSBsYXlvdXRJZC5jdXJyZW50ID4gMCAmJiAhc3RhdGUucXVldWUubGVuZ3RoICYmICFPYmplY3Qua2V5cyhzcHJpbmdzKS5zb21lKGtleSA9PiAhY3RybC5zcHJpbmdzW2tleV0pO1xuICAgICAgcmV0dXJuIGNhbkZsdXNoU3luYyA/IGZsdXNoVXBkYXRlUXVldWUoY3RybCwgdXBkYXRlcykgOiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgc2V0U3ByaW5ncyhjdHJsLCBzcHJpbmdzKTtcbiAgICAgICAgc3RhdGUucXVldWUucHVzaCgoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShmbHVzaFVwZGF0ZVF1ZXVlKGN0cmwsIHVwZGF0ZXMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvcmNlVXBkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgfSksIFtdKTtcbiAgY29uc3QgY3RybHMgPSB1c2VSZWYoWy4uLnN0YXRlLmN0cmxzXSk7XG4gIGNvbnN0IHVwZGF0ZXMgPSBbXTtcbiAgY29uc3QgcHJldkxlbmd0aCA9IHVzZVByZXYobGVuZ3RoKSB8fCAwO1xuICB1c2VNZW1vKCgpID0+IHtcbiAgICBlYWNoKGN0cmxzLmN1cnJlbnQuc2xpY2UobGVuZ3RoLCBwcmV2TGVuZ3RoKSwgY3RybCA9PiB7XG4gICAgICBkZXRhY2hSZWZzKGN0cmwsIHJlZik7XG4gICAgICBjdHJsLnN0b3AodHJ1ZSk7XG4gICAgfSk7XG4gICAgY3RybHMuY3VycmVudC5sZW5ndGggPSBsZW5ndGg7XG4gICAgZGVjbGFyZVVwZGF0ZXMocHJldkxlbmd0aCwgbGVuZ3RoKTtcbiAgfSwgW2xlbmd0aF0pO1xuICB1c2VNZW1vKCgpID0+IHtcbiAgICBkZWNsYXJlVXBkYXRlcygwLCBNYXRoLm1pbihwcmV2TGVuZ3RoLCBsZW5ndGgpKTtcbiAgfSwgZGVwcyk7XG5cbiAgZnVuY3Rpb24gZGVjbGFyZVVwZGF0ZXMoc3RhcnRJbmRleCwgZW5kSW5kZXgpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IGN0cmwgPSBjdHJscy5jdXJyZW50W2ldIHx8IChjdHJscy5jdXJyZW50W2ldID0gbmV3IENvbnRyb2xsZXIobnVsbCwgc3RhdGUuZmx1c2gpKTtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHByb3BzRm4gPyBwcm9wc0ZuKGksIGN0cmwpIDogcHJvcHNbaV07XG5cbiAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgdXBkYXRlc1tpXSA9IGRlY2xhcmVVcGRhdGUodXBkYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzcHJpbmdzID0gY3RybHMuY3VycmVudC5tYXAoKGN0cmwsIGkpID0+IGdldFNwcmluZ3MoY3RybCwgdXBkYXRlc1tpXSkpO1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChTcHJpbmdDb250ZXh0KTtcbiAgY29uc3QgcHJldkNvbnRleHQgPSB1c2VQcmV2KGNvbnRleHQpO1xuICBjb25zdCBoYXNDb250ZXh0ID0gY29udGV4dCAhPT0gcHJldkNvbnRleHQgJiYgaGFzUHJvcHMoY29udGV4dCk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgbGF5b3V0SWQuY3VycmVudCsrO1xuICAgIHN0YXRlLmN0cmxzID0gY3RybHMuY3VycmVudDtcbiAgICBjb25zdCB7XG4gICAgICBxdWV1ZVxuICAgIH0gPSBzdGF0ZTtcblxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLnF1ZXVlID0gW107XG4gICAgICBlYWNoKHF1ZXVlLCBjYiA9PiBjYigpKTtcbiAgICB9XG5cbiAgICBlYWNoKGN0cmxzLmN1cnJlbnQsIChjdHJsLCBpKSA9PiB7XG4gICAgICByZWYgPT0gbnVsbCA/IHZvaWQgMCA6IHJlZi5hZGQoY3RybCk7XG5cbiAgICAgIGlmIChoYXNDb250ZXh0KSB7XG4gICAgICAgIGN0cmwuc3RhcnQoe1xuICAgICAgICAgIGRlZmF1bHQ6IGNvbnRleHRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHVwZGF0ZXNbaV07XG5cbiAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgcmVwbGFjZVJlZihjdHJsLCB1cGRhdGUucmVmKTtcblxuICAgICAgICBpZiAoY3RybC5yZWYpIHtcbiAgICAgICAgICBjdHJsLnF1ZXVlLnB1c2godXBkYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHJsLnN0YXJ0KHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHVzZU9uY2UoKCkgPT4gKCkgPT4ge1xuICAgIGVhY2goc3RhdGUuY3RybHMsIGN0cmwgPT4gY3RybC5zdG9wKHRydWUpKTtcbiAgfSk7XG4gIGNvbnN0IHZhbHVlcyA9IHNwcmluZ3MubWFwKHggPT4gX2V4dGVuZHMoe30sIHgpKTtcbiAgcmV0dXJuIHJlZiA/IFt2YWx1ZXMsIHJlZl0gOiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIHVzZVNwcmluZyhwcm9wcywgZGVwcykge1xuICBjb25zdCBpc0ZuID0gaXMuZnVuKHByb3BzKTtcbiAgY29uc3QgW1t2YWx1ZXNdLCByZWZdID0gdXNlU3ByaW5ncygxLCBpc0ZuID8gcHJvcHMgOiBbcHJvcHNdLCBpc0ZuID8gZGVwcyB8fCBbXSA6IGRlcHMpO1xuICByZXR1cm4gaXNGbiB8fCBhcmd1bWVudHMubGVuZ3RoID09IDIgPyBbdmFsdWVzLCByZWZdIDogdmFsdWVzO1xufVxuXG5jb25zdCBpbml0U3ByaW5nUmVmID0gKCkgPT4gU3ByaW5nUmVmKCk7XG5cbmNvbnN0IHVzZVNwcmluZ1JlZiA9ICgpID0+IHVzZVN0YXRlKGluaXRTcHJpbmdSZWYpWzBdO1xuXG5mdW5jdGlvbiB1c2VUcmFpbChsZW5ndGgsIHByb3BzQXJnLCBkZXBzKSB7XG4gIHZhciBfcGFzc2VkUmVmO1xuXG4gIGNvbnN0IHByb3BzRm4gPSBpcy5mdW4ocHJvcHNBcmcpICYmIHByb3BzQXJnO1xuICBpZiAocHJvcHNGbiAmJiAhZGVwcykgZGVwcyA9IFtdO1xuICBsZXQgcmV2ZXJzZSA9IHRydWU7XG4gIGxldCBwYXNzZWRSZWYgPSB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc3VsdCA9IHVzZVNwcmluZ3MobGVuZ3RoLCAoaSwgY3RybCkgPT4ge1xuICAgIGNvbnN0IHByb3BzID0gcHJvcHNGbiA/IHByb3BzRm4oaSwgY3RybCkgOiBwcm9wc0FyZztcbiAgICBwYXNzZWRSZWYgPSBwcm9wcy5yZWY7XG4gICAgcmV2ZXJzZSA9IHJldmVyc2UgJiYgcHJvcHMucmV2ZXJzZTtcbiAgICByZXR1cm4gcHJvcHM7XG4gIH0sIGRlcHMgfHwgW3t9XSk7XG4gIGNvbnN0IHJlZiA9IChfcGFzc2VkUmVmID0gcGFzc2VkUmVmKSAhPSBudWxsID8gX3Bhc3NlZFJlZiA6IHJlc3VsdFsxXTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBlYWNoKHJlZi5jdXJyZW50LCAoY3RybCwgaSkgPT4ge1xuICAgICAgY29uc3QgcGFyZW50ID0gcmVmLmN1cnJlbnRbaSArIChyZXZlcnNlID8gMSA6IC0xKV07XG5cbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY3RybC5zdGFydCh7XG4gICAgICAgICAgdG86IHBhcmVudC5zcHJpbmdzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3RybC5zdGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBkZXBzKTtcblxuICBpZiAocHJvcHNGbiB8fCBhcmd1bWVudHMubGVuZ3RoID09IDMpIHtcbiAgICByZWZbJ19nZXRQcm9wcyddID0gKHByb3BzQXJnLCBjdHJsLCBpKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IGlzLmZ1bihwcm9wc0FyZykgPyBwcm9wc0FyZyhpLCBjdHJsKSA6IHByb3BzQXJnO1xuXG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gcmVmLmN1cnJlbnRbaSArIChwcm9wcy5yZXZlcnNlID8gMSA6IC0xKV07XG4gICAgICAgIGlmIChwYXJlbnQpIHByb3BzLnRvID0gcGFyZW50LnNwcmluZ3M7XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJlZlsnc3RhcnQnXSA9IHByb3BzQXJnID0+IHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgZWFjaChyZWYuY3VycmVudCwgKGN0cmwsIGkpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0gaXMuZnVuKHByb3BzQXJnKSA/IHByb3BzQXJnKGksIGN0cmwpIDogcHJvcHNBcmc7XG4gICAgICBjb25zdCBwYXJlbnQgPSByZWYuY3VycmVudFtpICsgKHJldmVyc2UgPyAxIDogLTEpXTtcblxuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICByZXN1bHRzLnB1c2goY3RybC5zdGFydChfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgICB0bzogcGFyZW50LnNwcmluZ3NcbiAgICAgICAgfSkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChjdHJsLnN0YXJ0KF9leHRlbmRzKHt9LCBwcm9wcykpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICByZXR1cm4gcmVzdWx0WzBdO1xufVxuXG5sZXQgVHJhbnNpdGlvblBoYXNlO1xuXG4oZnVuY3Rpb24gKFRyYW5zaXRpb25QaGFzZSkge1xuICBUcmFuc2l0aW9uUGhhc2VbXCJNT1VOVFwiXSA9IFwibW91bnRcIjtcbiAgVHJhbnNpdGlvblBoYXNlW1wiRU5URVJcIl0gPSBcImVudGVyXCI7XG4gIFRyYW5zaXRpb25QaGFzZVtcIlVQREFURVwiXSA9IFwidXBkYXRlXCI7XG4gIFRyYW5zaXRpb25QaGFzZVtcIkxFQVZFXCJdID0gXCJsZWF2ZVwiO1xufSkoVHJhbnNpdGlvblBoYXNlIHx8IChUcmFuc2l0aW9uUGhhc2UgPSB7fSkpO1xuXG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKGRhdGEsIHByb3BzLCBkZXBzKSB7XG4gIGNvbnN0IHByb3BzRm4gPSBpcy5mdW4ocHJvcHMpICYmIHByb3BzO1xuICBjb25zdCB7XG4gICAgcmVzZXQsXG4gICAgc29ydCxcbiAgICB0cmFpbCA9IDAsXG4gICAgZXhwaXJlcyA9IHRydWUsXG4gICAgZXhpdEJlZm9yZUVudGVyID0gZmFsc2UsXG4gICAgb25EZXN0cm95ZWQsXG4gICAgcmVmOiBwcm9wc1JlZixcbiAgICBjb25maWc6IHByb3BzQ29uZmlnXG4gIH0gPSBwcm9wc0ZuID8gcHJvcHNGbigpIDogcHJvcHM7XG4gIGNvbnN0IHJlZiA9IHVzZU1lbW8oKCkgPT4gcHJvcHNGbiB8fCBhcmd1bWVudHMubGVuZ3RoID09IDMgPyBTcHJpbmdSZWYoKSA6IHZvaWQgMCwgW10pO1xuICBjb25zdCBpdGVtcyA9IHRvQXJyYXkoZGF0YSk7XG4gIGNvbnN0IHRyYW5zaXRpb25zID0gW107XG4gIGNvbnN0IHVzZWRUcmFuc2l0aW9ucyA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgcHJldlRyYW5zaXRpb25zID0gcmVzZXQgPyBudWxsIDogdXNlZFRyYW5zaXRpb25zLmN1cnJlbnQ7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgdXNlZFRyYW5zaXRpb25zLmN1cnJlbnQgPSB0cmFuc2l0aW9ucztcbiAgfSk7XG4gIHVzZU9uY2UoKCkgPT4ge1xuICAgIGVhY2godXNlZFRyYW5zaXRpb25zLmN1cnJlbnQsIHQgPT4ge1xuICAgICAgdmFyIF90JGN0cmwkcmVmO1xuXG4gICAgICAoX3QkY3RybCRyZWYgPSB0LmN0cmwucmVmKSA9PSBudWxsID8gdm9pZCAwIDogX3QkY3RybCRyZWYuYWRkKHQuY3RybCk7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBjaGFuZ2VzLmdldCh0KTtcblxuICAgICAgaWYgKGNoYW5nZSkge1xuICAgICAgICB0LmN0cmwuc3RhcnQoY2hhbmdlLnBheWxvYWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBlYWNoKHVzZWRUcmFuc2l0aW9ucy5jdXJyZW50LCB0ID0+IHtcbiAgICAgICAgaWYgKHQuZXhwaXJlZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0LmV4cGlyYXRpb25JZCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXRhY2hSZWZzKHQuY3RybCwgcmVmKTtcbiAgICAgICAgdC5jdHJsLnN0b3AodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9KTtcbiAgY29uc3Qga2V5cyA9IGdldEtleXMoaXRlbXMsIHByb3BzRm4gPyBwcm9wc0ZuKCkgOiBwcm9wcywgcHJldlRyYW5zaXRpb25zKTtcbiAgY29uc3QgZXhwaXJlZCA9IHJlc2V0ICYmIHVzZWRUcmFuc2l0aW9ucy5jdXJyZW50IHx8IFtdO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4gZWFjaChleHBpcmVkLCAoe1xuICAgIGN0cmwsXG4gICAgaXRlbSxcbiAgICBrZXlcbiAgfSkgPT4ge1xuICAgIGRldGFjaFJlZnMoY3RybCwgcmVmKTtcbiAgICBjYWxsUHJvcChvbkRlc3Ryb3llZCwgaXRlbSwga2V5KTtcbiAgfSkpO1xuICBjb25zdCByZXVzZWQgPSBbXTtcbiAgaWYgKHByZXZUcmFuc2l0aW9ucykgZWFjaChwcmV2VHJhbnNpdGlvbnMsICh0LCBpKSA9PiB7XG4gICAgaWYgKHQuZXhwaXJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHQuZXhwaXJhdGlvbklkKTtcbiAgICAgIGV4cGlyZWQucHVzaCh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaSA9IHJldXNlZFtpXSA9IGtleXMuaW5kZXhPZih0LmtleSk7XG4gICAgICBpZiAofmkpIHRyYW5zaXRpb25zW2ldID0gdDtcbiAgICB9XG4gIH0pO1xuICBlYWNoKGl0ZW1zLCAoaXRlbSwgaSkgPT4ge1xuICAgIGlmICghdHJhbnNpdGlvbnNbaV0pIHtcbiAgICAgIHRyYW5zaXRpb25zW2ldID0ge1xuICAgICAgICBrZXk6IGtleXNbaV0sXG4gICAgICAgIGl0ZW0sXG4gICAgICAgIHBoYXNlOiBUcmFuc2l0aW9uUGhhc2UuTU9VTlQsXG4gICAgICAgIGN0cmw6IG5ldyBDb250cm9sbGVyKClcbiAgICAgIH07XG4gICAgICB0cmFuc2l0aW9uc1tpXS5jdHJsLml0ZW0gPSBpdGVtO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHJldXNlZC5sZW5ndGgpIHtcbiAgICBsZXQgaSA9IC0xO1xuICAgIGNvbnN0IHtcbiAgICAgIGxlYXZlXG4gICAgfSA9IHByb3BzRm4gPyBwcm9wc0ZuKCkgOiBwcm9wcztcbiAgICBlYWNoKHJldXNlZCwgKGtleUluZGV4LCBwcmV2SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHQgPSBwcmV2VHJhbnNpdGlvbnNbcHJldkluZGV4XTtcblxuICAgICAgaWYgKH5rZXlJbmRleCkge1xuICAgICAgICBpID0gdHJhbnNpdGlvbnMuaW5kZXhPZih0KTtcbiAgICAgICAgdHJhbnNpdGlvbnNbaV0gPSBfZXh0ZW5kcyh7fSwgdCwge1xuICAgICAgICAgIGl0ZW06IGl0ZW1zW2tleUluZGV4XVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAobGVhdmUpIHtcbiAgICAgICAgdHJhbnNpdGlvbnMuc3BsaWNlKCsraSwgMCwgdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXMuZnVuKHNvcnQpKSB7XG4gICAgdHJhbnNpdGlvbnMuc29ydCgoYSwgYikgPT4gc29ydChhLml0ZW0sIGIuaXRlbSkpO1xuICB9XG5cbiAgbGV0IGRlbGF5ID0gLXRyYWlsO1xuICBjb25zdCBmb3JjZVVwZGF0ZSA9IHVzZUZvcmNlVXBkYXRlKCk7XG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IGdldERlZmF1bHRQcm9wcyhwcm9wcyk7XG4gIGNvbnN0IGNoYW5nZXMgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGV4aXRpbmdUcmFuc2l0aW9ucyA9IHVzZVJlZihuZXcgTWFwKCkpO1xuICBjb25zdCBmb3JjZUNoYW5nZSA9IHVzZVJlZihmYWxzZSk7XG4gIGVhY2godHJhbnNpdGlvbnMsICh0LCBpKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gdC5rZXk7XG4gICAgY29uc3QgcHJldlBoYXNlID0gdC5waGFzZTtcbiAgICBjb25zdCBwID0gcHJvcHNGbiA/IHByb3BzRm4oKSA6IHByb3BzO1xuICAgIGxldCB0bztcbiAgICBsZXQgcGhhc2U7XG4gICAgbGV0IHByb3BzRGVsYXkgPSBjYWxsUHJvcChwLmRlbGF5IHx8IDAsIGtleSk7XG5cbiAgICBpZiAocHJldlBoYXNlID09IFRyYW5zaXRpb25QaGFzZS5NT1VOVCkge1xuICAgICAgdG8gPSBwLmVudGVyO1xuICAgICAgcGhhc2UgPSBUcmFuc2l0aW9uUGhhc2UuRU5URVI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzTGVhdmUgPSBrZXlzLmluZGV4T2Yoa2V5KSA8IDA7XG5cbiAgICAgIGlmIChwcmV2UGhhc2UgIT0gVHJhbnNpdGlvblBoYXNlLkxFQVZFKSB7XG4gICAgICAgIGlmIChpc0xlYXZlKSB7XG4gICAgICAgICAgdG8gPSBwLmxlYXZlO1xuICAgICAgICAgIHBoYXNlID0gVHJhbnNpdGlvblBoYXNlLkxFQVZFO1xuICAgICAgICB9IGVsc2UgaWYgKHRvID0gcC51cGRhdGUpIHtcbiAgICAgICAgICBwaGFzZSA9IFRyYW5zaXRpb25QaGFzZS5VUERBVEU7XG4gICAgICAgIH0gZWxzZSByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKCFpc0xlYXZlKSB7XG4gICAgICAgIHRvID0gcC5lbnRlcjtcbiAgICAgICAgcGhhc2UgPSBUcmFuc2l0aW9uUGhhc2UuRU5URVI7XG4gICAgICB9IGVsc2UgcmV0dXJuO1xuICAgIH1cblxuICAgIHRvID0gY2FsbFByb3AodG8sIHQuaXRlbSwgaSk7XG4gICAgdG8gPSBpcy5vYmoodG8pID8gaW5mZXJUbyh0bykgOiB7XG4gICAgICB0b1xuICAgIH07XG5cbiAgICBpZiAoIXRvLmNvbmZpZykge1xuICAgICAgY29uc3QgY29uZmlnID0gcHJvcHNDb25maWcgfHwgZGVmYXVsdFByb3BzLmNvbmZpZztcbiAgICAgIHRvLmNvbmZpZyA9IGNhbGxQcm9wKGNvbmZpZywgdC5pdGVtLCBpLCBwaGFzZSk7XG4gICAgfVxuXG4gICAgZGVsYXkgKz0gdHJhaWw7XG5cbiAgICBjb25zdCBwYXlsb2FkID0gX2V4dGVuZHMoe30sIGRlZmF1bHRQcm9wcywge1xuICAgICAgZGVsYXk6IHByb3BzRGVsYXkgKyBkZWxheSxcbiAgICAgIHJlZjogcHJvcHNSZWYsXG4gICAgICBpbW1lZGlhdGU6IHAuaW1tZWRpYXRlLFxuICAgICAgcmVzZXQ6IGZhbHNlXG4gICAgfSwgdG8pO1xuXG4gICAgaWYgKHBoYXNlID09IFRyYW5zaXRpb25QaGFzZS5FTlRFUiAmJiBpcy51bmQocGF5bG9hZC5mcm9tKSkge1xuICAgICAgY29uc3QgX3AgPSBwcm9wc0ZuID8gcHJvcHNGbigpIDogcHJvcHM7XG5cbiAgICAgIGNvbnN0IGZyb20gPSBpcy51bmQoX3AuaW5pdGlhbCkgfHwgcHJldlRyYW5zaXRpb25zID8gX3AuZnJvbSA6IF9wLmluaXRpYWw7XG4gICAgICBwYXlsb2FkLmZyb20gPSBjYWxsUHJvcChmcm9tLCB0Lml0ZW0sIGkpO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIG9uUmVzb2x2ZVxuICAgIH0gPSBwYXlsb2FkO1xuXG4gICAgcGF5bG9hZC5vblJlc29sdmUgPSByZXN1bHQgPT4ge1xuICAgICAgY2FsbFByb3Aob25SZXNvbHZlLCByZXN1bHQpO1xuICAgICAgY29uc3QgdHJhbnNpdGlvbnMgPSB1c2VkVHJhbnNpdGlvbnMuY3VycmVudDtcbiAgICAgIGNvbnN0IHQgPSB0cmFuc2l0aW9ucy5maW5kKHQgPT4gdC5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoIXQpIHJldHVybjtcblxuICAgICAgaWYgKHJlc3VsdC5jYW5jZWxsZWQgJiYgdC5waGFzZSAhPSBUcmFuc2l0aW9uUGhhc2UuVVBEQVRFKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHQuY3RybC5pZGxlKSB7XG4gICAgICAgIGNvbnN0IGlkbGUgPSB0cmFuc2l0aW9ucy5ldmVyeSh0ID0+IHQuY3RybC5pZGxlKTtcblxuICAgICAgICBpZiAodC5waGFzZSA9PSBUcmFuc2l0aW9uUGhhc2UuTEVBVkUpIHtcbiAgICAgICAgICBjb25zdCBleHBpcnkgPSBjYWxsUHJvcChleHBpcmVzLCB0Lml0ZW0pO1xuXG4gICAgICAgICAgaWYgKGV4cGlyeSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGlyeU1zID0gZXhwaXJ5ID09PSB0cnVlID8gMCA6IGV4cGlyeTtcbiAgICAgICAgICAgIHQuZXhwaXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICghaWRsZSAmJiBleHBpcnlNcyA+IDApIHtcbiAgICAgICAgICAgICAgaWYgKGV4cGlyeU1zIDw9IDB4N2ZmZmZmZmYpIHQuZXhwaXJhdGlvbklkID0gc2V0VGltZW91dChmb3JjZVVwZGF0ZSwgZXhwaXJ5TXMpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkbGUgJiYgdHJhbnNpdGlvbnMuc29tZSh0ID0+IHQuZXhwaXJlZCkpIHtcbiAgICAgICAgICBleGl0aW5nVHJhbnNpdGlvbnMuY3VycmVudC5kZWxldGUodCk7XG5cbiAgICAgICAgICBpZiAoZXhpdEJlZm9yZUVudGVyKSB7XG4gICAgICAgICAgICBmb3JjZUNoYW5nZS5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3JjZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHNwcmluZ3MgPSBnZXRTcHJpbmdzKHQuY3RybCwgcGF5bG9hZCk7XG5cbiAgICBpZiAocGhhc2UgPT09IFRyYW5zaXRpb25QaGFzZS5MRUFWRSAmJiBleGl0QmVmb3JlRW50ZXIpIHtcbiAgICAgIGV4aXRpbmdUcmFuc2l0aW9ucy5jdXJyZW50LnNldCh0LCB7XG4gICAgICAgIHBoYXNlLFxuICAgICAgICBzcHJpbmdzLFxuICAgICAgICBwYXlsb2FkXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhbmdlcy5zZXQodCwge1xuICAgICAgICBwaGFzZSxcbiAgICAgICAgc3ByaW5ncyxcbiAgICAgICAgcGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoU3ByaW5nQ29udGV4dCk7XG4gIGNvbnN0IHByZXZDb250ZXh0ID0gdXNlUHJldihjb250ZXh0KTtcbiAgY29uc3QgaGFzQ29udGV4dCA9IGNvbnRleHQgIT09IHByZXZDb250ZXh0ICYmIGhhc1Byb3BzKGNvbnRleHQpO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChoYXNDb250ZXh0KSB7XG4gICAgICBlYWNoKHRyYW5zaXRpb25zLCB0ID0+IHtcbiAgICAgICAgdC5jdHJsLnN0YXJ0KHtcbiAgICAgICAgICBkZWZhdWx0OiBjb250ZXh0XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbY29udGV4dF0pO1xuICBlYWNoKGNoYW5nZXMsIChfLCB0KSA9PiB7XG4gICAgaWYgKGV4aXRpbmdUcmFuc2l0aW9ucy5jdXJyZW50LnNpemUpIHtcbiAgICAgIGNvbnN0IGluZCA9IHRyYW5zaXRpb25zLmZpbmRJbmRleChzdGF0ZSA9PiBzdGF0ZS5rZXkgPT09IHQua2V5KTtcbiAgICAgIHRyYW5zaXRpb25zLnNwbGljZShpbmQsIDEpO1xuICAgIH1cbiAgfSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgZWFjaChleGl0aW5nVHJhbnNpdGlvbnMuY3VycmVudC5zaXplID8gZXhpdGluZ1RyYW5zaXRpb25zLmN1cnJlbnQgOiBjaGFuZ2VzLCAoe1xuICAgICAgcGhhc2UsXG4gICAgICBwYXlsb2FkXG4gICAgfSwgdCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjdHJsXG4gICAgICB9ID0gdDtcbiAgICAgIHQucGhhc2UgPSBwaGFzZTtcbiAgICAgIHJlZiA9PSBudWxsID8gdm9pZCAwIDogcmVmLmFkZChjdHJsKTtcblxuICAgICAgaWYgKGhhc0NvbnRleHQgJiYgcGhhc2UgPT0gVHJhbnNpdGlvblBoYXNlLkVOVEVSKSB7XG4gICAgICAgIGN0cmwuc3RhcnQoe1xuICAgICAgICAgIGRlZmF1bHQ6IGNvbnRleHRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICAgIHJlcGxhY2VSZWYoY3RybCwgcGF5bG9hZC5yZWYpO1xuXG4gICAgICAgIGlmIChjdHJsLnJlZiAmJiAhZm9yY2VDaGFuZ2UuY3VycmVudCkge1xuICAgICAgICAgIGN0cmwudXBkYXRlKHBheWxvYWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0cmwuc3RhcnQocGF5bG9hZCk7XG5cbiAgICAgICAgICBpZiAoZm9yY2VDaGFuZ2UuY3VycmVudCkge1xuICAgICAgICAgICAgZm9yY2VDaGFuZ2UuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LCByZXNldCA/IHZvaWQgMCA6IGRlcHMpO1xuXG4gIGNvbnN0IHJlbmRlclRyYW5zaXRpb25zID0gcmVuZGVyID0+IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRyYW5zaXRpb25zLm1hcCgodCwgaSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHNwcmluZ3NcbiAgICB9ID0gY2hhbmdlcy5nZXQodCkgfHwgdC5jdHJsO1xuICAgIGNvbnN0IGVsZW0gPSByZW5kZXIoX2V4dGVuZHMoe30sIHNwcmluZ3MpLCB0Lml0ZW0sIHQsIGkpO1xuICAgIHJldHVybiBlbGVtICYmIGVsZW0udHlwZSA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoZWxlbS50eXBlLCBfZXh0ZW5kcyh7fSwgZWxlbS5wcm9wcywge1xuICAgICAga2V5OiBpcy5zdHIodC5rZXkpIHx8IGlzLm51bSh0LmtleSkgPyB0LmtleSA6IHQuY3RybC5pZCxcbiAgICAgIHJlZjogZWxlbS5yZWZcbiAgICB9KSkgOiBlbGVtO1xuICB9KSk7XG5cbiAgcmV0dXJuIHJlZiA/IFtyZW5kZXJUcmFuc2l0aW9ucywgcmVmXSA6IHJlbmRlclRyYW5zaXRpb25zO1xufVxubGV0IG5leHRLZXkgPSAxO1xuXG5mdW5jdGlvbiBnZXRLZXlzKGl0ZW1zLCB7XG4gIGtleSxcbiAga2V5cyA9IGtleVxufSwgcHJldlRyYW5zaXRpb25zKSB7XG4gIGlmIChrZXlzID09PSBudWxsKSB7XG4gICAgY29uc3QgcmV1c2VkID0gbmV3IFNldCgpO1xuICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICBjb25zdCB0ID0gcHJldlRyYW5zaXRpb25zICYmIHByZXZUcmFuc2l0aW9ucy5maW5kKHQgPT4gdC5pdGVtID09PSBpdGVtICYmIHQucGhhc2UgIT09IFRyYW5zaXRpb25QaGFzZS5MRUFWRSAmJiAhcmV1c2VkLmhhcyh0KSk7XG5cbiAgICAgIGlmICh0KSB7XG4gICAgICAgIHJldXNlZC5hZGQodCk7XG4gICAgICAgIHJldHVybiB0LmtleTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRLZXkrKztcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBpcy51bmQoa2V5cykgPyBpdGVtcyA6IGlzLmZ1bihrZXlzKSA/IGl0ZW1zLm1hcChrZXlzKSA6IHRvQXJyYXkoa2V5cyk7XG59XG5cbmNvbnN0IF9leGNsdWRlZCQyID0gW1wiY2hpbGRyZW5cIl07XG5mdW5jdGlvbiBTcHJpbmcoX3JlZikge1xuICBsZXQge1xuICAgIGNoaWxkcmVuXG4gIH0gPSBfcmVmLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQkMik7XG5cbiAgcmV0dXJuIGNoaWxkcmVuKHVzZVNwcmluZyhwcm9wcykpO1xufVxuXG5jb25zdCBfZXhjbHVkZWQkMSA9IFtcIml0ZW1zXCIsIFwiY2hpbGRyZW5cIl07XG5mdW5jdGlvbiBUcmFpbChfcmVmKSB7XG4gIGxldCB7XG4gICAgaXRlbXMsXG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCQxKTtcblxuICBjb25zdCB0cmFpbHMgPSB1c2VUcmFpbChpdGVtcy5sZW5ndGgsIHByb3BzKTtcbiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBjaGlsZHJlbihpdGVtLCBpbmRleCk7XG4gICAgcmV0dXJuIGlzLmZ1bihyZXN1bHQpID8gcmVzdWx0KHRyYWlsc1tpbmRleF0pIDogcmVzdWx0O1xuICB9KTtcbn1cblxuY29uc3QgX2V4Y2x1ZGVkID0gW1wiaXRlbXNcIiwgXCJjaGlsZHJlblwiXTtcbmZ1bmN0aW9uIFRyYW5zaXRpb24oX3JlZikge1xuICBsZXQge1xuICAgIGl0ZW1zLFxuICAgIGNoaWxkcmVuXG4gIH0gPSBfcmVmLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiB1c2VUcmFuc2l0aW9uKGl0ZW1zLCBwcm9wcykoY2hpbGRyZW4pO1xufVxuXG5jbGFzcyBJbnRlcnBvbGF0aW9uIGV4dGVuZHMgRnJhbWVWYWx1ZSB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZSwgYXJncykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5rZXkgPSB2b2lkIDA7XG4gICAgdGhpcy5pZGxlID0gdHJ1ZTtcbiAgICB0aGlzLmNhbGMgPSB2b2lkIDA7XG4gICAgdGhpcy5fYWN0aXZlID0gbmV3IFNldCgpO1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMuY2FsYyA9IGNyZWF0ZUludGVycG9sYXRvciguLi5hcmdzKTtcblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0KCk7XG5cbiAgICBjb25zdCBub2RlVHlwZSA9IGdldEFuaW1hdGVkVHlwZSh2YWx1ZSk7XG4gICAgc2V0QW5pbWF0ZWQodGhpcywgbm9kZVR5cGUuY3JlYXRlKHZhbHVlKSk7XG4gIH1cblxuICBhZHZhbmNlKF9kdCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0KCk7XG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICBpZiAoIWlzRXF1YWwodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgZ2V0QW5pbWF0ZWQodGhpcykuc2V0VmFsdWUodmFsdWUpO1xuXG4gICAgICB0aGlzLl9vbkNoYW5nZSh2YWx1ZSwgdGhpcy5pZGxlKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaWRsZSAmJiBjaGVja0lkbGUodGhpcy5fYWN0aXZlKSkge1xuICAgICAgYmVjb21lSWRsZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBfZ2V0KCkge1xuICAgIGNvbnN0IGlucHV0cyA9IGlzLmFycih0aGlzLnNvdXJjZSkgPyB0aGlzLnNvdXJjZS5tYXAoZ2V0Rmx1aWRWYWx1ZSkgOiB0b0FycmF5KGdldEZsdWlkVmFsdWUodGhpcy5zb3VyY2UpKTtcbiAgICByZXR1cm4gdGhpcy5jYWxjKC4uLmlucHV0cyk7XG4gIH1cblxuICBfc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuaWRsZSAmJiAhY2hlY2tJZGxlKHRoaXMuX2FjdGl2ZSkpIHtcbiAgICAgIHRoaXMuaWRsZSA9IGZhbHNlO1xuICAgICAgZWFjaChnZXRQYXlsb2FkKHRoaXMpLCBub2RlID0+IHtcbiAgICAgICAgbm9kZS5kb25lID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgaWYgKEdsb2JhbHMuc2tpcEFuaW1hdGlvbikge1xuICAgICAgICByYWYuYmF0Y2hlZFVwZGF0ZXMoKCkgPT4gdGhpcy5hZHZhbmNlKCkpO1xuICAgICAgICBiZWNvbWVJZGxlKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJhbWVMb29wLnN0YXJ0KHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9hdHRhY2goKSB7XG4gICAgbGV0IHByaW9yaXR5ID0gMTtcbiAgICBlYWNoKHRvQXJyYXkodGhpcy5zb3VyY2UpLCBzb3VyY2UgPT4ge1xuICAgICAgaWYgKGhhc0ZsdWlkVmFsdWUoc291cmNlKSkge1xuICAgICAgICBhZGRGbHVpZE9ic2VydmVyKHNvdXJjZSwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ZyYW1lVmFsdWUoc291cmNlKSkge1xuICAgICAgICBpZiAoIXNvdXJjZS5pZGxlKSB7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlLmFkZChzb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpb3JpdHkgPSBNYXRoLm1heChwcmlvcml0eSwgc291cmNlLnByaW9yaXR5ICsgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgdGhpcy5fc3RhcnQoKTtcbiAgfVxuXG4gIF9kZXRhY2goKSB7XG4gICAgZWFjaCh0b0FycmF5KHRoaXMuc291cmNlKSwgc291cmNlID0+IHtcbiAgICAgIGlmIChoYXNGbHVpZFZhbHVlKHNvdXJjZSkpIHtcbiAgICAgICAgcmVtb3ZlRmx1aWRPYnNlcnZlcihzb3VyY2UsIHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fYWN0aXZlLmNsZWFyKCk7XG5cbiAgICBiZWNvbWVJZGxlKHRoaXMpO1xuICB9XG5cbiAgZXZlbnRPYnNlcnZlZChldmVudCkge1xuICAgIGlmIChldmVudC50eXBlID09ICdjaGFuZ2UnKSB7XG4gICAgICBpZiAoZXZlbnQuaWRsZSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZS5hZGQoZXZlbnQucGFyZW50KTtcblxuICAgICAgICB0aGlzLl9zdGFydCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PSAnaWRsZScpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlLmRlbGV0ZShldmVudC5wYXJlbnQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09ICdwcmlvcml0eScpIHtcbiAgICAgICAgICB0aGlzLnByaW9yaXR5ID0gdG9BcnJheSh0aGlzLnNvdXJjZSkucmVkdWNlKChoaWdoZXN0LCBwYXJlbnQpID0+IE1hdGgubWF4KGhpZ2hlc3QsIChpc0ZyYW1lVmFsdWUocGFyZW50KSA/IHBhcmVudC5wcmlvcml0eSA6IDApICsgMSksIDApO1xuICAgICAgICB9XG4gIH1cblxufVxuXG5mdW5jdGlvbiBpc0lkbGUoc291cmNlKSB7XG4gIHJldHVybiBzb3VyY2UuaWRsZSAhPT0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWRsZShhY3RpdmUpIHtcbiAgcmV0dXJuICFhY3RpdmUuc2l6ZSB8fCBBcnJheS5mcm9tKGFjdGl2ZSkuZXZlcnkoaXNJZGxlKTtcbn1cblxuZnVuY3Rpb24gYmVjb21lSWRsZShzZWxmKSB7XG4gIGlmICghc2VsZi5pZGxlKSB7XG4gICAgc2VsZi5pZGxlID0gdHJ1ZTtcbiAgICBlYWNoKGdldFBheWxvYWQoc2VsZiksIG5vZGUgPT4ge1xuICAgICAgbm9kZS5kb25lID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBjYWxsRmx1aWRPYnNlcnZlcnMoc2VsZiwge1xuICAgICAgdHlwZTogJ2lkbGUnLFxuICAgICAgcGFyZW50OiBzZWxmXG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgdG8gPSAoc291cmNlLCAuLi5hcmdzKSA9PiBuZXcgSW50ZXJwb2xhdGlvbihzb3VyY2UsIGFyZ3MpO1xuY29uc3QgaW50ZXJwb2xhdGUgPSAoc291cmNlLCAuLi5hcmdzKSA9PiAoZGVwcmVjYXRlSW50ZXJwb2xhdGUoKSwgbmV3IEludGVycG9sYXRpb24oc291cmNlLCBhcmdzKSk7XG5cbkdsb2JhbHMuYXNzaWduKHtcbiAgY3JlYXRlU3RyaW5nSW50ZXJwb2xhdG9yLFxuICB0bzogKHNvdXJjZSwgYXJncykgPT4gbmV3IEludGVycG9sYXRpb24oc291cmNlLCBhcmdzKVxufSk7XG5jb25zdCB1cGRhdGUgPSBmcmFtZUxvb3AuYWR2YW5jZTtcblxuZXhwb3J0IHsgQmFpbFNpZ25hbCwgQ29udHJvbGxlciwgRnJhbWVWYWx1ZSwgSW50ZXJwb2xhdGlvbiwgU3ByaW5nLCBTcHJpbmdDb250ZXh0LCBTcHJpbmdSZWYsIFNwcmluZ1ZhbHVlLCBUcmFpbCwgVHJhbnNpdGlvbiwgY29uZmlnLCBlYXNpbmdzLCBpbmZlclRvLCBpbnRlcnBvbGF0ZSwgdG8sIHVwZGF0ZSwgdXNlQ2hhaW4sIHVzZVNwcmluZywgdXNlU3ByaW5nUmVmLCB1c2VTcHJpbmdzLCB1c2VUcmFpbCwgdXNlVHJhbnNpdGlvbiB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4928\n")},4813:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"B0\": () => (/* binding */ FluidValue),\n \"OH\": () => (/* binding */ globals),\n \"UI\": () => (/* binding */ addFluidObserver),\n \"k0\": () => (/* binding */ callFluidObservers),\n \"O9\": () => (/* binding */ colors),\n \"mD\": () => (/* binding */ createInterpolator),\n \"qS\": () => (/* binding */ createStringInterpolator),\n \"dE\": () => (/* binding */ defineHidden),\n \"ZR\": () => (/* binding */ deprecateDirectCall),\n \"LW\": () => (/* binding */ deprecateInterpolate),\n \"S6\": () => (/* binding */ each),\n \"rU\": () => (/* binding */ eachProp),\n \"yl\": () => (/* binding */ flush),\n \"bl\": () => (/* binding */ flushCalls),\n \"fT\": () => (/* binding */ frameLoop),\n \"Ll\": () => (/* binding */ getFluidObservers),\n \"je\": () => (/* binding */ getFluidValue),\n \"j$\": () => (/* binding */ hasFluidValue),\n \"is\": () => (/* binding */ is),\n \"Df\": () => (/* binding */ isAnimatedString),\n \"Xy\": () => (/* binding */ isEqual),\n \"ZT\": () => (/* binding */ noop),\n \"Wn\": () => (/* reexport */ raf),\n \"iL\": () => (/* binding */ removeFluidObserver),\n \"qo\": () => (/* binding */ toArray),\n \"NW\": () => (/* binding */ useForceUpdate),\n \"bt\": () => (/* binding */ useLayoutEffect),\n \"Pr\": () => (/* binding */ useMemoOne),\n \"tf\": () => (/* binding */ useOnce),\n \"zH\": () => (/* binding */ usePrev)\n});\n\n// UNUSED EXPORTS: callFluidObserver, colorToRgba, hex3, hex4, hex6, hex8, hsl, hsla, isSSR, rgb, rgba, setFluidGetter\n\n;// CONCATENATED MODULE: ./node_modules/@react-spring/rafz/dist/react-spring-rafz.esm.js\nlet updateQueue = makeQueue();\nconst raf = fn => schedule(fn, updateQueue);\nlet writeQueue = makeQueue();\n\nraf.write = fn => schedule(fn, writeQueue);\n\nlet onStartQueue = makeQueue();\n\nraf.onStart = fn => schedule(fn, onStartQueue);\n\nlet onFrameQueue = makeQueue();\n\nraf.onFrame = fn => schedule(fn, onFrameQueue);\n\nlet onFinishQueue = makeQueue();\n\nraf.onFinish = fn => schedule(fn, onFinishQueue);\n\nlet timeouts = [];\n\nraf.setTimeout = (handler, ms) => {\n let time = raf.now() + ms;\n\n let cancel = () => {\n let i = timeouts.findIndex(t => t.cancel == cancel);\n if (~i) timeouts.splice(i, 1);\n pendingCount -= ~i ? 1 : 0;\n };\n\n let timeout = {\n time,\n handler,\n cancel\n };\n timeouts.splice(findTimeout(time), 0, timeout);\n pendingCount += 1;\n start();\n return timeout;\n};\n\nlet findTimeout = time => ~(~timeouts.findIndex(t => t.time > time) || ~timeouts.length);\n\nraf.cancel = fn => {\n onStartQueue.delete(fn);\n onFrameQueue.delete(fn);\n updateQueue.delete(fn);\n writeQueue.delete(fn);\n onFinishQueue.delete(fn);\n};\n\nraf.sync = fn => {\n sync = true;\n raf.batchedUpdates(fn);\n sync = false;\n};\n\nraf.throttle = fn => {\n let lastArgs;\n\n function queuedFn() {\n try {\n fn(...lastArgs);\n } finally {\n lastArgs = null;\n }\n }\n\n function throttled(...args) {\n lastArgs = args;\n raf.onStart(queuedFn);\n }\n\n throttled.handler = fn;\n\n throttled.cancel = () => {\n onStartQueue.delete(queuedFn);\n lastArgs = null;\n };\n\n return throttled;\n};\n\nlet nativeRaf = typeof window != 'undefined' ? window.requestAnimationFrame : () => {};\n\nraf.use = impl => nativeRaf = impl;\n\nraf.now = typeof performance != 'undefined' ? () => performance.now() : Date.now;\n\nraf.batchedUpdates = fn => fn();\n\nraf.catch = console.error;\nraf.frameLoop = 'always';\n\nraf.advance = () => {\n if (raf.frameLoop !== 'demand') {\n console.warn('Cannot call the manual advancement of rafz whilst frameLoop is not set as demand');\n } else {\n update();\n }\n};\n\nlet ts = -1;\nlet pendingCount = 0;\nlet sync = false;\n\nfunction schedule(fn, queue) {\n if (sync) {\n queue.delete(fn);\n fn(0);\n } else {\n queue.add(fn);\n start();\n }\n}\n\nfunction start() {\n if (ts < 0) {\n ts = 0;\n\n if (raf.frameLoop !== 'demand') {\n nativeRaf(loop);\n }\n }\n}\n\nfunction stop() {\n ts = -1;\n}\n\nfunction loop() {\n if (~ts) {\n nativeRaf(loop);\n raf.batchedUpdates(update);\n }\n}\n\nfunction update() {\n let prevTs = ts;\n ts = raf.now();\n let count = findTimeout(ts);\n\n if (count) {\n eachSafely(timeouts.splice(0, count), t => t.handler());\n pendingCount -= count;\n }\n\n onStartQueue.flush();\n updateQueue.flush(prevTs ? Math.min(64, ts - prevTs) : 16.667);\n onFrameQueue.flush();\n writeQueue.flush();\n onFinishQueue.flush();\n\n if (!pendingCount) {\n stop();\n }\n}\n\nfunction makeQueue() {\n let next = new Set();\n let current = next;\n return {\n add(fn) {\n pendingCount += current == next && !next.has(fn) ? 1 : 0;\n next.add(fn);\n },\n\n delete(fn) {\n pendingCount -= current == next && next.has(fn) ? 1 : 0;\n return next.delete(fn);\n },\n\n flush(arg) {\n if (current.size) {\n next = new Set();\n pendingCount -= current.size;\n eachSafely(current, fn => fn(arg) && next.add(fn));\n pendingCount += next.size;\n current = next;\n }\n }\n\n };\n}\n\nfunction eachSafely(values, each) {\n values.forEach(value => {\n try {\n each(value);\n } catch (e) {\n raf.catch(e);\n }\n });\n}\n\nconst __raf = {\n count() {\n return pendingCount;\n },\n\n isRunning() {\n return ts >= 0;\n },\n\n clear() {\n ts = -1;\n timeouts = [];\n onStartQueue = makeQueue();\n updateQueue = makeQueue();\n onFrameQueue = makeQueue();\n writeQueue = makeQueue();\n onFinishQueue = makeQueue();\n pendingCount = 0;\n }\n\n};\n\n\n\n// EXTERNAL MODULE: external \"React\"\nvar external_React_ = __webpack_require__(7363);\n;// CONCATENATED MODULE: ./node_modules/@react-spring/shared/dist/react-spring-shared.esm.js\n\n\n\n\n\nfunction noop() {}\nconst defineHidden = (obj, key, value) => Object.defineProperty(obj, key, {\n value,\n writable: true,\n configurable: true\n});\nconst is = {\n arr: Array.isArray,\n obj: a => !!a && a.constructor.name === 'Object',\n fun: a => typeof a === 'function',\n str: a => typeof a === 'string',\n num: a => typeof a === 'number',\n und: a => a === undefined\n};\nfunction isEqual(a, b) {\n if (is.arr(a)) {\n if (!is.arr(b) || a.length !== b.length) return false;\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n\n return true;\n }\n\n return a === b;\n}\nconst each = (obj, fn) => obj.forEach(fn);\nfunction eachProp(obj, fn, ctx) {\n if (is.arr(obj)) {\n for (let i = 0; i < obj.length; i++) {\n fn.call(ctx, obj[i], `${i}`);\n }\n\n return;\n }\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n fn.call(ctx, obj[key], key);\n }\n }\n}\nconst toArray = a => is.und(a) ? [] : is.arr(a) ? a : [a];\nfunction flush(queue, iterator) {\n if (queue.size) {\n const items = Array.from(queue);\n queue.clear();\n each(items, iterator);\n }\n}\nconst flushCalls = (queue, ...args) => flush(queue, fn => fn(...args));\nconst isSSR = () => typeof window === 'undefined' || !window.navigator || /ServerSideRendering|^Deno\\//.test(window.navigator.userAgent);\n\nlet createStringInterpolator$1;\nlet to;\nlet colors$1 = null;\nlet skipAnimation = false;\nlet willAdvance = noop;\nconst react_spring_shared_esm_assign = globals => {\n if (globals.to) to = globals.to;\n if (globals.now) raf.now = globals.now;\n if (globals.colors !== undefined) colors$1 = globals.colors;\n if (globals.skipAnimation != null) skipAnimation = globals.skipAnimation;\n if (globals.createStringInterpolator) createStringInterpolator$1 = globals.createStringInterpolator;\n if (globals.requestAnimationFrame) raf.use(globals.requestAnimationFrame);\n if (globals.batchedUpdates) raf.batchedUpdates = globals.batchedUpdates;\n if (globals.willAdvance) willAdvance = globals.willAdvance;\n if (globals.frameLoop) raf.frameLoop = globals.frameLoop;\n};\n\nvar globals = /*#__PURE__*/Object.freeze({\n __proto__: null,\n get createStringInterpolator () { return createStringInterpolator$1; },\n get to () { return to; },\n get colors () { return colors$1; },\n get skipAnimation () { return skipAnimation; },\n get willAdvance () { return willAdvance; },\n assign: react_spring_shared_esm_assign\n});\n\nconst startQueue = new Set();\nlet currentFrame = [];\nlet prevFrame = [];\nlet priority = 0;\nconst frameLoop = {\n get idle() {\n return !startQueue.size && !currentFrame.length;\n },\n\n start(animation) {\n if (priority > animation.priority) {\n startQueue.add(animation);\n raf.onStart(flushStartQueue);\n } else {\n startSafely(animation);\n raf(advance);\n }\n },\n\n advance,\n\n sort(animation) {\n if (priority) {\n raf.onFrame(() => frameLoop.sort(animation));\n } else {\n const prevIndex = currentFrame.indexOf(animation);\n\n if (~prevIndex) {\n currentFrame.splice(prevIndex, 1);\n startUnsafely(animation);\n }\n }\n },\n\n clear() {\n currentFrame = [];\n startQueue.clear();\n }\n\n};\n\nfunction flushStartQueue() {\n startQueue.forEach(startSafely);\n startQueue.clear();\n raf(advance);\n}\n\nfunction startSafely(animation) {\n if (!currentFrame.includes(animation)) startUnsafely(animation);\n}\n\nfunction startUnsafely(animation) {\n currentFrame.splice(findIndex(currentFrame, other => other.priority > animation.priority), 0, animation);\n}\n\nfunction advance(dt) {\n const nextFrame = prevFrame;\n\n for (let i = 0; i < currentFrame.length; i++) {\n const animation = currentFrame[i];\n priority = animation.priority;\n\n if (!animation.idle) {\n willAdvance(animation);\n animation.advance(dt);\n\n if (!animation.idle) {\n nextFrame.push(animation);\n }\n }\n }\n\n priority = 0;\n prevFrame = currentFrame;\n prevFrame.length = 0;\n currentFrame = nextFrame;\n return currentFrame.length > 0;\n}\n\nfunction findIndex(arr, test) {\n const index = arr.findIndex(test);\n return index < 0 ? arr.length : index;\n}\n\nconst colors = {\n transparent: 0x00000000,\n aliceblue: 0xf0f8ffff,\n antiquewhite: 0xfaebd7ff,\n aqua: 0x00ffffff,\n aquamarine: 0x7fffd4ff,\n azure: 0xf0ffffff,\n beige: 0xf5f5dcff,\n bisque: 0xffe4c4ff,\n black: 0x000000ff,\n blanchedalmond: 0xffebcdff,\n blue: 0x0000ffff,\n blueviolet: 0x8a2be2ff,\n brown: 0xa52a2aff,\n burlywood: 0xdeb887ff,\n burntsienna: 0xea7e5dff,\n cadetblue: 0x5f9ea0ff,\n chartreuse: 0x7fff00ff,\n chocolate: 0xd2691eff,\n coral: 0xff7f50ff,\n cornflowerblue: 0x6495edff,\n cornsilk: 0xfff8dcff,\n crimson: 0xdc143cff,\n cyan: 0x00ffffff,\n darkblue: 0x00008bff,\n darkcyan: 0x008b8bff,\n darkgoldenrod: 0xb8860bff,\n darkgray: 0xa9a9a9ff,\n darkgreen: 0x006400ff,\n darkgrey: 0xa9a9a9ff,\n darkkhaki: 0xbdb76bff,\n darkmagenta: 0x8b008bff,\n darkolivegreen: 0x556b2fff,\n darkorange: 0xff8c00ff,\n darkorchid: 0x9932ccff,\n darkred: 0x8b0000ff,\n darksalmon: 0xe9967aff,\n darkseagreen: 0x8fbc8fff,\n darkslateblue: 0x483d8bff,\n darkslategray: 0x2f4f4fff,\n darkslategrey: 0x2f4f4fff,\n darkturquoise: 0x00ced1ff,\n darkviolet: 0x9400d3ff,\n deeppink: 0xff1493ff,\n deepskyblue: 0x00bfffff,\n dimgray: 0x696969ff,\n dimgrey: 0x696969ff,\n dodgerblue: 0x1e90ffff,\n firebrick: 0xb22222ff,\n floralwhite: 0xfffaf0ff,\n forestgreen: 0x228b22ff,\n fuchsia: 0xff00ffff,\n gainsboro: 0xdcdcdcff,\n ghostwhite: 0xf8f8ffff,\n gold: 0xffd700ff,\n goldenrod: 0xdaa520ff,\n gray: 0x808080ff,\n green: 0x008000ff,\n greenyellow: 0xadff2fff,\n grey: 0x808080ff,\n honeydew: 0xf0fff0ff,\n hotpink: 0xff69b4ff,\n indianred: 0xcd5c5cff,\n indigo: 0x4b0082ff,\n ivory: 0xfffff0ff,\n khaki: 0xf0e68cff,\n lavender: 0xe6e6faff,\n lavenderblush: 0xfff0f5ff,\n lawngreen: 0x7cfc00ff,\n lemonchiffon: 0xfffacdff,\n lightblue: 0xadd8e6ff,\n lightcoral: 0xf08080ff,\n lightcyan: 0xe0ffffff,\n lightgoldenrodyellow: 0xfafad2ff,\n lightgray: 0xd3d3d3ff,\n lightgreen: 0x90ee90ff,\n lightgrey: 0xd3d3d3ff,\n lightpink: 0xffb6c1ff,\n lightsalmon: 0xffa07aff,\n lightseagreen: 0x20b2aaff,\n lightskyblue: 0x87cefaff,\n lightslategray: 0x778899ff,\n lightslategrey: 0x778899ff,\n lightsteelblue: 0xb0c4deff,\n lightyellow: 0xffffe0ff,\n lime: 0x00ff00ff,\n limegreen: 0x32cd32ff,\n linen: 0xfaf0e6ff,\n magenta: 0xff00ffff,\n maroon: 0x800000ff,\n mediumaquamarine: 0x66cdaaff,\n mediumblue: 0x0000cdff,\n mediumorchid: 0xba55d3ff,\n mediumpurple: 0x9370dbff,\n mediumseagreen: 0x3cb371ff,\n mediumslateblue: 0x7b68eeff,\n mediumspringgreen: 0x00fa9aff,\n mediumturquoise: 0x48d1ccff,\n mediumvioletred: 0xc71585ff,\n midnightblue: 0x191970ff,\n mintcream: 0xf5fffaff,\n mistyrose: 0xffe4e1ff,\n moccasin: 0xffe4b5ff,\n navajowhite: 0xffdeadff,\n navy: 0x000080ff,\n oldlace: 0xfdf5e6ff,\n olive: 0x808000ff,\n olivedrab: 0x6b8e23ff,\n orange: 0xffa500ff,\n orangered: 0xff4500ff,\n orchid: 0xda70d6ff,\n palegoldenrod: 0xeee8aaff,\n palegreen: 0x98fb98ff,\n paleturquoise: 0xafeeeeff,\n palevioletred: 0xdb7093ff,\n papayawhip: 0xffefd5ff,\n peachpuff: 0xffdab9ff,\n peru: 0xcd853fff,\n pink: 0xffc0cbff,\n plum: 0xdda0ddff,\n powderblue: 0xb0e0e6ff,\n purple: 0x800080ff,\n rebeccapurple: 0x663399ff,\n red: 0xff0000ff,\n rosybrown: 0xbc8f8fff,\n royalblue: 0x4169e1ff,\n saddlebrown: 0x8b4513ff,\n salmon: 0xfa8072ff,\n sandybrown: 0xf4a460ff,\n seagreen: 0x2e8b57ff,\n seashell: 0xfff5eeff,\n sienna: 0xa0522dff,\n silver: 0xc0c0c0ff,\n skyblue: 0x87ceebff,\n slateblue: 0x6a5acdff,\n slategray: 0x708090ff,\n slategrey: 0x708090ff,\n snow: 0xfffafaff,\n springgreen: 0x00ff7fff,\n steelblue: 0x4682b4ff,\n tan: 0xd2b48cff,\n teal: 0x008080ff,\n thistle: 0xd8bfd8ff,\n tomato: 0xff6347ff,\n turquoise: 0x40e0d0ff,\n violet: 0xee82eeff,\n wheat: 0xf5deb3ff,\n white: 0xffffffff,\n whitesmoke: 0xf5f5f5ff,\n yellow: 0xffff00ff,\n yellowgreen: 0x9acd32ff\n};\n\nconst NUMBER = '[-+]?\\\\d*\\\\.?\\\\d+';\nconst PERCENTAGE = NUMBER + '%';\n\nfunction call(...parts) {\n return '\\\\(\\\\s*(' + parts.join(')\\\\s*,\\\\s*(') + ')\\\\s*\\\\)';\n}\n\nconst rgb = new RegExp('rgb' + call(NUMBER, NUMBER, NUMBER));\nconst rgba = new RegExp('rgba' + call(NUMBER, NUMBER, NUMBER, NUMBER));\nconst hsl = new RegExp('hsl' + call(NUMBER, PERCENTAGE, PERCENTAGE));\nconst hsla = new RegExp('hsla' + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER));\nconst hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nconst hex4 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nconst hex6 = /^#([0-9a-fA-F]{6})$/;\nconst hex8 = /^#([0-9a-fA-F]{8})$/;\n\nfunction normalizeColor(color) {\n let match;\n\n if (typeof color === 'number') {\n return color >>> 0 === color && color >= 0 && color <= 0xffffffff ? color : null;\n }\n\n if (match = hex6.exec(color)) return parseInt(match[1] + 'ff', 16) >>> 0;\n\n if (colors$1 && colors$1[color] !== undefined) {\n return colors$1[color];\n }\n\n if (match = rgb.exec(color)) {\n return (parse255(match[1]) << 24 | parse255(match[2]) << 16 | parse255(match[3]) << 8 | 0x000000ff) >>> 0;\n }\n\n if (match = rgba.exec(color)) {\n return (parse255(match[1]) << 24 | parse255(match[2]) << 16 | parse255(match[3]) << 8 | parse1(match[4])) >>> 0;\n }\n\n if (match = hex3.exec(color)) {\n return parseInt(match[1] + match[1] + match[2] + match[2] + match[3] + match[3] + 'ff', 16) >>> 0;\n }\n\n if (match = hex8.exec(color)) return parseInt(match[1], 16) >>> 0;\n\n if (match = hex4.exec(color)) {\n return parseInt(match[1] + match[1] + match[2] + match[2] + match[3] + match[3] + match[4] + match[4], 16) >>> 0;\n }\n\n if (match = hsl.exec(color)) {\n return (hslToRgb(parse360(match[1]), parsePercentage(match[2]), parsePercentage(match[3])) | 0x000000ff) >>> 0;\n }\n\n if (match = hsla.exec(color)) {\n return (hslToRgb(parse360(match[1]), parsePercentage(match[2]), parsePercentage(match[3])) | parse1(match[4])) >>> 0;\n }\n\n return null;\n}\n\nfunction hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\n\nfunction hslToRgb(h, s, l) {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const r = hue2rgb(p, q, h + 1 / 3);\n const g = hue2rgb(p, q, h);\n const b = hue2rgb(p, q, h - 1 / 3);\n return Math.round(r * 255) << 24 | Math.round(g * 255) << 16 | Math.round(b * 255) << 8;\n}\n\nfunction parse255(str) {\n const int = parseInt(str, 10);\n if (int < 0) return 0;\n if (int > 255) return 255;\n return int;\n}\n\nfunction parse360(str) {\n const int = parseFloat(str);\n return (int % 360 + 360) % 360 / 360;\n}\n\nfunction parse1(str) {\n const num = parseFloat(str);\n if (num < 0) return 0;\n if (num > 1) return 255;\n return Math.round(num * 255);\n}\n\nfunction parsePercentage(str) {\n const int = parseFloat(str);\n if (int < 0) return 0;\n if (int > 100) return 1;\n return int / 100;\n}\n\nfunction colorToRgba(input) {\n let int32Color = normalizeColor(input);\n if (int32Color === null) return input;\n int32Color = int32Color || 0;\n let r = (int32Color & 0xff000000) >>> 24;\n let g = (int32Color & 0x00ff0000) >>> 16;\n let b = (int32Color & 0x0000ff00) >>> 8;\n let a = (int32Color & 0x000000ff) / 255;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\nconst createInterpolator = (range, output, extrapolate) => {\n if (is.fun(range)) {\n return range;\n }\n\n if (is.arr(range)) {\n return createInterpolator({\n range,\n output: output,\n extrapolate\n });\n }\n\n if (is.str(range.output[0])) {\n return createStringInterpolator$1(range);\n }\n\n const config = range;\n const outputRange = config.output;\n const inputRange = config.range || [0, 1];\n const extrapolateLeft = config.extrapolateLeft || config.extrapolate || 'extend';\n const extrapolateRight = config.extrapolateRight || config.extrapolate || 'extend';\n\n const easing = config.easing || (t => t);\n\n return input => {\n const range = findRange(input, inputRange);\n return interpolate(input, inputRange[range], inputRange[range + 1], outputRange[range], outputRange[range + 1], easing, extrapolateLeft, extrapolateRight, config.map);\n };\n};\n\nfunction interpolate(input, inputMin, inputMax, outputMin, outputMax, easing, extrapolateLeft, extrapolateRight, map) {\n let result = map ? map(input) : input;\n\n if (result < inputMin) {\n if (extrapolateLeft === 'identity') return result;else if (extrapolateLeft === 'clamp') result = inputMin;\n }\n\n if (result > inputMax) {\n if (extrapolateRight === 'identity') return result;else if (extrapolateRight === 'clamp') result = inputMax;\n }\n\n if (outputMin === outputMax) return outputMin;\n if (inputMin === inputMax) return input <= inputMin ? outputMin : outputMax;\n if (inputMin === -Infinity) result = -result;else if (inputMax === Infinity) result = result - inputMin;else result = (result - inputMin) / (inputMax - inputMin);\n result = easing(result);\n if (outputMin === -Infinity) result = -result;else if (outputMax === Infinity) result = result + outputMin;else result = result * (outputMax - outputMin) + outputMin;\n return result;\n}\n\nfunction findRange(input, inputRange) {\n for (var i = 1; i < inputRange.length - 1; ++i) if (inputRange[i] >= input) break;\n\n return i - 1;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nconst $get = Symbol.for('FluidValue.get');\nconst $observers = Symbol.for('FluidValue.observers');\n\nconst hasFluidValue = arg => Boolean(arg && arg[$get]);\n\nconst getFluidValue = arg => arg && arg[$get] ? arg[$get]() : arg;\n\nconst getFluidObservers = target => target[$observers] || null;\n\nfunction callFluidObserver(observer, event) {\n if (observer.eventObserved) {\n observer.eventObserved(event);\n } else {\n observer(event);\n }\n}\n\nfunction callFluidObservers(target, event) {\n let observers = target[$observers];\n\n if (observers) {\n observers.forEach(observer => {\n callFluidObserver(observer, event);\n });\n }\n}\n\nclass FluidValue {\n constructor(get) {\n this[$get] = void 0;\n this[$observers] = void 0;\n\n if (!get && !(get = this.get)) {\n throw Error('Unknown getter');\n }\n\n setFluidGetter(this, get);\n }\n\n}\n\nconst setFluidGetter = (target, get) => setHidden(target, $get, get);\n\nfunction addFluidObserver(target, observer) {\n if (target[$get]) {\n let observers = target[$observers];\n\n if (!observers) {\n setHidden(target, $observers, observers = new Set());\n }\n\n if (!observers.has(observer)) {\n observers.add(observer);\n\n if (target.observerAdded) {\n target.observerAdded(observers.size, observer);\n }\n }\n }\n\n return observer;\n}\n\nfunction removeFluidObserver(target, observer) {\n let observers = target[$observers];\n\n if (observers && observers.has(observer)) {\n const count = observers.size - 1;\n\n if (count) {\n observers.delete(observer);\n } else {\n target[$observers] = null;\n }\n\n if (target.observerRemoved) {\n target.observerRemoved(count, observer);\n }\n }\n}\n\nconst setHidden = (target, key, value) => Object.defineProperty(target, key, {\n value,\n writable: true,\n configurable: true\n});\n\nconst numberRegex = /[+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nconst colorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?\\d+%?[,\\s]+){2,3}\\s*[\\d\\.]+%?\\))/gi;\nconst unitRegex = new RegExp(`(${numberRegex.source})(%|[a-z]+)`, 'i');\nconst rgbaRegex = /rgba\\(([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+)\\)/gi;\nconst cssVariableRegex = /var\\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\\)/;\n\nconst variableToRgba = input => {\n const [token, fallback] = parseCSSVariable(input);\n\n if (!token || isSSR()) {\n return input;\n }\n\n const value = window.getComputedStyle(document.documentElement).getPropertyValue(token);\n\n if (value) {\n return value.trim();\n } else if (fallback && fallback.startsWith('--')) {\n const _value = window.getComputedStyle(document.documentElement).getPropertyValue(fallback);\n\n if (_value) {\n return _value;\n } else {\n return input;\n }\n } else if (fallback && cssVariableRegex.test(fallback)) {\n return variableToRgba(fallback);\n } else if (fallback) {\n return fallback;\n }\n\n return input;\n};\n\nconst parseCSSVariable = current => {\n const match = cssVariableRegex.exec(current);\n if (!match) return [,];\n const [, token, fallback] = match;\n return [token, fallback];\n};\n\nlet namedColorRegex;\n\nconst rgbaRound = (_, p1, p2, p3, p4) => `rgba(${Math.round(p1)}, ${Math.round(p2)}, ${Math.round(p3)}, ${p4})`;\n\nconst createStringInterpolator = config => {\n if (!namedColorRegex) namedColorRegex = colors$1 ? new RegExp(`(${Object.keys(colors$1).join('|')})(?!\\\\w)`, 'g') : /^\\b$/;\n const output = config.output.map(value => {\n return getFluidValue(value).replace(cssVariableRegex, variableToRgba).replace(colorRegex, colorToRgba).replace(namedColorRegex, colorToRgba);\n });\n const keyframes = output.map(value => value.match(numberRegex).map(Number));\n const outputRanges = keyframes[0].map((_, i) => keyframes.map(values => {\n if (!(i in values)) {\n throw Error('The arity of each \"output\" value must be equal');\n }\n\n return values[i];\n }));\n const interpolators = outputRanges.map(output => createInterpolator(_extends({}, config, {\n output\n })));\n return input => {\n var _output$find;\n\n const missingUnit = !unitRegex.test(output[0]) && ((_output$find = output.find(value => unitRegex.test(value))) == null ? void 0 : _output$find.replace(numberRegex, ''));\n let i = 0;\n return output[0].replace(numberRegex, () => `${interpolators[i++](input)}${missingUnit || ''}`).replace(rgbaRegex, rgbaRound);\n };\n};\n\nconst prefix = 'react-spring: ';\n\nconst once = fn => {\n const func = fn;\n let called = false;\n\n if (typeof func != 'function') {\n throw new TypeError(`${prefix}once requires a function parameter`);\n }\n\n return (...args) => {\n if (!called) {\n func(...args);\n called = true;\n }\n };\n};\n\nconst warnInterpolate = once(console.warn);\nfunction deprecateInterpolate() {\n warnInterpolate(`${prefix}The \"interpolate\" function is deprecated in v9 (use \"to\" instead)`);\n}\nconst warnDirectCall = once(console.warn);\nfunction deprecateDirectCall() {\n warnDirectCall(`${prefix}Directly calling start instead of using the api object is deprecated in v9 (use \".start\" instead), this will be removed in later 0.X.0 versions`);\n}\n\nfunction isAnimatedString(value) {\n return is.str(value) && (value[0] == '#' || /\\d/.test(value) || !isSSR() && cssVariableRegex.test(value) || value in (colors$1 || {}));\n}\n\nconst useLayoutEffect = typeof window !== 'undefined' && window.document && window.document.createElement ? external_React_.useLayoutEffect : external_React_.useEffect;\n\nconst useIsMounted = () => {\n const isMounted = (0,external_React_.useRef)(false);\n useLayoutEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return isMounted;\n};\n\nfunction useForceUpdate() {\n const update = (0,external_React_.useState)()[1];\n const isMounted = useIsMounted();\n return () => {\n if (isMounted.current) {\n update(Math.random());\n }\n };\n}\n\nfunction useMemoOne(getResult, inputs) {\n const [initial] = (0,external_React_.useState)(() => ({\n inputs,\n result: getResult()\n }));\n const committed = (0,external_React_.useRef)();\n const prevCache = committed.current;\n let cache = prevCache;\n\n if (cache) {\n const useCache = Boolean(inputs && cache.inputs && areInputsEqual(inputs, cache.inputs));\n\n if (!useCache) {\n cache = {\n inputs,\n result: getResult()\n };\n }\n } else {\n cache = initial;\n }\n\n (0,external_React_.useEffect)(() => {\n committed.current = cache;\n\n if (prevCache == initial) {\n initial.inputs = initial.result = undefined;\n }\n }, [cache]);\n return cache.result;\n}\n\nfunction areInputsEqual(next, prev) {\n if (next.length !== prev.length) {\n return false;\n }\n\n for (let i = 0; i < next.length; i++) {\n if (next[i] !== prev[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nconst useOnce = effect => (0,external_React_.useEffect)(effect, emptyDeps);\nconst emptyDeps = [];\n\nfunction usePrev(value) {\n const prevRef = (0,external_React_.useRef)();\n (0,external_React_.useEffect)(() => {\n prevRef.current = value;\n });\n return prevRef.current;\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgxMy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3hOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQHJlYWN0LXNwcmluZy9yYWZ6L2Rpc3QvcmVhY3Qtc3ByaW5nLXJhZnouZXNtLmpzP2ZmNTIiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQHJlYWN0LXNwcmluZy9zaGFyZWQvZGlzdC9yZWFjdC1zcHJpbmctc2hhcmVkLmVzbS5qcz85YzQ1Il0sInNvdXJjZXNDb250ZW50IjpbImxldCB1cGRhdGVRdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuY29uc3QgcmFmID0gZm4gPT4gc2NoZWR1bGUoZm4sIHVwZGF0ZVF1ZXVlKTtcbmxldCB3cml0ZVF1ZXVlID0gbWFrZVF1ZXVlKCk7XG5cbnJhZi53cml0ZSA9IGZuID0+IHNjaGVkdWxlKGZuLCB3cml0ZVF1ZXVlKTtcblxubGV0IG9uU3RhcnRRdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuXG5yYWYub25TdGFydCA9IGZuID0+IHNjaGVkdWxlKGZuLCBvblN0YXJ0UXVldWUpO1xuXG5sZXQgb25GcmFtZVF1ZXVlID0gbWFrZVF1ZXVlKCk7XG5cbnJhZi5vbkZyYW1lID0gZm4gPT4gc2NoZWR1bGUoZm4sIG9uRnJhbWVRdWV1ZSk7XG5cbmxldCBvbkZpbmlzaFF1ZXVlID0gbWFrZVF1ZXVlKCk7XG5cbnJhZi5vbkZpbmlzaCA9IGZuID0+IHNjaGVkdWxlKGZuLCBvbkZpbmlzaFF1ZXVlKTtcblxubGV0IHRpbWVvdXRzID0gW107XG5cbnJhZi5zZXRUaW1lb3V0ID0gKGhhbmRsZXIsIG1zKSA9PiB7XG4gIGxldCB0aW1lID0gcmFmLm5vdygpICsgbXM7XG5cbiAgbGV0IGNhbmNlbCA9ICgpID0+IHtcbiAgICBsZXQgaSA9IHRpbWVvdXRzLmZpbmRJbmRleCh0ID0+IHQuY2FuY2VsID09IGNhbmNlbCk7XG4gICAgaWYgKH5pKSB0aW1lb3V0cy5zcGxpY2UoaSwgMSk7XG4gICAgcGVuZGluZ0NvdW50IC09IH5pID8gMSA6IDA7XG4gIH07XG5cbiAgbGV0IHRpbWVvdXQgPSB7XG4gICAgdGltZSxcbiAgICBoYW5kbGVyLFxuICAgIGNhbmNlbFxuICB9O1xuICB0aW1lb3V0cy5zcGxpY2UoZmluZFRpbWVvdXQodGltZSksIDAsIHRpbWVvdXQpO1xuICBwZW5kaW5nQ291bnQgKz0gMTtcbiAgc3RhcnQoKTtcbiAgcmV0dXJuIHRpbWVvdXQ7XG59O1xuXG5sZXQgZmluZFRpbWVvdXQgPSB0aW1lID0+IH4ofnRpbWVvdXRzLmZpbmRJbmRleCh0ID0+IHQudGltZSA+IHRpbWUpIHx8IH50aW1lb3V0cy5sZW5ndGgpO1xuXG5yYWYuY2FuY2VsID0gZm4gPT4ge1xuICBvblN0YXJ0UXVldWUuZGVsZXRlKGZuKTtcbiAgb25GcmFtZVF1ZXVlLmRlbGV0ZShmbik7XG4gIHVwZGF0ZVF1ZXVlLmRlbGV0ZShmbik7XG4gIHdyaXRlUXVldWUuZGVsZXRlKGZuKTtcbiAgb25GaW5pc2hRdWV1ZS5kZWxldGUoZm4pO1xufTtcblxucmFmLnN5bmMgPSBmbiA9PiB7XG4gIHN5bmMgPSB0cnVlO1xuICByYWYuYmF0Y2hlZFVwZGF0ZXMoZm4pO1xuICBzeW5jID0gZmFsc2U7XG59O1xuXG5yYWYudGhyb3R0bGUgPSBmbiA9PiB7XG4gIGxldCBsYXN0QXJncztcblxuICBmdW5jdGlvbiBxdWV1ZWRGbigpIHtcbiAgICB0cnkge1xuICAgICAgZm4oLi4ubGFzdEFyZ3MpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGhyb3R0bGVkKC4uLmFyZ3MpIHtcbiAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgcmFmLm9uU3RhcnQocXVldWVkRm4pO1xuICB9XG5cbiAgdGhyb3R0bGVkLmhhbmRsZXIgPSBmbjtcblxuICB0aHJvdHRsZWQuY2FuY2VsID0gKCkgPT4ge1xuICAgIG9uU3RhcnRRdWV1ZS5kZWxldGUocXVldWVkRm4pO1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgfTtcblxuICByZXR1cm4gdGhyb3R0bGVkO1xufTtcblxubGV0IG5hdGl2ZVJhZiA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogKCkgPT4ge307XG5cbnJhZi51c2UgPSBpbXBsID0+IG5hdGl2ZVJhZiA9IGltcGw7XG5cbnJhZi5ub3cgPSB0eXBlb2YgcGVyZm9ybWFuY2UgIT0gJ3VuZGVmaW5lZCcgPyAoKSA9PiBwZXJmb3JtYW5jZS5ub3coKSA6IERhdGUubm93O1xuXG5yYWYuYmF0Y2hlZFVwZGF0ZXMgPSBmbiA9PiBmbigpO1xuXG5yYWYuY2F0Y2ggPSBjb25zb2xlLmVycm9yO1xucmFmLmZyYW1lTG9vcCA9ICdhbHdheXMnO1xuXG5yYWYuYWR2YW5jZSA9ICgpID0+IHtcbiAgaWYgKHJhZi5mcmFtZUxvb3AgIT09ICdkZW1hbmQnKSB7XG4gICAgY29uc29sZS53YXJuKCdDYW5ub3QgY2FsbCB0aGUgbWFudWFsIGFkdmFuY2VtZW50IG9mIHJhZnogd2hpbHN0IGZyYW1lTG9vcCBpcyBub3Qgc2V0IGFzIGRlbWFuZCcpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZSgpO1xuICB9XG59O1xuXG5sZXQgdHMgPSAtMTtcbmxldCBwZW5kaW5nQ291bnQgPSAwO1xubGV0IHN5bmMgPSBmYWxzZTtcblxuZnVuY3Rpb24gc2NoZWR1bGUoZm4sIHF1ZXVlKSB7XG4gIGlmIChzeW5jKSB7XG4gICAgcXVldWUuZGVsZXRlKGZuKTtcbiAgICBmbigwKTtcbiAgfSBlbHNlIHtcbiAgICBxdWV1ZS5hZGQoZm4pO1xuICAgIHN0YXJ0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnQoKSB7XG4gIGlmICh0cyA8IDApIHtcbiAgICB0cyA9IDA7XG5cbiAgICBpZiAocmFmLmZyYW1lTG9vcCAhPT0gJ2RlbWFuZCcpIHtcbiAgICAgIG5hdGl2ZVJhZihsb29wKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcCgpIHtcbiAgdHMgPSAtMTtcbn1cblxuZnVuY3Rpb24gbG9vcCgpIHtcbiAgaWYgKH50cykge1xuICAgIG5hdGl2ZVJhZihsb29wKTtcbiAgICByYWYuYmF0Y2hlZFVwZGF0ZXModXBkYXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGUoKSB7XG4gIGxldCBwcmV2VHMgPSB0cztcbiAgdHMgPSByYWYubm93KCk7XG4gIGxldCBjb3VudCA9IGZpbmRUaW1lb3V0KHRzKTtcblxuICBpZiAoY291bnQpIHtcbiAgICBlYWNoU2FmZWx5KHRpbWVvdXRzLnNwbGljZSgwLCBjb3VudCksIHQgPT4gdC5oYW5kbGVyKCkpO1xuICAgIHBlbmRpbmdDb3VudCAtPSBjb3VudDtcbiAgfVxuXG4gIG9uU3RhcnRRdWV1ZS5mbHVzaCgpO1xuICB1cGRhdGVRdWV1ZS5mbHVzaChwcmV2VHMgPyBNYXRoLm1pbig2NCwgdHMgLSBwcmV2VHMpIDogMTYuNjY3KTtcbiAgb25GcmFtZVF1ZXVlLmZsdXNoKCk7XG4gIHdyaXRlUXVldWUuZmx1c2goKTtcbiAgb25GaW5pc2hRdWV1ZS5mbHVzaCgpO1xuXG4gIGlmICghcGVuZGluZ0NvdW50KSB7XG4gICAgc3RvcCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VRdWV1ZSgpIHtcbiAgbGV0IG5leHQgPSBuZXcgU2V0KCk7XG4gIGxldCBjdXJyZW50ID0gbmV4dDtcbiAgcmV0dXJuIHtcbiAgICBhZGQoZm4pIHtcbiAgICAgIHBlbmRpbmdDb3VudCArPSBjdXJyZW50ID09IG5leHQgJiYgIW5leHQuaGFzKGZuKSA/IDEgOiAwO1xuICAgICAgbmV4dC5hZGQoZm4pO1xuICAgIH0sXG5cbiAgICBkZWxldGUoZm4pIHtcbiAgICAgIHBlbmRpbmdDb3VudCAtPSBjdXJyZW50ID09IG5leHQgJiYgbmV4dC5oYXMoZm4pID8gMSA6IDA7XG4gICAgICByZXR1cm4gbmV4dC5kZWxldGUoZm4pO1xuICAgIH0sXG5cbiAgICBmbHVzaChhcmcpIHtcbiAgICAgIGlmIChjdXJyZW50LnNpemUpIHtcbiAgICAgICAgbmV4dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgcGVuZGluZ0NvdW50IC09IGN1cnJlbnQuc2l6ZTtcbiAgICAgICAgZWFjaFNhZmVseShjdXJyZW50LCBmbiA9PiBmbihhcmcpICYmIG5leHQuYWRkKGZuKSk7XG4gICAgICAgIHBlbmRpbmdDb3VudCArPSBuZXh0LnNpemU7XG4gICAgICAgIGN1cnJlbnQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICB9O1xufVxuXG5mdW5jdGlvbiBlYWNoU2FmZWx5KHZhbHVlcywgZWFjaCkge1xuICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGVhY2godmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJhZi5jYXRjaChlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBfX3JhZiA9IHtcbiAgY291bnQoKSB7XG4gICAgcmV0dXJuIHBlbmRpbmdDb3VudDtcbiAgfSxcblxuICBpc1J1bm5pbmcoKSB7XG4gICAgcmV0dXJuIHRzID49IDA7XG4gIH0sXG5cbiAgY2xlYXIoKSB7XG4gICAgdHMgPSAtMTtcbiAgICB0aW1lb3V0cyA9IFtdO1xuICAgIG9uU3RhcnRRdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuICAgIHVwZGF0ZVF1ZXVlID0gbWFrZVF1ZXVlKCk7XG4gICAgb25GcmFtZVF1ZXVlID0gbWFrZVF1ZXVlKCk7XG4gICAgd3JpdGVRdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuICAgIG9uRmluaXNoUXVldWUgPSBtYWtlUXVldWUoKTtcbiAgICBwZW5kaW5nQ291bnQgPSAwO1xuICB9XG5cbn07XG5cbmV4cG9ydCB7IF9fcmFmLCByYWYgfTtcbiIsImltcG9ydCB7IHJhZiB9IGZyb20gJ0ByZWFjdC1zcHJpbmcvcmFmeic7XG5leHBvcnQgeyByYWYgfSBmcm9tICdAcmVhY3Qtc3ByaW5nL3JhZnonO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiBub29wKCkge31cbmNvbnN0IGRlZmluZUhpZGRlbiA9IChvYmosIGtleSwgdmFsdWUpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICB2YWx1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5jb25zdCBpcyA9IHtcbiAgYXJyOiBBcnJheS5pc0FycmF5LFxuICBvYmo6IGEgPT4gISFhICYmIGEuY29uc3RydWN0b3IubmFtZSA9PT0gJ09iamVjdCcsXG4gIGZ1bjogYSA9PiB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyxcbiAgc3RyOiBhID0+IHR5cGVvZiBhID09PSAnc3RyaW5nJyxcbiAgbnVtOiBhID0+IHR5cGVvZiBhID09PSAnbnVtYmVyJyxcbiAgdW5kOiBhID0+IGEgPT09IHVuZGVmaW5lZFxufTtcbmZ1bmN0aW9uIGlzRXF1YWwoYSwgYikge1xuICBpZiAoaXMuYXJyKGEpKSB7XG4gICAgaWYgKCFpcy5hcnIoYikgfHwgYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gYSA9PT0gYjtcbn1cbmNvbnN0IGVhY2ggPSAob2JqLCBmbikgPT4gb2JqLmZvckVhY2goZm4pO1xuZnVuY3Rpb24gZWFjaFByb3Aob2JqLCBmbiwgY3R4KSB7XG4gIGlmIChpcy5hcnIob2JqKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKGN0eCwgb2JqW2ldLCBgJHtpfWApO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgZm4uY2FsbChjdHgsIG9ialtrZXldLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuY29uc3QgdG9BcnJheSA9IGEgPT4gaXMudW5kKGEpID8gW10gOiBpcy5hcnIoYSkgPyBhIDogW2FdO1xuZnVuY3Rpb24gZmx1c2gocXVldWUsIGl0ZXJhdG9yKSB7XG4gIGlmIChxdWV1ZS5zaXplKSB7XG4gICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKHF1ZXVlKTtcbiAgICBxdWV1ZS5jbGVhcigpO1xuICAgIGVhY2goaXRlbXMsIGl0ZXJhdG9yKTtcbiAgfVxufVxuY29uc3QgZmx1c2hDYWxscyA9IChxdWV1ZSwgLi4uYXJncykgPT4gZmx1c2gocXVldWUsIGZuID0+IGZuKC4uLmFyZ3MpKTtcbmNvbnN0IGlzU1NSID0gKCkgPT4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5uYXZpZ2F0b3IgfHwgL1NlcnZlclNpZGVSZW5kZXJpbmd8XkRlbm9cXC8vLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG5sZXQgY3JlYXRlU3RyaW5nSW50ZXJwb2xhdG9yJDE7XG5sZXQgdG87XG5sZXQgY29sb3JzJDEgPSBudWxsO1xubGV0IHNraXBBbmltYXRpb24gPSBmYWxzZTtcbmxldCB3aWxsQWR2YW5jZSA9IG5vb3A7XG5jb25zdCBhc3NpZ24gPSBnbG9iYWxzID0+IHtcbiAgaWYgKGdsb2JhbHMudG8pIHRvID0gZ2xvYmFscy50bztcbiAgaWYgKGdsb2JhbHMubm93KSByYWYubm93ID0gZ2xvYmFscy5ub3c7XG4gIGlmIChnbG9iYWxzLmNvbG9ycyAhPT0gdW5kZWZpbmVkKSBjb2xvcnMkMSA9IGdsb2JhbHMuY29sb3JzO1xuICBpZiAoZ2xvYmFscy5za2lwQW5pbWF0aW9uICE9IG51bGwpIHNraXBBbmltYXRpb24gPSBnbG9iYWxzLnNraXBBbmltYXRpb247XG4gIGlmIChnbG9iYWxzLmNyZWF0ZVN0cmluZ0ludGVycG9sYXRvcikgY3JlYXRlU3RyaW5nSW50ZXJwb2xhdG9yJDEgPSBnbG9iYWxzLmNyZWF0ZVN0cmluZ0ludGVycG9sYXRvcjtcbiAgaWYgKGdsb2JhbHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSByYWYudXNlKGdsb2JhbHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKTtcbiAgaWYgKGdsb2JhbHMuYmF0Y2hlZFVwZGF0ZXMpIHJhZi5iYXRjaGVkVXBkYXRlcyA9IGdsb2JhbHMuYmF0Y2hlZFVwZGF0ZXM7XG4gIGlmIChnbG9iYWxzLndpbGxBZHZhbmNlKSB3aWxsQWR2YW5jZSA9IGdsb2JhbHMud2lsbEFkdmFuY2U7XG4gIGlmIChnbG9iYWxzLmZyYW1lTG9vcCkgcmFmLmZyYW1lTG9vcCA9IGdsb2JhbHMuZnJhbWVMb29wO1xufTtcblxudmFyIGdsb2JhbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZ2V0IGNyZWF0ZVN0cmluZ0ludGVycG9sYXRvciAoKSB7IHJldHVybiBjcmVhdGVTdHJpbmdJbnRlcnBvbGF0b3IkMTsgfSxcbiAgZ2V0IHRvICgpIHsgcmV0dXJuIHRvOyB9LFxuICBnZXQgY29sb3JzICgpIHsgcmV0dXJuIGNvbG9ycyQxOyB9LFxuICBnZXQgc2tpcEFuaW1hdGlvbiAoKSB7IHJldHVybiBza2lwQW5pbWF0aW9uOyB9LFxuICBnZXQgd2lsbEFkdmFuY2UgKCkgeyByZXR1cm4gd2lsbEFkdmFuY2U7IH0sXG4gIGFzc2lnbjogYXNzaWduXG59KTtcblxuY29uc3Qgc3RhcnRRdWV1ZSA9IG5ldyBTZXQoKTtcbmxldCBjdXJyZW50RnJhbWUgPSBbXTtcbmxldCBwcmV2RnJhbWUgPSBbXTtcbmxldCBwcmlvcml0eSA9IDA7XG5jb25zdCBmcmFtZUxvb3AgPSB7XG4gIGdldCBpZGxlKCkge1xuICAgIHJldHVybiAhc3RhcnRRdWV1ZS5zaXplICYmICFjdXJyZW50RnJhbWUubGVuZ3RoO1xuICB9LFxuXG4gIHN0YXJ0KGFuaW1hdGlvbikge1xuICAgIGlmIChwcmlvcml0eSA+IGFuaW1hdGlvbi5wcmlvcml0eSkge1xuICAgICAgc3RhcnRRdWV1ZS5hZGQoYW5pbWF0aW9uKTtcbiAgICAgIHJhZi5vblN0YXJ0KGZsdXNoU3RhcnRRdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0U2FmZWx5KGFuaW1hdGlvbik7XG4gICAgICByYWYoYWR2YW5jZSk7XG4gICAgfVxuICB9LFxuXG4gIGFkdmFuY2UsXG5cbiAgc29ydChhbmltYXRpb24pIHtcbiAgICBpZiAocHJpb3JpdHkpIHtcbiAgICAgIHJhZi5vbkZyYW1lKCgpID0+IGZyYW1lTG9vcC5zb3J0KGFuaW1hdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50RnJhbWUuaW5kZXhPZihhbmltYXRpb24pO1xuXG4gICAgICBpZiAofnByZXZJbmRleCkge1xuICAgICAgICBjdXJyZW50RnJhbWUuc3BsaWNlKHByZXZJbmRleCwgMSk7XG4gICAgICAgIHN0YXJ0VW5zYWZlbHkoYW5pbWF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY2xlYXIoKSB7XG4gICAgY3VycmVudEZyYW1lID0gW107XG4gICAgc3RhcnRRdWV1ZS5jbGVhcigpO1xuICB9XG5cbn07XG5cbmZ1bmN0aW9uIGZsdXNoU3RhcnRRdWV1ZSgpIHtcbiAgc3RhcnRRdWV1ZS5mb3JFYWNoKHN0YXJ0U2FmZWx5KTtcbiAgc3RhcnRRdWV1ZS5jbGVhcigpO1xuICByYWYoYWR2YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0U2FmZWx5KGFuaW1hdGlvbikge1xuICBpZiAoIWN1cnJlbnRGcmFtZS5pbmNsdWRlcyhhbmltYXRpb24pKSBzdGFydFVuc2FmZWx5KGFuaW1hdGlvbik7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VW5zYWZlbHkoYW5pbWF0aW9uKSB7XG4gIGN1cnJlbnRGcmFtZS5zcGxpY2UoZmluZEluZGV4KGN1cnJlbnRGcmFtZSwgb3RoZXIgPT4gb3RoZXIucHJpb3JpdHkgPiBhbmltYXRpb24ucHJpb3JpdHkpLCAwLCBhbmltYXRpb24pO1xufVxuXG5mdW5jdGlvbiBhZHZhbmNlKGR0KSB7XG4gIGNvbnN0IG5leHRGcmFtZSA9IHByZXZGcmFtZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnRGcmFtZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFuaW1hdGlvbiA9IGN1cnJlbnRGcmFtZVtpXTtcbiAgICBwcmlvcml0eSA9IGFuaW1hdGlvbi5wcmlvcml0eTtcblxuICAgIGlmICghYW5pbWF0aW9uLmlkbGUpIHtcbiAgICAgIHdpbGxBZHZhbmNlKGFuaW1hdGlvbik7XG4gICAgICBhbmltYXRpb24uYWR2YW5jZShkdCk7XG5cbiAgICAgIGlmICghYW5pbWF0aW9uLmlkbGUpIHtcbiAgICAgICAgbmV4dEZyYW1lLnB1c2goYW5pbWF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmlvcml0eSA9IDA7XG4gIHByZXZGcmFtZSA9IGN1cnJlbnRGcmFtZTtcbiAgcHJldkZyYW1lLmxlbmd0aCA9IDA7XG4gIGN1cnJlbnRGcmFtZSA9IG5leHRGcmFtZTtcbiAgcmV0dXJuIGN1cnJlbnRGcmFtZS5sZW5ndGggPiAwO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyLCB0ZXN0KSB7XG4gIGNvbnN0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh0ZXN0KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IGFyci5sZW5ndGggOiBpbmRleDtcbn1cblxuY29uc3QgY29sb3JzID0ge1xuICB0cmFuc3BhcmVudDogMHgwMDAwMDAwMCxcbiAgYWxpY2VibHVlOiAweGYwZjhmZmZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3ZmYsXG4gIGFxdWE6IDB4MDBmZmZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0ZmYsXG4gIGF6dXJlOiAweGYwZmZmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGNmZixcbiAgYmlzcXVlOiAweGZmZTRjNGZmLFxuICBibGFjazogMHgwMDAwMDBmZixcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkZmYsXG4gIGJsdWU6IDB4MDAwMGZmZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyZmYsXG4gIGJyb3duOiAweGE1MmEyYWZmLFxuICBidXJseXdvb2Q6IDB4ZGViODg3ZmYsXG4gIGJ1cm50c2llbm5hOiAweGVhN2U1ZGZmLFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwZmYsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwZmYsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWVmZixcbiAgY29yYWw6IDB4ZmY3ZjUwZmYsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZGZmLFxuICBjb3Juc2lsazogMHhmZmY4ZGNmZixcbiAgY3JpbXNvbjogMHhkYzE0M2NmZixcbiAgY3lhbjogMHgwMGZmZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiZmYsXG4gIGRhcmtjeWFuOiAweDAwOGI4YmZmLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYmZmLFxuICBkYXJrZ3JheTogMHhhOWE5YTlmZixcbiAgZGFya2dyZWVuOiAweDAwNjQwMGZmLFxuICBkYXJrZ3JleTogMHhhOWE5YTlmZixcbiAgZGFya2toYWtpOiAweGJkYjc2YmZmLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGJmZixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmZmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwZmYsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjZmYsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwZmYsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhZmYsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGZmZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGJmZixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGZmZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGZmZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDFmZixcbiAgZGFya3Zpb2xldDogMHg5NDAwZDNmZixcbiAgZGVlcHBpbms6IDB4ZmYxNDkzZmYsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OWZmLFxuICBkaW1ncmV5OiAweDY5Njk2OWZmLFxuICBkb2RnZXJibHVlOiAweDFlOTBmZmZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyZmYsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMGZmLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjJmZixcbiAgZnVjaHNpYTogMHhmZjAwZmZmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkY2ZmLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZmZmLFxuICBnb2xkOiAweGZmZDcwMGZmLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwZmYsXG4gIGdyYXk6IDB4ODA4MDgwZmYsXG4gIGdyZWVuOiAweDAwODAwMGZmLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmZmZixcbiAgZ3JleTogMHg4MDgwODBmZixcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwZmYsXG4gIGhvdHBpbms6IDB4ZmY2OWI0ZmYsXG4gIGluZGlhbnJlZDogMHhjZDVjNWNmZixcbiAgaW5kaWdvOiAweDRiMDA4MmZmLFxuICBpdm9yeTogMHhmZmZmZjBmZixcbiAga2hha2k6IDB4ZjBlNjhjZmYsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYWZmLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNWZmLFxuICBsYXduZ3JlZW46IDB4N2NmYzAwZmYsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2RmZixcbiAgbGlnaHRibHVlOiAweGFkZDhlNmZmLFxuICBsaWdodGNvcmFsOiAweGYwODA4MGZmLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMmZmLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzZmYsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwZmYsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDNmZixcbiAgbGlnaHRwaW5rOiAweGZmYjZjMWZmLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2FmZixcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWFmZixcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYWZmLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTlmZixcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5ZmYsXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZWZmLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTBmZixcbiAgbGltZTogMHgwMGZmMDBmZixcbiAgbGltZWdyZWVuOiAweDMyY2QzMmZmLFxuICBsaW5lbjogMHhmYWYwZTZmZixcbiAgbWFnZW50YTogMHhmZjAwZmZmZixcbiAgbWFyb29uOiAweDgwMDAwMGZmLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYWZmLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZGZmLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzZmYsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGJmZixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxZmYsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWVmZixcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhZmYsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2NmZixcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NWZmLFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwZmYsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmFmZixcbiAgbWlzdHlyb3NlOiAweGZmZTRlMWZmLFxuICBtb2NjYXNpbjogMHhmZmU0YjVmZixcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkZmYsXG4gIG5hdnk6IDB4MDAwMDgwZmYsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2ZmYsXG4gIG9saXZlOiAweDgwODAwMGZmLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzZmYsXG4gIG9yYW5nZTogMHhmZmE1MDBmZixcbiAgb3JhbmdlcmVkOiAweGZmNDUwMGZmLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2ZmYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhZmYsXG4gIHBhbGVncmVlbjogMHg5OGZiOThmZixcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWVmZixcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTNmZixcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDVmZixcbiAgcGVhY2hwdWZmOiAweGZmZGFiOWZmLFxuICBwZXJ1OiAweGNkODUzZmZmLFxuICBwaW5rOiAweGZmYzBjYmZmLFxuICBwbHVtOiAweGRkYTBkZGZmLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNmZmLFxuICBwdXJwbGU6IDB4ODAwMDgwZmYsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5ZmYsXG4gIHJlZDogMHhmZjAwMDBmZixcbiAgcm9zeWJyb3duOiAweGJjOGY4ZmZmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxZmYsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxM2ZmLFxuICBzYWxtb246IDB4ZmE4MDcyZmYsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwZmYsXG4gIHNlYWdyZWVuOiAweDJlOGI1N2ZmLFxuICBzZWFzaGVsbDogMHhmZmY1ZWVmZixcbiAgc2llbm5hOiAweGEwNTIyZGZmLFxuICBzaWx2ZXI6IDB4YzBjMGMwZmYsXG4gIHNreWJsdWU6IDB4ODdjZWViZmYsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2RmZixcbiAgc2xhdGVncmF5OiAweDcwODA5MGZmLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwZmYsXG4gIHNub3c6IDB4ZmZmYWZhZmYsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZmZmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0ZmYsXG4gIHRhbjogMHhkMmI0OGNmZixcbiAgdGVhbDogMHgwMDgwODBmZixcbiAgdGhpc3RsZTogMHhkOGJmZDhmZixcbiAgdG9tYXRvOiAweGZmNjM0N2ZmLFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwZmYsXG4gIHZpb2xldDogMHhlZTgyZWVmZixcbiAgd2hlYXQ6IDB4ZjVkZWIzZmYsXG4gIHdoaXRlOiAweGZmZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNWZmLFxuICB5ZWxsb3c6IDB4ZmZmZjAwZmYsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMmZmXG59O1xuXG5jb25zdCBOVU1CRVIgPSAnWy0rXT9cXFxcZCpcXFxcLj9cXFxcZCsnO1xuY29uc3QgUEVSQ0VOVEFHRSA9IE5VTUJFUiArICclJztcblxuZnVuY3Rpb24gY2FsbCguLi5wYXJ0cykge1xuICByZXR1cm4gJ1xcXFwoXFxcXHMqKCcgKyBwYXJ0cy5qb2luKCcpXFxcXHMqLFxcXFxzKignKSArICcpXFxcXHMqXFxcXCknO1xufVxuXG5jb25zdCByZ2IgPSBuZXcgUmVnRXhwKCdyZ2InICsgY2FsbChOVU1CRVIsIE5VTUJFUiwgTlVNQkVSKSk7XG5jb25zdCByZ2JhID0gbmV3IFJlZ0V4cCgncmdiYScgKyBjYWxsKE5VTUJFUiwgTlVNQkVSLCBOVU1CRVIsIE5VTUJFUikpO1xuY29uc3QgaHNsID0gbmV3IFJlZ0V4cCgnaHNsJyArIGNhbGwoTlVNQkVSLCBQRVJDRU5UQUdFLCBQRVJDRU5UQUdFKSk7XG5jb25zdCBoc2xhID0gbmV3IFJlZ0V4cCgnaHNsYScgKyBjYWxsKE5VTUJFUiwgUEVSQ0VOVEFHRSwgUEVSQ0VOVEFHRSwgTlVNQkVSKSk7XG5jb25zdCBoZXgzID0gL14jKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC87XG5jb25zdCBoZXg0ID0gL14jKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KSQvO1xuY29uc3QgaGV4NiA9IC9eIyhbMC05YS1mQS1GXXs2fSkkLztcbmNvbnN0IGhleDggPSAvXiMoWzAtOWEtZkEtRl17OH0pJC87XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbG9yKGNvbG9yKSB7XG4gIGxldCBtYXRjaDtcblxuICBpZiAodHlwZW9mIGNvbG9yID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBjb2xvciA+Pj4gMCA9PT0gY29sb3IgJiYgY29sb3IgPj0gMCAmJiBjb2xvciA8PSAweGZmZmZmZmZmID8gY29sb3IgOiBudWxsO1xuICB9XG5cbiAgaWYgKG1hdGNoID0gaGV4Ni5leGVjKGNvbG9yKSkgcmV0dXJuIHBhcnNlSW50KG1hdGNoWzFdICsgJ2ZmJywgMTYpID4+PiAwO1xuXG4gIGlmIChjb2xvcnMkMSAmJiBjb2xvcnMkMVtjb2xvcl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2xvcnMkMVtjb2xvcl07XG4gIH1cblxuICBpZiAobWF0Y2ggPSByZ2IuZXhlYyhjb2xvcikpIHtcbiAgICByZXR1cm4gKHBhcnNlMjU1KG1hdGNoWzFdKSA8PCAyNCB8IHBhcnNlMjU1KG1hdGNoWzJdKSA8PCAxNiB8IHBhcnNlMjU1KG1hdGNoWzNdKSA8PCA4IHwgMHgwMDAwMDBmZikgPj4+IDA7XG4gIH1cblxuICBpZiAobWF0Y2ggPSByZ2JhLmV4ZWMoY29sb3IpKSB7XG4gICAgcmV0dXJuIChwYXJzZTI1NShtYXRjaFsxXSkgPDwgMjQgfCBwYXJzZTI1NShtYXRjaFsyXSkgPDwgMTYgfCBwYXJzZTI1NShtYXRjaFszXSkgPDwgOCB8IHBhcnNlMShtYXRjaFs0XSkpID4+PiAwO1xuICB9XG5cbiAgaWYgKG1hdGNoID0gaGV4My5leGVjKGNvbG9yKSkge1xuICAgIHJldHVybiBwYXJzZUludChtYXRjaFsxXSArIG1hdGNoWzFdICsgbWF0Y2hbMl0gKyBtYXRjaFsyXSArIG1hdGNoWzNdICsgbWF0Y2hbM10gKyAnZmYnLCAxNikgPj4+IDA7XG4gIH1cblxuICBpZiAobWF0Y2ggPSBoZXg4LmV4ZWMoY29sb3IpKSByZXR1cm4gcGFyc2VJbnQobWF0Y2hbMV0sIDE2KSA+Pj4gMDtcblxuICBpZiAobWF0Y2ggPSBoZXg0LmV4ZWMoY29sb3IpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoWzFdICsgbWF0Y2hbMV0gKyBtYXRjaFsyXSArIG1hdGNoWzJdICsgbWF0Y2hbM10gKyBtYXRjaFszXSArIG1hdGNoWzRdICsgbWF0Y2hbNF0sIDE2KSA+Pj4gMDtcbiAgfVxuXG4gIGlmIChtYXRjaCA9IGhzbC5leGVjKGNvbG9yKSkge1xuICAgIHJldHVybiAoaHNsVG9SZ2IocGFyc2UzNjAobWF0Y2hbMV0pLCBwYXJzZVBlcmNlbnRhZ2UobWF0Y2hbMl0pLCBwYXJzZVBlcmNlbnRhZ2UobWF0Y2hbM10pKSB8IDB4MDAwMDAwZmYpID4+PiAwO1xuICB9XG5cbiAgaWYgKG1hdGNoID0gaHNsYS5leGVjKGNvbG9yKSkge1xuICAgIHJldHVybiAoaHNsVG9SZ2IocGFyc2UzNjAobWF0Y2hbMV0pLCBwYXJzZVBlcmNlbnRhZ2UobWF0Y2hbMl0pLCBwYXJzZVBlcmNlbnRhZ2UobWF0Y2hbM10pKSB8IHBhcnNlMShtYXRjaFs0XSkpID4+PiAwO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGh1ZTJyZ2IocCwgcSwgdCkge1xuICBpZiAodCA8IDApIHQgKz0gMTtcbiAgaWYgKHQgPiAxKSB0IC09IDE7XG4gIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcbiAgaWYgKHQgPCAyIC8gMykgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xuICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gaHNsVG9SZ2IoaCwgcywgbCkge1xuICBjb25zdCBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcbiAgY29uc3QgcCA9IDIgKiBsIC0gcTtcbiAgY29uc3QgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKTtcbiAgY29uc3QgZyA9IGh1ZTJyZ2IocCwgcSwgaCk7XG4gIGNvbnN0IGIgPSBodWUycmdiKHAsIHEsIGggLSAxIC8gMyk7XG4gIHJldHVybiBNYXRoLnJvdW5kKHIgKiAyNTUpIDw8IDI0IHwgTWF0aC5yb3VuZChnICogMjU1KSA8PCAxNiB8IE1hdGgucm91bmQoYiAqIDI1NSkgPDwgODtcbn1cblxuZnVuY3Rpb24gcGFyc2UyNTUoc3RyKSB7XG4gIGNvbnN0IGludCA9IHBhcnNlSW50KHN0ciwgMTApO1xuICBpZiAoaW50IDwgMCkgcmV0dXJuIDA7XG4gIGlmIChpbnQgPiAyNTUpIHJldHVybiAyNTU7XG4gIHJldHVybiBpbnQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlMzYwKHN0cikge1xuICBjb25zdCBpbnQgPSBwYXJzZUZsb2F0KHN0cik7XG4gIHJldHVybiAoaW50ICUgMzYwICsgMzYwKSAlIDM2MCAvIDM2MDtcbn1cblxuZnVuY3Rpb24gcGFyc2UxKHN0cikge1xuICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHN0cik7XG4gIGlmIChudW0gPCAwKSByZXR1cm4gMDtcbiAgaWYgKG51bSA+IDEpIHJldHVybiAyNTU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG51bSAqIDI1NSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGVyY2VudGFnZShzdHIpIHtcbiAgY29uc3QgaW50ID0gcGFyc2VGbG9hdChzdHIpO1xuICBpZiAoaW50IDwgMCkgcmV0dXJuIDA7XG4gIGlmIChpbnQgPiAxMDApIHJldHVybiAxO1xuICByZXR1cm4gaW50IC8gMTAwO1xufVxuXG5mdW5jdGlvbiBjb2xvclRvUmdiYShpbnB1dCkge1xuICBsZXQgaW50MzJDb2xvciA9IG5vcm1hbGl6ZUNvbG9yKGlucHV0KTtcbiAgaWYgKGludDMyQ29sb3IgPT09IG51bGwpIHJldHVybiBpbnB1dDtcbiAgaW50MzJDb2xvciA9IGludDMyQ29sb3IgfHwgMDtcbiAgbGV0IHIgPSAoaW50MzJDb2xvciAmIDB4ZmYwMDAwMDApID4+PiAyNDtcbiAgbGV0IGcgPSAoaW50MzJDb2xvciAmIDB4MDBmZjAwMDApID4+PiAxNjtcbiAgbGV0IGIgPSAoaW50MzJDb2xvciAmIDB4MDAwMGZmMDApID4+PiA4O1xuICBsZXQgYSA9IChpbnQzMkNvbG9yICYgMHgwMDAwMDBmZikgLyAyNTU7XG4gIHJldHVybiBgcmdiYSgke3J9LCAke2d9LCAke2J9LCAke2F9KWA7XG59XG5cbmNvbnN0IGNyZWF0ZUludGVycG9sYXRvciA9IChyYW5nZSwgb3V0cHV0LCBleHRyYXBvbGF0ZSkgPT4ge1xuICBpZiAoaXMuZnVuKHJhbmdlKSkge1xuICAgIHJldHVybiByYW5nZTtcbiAgfVxuXG4gIGlmIChpcy5hcnIocmFuZ2UpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUludGVycG9sYXRvcih7XG4gICAgICByYW5nZSxcbiAgICAgIG91dHB1dDogb3V0cHV0LFxuICAgICAgZXh0cmFwb2xhdGVcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpcy5zdHIocmFuZ2Uub3V0cHV0WzBdKSkge1xuICAgIHJldHVybiBjcmVhdGVTdHJpbmdJbnRlcnBvbGF0b3IkMShyYW5nZSk7XG4gIH1cblxuICBjb25zdCBjb25maWcgPSByYW5nZTtcbiAgY29uc3Qgb3V0cHV0UmFuZ2UgPSBjb25maWcub3V0cHV0O1xuICBjb25zdCBpbnB1dFJhbmdlID0gY29uZmlnLnJhbmdlIHx8IFswLCAxXTtcbiAgY29uc3QgZXh0cmFwb2xhdGVMZWZ0ID0gY29uZmlnLmV4dHJhcG9sYXRlTGVmdCB8fCBjb25maWcuZXh0cmFwb2xhdGUgfHwgJ2V4dGVuZCc7XG4gIGNvbnN0IGV4dHJhcG9sYXRlUmlnaHQgPSBjb25maWcuZXh0cmFwb2xhdGVSaWdodCB8fCBjb25maWcuZXh0cmFwb2xhdGUgfHwgJ2V4dGVuZCc7XG5cbiAgY29uc3QgZWFzaW5nID0gY29uZmlnLmVhc2luZyB8fCAodCA9PiB0KTtcblxuICByZXR1cm4gaW5wdXQgPT4ge1xuICAgIGNvbnN0IHJhbmdlID0gZmluZFJhbmdlKGlucHV0LCBpbnB1dFJhbmdlKTtcbiAgICByZXR1cm4gaW50ZXJwb2xhdGUoaW5wdXQsIGlucHV0UmFuZ2VbcmFuZ2VdLCBpbnB1dFJhbmdlW3JhbmdlICsgMV0sIG91dHB1dFJhbmdlW3JhbmdlXSwgb3V0cHV0UmFuZ2VbcmFuZ2UgKyAxXSwgZWFzaW5nLCBleHRyYXBvbGF0ZUxlZnQsIGV4dHJhcG9sYXRlUmlnaHQsIGNvbmZpZy5tYXApO1xuICB9O1xufTtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGUoaW5wdXQsIGlucHV0TWluLCBpbnB1dE1heCwgb3V0cHV0TWluLCBvdXRwdXRNYXgsIGVhc2luZywgZXh0cmFwb2xhdGVMZWZ0LCBleHRyYXBvbGF0ZVJpZ2h0LCBtYXApIHtcbiAgbGV0IHJlc3VsdCA9IG1hcCA/IG1hcChpbnB1dCkgOiBpbnB1dDtcblxuICBpZiAocmVzdWx0IDwgaW5wdXRNaW4pIHtcbiAgICBpZiAoZXh0cmFwb2xhdGVMZWZ0ID09PSAnaWRlbnRpdHknKSByZXR1cm4gcmVzdWx0O2Vsc2UgaWYgKGV4dHJhcG9sYXRlTGVmdCA9PT0gJ2NsYW1wJykgcmVzdWx0ID0gaW5wdXRNaW47XG4gIH1cblxuICBpZiAocmVzdWx0ID4gaW5wdXRNYXgpIHtcbiAgICBpZiAoZXh0cmFwb2xhdGVSaWdodCA9PT0gJ2lkZW50aXR5JykgcmV0dXJuIHJlc3VsdDtlbHNlIGlmIChleHRyYXBvbGF0ZVJpZ2h0ID09PSAnY2xhbXAnKSByZXN1bHQgPSBpbnB1dE1heDtcbiAgfVxuXG4gIGlmIChvdXRwdXRNaW4gPT09IG91dHB1dE1heCkgcmV0dXJuIG91dHB1dE1pbjtcbiAgaWYgKGlucHV0TWluID09PSBpbnB1dE1heCkgcmV0dXJuIGlucHV0IDw9IGlucHV0TWluID8gb3V0cHV0TWluIDogb3V0cHV0TWF4O1xuICBpZiAoaW5wdXRNaW4gPT09IC1JbmZpbml0eSkgcmVzdWx0ID0gLXJlc3VsdDtlbHNlIGlmIChpbnB1dE1heCA9PT0gSW5maW5pdHkpIHJlc3VsdCA9IHJlc3VsdCAtIGlucHV0TWluO2Vsc2UgcmVzdWx0ID0gKHJlc3VsdCAtIGlucHV0TWluKSAvIChpbnB1dE1heCAtIGlucHV0TWluKTtcbiAgcmVzdWx0ID0gZWFzaW5nKHJlc3VsdCk7XG4gIGlmIChvdXRwdXRNaW4gPT09IC1JbmZpbml0eSkgcmVzdWx0ID0gLXJlc3VsdDtlbHNlIGlmIChvdXRwdXRNYXggPT09IEluZmluaXR5KSByZXN1bHQgPSByZXN1bHQgKyBvdXRwdXRNaW47ZWxzZSByZXN1bHQgPSByZXN1bHQgKiAob3V0cHV0TWF4IC0gb3V0cHV0TWluKSArIG91dHB1dE1pbjtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZmluZFJhbmdlKGlucHV0LCBpbnB1dFJhbmdlKSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgaW5wdXRSYW5nZS5sZW5ndGggLSAxOyArK2kpIGlmIChpbnB1dFJhbmdlW2ldID49IGlucHV0KSBicmVhaztcblxuICByZXR1cm4gaSAtIDE7XG59XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmNvbnN0ICRnZXQgPSBTeW1ib2wuZm9yKCdGbHVpZFZhbHVlLmdldCcpO1xuY29uc3QgJG9ic2VydmVycyA9IFN5bWJvbC5mb3IoJ0ZsdWlkVmFsdWUub2JzZXJ2ZXJzJyk7XG5cbmNvbnN0IGhhc0ZsdWlkVmFsdWUgPSBhcmcgPT4gQm9vbGVhbihhcmcgJiYgYXJnWyRnZXRdKTtcblxuY29uc3QgZ2V0Rmx1aWRWYWx1ZSA9IGFyZyA9PiBhcmcgJiYgYXJnWyRnZXRdID8gYXJnWyRnZXRdKCkgOiBhcmc7XG5cbmNvbnN0IGdldEZsdWlkT2JzZXJ2ZXJzID0gdGFyZ2V0ID0+IHRhcmdldFskb2JzZXJ2ZXJzXSB8fCBudWxsO1xuXG5mdW5jdGlvbiBjYWxsRmx1aWRPYnNlcnZlcihvYnNlcnZlciwgZXZlbnQpIHtcbiAgaWYgKG9ic2VydmVyLmV2ZW50T2JzZXJ2ZWQpIHtcbiAgICBvYnNlcnZlci5ldmVudE9ic2VydmVkKGV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBvYnNlcnZlcihldmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbEZsdWlkT2JzZXJ2ZXJzKHRhcmdldCwgZXZlbnQpIHtcbiAgbGV0IG9ic2VydmVycyA9IHRhcmdldFskb2JzZXJ2ZXJzXTtcblxuICBpZiAob2JzZXJ2ZXJzKSB7XG4gICAgb2JzZXJ2ZXJzLmZvckVhY2gob2JzZXJ2ZXIgPT4ge1xuICAgICAgY2FsbEZsdWlkT2JzZXJ2ZXIob2JzZXJ2ZXIsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBGbHVpZFZhbHVlIHtcbiAgY29uc3RydWN0b3IoZ2V0KSB7XG4gICAgdGhpc1skZ2V0XSA9IHZvaWQgMDtcbiAgICB0aGlzWyRvYnNlcnZlcnNdID0gdm9pZCAwO1xuXG4gICAgaWYgKCFnZXQgJiYgIShnZXQgPSB0aGlzLmdldCkpIHtcbiAgICAgIHRocm93IEVycm9yKCdVbmtub3duIGdldHRlcicpO1xuICAgIH1cblxuICAgIHNldEZsdWlkR2V0dGVyKHRoaXMsIGdldCk7XG4gIH1cblxufVxuXG5jb25zdCBzZXRGbHVpZEdldHRlciA9ICh0YXJnZXQsIGdldCkgPT4gc2V0SGlkZGVuKHRhcmdldCwgJGdldCwgZ2V0KTtcblxuZnVuY3Rpb24gYWRkRmx1aWRPYnNlcnZlcih0YXJnZXQsIG9ic2VydmVyKSB7XG4gIGlmICh0YXJnZXRbJGdldF0pIHtcbiAgICBsZXQgb2JzZXJ2ZXJzID0gdGFyZ2V0WyRvYnNlcnZlcnNdO1xuXG4gICAgaWYgKCFvYnNlcnZlcnMpIHtcbiAgICAgIHNldEhpZGRlbih0YXJnZXQsICRvYnNlcnZlcnMsIG9ic2VydmVycyA9IG5ldyBTZXQoKSk7XG4gICAgfVxuXG4gICAgaWYgKCFvYnNlcnZlcnMuaGFzKG9ic2VydmVyKSkge1xuICAgICAgb2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7XG5cbiAgICAgIGlmICh0YXJnZXQub2JzZXJ2ZXJBZGRlZCkge1xuICAgICAgICB0YXJnZXQub2JzZXJ2ZXJBZGRlZChvYnNlcnZlcnMuc2l6ZSwgb2JzZXJ2ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYnNlcnZlcjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRmx1aWRPYnNlcnZlcih0YXJnZXQsIG9ic2VydmVyKSB7XG4gIGxldCBvYnNlcnZlcnMgPSB0YXJnZXRbJG9ic2VydmVyc107XG5cbiAgaWYgKG9ic2VydmVycyAmJiBvYnNlcnZlcnMuaGFzKG9ic2VydmVyKSkge1xuICAgIGNvbnN0IGNvdW50ID0gb2JzZXJ2ZXJzLnNpemUgLSAxO1xuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBvYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0WyRvYnNlcnZlcnNdID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0Lm9ic2VydmVyUmVtb3ZlZCkge1xuICAgICAgdGFyZ2V0Lm9ic2VydmVyUmVtb3ZlZChjb3VudCwgb2JzZXJ2ZXIpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBzZXRIaWRkZW4gPSAodGFyZ2V0LCBrZXksIHZhbHVlKSA9PiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgdmFsdWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG5jb25zdCBudW1iZXJSZWdleCA9IC9bK1xcLV0/KD86MHxbMS05XVxcZCopKD86XFwuXFxkKik/KD86W2VFXVsrXFwtXT9cXGQrKT8vZztcbmNvbnN0IGNvbG9yUmVnZXggPSAvKCMoPzpbMC05YS1mXXsyfSl7Miw0fXwoI1swLTlhLWZdezN9KXwocmdifGhzbClhP1xcKCgtP1xcZCslP1ssXFxzXSspezIsM31cXHMqW1xcZFxcLl0rJT9cXCkpL2dpO1xuY29uc3QgdW5pdFJlZ2V4ID0gbmV3IFJlZ0V4cChgKCR7bnVtYmVyUmVnZXguc291cmNlfSkoJXxbYS16XSspYCwgJ2knKTtcbmNvbnN0IHJnYmFSZWdleCA9IC9yZ2JhXFwoKFswLTlcXC4tXSspLCAoWzAtOVxcLi1dKyksIChbMC05XFwuLV0rKSwgKFswLTlcXC4tXSspXFwpL2dpO1xuY29uc3QgY3NzVmFyaWFibGVSZWdleCA9IC92YXJcXCgoLS1bYS16QS1aMC05LV9dKyksPyA/KFthLXpBLVowLTkgKCklIy4sLV0rKT9cXCkvO1xuXG5jb25zdCB2YXJpYWJsZVRvUmdiYSA9IGlucHV0ID0+IHtcbiAgY29uc3QgW3Rva2VuLCBmYWxsYmFja10gPSBwYXJzZUNTU1ZhcmlhYmxlKGlucHV0KTtcblxuICBpZiAoIXRva2VuIHx8IGlzU1NSKCkpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSh0b2tlbik7XG5cbiAgaWYgKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgfSBlbHNlIGlmIChmYWxsYmFjayAmJiBmYWxsYmFjay5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgY29uc3QgX3ZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGZhbGxiYWNrKTtcblxuICAgIGlmIChfdmFsdWUpIHtcbiAgICAgIHJldHVybiBfdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZmFsbGJhY2sgJiYgY3NzVmFyaWFibGVSZWdleC50ZXN0KGZhbGxiYWNrKSkge1xuICAgIHJldHVybiB2YXJpYWJsZVRvUmdiYShmYWxsYmFjayk7XG4gIH0gZWxzZSBpZiAoZmFsbGJhY2spIHtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cblxuICByZXR1cm4gaW5wdXQ7XG59O1xuXG5jb25zdCBwYXJzZUNTU1ZhcmlhYmxlID0gY3VycmVudCA9PiB7XG4gIGNvbnN0IG1hdGNoID0gY3NzVmFyaWFibGVSZWdleC5leGVjKGN1cnJlbnQpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gWyxdO1xuICBjb25zdCBbLCB0b2tlbiwgZmFsbGJhY2tdID0gbWF0Y2g7XG4gIHJldHVybiBbdG9rZW4sIGZhbGxiYWNrXTtcbn07XG5cbmxldCBuYW1lZENvbG9yUmVnZXg7XG5cbmNvbnN0IHJnYmFSb3VuZCA9IChfLCBwMSwgcDIsIHAzLCBwNCkgPT4gYHJnYmEoJHtNYXRoLnJvdW5kKHAxKX0sICR7TWF0aC5yb3VuZChwMil9LCAke01hdGgucm91bmQocDMpfSwgJHtwNH0pYDtcblxuY29uc3QgY3JlYXRlU3RyaW5nSW50ZXJwb2xhdG9yID0gY29uZmlnID0+IHtcbiAgaWYgKCFuYW1lZENvbG9yUmVnZXgpIG5hbWVkQ29sb3JSZWdleCA9IGNvbG9ycyQxID8gbmV3IFJlZ0V4cChgKCR7T2JqZWN0LmtleXMoY29sb3JzJDEpLmpvaW4oJ3wnKX0pKD8hXFxcXHcpYCwgJ2cnKSA6IC9eXFxiJC87XG4gIGNvbnN0IG91dHB1dCA9IGNvbmZpZy5vdXRwdXQubWFwKHZhbHVlID0+IHtcbiAgICByZXR1cm4gZ2V0Rmx1aWRWYWx1ZSh2YWx1ZSkucmVwbGFjZShjc3NWYXJpYWJsZVJlZ2V4LCB2YXJpYWJsZVRvUmdiYSkucmVwbGFjZShjb2xvclJlZ2V4LCBjb2xvclRvUmdiYSkucmVwbGFjZShuYW1lZENvbG9yUmVnZXgsIGNvbG9yVG9SZ2JhKTtcbiAgfSk7XG4gIGNvbnN0IGtleWZyYW1lcyA9IG91dHB1dC5tYXAodmFsdWUgPT4gdmFsdWUubWF0Y2gobnVtYmVyUmVnZXgpLm1hcChOdW1iZXIpKTtcbiAgY29uc3Qgb3V0cHV0UmFuZ2VzID0ga2V5ZnJhbWVzWzBdLm1hcCgoXywgaSkgPT4ga2V5ZnJhbWVzLm1hcCh2YWx1ZXMgPT4ge1xuICAgIGlmICghKGkgaW4gdmFsdWVzKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1RoZSBhcml0eSBvZiBlYWNoIFwib3V0cHV0XCIgdmFsdWUgbXVzdCBiZSBlcXVhbCcpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNbaV07XG4gIH0pKTtcbiAgY29uc3QgaW50ZXJwb2xhdG9ycyA9IG91dHB1dFJhbmdlcy5tYXAob3V0cHV0ID0+IGNyZWF0ZUludGVycG9sYXRvcihfZXh0ZW5kcyh7fSwgY29uZmlnLCB7XG4gICAgb3V0cHV0XG4gIH0pKSk7XG4gIHJldHVybiBpbnB1dCA9PiB7XG4gICAgdmFyIF9vdXRwdXQkZmluZDtcblxuICAgIGNvbnN0IG1pc3NpbmdVbml0ID0gIXVuaXRSZWdleC50ZXN0KG91dHB1dFswXSkgJiYgKChfb3V0cHV0JGZpbmQgPSBvdXRwdXQuZmluZCh2YWx1ZSA9PiB1bml0UmVnZXgudGVzdCh2YWx1ZSkpKSA9PSBudWxsID8gdm9pZCAwIDogX291dHB1dCRmaW5kLnJlcGxhY2UobnVtYmVyUmVnZXgsICcnKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIHJldHVybiBvdXRwdXRbMF0ucmVwbGFjZShudW1iZXJSZWdleCwgKCkgPT4gYCR7aW50ZXJwb2xhdG9yc1tpKytdKGlucHV0KX0ke21pc3NpbmdVbml0IHx8ICcnfWApLnJlcGxhY2UocmdiYVJlZ2V4LCByZ2JhUm91bmQpO1xuICB9O1xufTtcblxuY29uc3QgcHJlZml4ID0gJ3JlYWN0LXNwcmluZzogJztcblxuY29uc3Qgb25jZSA9IGZuID0+IHtcbiAgY29uc3QgZnVuYyA9IGZuO1xuICBsZXQgY2FsbGVkID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3ByZWZpeH1vbmNlIHJlcXVpcmVzIGEgZnVuY3Rpb24gcGFyYW1ldGVyYCk7XG4gIH1cblxuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgZnVuYyguLi5hcmdzKTtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3Qgd2FybkludGVycG9sYXRlID0gb25jZShjb25zb2xlLndhcm4pO1xuZnVuY3Rpb24gZGVwcmVjYXRlSW50ZXJwb2xhdGUoKSB7XG4gIHdhcm5JbnRlcnBvbGF0ZShgJHtwcmVmaXh9VGhlIFwiaW50ZXJwb2xhdGVcIiBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGluIHY5ICh1c2UgXCJ0b1wiIGluc3RlYWQpYCk7XG59XG5jb25zdCB3YXJuRGlyZWN0Q2FsbCA9IG9uY2UoY29uc29sZS53YXJuKTtcbmZ1bmN0aW9uIGRlcHJlY2F0ZURpcmVjdENhbGwoKSB7XG4gIHdhcm5EaXJlY3RDYWxsKGAke3ByZWZpeH1EaXJlY3RseSBjYWxsaW5nIHN0YXJ0IGluc3RlYWQgb2YgdXNpbmcgdGhlIGFwaSBvYmplY3QgaXMgZGVwcmVjYXRlZCBpbiB2OSAodXNlIFwiLnN0YXJ0XCIgaW5zdGVhZCksIHRoaXMgd2lsbCBiZSByZW1vdmVkIGluIGxhdGVyIDAuWC4wIHZlcnNpb25zYCk7XG59XG5cbmZ1bmN0aW9uIGlzQW5pbWF0ZWRTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIGlzLnN0cih2YWx1ZSkgJiYgKHZhbHVlWzBdID09ICcjJyB8fCAvXFxkLy50ZXN0KHZhbHVlKSB8fCAhaXNTU1IoKSAmJiBjc3NWYXJpYWJsZVJlZ2V4LnRlc3QodmFsdWUpIHx8IHZhbHVlIGluIChjb2xvcnMkMSB8fCB7fSkpO1xufVxuXG5jb25zdCB1c2VMYXlvdXRFZmZlY3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG5cbmNvbnN0IHVzZUlzTW91bnRlZCA9ICgpID0+IHtcbiAgY29uc3QgaXNNb3VudGVkID0gdXNlUmVmKGZhbHNlKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpc01vdW50ZWQuY3VycmVudCA9IHRydWU7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gaXNNb3VudGVkO1xufTtcblxuZnVuY3Rpb24gdXNlRm9yY2VVcGRhdGUoKSB7XG4gIGNvbnN0IHVwZGF0ZSA9IHVzZVN0YXRlKClbMV07XG4gIGNvbnN0IGlzTW91bnRlZCA9IHVzZUlzTW91bnRlZCgpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmIChpc01vdW50ZWQuY3VycmVudCkge1xuICAgICAgdXBkYXRlKE1hdGgucmFuZG9tKCkpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlTWVtb09uZShnZXRSZXN1bHQsIGlucHV0cykge1xuICBjb25zdCBbaW5pdGlhbF0gPSB1c2VTdGF0ZSgoKSA9PiAoe1xuICAgIGlucHV0cyxcbiAgICByZXN1bHQ6IGdldFJlc3VsdCgpXG4gIH0pKTtcbiAgY29uc3QgY29tbWl0dGVkID0gdXNlUmVmKCk7XG4gIGNvbnN0IHByZXZDYWNoZSA9IGNvbW1pdHRlZC5jdXJyZW50O1xuICBsZXQgY2FjaGUgPSBwcmV2Q2FjaGU7XG5cbiAgaWYgKGNhY2hlKSB7XG4gICAgY29uc3QgdXNlQ2FjaGUgPSBCb29sZWFuKGlucHV0cyAmJiBjYWNoZS5pbnB1dHMgJiYgYXJlSW5wdXRzRXF1YWwoaW5wdXRzLCBjYWNoZS5pbnB1dHMpKTtcblxuICAgIGlmICghdXNlQ2FjaGUpIHtcbiAgICAgIGNhY2hlID0ge1xuICAgICAgICBpbnB1dHMsXG4gICAgICAgIHJlc3VsdDogZ2V0UmVzdWx0KClcbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhY2hlID0gaW5pdGlhbDtcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29tbWl0dGVkLmN1cnJlbnQgPSBjYWNoZTtcblxuICAgIGlmIChwcmV2Q2FjaGUgPT0gaW5pdGlhbCkge1xuICAgICAgaW5pdGlhbC5pbnB1dHMgPSBpbml0aWFsLnJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIFtjYWNoZV0pO1xuICByZXR1cm4gY2FjaGUucmVzdWx0O1xufVxuXG5mdW5jdGlvbiBhcmVJbnB1dHNFcXVhbChuZXh0LCBwcmV2KSB7XG4gIGlmIChuZXh0Lmxlbmd0aCAhPT0gcHJldi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobmV4dFtpXSAhPT0gcHJldltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCB1c2VPbmNlID0gZWZmZWN0ID0+IHVzZUVmZmVjdChlZmZlY3QsIGVtcHR5RGVwcyk7XG5jb25zdCBlbXB0eURlcHMgPSBbXTtcblxuZnVuY3Rpb24gdXNlUHJldih2YWx1ZSkge1xuICBjb25zdCBwcmV2UmVmID0gdXNlUmVmKCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcHJldlJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcHJldlJlZi5jdXJyZW50O1xufVxuXG5leHBvcnQgeyBGbHVpZFZhbHVlLCBnbG9iYWxzIGFzIEdsb2JhbHMsIGFkZEZsdWlkT2JzZXJ2ZXIsIGNhbGxGbHVpZE9ic2VydmVyLCBjYWxsRmx1aWRPYnNlcnZlcnMsIGNvbG9yVG9SZ2JhLCBjb2xvcnMsIGNyZWF0ZUludGVycG9sYXRvciwgY3JlYXRlU3RyaW5nSW50ZXJwb2xhdG9yLCBkZWZpbmVIaWRkZW4sIGRlcHJlY2F0ZURpcmVjdENhbGwsIGRlcHJlY2F0ZUludGVycG9sYXRlLCBlYWNoLCBlYWNoUHJvcCwgZmx1c2gsIGZsdXNoQ2FsbHMsIGZyYW1lTG9vcCwgZ2V0Rmx1aWRPYnNlcnZlcnMsIGdldEZsdWlkVmFsdWUsIGhhc0ZsdWlkVmFsdWUsIGhleDMsIGhleDQsIGhleDYsIGhleDgsIGhzbCwgaHNsYSwgaXMsIGlzQW5pbWF0ZWRTdHJpbmcsIGlzRXF1YWwsIGlzU1NSLCBub29wLCByZW1vdmVGbHVpZE9ic2VydmVyLCByZ2IsIHJnYmEsIHNldEZsdWlkR2V0dGVyLCB0b0FycmF5LCB1c2VGb3JjZVVwZGF0ZSwgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vT25lLCB1c2VPbmNlLCB1c2VQcmV2IH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4813\n")},1472:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Transition\": () => (/* reexport safe */ _react_spring_core__WEBPACK_IMPORTED_MODULE_0__.Transition),\n/* harmony export */ \"animated\": () => (/* binding */ animated)\n/* harmony export */ });\n/* unused harmony export a */\n/* harmony import */ var _react_spring_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4928);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1533);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _react_spring_shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4813);\n/* harmony import */ var _react_spring_animated__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1314);\n\n\n\n\n\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nconst _excluded$2 = [\"style\", \"children\", \"scrollTop\", \"scrollLeft\"];\nconst isCustomPropRE = /^--/;\n\nfunction dangerousStyleValue(name, value) {\n if (value == null || typeof value === 'boolean' || value === '') return '';\n if (typeof value === 'number' && value !== 0 && !isCustomPropRE.test(name) && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) return value + 'px';\n return ('' + value).trim();\n}\n\nconst attributeCache = {};\nfunction applyAnimatedValues(instance, props) {\n if (!instance.nodeType || !instance.setAttribute) {\n return false;\n }\n\n const isFilterElement = instance.nodeName === 'filter' || instance.parentNode && instance.parentNode.nodeName === 'filter';\n\n const _ref = props,\n {\n style,\n children,\n scrollTop,\n scrollLeft\n } = _ref,\n attributes = _objectWithoutPropertiesLoose(_ref, _excluded$2);\n\n const values = Object.values(attributes);\n const names = Object.keys(attributes).map(name => isFilterElement || instance.hasAttribute(name) ? name : attributeCache[name] || (attributeCache[name] = name.replace(/([A-Z])/g, n => '-' + n.toLowerCase())));\n\n if (children !== void 0) {\n instance.textContent = children;\n }\n\n for (let name in style) {\n if (style.hasOwnProperty(name)) {\n const value = dangerousStyleValue(name, style[name]);\n\n if (isCustomPropRE.test(name)) {\n instance.style.setProperty(name, value);\n } else {\n instance.style[name] = value;\n }\n }\n }\n\n names.forEach((name, i) => {\n instance.setAttribute(name, values[i]);\n });\n\n if (scrollTop !== void 0) {\n instance.scrollTop = scrollTop;\n }\n\n if (scrollLeft !== void 0) {\n instance.scrollLeft = scrollLeft;\n }\n}\nlet isUnitlessNumber = {\n animationIterationCount: true,\n borderImageOutset: true,\n borderImageSlice: true,\n borderImageWidth: true,\n boxFlex: true,\n boxFlexGroup: true,\n boxOrdinalGroup: true,\n columnCount: true,\n columns: true,\n flex: true,\n flexGrow: true,\n flexPositive: true,\n flexShrink: true,\n flexNegative: true,\n flexOrder: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowSpan: true,\n gridRowStart: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnSpan: true,\n gridColumnStart: true,\n fontWeight: true,\n lineClamp: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n tabSize: true,\n widows: true,\n zIndex: true,\n zoom: true,\n fillOpacity: true,\n floodOpacity: true,\n stopOpacity: true,\n strokeDasharray: true,\n strokeDashoffset: true,\n strokeMiterlimit: true,\n strokeOpacity: true,\n strokeWidth: true\n};\n\nconst prefixKey = (prefix, key) => prefix + key.charAt(0).toUpperCase() + key.substring(1);\n\nconst prefixes = ['Webkit', 'Ms', 'Moz', 'O'];\nisUnitlessNumber = Object.keys(isUnitlessNumber).reduce((acc, prop) => {\n prefixes.forEach(prefix => acc[prefixKey(prefix, prop)] = acc[prop]);\n return acc;\n}, isUnitlessNumber);\n\nconst _excluded$1 = [\"x\", \"y\", \"z\"];\nconst domTransforms = /^(matrix|translate|scale|rotate|skew)/;\nconst pxTransforms = /^(translate)/;\nconst degTransforms = /^(rotate|skew)/;\n\nconst addUnit = (value, unit) => _react_spring_shared__WEBPACK_IMPORTED_MODULE_2__.is.num(value) && value !== 0 ? value + unit : value;\n\nconst isValueIdentity = (value, id) => _react_spring_shared__WEBPACK_IMPORTED_MODULE_2__.is.arr(value) ? value.every(v => isValueIdentity(v, id)) : _react_spring_shared__WEBPACK_IMPORTED_MODULE_2__.is.num(value) ? value === id : parseFloat(value) === id;\n\nclass AnimatedStyle extends _react_spring_animated__WEBPACK_IMPORTED_MODULE_3__/* .AnimatedObject */ .rS {\n constructor(_ref) {\n let {\n x,\n y,\n z\n } = _ref,\n style = _objectWithoutPropertiesLoose(_ref, _excluded$1);\n\n const inputs = [];\n const transforms = [];\n\n if (x || y || z) {\n inputs.push([x || 0, y || 0, z || 0]);\n transforms.push(xyz => [`translate3d(${xyz.map(v => addUnit(v, 'px')).join(',')})`, isValueIdentity(xyz, 0)]);\n }\n\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .eachProp */ .rU)(style, (value, key) => {\n if (key === 'transform') {\n inputs.push([value || '']);\n transforms.push(transform => [transform, transform === '']);\n } else if (domTransforms.test(key)) {\n delete style[key];\n if (_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__.is.und(value)) return;\n const unit = pxTransforms.test(key) ? 'px' : degTransforms.test(key) ? 'deg' : '';\n inputs.push((0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .toArray */ .qo)(value));\n transforms.push(key === 'rotate3d' ? ([x, y, z, deg]) => [`rotate3d(${x},${y},${z},${addUnit(deg, unit)})`, isValueIdentity(deg, 0)] : input => [`${key}(${input.map(v => addUnit(v, unit)).join(',')})`, isValueIdentity(input, key.startsWith('scale') ? 1 : 0)]);\n }\n });\n\n if (inputs.length) {\n style.transform = new FluidTransform(inputs, transforms);\n }\n\n super(style);\n }\n\n}\n\nclass FluidTransform extends _react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .FluidValue */ .B0 {\n constructor(inputs, transforms) {\n super();\n this._value = null;\n this.inputs = inputs;\n this.transforms = transforms;\n }\n\n get() {\n return this._value || (this._value = this._get());\n }\n\n _get() {\n let transform = '';\n let identity = true;\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .each */ .S6)(this.inputs, (input, i) => {\n const arg1 = (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .getFluidValue */ .je)(input[0]);\n const [t, id] = this.transforms[i](_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__.is.arr(arg1) ? arg1 : input.map(_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .getFluidValue */ .je));\n transform += ' ' + t;\n identity = identity && id;\n });\n return identity ? 'none' : transform;\n }\n\n observerAdded(count) {\n if (count == 1) (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .each */ .S6)(this.inputs, input => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .each */ .S6)(input, value => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .hasFluidValue */ .j$)(value) && (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .addFluidObserver */ .UI)(value, this)));\n }\n\n observerRemoved(count) {\n if (count == 0) (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .each */ .S6)(this.inputs, input => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .each */ .S6)(input, value => (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .hasFluidValue */ .j$)(value) && (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .removeFluidObserver */ .iL)(value, this)));\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n this._value = null;\n }\n\n (0,_react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .callFluidObservers */ .k0)(this, event);\n }\n\n}\n\nconst primitives = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr', 'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];\n\nconst _excluded = [\"scrollTop\", \"scrollLeft\"];\n_react_spring_core__WEBPACK_IMPORTED_MODULE_0__.Globals.assign({\n batchedUpdates: react_dom__WEBPACK_IMPORTED_MODULE_1__.unstable_batchedUpdates,\n createStringInterpolator: _react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .createStringInterpolator */ .qS,\n colors: _react_spring_shared__WEBPACK_IMPORTED_MODULE_2__/* .colors */ .O9\n});\nconst host = (0,_react_spring_animated__WEBPACK_IMPORTED_MODULE_3__/* .createHost */ .Ld)(primitives, {\n applyAnimatedValues,\n createAnimatedStyle: style => new AnimatedStyle(style),\n getComponentProps: _ref => {\n let props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n return props;\n }\n});\nconst animated = host.animated;\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ3Mi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQHJlYWN0LXNwcmluZy93ZWIvZGlzdC9yZWFjdC1zcHJpbmctd2ViLmVzbS5qcz9mODM1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdsb2JhbHMgfSBmcm9tICdAcmVhY3Qtc3ByaW5nL2NvcmUnO1xuZXhwb3J0ICogZnJvbSAnQHJlYWN0LXNwcmluZy9jb3JlJztcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IGVhY2hQcm9wLCBpcywgdG9BcnJheSwgRmx1aWRWYWx1ZSwgZWFjaCwgZ2V0Rmx1aWRWYWx1ZSwgaGFzRmx1aWRWYWx1ZSwgYWRkRmx1aWRPYnNlcnZlciwgcmVtb3ZlRmx1aWRPYnNlcnZlciwgY2FsbEZsdWlkT2JzZXJ2ZXJzLCBjcmVhdGVTdHJpbmdJbnRlcnBvbGF0b3IsIGNvbG9ycyB9IGZyb20gJ0ByZWFjdC1zcHJpbmcvc2hhcmVkJztcbmltcG9ydCB7IEFuaW1hdGVkT2JqZWN0LCBjcmVhdGVIb3N0IH0gZnJvbSAnQHJlYWN0LXNwcmluZy9hbmltYXRlZCc7XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5jb25zdCBfZXhjbHVkZWQkMiA9IFtcInN0eWxlXCIsIFwiY2hpbGRyZW5cIiwgXCJzY3JvbGxUb3BcIiwgXCJzY3JvbGxMZWZ0XCJdO1xuY29uc3QgaXNDdXN0b21Qcm9wUkUgPSAvXi0tLztcblxuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJycpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IDAgJiYgIWlzQ3VzdG9tUHJvcFJFLnRlc3QobmFtZSkgJiYgIShpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pKSByZXR1cm4gdmFsdWUgKyAncHgnO1xuICByZXR1cm4gKCcnICsgdmFsdWUpLnRyaW0oKTtcbn1cblxuY29uc3QgYXR0cmlidXRlQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGFwcGx5QW5pbWF0ZWRWYWx1ZXMoaW5zdGFuY2UsIHByb3BzKSB7XG4gIGlmICghaW5zdGFuY2Uubm9kZVR5cGUgfHwgIWluc3RhbmNlLnNldEF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlzRmlsdGVyRWxlbWVudCA9IGluc3RhbmNlLm5vZGVOYW1lID09PSAnZmlsdGVyJyB8fCBpbnN0YW5jZS5wYXJlbnROb2RlICYmIGluc3RhbmNlLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdmaWx0ZXInO1xuXG4gIGNvbnN0IF9yZWYgPSBwcm9wcyxcbiAgICAgICAge1xuICAgIHN0eWxlLFxuICAgIGNoaWxkcmVuLFxuICAgIHNjcm9sbFRvcCxcbiAgICBzY3JvbGxMZWZ0XG4gIH0gPSBfcmVmLFxuICAgICAgICBhdHRyaWJ1dGVzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkJDIpO1xuXG4gIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMoYXR0cmlidXRlcyk7XG4gIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcykubWFwKG5hbWUgPT4gaXNGaWx0ZXJFbGVtZW50IHx8IGluc3RhbmNlLmhhc0F0dHJpYnV0ZShuYW1lKSA/IG5hbWUgOiBhdHRyaWJ1dGVDYWNoZVtuYW1lXSB8fCAoYXR0cmlidXRlQ2FjaGVbbmFtZV0gPSBuYW1lLnJlcGxhY2UoLyhbQS1aXSkvZywgbiA9PiAnLScgKyBuLnRvTG93ZXJDYXNlKCkpKSk7XG5cbiAgaWYgKGNoaWxkcmVuICE9PSB2b2lkIDApIHtcbiAgICBpbnN0YW5jZS50ZXh0Q29udGVudCA9IGNoaWxkcmVuO1xuICB9XG5cbiAgZm9yIChsZXQgbmFtZSBpbiBzdHlsZSkge1xuICAgIGlmIChzdHlsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHN0eWxlW25hbWVdKTtcblxuICAgICAgaWYgKGlzQ3VzdG9tUHJvcFJFLnRlc3QobmFtZSkpIHtcbiAgICAgICAgaW5zdGFuY2Uuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdGFuY2Uuc3R5bGVbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuYW1lcy5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XG4gICAgaW5zdGFuY2Uuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlc1tpXSk7XG4gIH0pO1xuXG4gIGlmIChzY3JvbGxUb3AgIT09IHZvaWQgMCkge1xuICAgIGluc3RhbmNlLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgfVxuXG4gIGlmIChzY3JvbGxMZWZ0ICE9PSB2b2lkIDApIHtcbiAgICBpbnN0YW5jZS5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgfVxufVxubGV0IGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuXG5jb25zdCBwcmVmaXhLZXkgPSAocHJlZml4LCBrZXkpID0+IHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG5cbmNvbnN0IHByZWZpeGVzID0gWydXZWJraXQnLCAnTXMnLCAnTW96JywgJ08nXTtcbmlzVW5pdGxlc3NOdW1iZXIgPSBPYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5yZWR1Y2UoKGFjYywgcHJvcCkgPT4ge1xuICBwcmVmaXhlcy5mb3JFYWNoKHByZWZpeCA9PiBhY2NbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gYWNjW3Byb3BdKTtcbiAgcmV0dXJuIGFjYztcbn0sIGlzVW5pdGxlc3NOdW1iZXIpO1xuXG5jb25zdCBfZXhjbHVkZWQkMSA9IFtcInhcIiwgXCJ5XCIsIFwielwiXTtcbmNvbnN0IGRvbVRyYW5zZm9ybXMgPSAvXihtYXRyaXh8dHJhbnNsYXRlfHNjYWxlfHJvdGF0ZXxza2V3KS87XG5jb25zdCBweFRyYW5zZm9ybXMgPSAvXih0cmFuc2xhdGUpLztcbmNvbnN0IGRlZ1RyYW5zZm9ybXMgPSAvXihyb3RhdGV8c2tldykvO1xuXG5jb25zdCBhZGRVbml0ID0gKHZhbHVlLCB1bml0KSA9PiBpcy5udW0odmFsdWUpICYmIHZhbHVlICE9PSAwID8gdmFsdWUgKyB1bml0IDogdmFsdWU7XG5cbmNvbnN0IGlzVmFsdWVJZGVudGl0eSA9ICh2YWx1ZSwgaWQpID0+IGlzLmFycih2YWx1ZSkgPyB2YWx1ZS5ldmVyeSh2ID0+IGlzVmFsdWVJZGVudGl0eSh2LCBpZCkpIDogaXMubnVtKHZhbHVlKSA/IHZhbHVlID09PSBpZCA6IHBhcnNlRmxvYXQodmFsdWUpID09PSBpZDtcblxuY2xhc3MgQW5pbWF0ZWRTdHlsZSBleHRlbmRzIEFuaW1hdGVkT2JqZWN0IHtcbiAgY29uc3RydWN0b3IoX3JlZikge1xuICAgIGxldCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHpcbiAgICB9ID0gX3JlZixcbiAgICAgICAgc3R5bGUgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQkMSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBbXTtcbiAgICBjb25zdCB0cmFuc2Zvcm1zID0gW107XG5cbiAgICBpZiAoeCB8fCB5IHx8IHopIHtcbiAgICAgIGlucHV0cy5wdXNoKFt4IHx8IDAsIHkgfHwgMCwgeiB8fCAwXSk7XG4gICAgICB0cmFuc2Zvcm1zLnB1c2goeHl6ID0+IFtgdHJhbnNsYXRlM2QoJHt4eXoubWFwKHYgPT4gYWRkVW5pdCh2LCAncHgnKSkuam9pbignLCcpfSlgLCBpc1ZhbHVlSWRlbnRpdHkoeHl6LCAwKV0pO1xuICAgIH1cblxuICAgIGVhY2hQcm9wKHN0eWxlLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gJ3RyYW5zZm9ybScpIHtcbiAgICAgICAgaW5wdXRzLnB1c2goW3ZhbHVlIHx8ICcnXSk7XG4gICAgICAgIHRyYW5zZm9ybXMucHVzaCh0cmFuc2Zvcm0gPT4gW3RyYW5zZm9ybSwgdHJhbnNmb3JtID09PSAnJ10pO1xuICAgICAgfSBlbHNlIGlmIChkb21UcmFuc2Zvcm1zLnRlc3Qoa2V5KSkge1xuICAgICAgICBkZWxldGUgc3R5bGVba2V5XTtcbiAgICAgICAgaWYgKGlzLnVuZCh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgY29uc3QgdW5pdCA9IHB4VHJhbnNmb3Jtcy50ZXN0KGtleSkgPyAncHgnIDogZGVnVHJhbnNmb3Jtcy50ZXN0KGtleSkgPyAnZGVnJyA6ICcnO1xuICAgICAgICBpbnB1dHMucHVzaCh0b0FycmF5KHZhbHVlKSk7XG4gICAgICAgIHRyYW5zZm9ybXMucHVzaChrZXkgPT09ICdyb3RhdGUzZCcgPyAoW3gsIHksIHosIGRlZ10pID0+IFtgcm90YXRlM2QoJHt4fSwke3l9LCR7en0sJHthZGRVbml0KGRlZywgdW5pdCl9KWAsIGlzVmFsdWVJZGVudGl0eShkZWcsIDApXSA6IGlucHV0ID0+IFtgJHtrZXl9KCR7aW5wdXQubWFwKHYgPT4gYWRkVW5pdCh2LCB1bml0KSkuam9pbignLCcpfSlgLCBpc1ZhbHVlSWRlbnRpdHkoaW5wdXQsIGtleS5zdGFydHNXaXRoKCdzY2FsZScpID8gMSA6IDApXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaW5wdXRzLmxlbmd0aCkge1xuICAgICAgc3R5bGUudHJhbnNmb3JtID0gbmV3IEZsdWlkVHJhbnNmb3JtKGlucHV0cywgdHJhbnNmb3Jtcyk7XG4gICAgfVxuXG4gICAgc3VwZXIoc3R5bGUpO1xuICB9XG5cbn1cblxuY2xhc3MgRmx1aWRUcmFuc2Zvcm0gZXh0ZW5kcyBGbHVpZFZhbHVlIHtcbiAgY29uc3RydWN0b3IoaW5wdXRzLCB0cmFuc2Zvcm1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl92YWx1ZSA9IG51bGw7XG4gICAgdGhpcy5pbnB1dHMgPSBpbnB1dHM7XG4gICAgdGhpcy50cmFuc2Zvcm1zID0gdHJhbnNmb3JtcztcbiAgfVxuXG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgfHwgKHRoaXMuX3ZhbHVlID0gdGhpcy5fZ2V0KCkpO1xuICB9XG5cbiAgX2dldCgpIHtcbiAgICBsZXQgdHJhbnNmb3JtID0gJyc7XG4gICAgbGV0IGlkZW50aXR5ID0gdHJ1ZTtcbiAgICBlYWNoKHRoaXMuaW5wdXRzLCAoaW5wdXQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGFyZzEgPSBnZXRGbHVpZFZhbHVlKGlucHV0WzBdKTtcbiAgICAgIGNvbnN0IFt0LCBpZF0gPSB0aGlzLnRyYW5zZm9ybXNbaV0oaXMuYXJyKGFyZzEpID8gYXJnMSA6IGlucHV0Lm1hcChnZXRGbHVpZFZhbHVlKSk7XG4gICAgICB0cmFuc2Zvcm0gKz0gJyAnICsgdDtcbiAgICAgIGlkZW50aXR5ID0gaWRlbnRpdHkgJiYgaWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkZW50aXR5ID8gJ25vbmUnIDogdHJhbnNmb3JtO1xuICB9XG5cbiAgb2JzZXJ2ZXJBZGRlZChjb3VudCkge1xuICAgIGlmIChjb3VudCA9PSAxKSBlYWNoKHRoaXMuaW5wdXRzLCBpbnB1dCA9PiBlYWNoKGlucHV0LCB2YWx1ZSA9PiBoYXNGbHVpZFZhbHVlKHZhbHVlKSAmJiBhZGRGbHVpZE9ic2VydmVyKHZhbHVlLCB0aGlzKSkpO1xuICB9XG5cbiAgb2JzZXJ2ZXJSZW1vdmVkKGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09IDApIGVhY2godGhpcy5pbnB1dHMsIGlucHV0ID0+IGVhY2goaW5wdXQsIHZhbHVlID0+IGhhc0ZsdWlkVmFsdWUodmFsdWUpICYmIHJlbW92ZUZsdWlkT2JzZXJ2ZXIodmFsdWUsIHRoaXMpKSk7XG4gIH1cblxuICBldmVudE9ic2VydmVkKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT0gJ2NoYW5nZScpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICBjYWxsRmx1aWRPYnNlcnZlcnModGhpcywgZXZlbnQpO1xuICB9XG5cbn1cblxuY29uc3QgcHJpbWl0aXZlcyA9IFsnYScsICdhYmJyJywgJ2FkZHJlc3MnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2F1ZGlvJywgJ2InLCAnYmFzZScsICdiZGknLCAnYmRvJywgJ2JpZycsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhbnZhcycsICdjYXB0aW9uJywgJ2NpdGUnLCAnY29kZScsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGF0YScsICdkYXRhbGlzdCcsICdkZCcsICdkZWwnLCAnZGV0YWlscycsICdkZm4nLCAnZGlhbG9nJywgJ2RpdicsICdkbCcsICdkdCcsICdlbScsICdlbWJlZCcsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaW5zJywgJ2tiZCcsICdrZXlnZW4nLCAnbGFiZWwnLCAnbGVnZW5kJywgJ2xpJywgJ2xpbmsnLCAnbWFpbicsICdtYXAnLCAnbWFyaycsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbWV0ZXInLCAnbmF2JywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdvcHRncm91cCcsICdvcHRpb24nLCAnb3V0cHV0JywgJ3AnLCAncGFyYW0nLCAncGljdHVyZScsICdwcmUnLCAncHJvZ3Jlc3MnLCAncScsICdycCcsICdydCcsICdydWJ5JywgJ3MnLCAnc2FtcCcsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc21hbGwnLCAnc291cmNlJywgJ3NwYW4nLCAnc3Ryb25nJywgJ3N0eWxlJywgJ3N1YicsICdzdW1tYXJ5JywgJ3N1cCcsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aW1lJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3UnLCAndWwnLCAndmFyJywgJ3ZpZGVvJywgJ3dicicsICdjaXJjbGUnLCAnY2xpcFBhdGgnLCAnZGVmcycsICdlbGxpcHNlJywgJ2ZvcmVpZ25PYmplY3QnLCAnZycsICdpbWFnZScsICdsaW5lJywgJ2xpbmVhckdyYWRpZW50JywgJ21hc2snLCAncGF0aCcsICdwYXR0ZXJuJywgJ3BvbHlnb24nLCAncG9seWxpbmUnLCAncmFkaWFsR3JhZGllbnQnLCAncmVjdCcsICdzdG9wJywgJ3N2ZycsICd0ZXh0JywgJ3RzcGFuJ107XG5cbmNvbnN0IF9leGNsdWRlZCA9IFtcInNjcm9sbFRvcFwiLCBcInNjcm9sbExlZnRcIl07XG5HbG9iYWxzLmFzc2lnbih7XG4gIGJhdGNoZWRVcGRhdGVzOiB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyxcbiAgY3JlYXRlU3RyaW5nSW50ZXJwb2xhdG9yLFxuICBjb2xvcnNcbn0pO1xuY29uc3QgaG9zdCA9IGNyZWF0ZUhvc3QocHJpbWl0aXZlcywge1xuICBhcHBseUFuaW1hdGVkVmFsdWVzLFxuICBjcmVhdGVBbmltYXRlZFN0eWxlOiBzdHlsZSA9PiBuZXcgQW5pbWF0ZWRTdHlsZShzdHlsZSksXG4gIGdldENvbXBvbmVudFByb3BzOiBfcmVmID0+IHtcbiAgICBsZXQgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG59KTtcbmNvbnN0IGFuaW1hdGVkID0gaG9zdC5hbmltYXRlZDtcblxuZXhwb3J0IHsgYW5pbWF0ZWQgYXMgYSwgYW5pbWF0ZWQgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1472\n")},454:module=>{"use strict";eval('\n\nconst arrayMoveMutate = (array, from, to) => {\n\tconst startIndex = to < 0 ? array.length + to : to;\n\tconst item = array.splice(from, 1)[0];\n\tarray.splice(startIndex, 0, item);\n};\n\nconst arrayMove = (array, from, to) => {\n\tarray = array.slice();\n\tarrayMoveMutate(array, from, to);\n\treturn array;\n};\n\nmodule.exports = arrayMove;\n// TODO: Remove this for the next major release\nmodule.exports["default"] = arrayMove;\n\nmodule.exports.mutate = arrayMoveMutate;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvYXJyYXktbW92ZS9pbmRleC5qcz9jMThjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYXJyYXlNb3ZlTXV0YXRlID0gKGFycmF5LCBmcm9tLCB0bykgPT4ge1xuXHRjb25zdCBzdGFydEluZGV4ID0gdG8gPCAwID8gYXJyYXkubGVuZ3RoICsgdG8gOiB0bztcblx0Y29uc3QgaXRlbSA9IGFycmF5LnNwbGljZShmcm9tLCAxKVswXTtcblx0YXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXgsIDAsIGl0ZW0pO1xufTtcblxuY29uc3QgYXJyYXlNb3ZlID0gKGFycmF5LCBmcm9tLCB0bykgPT4ge1xuXHRhcnJheSA9IGFycmF5LnNsaWNlKCk7XG5cdGFycmF5TW92ZU11dGF0ZShhcnJheSwgZnJvbSwgdG8pO1xuXHRyZXR1cm4gYXJyYXk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TW92ZTtcbi8vIFRPRE86IFJlbW92ZSB0aGlzIGZvciB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gYXJyYXlNb3ZlO1xuXG5tb2R1bGUuZXhwb3J0cy5tdXRhdGUgPSBhcnJheU1vdmVNdXRhdGU7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///454\n')},7136:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": () => (/* binding */ components_Overlay)\n});\n\n// EXTERNAL MODULE: external "window.wp.element"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: external "React"\nvar external_React_ = __webpack_require__(7363);\nvar external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);\n;// CONCATENATED MODULE: ./node_modules/@reach/component-component/es/index.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\n\n\n\nvar cleanProps = function cleanProps(props) {\n var initialState = props.initialState,\n getInitialState = props.getInitialState,\n refs = props.refs,\n getRefs = props.getRefs,\n didMount = props.didMount,\n didUpdate = props.didUpdate,\n willUnmount = props.willUnmount,\n getSnapshotBeforeUpdate = props.getSnapshotBeforeUpdate,\n shouldUpdate = props.shouldUpdate,\n render = props.render,\n rest = _objectWithoutProperties(props, ["initialState", "getInitialState", "refs", "getRefs", "didMount", "didUpdate", "willUnmount", "getSnapshotBeforeUpdate", "shouldUpdate", "render"]);\n\n return rest;\n};\n\nvar Component = function (_React$Component) {\n _inherits(Component, _React$Component);\n\n function Component() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, Component);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _initialiseProps.call(_this), _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n Component.prototype.getArgs = function getArgs() {\n var state = this.state,\n props = this.props,\n setState = this._setState,\n forceUpdate = this._forceUpdate,\n refs = this._refs;\n\n return {\n state: state,\n props: cleanProps(props),\n refs: refs,\n setState: setState,\n forceUpdate: forceUpdate\n };\n };\n\n Component.prototype.componentDidMount = function componentDidMount() {\n if (this.props.didMount) this.props.didMount(this.getArgs());\n };\n\n Component.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) {\n if (this.props.shouldUpdate) return this.props.shouldUpdate({\n props: this.props,\n state: this.state,\n nextProps: cleanProps(nextProps),\n nextState: nextState\n });else return true;\n };\n\n Component.prototype.componentWillUnmount = function componentWillUnmount() {\n if (this.props.willUnmount) this.props.willUnmount({\n state: this.state,\n props: cleanProps(this.props),\n refs: this._refs\n });\n };\n\n Component.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.didUpdate) this.props.didUpdate(Object.assign(this.getArgs(), {\n prevProps: cleanProps(prevProps),\n prevState: prevState\n }), snapshot);\n };\n\n Component.prototype.getSnapshotBeforeUpdate = function getSnapshotBeforeUpdate(prevProps, prevState) {\n if (this.props.getSnapshotBeforeUpdate) {\n return this.props.getSnapshotBeforeUpdate(Object.assign(this.getArgs(), {\n prevProps: cleanProps(prevProps),\n prevState: prevState\n }));\n } else {\n return null;\n }\n };\n\n Component.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n render = _props.render;\n\n return render ? render(this.getArgs()) : typeof children === "function" ? children(this.getArgs()) : children || null;\n };\n\n return Component;\n}((external_React_default()).Component);\n\nComponent.defaultProps = {\n getInitialState: function getInitialState() {},\n getRefs: function getRefs() {\n return {};\n }\n};\n\nvar _initialiseProps = function _initialiseProps() {\n var _this2 = this;\n\n this.state = this.props.initialState || this.props.getInitialState(this.props);\n this._refs = this.props.refs || this.props.getRefs(this.getArgs());\n\n this._setState = function () {\n return _this2.setState.apply(_this2, arguments);\n };\n\n this._forceUpdate = function () {\n return _this2.forceUpdate.apply(_this2, arguments);\n };\n};\n\n false ? 0 : void 0;\n\n\n/* harmony default export */ const es = (Component);\n;// CONCATENATED MODULE: ./static/js/customizer/components/reach/portal.js\n\n\n\nlet Portal = _ref => {\n let {\n children,\n container = document.body,\n type = \'reach-portal\'\n } = _ref;\n return (0,external_window_wp_element_.createElement)(es, {\n getRefs: () => ({\n node: null\n }),\n didMount: _ref2 => {\n let {\n refs,\n forceUpdate\n } = _ref2;\n let containerNode = container.hasOwnProperty(\'current\') ? container.current : container;\n refs.node = document.createElement(type);\n containerNode.appendChild(refs.node);\n forceUpdate();\n },\n willUnmount: _ref3 => {\n let {\n refs: {\n node\n }\n } = _ref3;\n let containerNode = container.hasOwnProperty(\'current\') ? container.current : container;\n\n if (containerNode) {\n containerNode.removeChild(node);\n }\n },\n render: _ref4 => {\n let {\n refs: {\n node\n }\n } = _ref4;\n return node ? (0,external_window_wp_element_.createPortal)(children, node) : null;\n }\n });\n};\n\n/* harmony default export */ const portal = (Portal);\n;// CONCATENATED MODULE: ./node_modules/@reach/utils/es/index.js\nvar checkedPkgs = {};\n\nvar checkStyles = function checkStyles() {};\n\nif (false) {}\n\n\n\nvar wrapEvent = function wrapEvent(theirHandler, ourHandler) {\n return function (event) {\n theirHandler && theirHandler(event);\n if (!event.defaultPrevented) {\n return ourHandler(event);\n }\n };\n};\n\nvar assignRef = function assignRef(ref, value) {\n if (ref == null) return;\n if (typeof ref === "function") {\n ref(value);\n } else {\n try {\n ref.current = value;\n } catch (error) {\n throw new Error("Cannot assign value \\"" + value + "\\" to ref \\"" + ref + "\\"");\n }\n }\n};\n// EXTERNAL MODULE: ./node_modules/focus-trap/index.js\nvar focus_trap = __webpack_require__(3172);\nvar focus_trap_default = /*#__PURE__*/__webpack_require__.n(focus_trap);\n;// CONCATENATED MODULE: ./static/js/customizer/components/reach/dialog.js\nconst _excluded = ["container", "isOpen", "onDismiss", "initialFocusRef", "onClick", "onKeyDown"],\n _excluded2 = ["onClick", "onKeyDown"],\n _excluded3 = (/* unused pure expression or super */ null && (["container", "isOpen", "onDismiss"]));\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction dialog_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\nlet createAriaHider = dialogNode => {\n let originalValues = [];\n let rootNodes = [];\n Array.prototype.forEach.call(document.querySelectorAll(\'body > *\'), node => {\n if (node === dialogNode.parentNode) {\n return;\n }\n\n let attr = node.getAttribute(\'aria-hidden\');\n let alreadyHidden = attr !== null && attr !== \'false\';\n\n if (alreadyHidden) {\n return;\n }\n\n originalValues.push(attr);\n rootNodes.push(node);\n node.setAttribute(\'aria-hidden\', \'true\');\n });\n return () => {\n rootNodes.forEach((node, index) => {\n let originalValue = originalValues[index];\n\n if (originalValue === null) {\n node.removeAttribute(\'aria-hidden\');\n } else {\n node.setAttribute(\'aria-hidden\', originalValue);\n }\n });\n };\n};\n\nlet k = () => {};\n\nlet checkDialogStyles = () => checkStyles(\'dialog\');\n\nlet portalDidMount = (refs, initialFocusRef) => {\n refs.disposeAriaHider = createAriaHider(refs.overlayNode);\n refs.trap = focus_trap_default()(refs.overlayNode, {\n initialFocus: initialFocusRef ? () => initialFocusRef.current : undefined,\n fallbackFocus: refs.contentNode,\n escapeDeactivates: false,\n clickOutsideDeactivates: false\n }); // refs.trap.activate()\n};\n\nlet contentWillUnmount = _ref => {\n let {\n refs\n } = _ref;\n refs.trap.deactivate();\n refs.disposeAriaHider();\n};\n\nlet FocusContext = React.createContext();\nlet DialogOverlay = React.forwardRef((_ref2, forwardRef) => {\n let {\n container,\n isOpen = true,\n onDismiss = k,\n initialFocusRef,\n onClick,\n onKeyDown\n } = _ref2,\n props = dialog_objectWithoutProperties(_ref2, _excluded);\n\n return (0,external_window_wp_element_.createElement)(es, {\n didMount: checkDialogStyles\n }, isOpen ? (0,external_window_wp_element_.createElement)(portal, {\n container: container,\n "data-reach-dialog-wrapper": true\n }, (0,external_window_wp_element_.createElement)(es, {\n refs: {\n overlayNode: null,\n contentNode: null\n },\n didMount: _ref3 => {\n let {\n refs\n } = _ref3;\n portalDidMount(refs, initialFocusRef);\n },\n willUnmount: contentWillUnmount\n }, _ref4 => {\n let {\n refs\n } = _ref4;\n return (0,external_window_wp_element_.createElement)(FocusContext.Provider, {\n value: node => refs.contentNode = node\n }, (0,external_window_wp_element_.createElement)("div", _extends({\n "data-reach-dialog-overlay": true,\n onClick: wrapEvent(onClick, event => {\n event.stopPropagation();\n onDismiss();\n }),\n onKeyDown: wrapEvent(onKeyDown, event => {\n if (event.key === \'Escape\') {\n event.stopPropagation();\n onDismiss();\n }\n }),\n ref: node => {\n refs.overlayNode = node;\n forwardRef && forwardRef(node);\n }\n }, props)));\n })) : null);\n});\nDialogOverlay.propTypes = {\n initialFocusRef: () => {}\n};\n\nlet stopPropagation = event => event.stopPropagation();\n\nlet DialogContent = React.forwardRef((_ref5, forwardRef) => {\n let {\n onClick,\n onKeyDown\n } = _ref5,\n props = dialog_objectWithoutProperties(_ref5, _excluded2);\n\n return (0,external_window_wp_element_.createElement)(FocusContext.Consumer, null, contentRef => (0,external_window_wp_element_.createElement)("div", _extends({\n "aria-modal": "true",\n "data-reach-dialog-content": true,\n tabIndex: "-1",\n onClick: wrapEvent(onClick, stopPropagation),\n ref: node => {\n contentRef(node);\n forwardRef && forwardRef(node);\n }\n }, props)));\n});\n\nlet Dialog = _ref6 => {\n let {\n container,\n isOpen,\n onDismiss = k\n } = _ref6,\n props = dialog_objectWithoutProperties(_ref6, _excluded3);\n\n return createElement(DialogOverlay, {\n container: container,\n isOpen: isOpen,\n onDismiss: onDismiss\n }, createElement(DialogContent, props));\n};\n\n\n// EXTERNAL MODULE: ./node_modules/react-spring/renderprops.js\nvar renderprops = __webpack_require__(4823);\n// EXTERNAL MODULE: external "window.wp.i18n"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\n;// CONCATENATED MODULE: ./static/js/customizer/components/Overlay.js\n\n\n\n\n\n\nconst defaultIsVisible = i => !!i;\n\nconst Overlay = _ref => {\n let {\n items,\n isVisible = defaultIsVisible,\n render,\n className,\n initialFocusRef,\n onDismiss\n } = _ref;\n return (0,external_window_wp_element_.createElement)(renderprops/* Transition */.uT, {\n items: items,\n onStart: () => document.body.classList[isVisible(items) ? \'add\' : \'remove\'](\'ct-dashboard-overlay-open\'),\n config: {\n duration: 200\n },\n from: {\n opacity: 0,\n y: -10\n },\n enter: {\n opacity: 1,\n y: 0\n },\n leave: {\n opacity: 0,\n y: 10\n }\n }, items => isVisible(items) && (props => (0,external_window_wp_element_.createElement)(DialogOverlay, {\n style: {\n opacity: props.opacity\n },\n container: document.body,\n onDismiss: () => onDismiss(),\n initialFocusRef: initialFocusRef\n }, (0,external_window_wp_element_.createElement)(DialogContent, {\n className: className,\n style: {\n transform: `translate3d(0px, ${props.y}px, 0px)`\n }\n }, (0,external_window_wp_element_.createElement)("button", {\n className: "close-button",\n onClick: () => onDismiss()\n }, "\\xD7"), render(items, props)))));\n};\n\n/* harmony default export */ const components_Overlay = (Overlay);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEzNi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBYUE7QUFDQTtBQUNBOztBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUNuS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQHJlYWNoL2NvbXBvbmVudC1jb21wb25lbnQvZXMvaW5kZXguanM/MDY0MyIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL2NvbXBvbmVudHMvcmVhY2gvcG9ydGFsLmpzPzYwZjkiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQHJlYWNoL3V0aWxzL2VzL2luZGV4LmpzPzVlOGYiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9jb21wb25lbnRzL3JlYWNoL2RpYWxvZy5qcz8wY2NhIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL2N1c3RvbWl6ZXIvY29tcG9uZW50cy9PdmVybGF5LmpzP2NiMDAiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IG9iamVjdCwgZnVuYywgb25lT2ZUeXBlLCBub2RlIH0gZnJvbSBcInByb3AtdHlwZXNcIjtcblxudmFyIGNsZWFuUHJvcHMgPSBmdW5jdGlvbiBjbGVhblByb3BzKHByb3BzKSB7XG4gIHZhciBpbml0aWFsU3RhdGUgPSBwcm9wcy5pbml0aWFsU3RhdGUsXG4gICAgICBnZXRJbml0aWFsU3RhdGUgPSBwcm9wcy5nZXRJbml0aWFsU3RhdGUsXG4gICAgICByZWZzID0gcHJvcHMucmVmcyxcbiAgICAgIGdldFJlZnMgPSBwcm9wcy5nZXRSZWZzLFxuICAgICAgZGlkTW91bnQgPSBwcm9wcy5kaWRNb3VudCxcbiAgICAgIGRpZFVwZGF0ZSA9IHByb3BzLmRpZFVwZGF0ZSxcbiAgICAgIHdpbGxVbm1vdW50ID0gcHJvcHMud2lsbFVubW91bnQsXG4gICAgICBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHByb3BzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlLFxuICAgICAgc2hvdWxkVXBkYXRlID0gcHJvcHMuc2hvdWxkVXBkYXRlLFxuICAgICAgcmVuZGVyID0gcHJvcHMucmVuZGVyLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiaW5pdGlhbFN0YXRlXCIsIFwiZ2V0SW5pdGlhbFN0YXRlXCIsIFwicmVmc1wiLCBcImdldFJlZnNcIiwgXCJkaWRNb3VudFwiLCBcImRpZFVwZGF0ZVwiLCBcIndpbGxVbm1vdW50XCIsIFwiZ2V0U25hcHNob3RCZWZvcmVVcGRhdGVcIiwgXCJzaG91bGRVcGRhdGVcIiwgXCJyZW5kZXJcIl0pO1xuXG4gIHJldHVybiByZXN0O1xufTtcblxudmFyIENvbXBvbmVudCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhDb21wb25lbnQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENvbXBvbmVudCgpIHtcbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbXBvbmVudCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX2luaXRpYWxpc2VQcm9wcy5jYWxsKF90aGlzKSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBDb21wb25lbnQucHJvdG90eXBlLmdldEFyZ3MgPSBmdW5jdGlvbiBnZXRBcmdzKCkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgIHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc2V0U3RhdGUgPSB0aGlzLl9zZXRTdGF0ZSxcbiAgICAgICAgZm9yY2VVcGRhdGUgPSB0aGlzLl9mb3JjZVVwZGF0ZSxcbiAgICAgICAgcmVmcyA9IHRoaXMuX3JlZnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgcHJvcHM6IGNsZWFuUHJvcHMocHJvcHMpLFxuICAgICAgcmVmczogcmVmcyxcbiAgICAgIHNldFN0YXRlOiBzZXRTdGF0ZSxcbiAgICAgIGZvcmNlVXBkYXRlOiBmb3JjZVVwZGF0ZVxuICAgIH07XG4gIH07XG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLmRpZE1vdW50KSB0aGlzLnByb3BzLmRpZE1vdW50KHRoaXMuZ2V0QXJncygpKTtcbiAgfTtcblxuICBDb21wb25lbnQucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3VsZFVwZGF0ZSkgcmV0dXJuIHRoaXMucHJvcHMuc2hvdWxkVXBkYXRlKHtcbiAgICAgIHByb3BzOiB0aGlzLnByb3BzLFxuICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICBuZXh0UHJvcHM6IGNsZWFuUHJvcHMobmV4dFByb3BzKSxcbiAgICAgIG5leHRTdGF0ZTogbmV4dFN0YXRlXG4gICAgfSk7ZWxzZSByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBDb21wb25lbnQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMud2lsbFVubW91bnQpIHRoaXMucHJvcHMud2lsbFVubW91bnQoe1xuICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICBwcm9wczogY2xlYW5Qcm9wcyh0aGlzLnByb3BzKSxcbiAgICAgIHJlZnM6IHRoaXMuX3JlZnNcbiAgICB9KTtcbiAgfTtcblxuICBDb21wb25lbnQucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgc25hcHNob3QpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5kaWRVcGRhdGUpIHRoaXMucHJvcHMuZGlkVXBkYXRlKE9iamVjdC5hc3NpZ24odGhpcy5nZXRBcmdzKCksIHtcbiAgICAgIHByZXZQcm9wczogY2xlYW5Qcm9wcyhwcmV2UHJvcHMpLFxuICAgICAgcHJldlN0YXRlOiBwcmV2U3RhdGVcbiAgICB9KSwgc25hcHNob3QpO1xuICB9O1xuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPSBmdW5jdGlvbiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShPYmplY3QuYXNzaWduKHRoaXMuZ2V0QXJncygpLCB7XG4gICAgICAgIHByZXZQcm9wczogY2xlYW5Qcm9wcyhwcmV2UHJvcHMpLFxuICAgICAgICBwcmV2U3RhdGU6IHByZXZTdGF0ZVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICByZW5kZXIgPSBfcHJvcHMucmVuZGVyO1xuXG4gICAgcmV0dXJuIHJlbmRlciA/IHJlbmRlcih0aGlzLmdldEFyZ3MoKSkgOiB0eXBlb2YgY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IGNoaWxkcmVuKHRoaXMuZ2V0QXJncygpKSA6IGNoaWxkcmVuIHx8IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9IHtcbiAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKSB7fSxcbiAgZ2V0UmVmczogZnVuY3Rpb24gZ2V0UmVmcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn07XG5cbnZhciBfaW5pdGlhbGlzZVByb3BzID0gZnVuY3Rpb24gX2luaXRpYWxpc2VQcm9wcygpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdGhpcy5zdGF0ZSA9IHRoaXMucHJvcHMuaW5pdGlhbFN0YXRlIHx8IHRoaXMucHJvcHMuZ2V0SW5pdGlhbFN0YXRlKHRoaXMucHJvcHMpO1xuICB0aGlzLl9yZWZzID0gdGhpcy5wcm9wcy5yZWZzIHx8IHRoaXMucHJvcHMuZ2V0UmVmcyh0aGlzLmdldEFyZ3MoKSk7XG5cbiAgdGhpcy5fc2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF90aGlzMi5zZXRTdGF0ZS5hcHBseShfdGhpczIsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgdGhpcy5fZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF90aGlzMi5mb3JjZVVwZGF0ZS5hcHBseShfdGhpczIsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuXG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDb21wb25lbnQucHJvcFR5cGVzID0ge1xuICBpbml0aWFsU3RhdGU6IG9iamVjdCxcbiAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jLFxuICByZWZzOiBvYmplY3QsXG4gIGdldFJlZnM6IGZ1bmMsXG4gIGRpZE1vdW50OiBmdW5jLFxuICBkaWRVcGRhdGU6IGZ1bmMsXG4gIHdpbGxVbm1vdW50OiBmdW5jLFxuICBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZTogZnVuYyxcbiAgc2hvdWxkVXBkYXRlOiBmdW5jLFxuICByZW5kZXI6IGZ1bmMsXG4gIGNoaWxkcmVuOiBvbmVPZlR5cGUoW2Z1bmMsIG5vZGVdKVxufSA6IHZvaWQgMDtcblxuXG5leHBvcnQgZGVmYXVsdCBDb21wb25lbnQ7IiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgdXNlRWZmZWN0LCBjcmVhdGVQb3J0YWwsIHVzZVN0YXRlLCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJ0ByZWFjaC9jb21wb25lbnQtY29tcG9uZW50JztcblxubGV0IFBvcnRhbCA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGNoaWxkcmVuLFxuICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmJvZHksXG4gICAgdHlwZSA9ICdyZWFjaC1wb3J0YWwnXG4gIH0gPSBfcmVmO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHtcbiAgICBnZXRSZWZzOiAoKSA9PiAoe1xuICAgICAgbm9kZTogbnVsbFxuICAgIH0pLFxuICAgIGRpZE1vdW50OiBfcmVmMiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICByZWZzLFxuICAgICAgICBmb3JjZVVwZGF0ZVxuICAgICAgfSA9IF9yZWYyO1xuICAgICAgbGV0IGNvbnRhaW5lck5vZGUgPSBjb250YWluZXIuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSA/IGNvbnRhaW5lci5jdXJyZW50IDogY29udGFpbmVyO1xuICAgICAgcmVmcy5ub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTtcbiAgICAgIGNvbnRhaW5lck5vZGUuYXBwZW5kQ2hpbGQocmVmcy5ub2RlKTtcbiAgICAgIGZvcmNlVXBkYXRlKCk7XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogX3JlZjMgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgcmVmczoge1xuICAgICAgICAgIG5vZGVcbiAgICAgICAgfVxuICAgICAgfSA9IF9yZWYzO1xuICAgICAgbGV0IGNvbnRhaW5lck5vZGUgPSBjb250YWluZXIuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSA/IGNvbnRhaW5lci5jdXJyZW50IDogY29udGFpbmVyO1xuXG4gICAgICBpZiAoY29udGFpbmVyTm9kZSkge1xuICAgICAgICBjb250YWluZXJOb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVuZGVyOiBfcmVmNCA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICByZWZzOiB7XG4gICAgICAgICAgbm9kZVxuICAgICAgICB9XG4gICAgICB9ID0gX3JlZjQ7XG4gICAgICByZXR1cm4gbm9kZSA/IGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgbm9kZSkgOiBudWxsO1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQb3J0YWw7IiwidmFyIGNoZWNrZWRQa2dzID0ge307XG5cbnZhciBjaGVja1N0eWxlcyA9IGZ1bmN0aW9uIGNoZWNrU3R5bGVzKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgY2hlY2tTdHlsZXMgPSBmdW5jdGlvbiBjaGVja1N0eWxlcyhwa2cpIHtcbiAgICAvLyBvbmx5IGNoZWNrIG9uY2UgcGVyIHBhY2thZ2VcbiAgICBpZiAoY2hlY2tlZFBrZ3NbcGtnXSkgcmV0dXJuO1xuICAgIGNoZWNrZWRQa2dzW3BrZ10gPSB0cnVlO1xuXG4gICAgaWYgKHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoXCItLXJlYWNoLVwiICsgcGtnKSwgMTApICE9PSAxKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJAcmVhY2gvXCIgKyBwa2cgKyBcIiBzdHlsZXMgbm90IGZvdW5kLiBJZiB5b3UgYXJlIHVzaW5nIGEgYnVuZGxlciBsaWtlIHdlYnBhY2sgb3IgcGFyY2VsIGluY2x1ZGUgdGhpcyBpbiB0aGUgZW50cnkgZmlsZSBvZiB5b3VyIGFwcCBiZWZvcmUgYW55IG9mIHlvdXIgb3duIHN0eWxlczpcXG5cXG4gICAgaW1wb3J0IFxcXCJAcmVhY2gvXCIgKyBwa2cgKyBcIi9zdHlsZXMuY3NzXFxcIjtcXG5cXG4gIE90aGVyd2lzZSB5b3UnbGwgbmVlZCB0byBpbmNsdWRlIHRoZW0gc29tZSBvdGhlciB3YXk6XFxuXFxuICAgIDxsaW5rIHJlbD1cXFwic3R5bGVzaGVldFxcXCIgdHlwZT1cXFwidGV4dC9jc3NcXFwiIGhyZWY9XFxcIm5vZGVfbW9kdWxlcy9AcmVhY2gvXCIgKyBwa2cgKyBcIi9zdHlsZXMuY3NzXFxcIiAvPlxcblxcbiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gdmlzaXQgaHR0cHM6Ly91aS5yZWFjaC50ZWNoL3N0eWxpbmcuXFxuICBcIik7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgeyBjaGVja1N0eWxlcyB9O1xuXG5leHBvcnQgdmFyIHdyYXBFdmVudCA9IGZ1bmN0aW9uIHdyYXBFdmVudCh0aGVpckhhbmRsZXIsIG91ckhhbmRsZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHRoZWlySGFuZGxlciAmJiB0aGVpckhhbmRsZXIoZXZlbnQpO1xuICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuIG91ckhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCB2YXIgYXNzaWduUmVmID0gZnVuY3Rpb24gYXNzaWduUmVmKHJlZiwgdmFsdWUpIHtcbiAgaWYgKHJlZiA9PSBudWxsKSByZXR1cm47XG4gIGlmICh0eXBlb2YgcmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZWYodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYXNzaWduIHZhbHVlIFxcXCJcIiArIHZhbHVlICsgXCJcXFwiIHRvIHJlZiBcXFwiXCIgKyByZWYgKyBcIlxcXCJcIik7XG4gICAgfVxuICB9XG59OyIsImNvbnN0IF9leGNsdWRlZCA9IFtcImNvbnRhaW5lclwiLCBcImlzT3BlblwiLCBcIm9uRGlzbWlzc1wiLCBcImluaXRpYWxGb2N1c1JlZlwiLCBcIm9uQ2xpY2tcIiwgXCJvbktleURvd25cIl0sXG4gICAgICBfZXhjbHVkZWQyID0gW1wib25DbGlja1wiLCBcIm9uS2V5RG93blwiXSxcbiAgICAgIF9leGNsdWRlZDMgPSBbXCJjb250YWluZXJcIiwgXCJpc09wZW5cIiwgXCJvbkRpc21pc3NcIl07XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJ0ByZWFjaC9jb21wb25lbnQtY29tcG9uZW50JztcbmltcG9ydCBQb3J0YWwgZnJvbSAnLi9wb3J0YWwnO1xuaW1wb3J0IHsgY2hlY2tTdHlsZXMsIHdyYXBFdmVudCB9IGZyb20gJ0ByZWFjaC91dGlscyc7XG5pbXBvcnQgY3JlYXRlRm9jdXNUcmFwIGZyb20gJ2ZvY3VzLXRyYXAnO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuXG5sZXQgY3JlYXRlQXJpYUhpZGVyID0gZGlhbG9nTm9kZSA9PiB7XG4gIGxldCBvcmlnaW5hbFZhbHVlcyA9IFtdO1xuICBsZXQgcm9vdE5vZGVzID0gW107XG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSA+IConKSwgbm9kZSA9PiB7XG4gICAgaWYgKG5vZGUgPT09IGRpYWxvZ05vZGUucGFyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBhdHRyID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gICAgbGV0IGFscmVhZHlIaWRkZW4gPSBhdHRyICE9PSBudWxsICYmIGF0dHIgIT09ICdmYWxzZSc7XG5cbiAgICBpZiAoYWxyZWFkeUhpZGRlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG9yaWdpbmFsVmFsdWVzLnB1c2goYXR0cik7XG4gICAgcm9vdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgfSk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgcm9vdE5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWVzW2luZGV4XTtcblxuICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBvcmlnaW5hbFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn07XG5cbmxldCBrID0gKCkgPT4ge307XG5cbmxldCBjaGVja0RpYWxvZ1N0eWxlcyA9ICgpID0+IGNoZWNrU3R5bGVzKCdkaWFsb2cnKTtcblxubGV0IHBvcnRhbERpZE1vdW50ID0gKHJlZnMsIGluaXRpYWxGb2N1c1JlZikgPT4ge1xuICByZWZzLmRpc3Bvc2VBcmlhSGlkZXIgPSBjcmVhdGVBcmlhSGlkZXIocmVmcy5vdmVybGF5Tm9kZSk7XG4gIHJlZnMudHJhcCA9IGNyZWF0ZUZvY3VzVHJhcChyZWZzLm92ZXJsYXlOb2RlLCB7XG4gICAgaW5pdGlhbEZvY3VzOiBpbml0aWFsRm9jdXNSZWYgPyAoKSA9PiBpbml0aWFsRm9jdXNSZWYuY3VycmVudCA6IHVuZGVmaW5lZCxcbiAgICBmYWxsYmFja0ZvY3VzOiByZWZzLmNvbnRlbnROb2RlLFxuICAgIGVzY2FwZURlYWN0aXZhdGVzOiBmYWxzZSxcbiAgICBjbGlja091dHNpZGVEZWFjdGl2YXRlczogZmFsc2VcbiAgfSk7IC8vIHJlZnMudHJhcC5hY3RpdmF0ZSgpXG59O1xuXG5sZXQgY29udGVudFdpbGxVbm1vdW50ID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgcmVmc1xuICB9ID0gX3JlZjtcbiAgcmVmcy50cmFwLmRlYWN0aXZhdGUoKTtcbiAgcmVmcy5kaXNwb3NlQXJpYUhpZGVyKCk7XG59O1xuXG5sZXQgRm9jdXNDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCgpO1xubGV0IERpYWxvZ092ZXJsYXkgPSBSZWFjdC5mb3J3YXJkUmVmKChfcmVmMiwgZm9yd2FyZFJlZikgPT4ge1xuICBsZXQge1xuICAgIGNvbnRhaW5lcixcbiAgICBpc09wZW4gPSB0cnVlLFxuICAgIG9uRGlzbWlzcyA9IGssXG4gICAgaW5pdGlhbEZvY3VzUmVmLFxuICAgIG9uQ2xpY2ssXG4gICAgb25LZXlEb3duXG4gIH0gPSBfcmVmMixcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KENvbXBvbmVudCwge1xuICAgIGRpZE1vdW50OiBjaGVja0RpYWxvZ1N0eWxlc1xuICB9LCBpc09wZW4gPyBjcmVhdGVFbGVtZW50KFBvcnRhbCwge1xuICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgIFwiZGF0YS1yZWFjaC1kaWFsb2ctd3JhcHBlclwiOiB0cnVlXG4gIH0sIGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgcmVmczoge1xuICAgICAgb3ZlcmxheU5vZGU6IG51bGwsXG4gICAgICBjb250ZW50Tm9kZTogbnVsbFxuICAgIH0sXG4gICAgZGlkTW91bnQ6IF9yZWYzID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIHJlZnNcbiAgICAgIH0gPSBfcmVmMztcbiAgICAgIHBvcnRhbERpZE1vdW50KHJlZnMsIGluaXRpYWxGb2N1c1JlZik7XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogY29udGVudFdpbGxVbm1vdW50XG4gIH0sIF9yZWY0ID0+IHtcbiAgICBsZXQge1xuICAgICAgcmVmc1xuICAgIH0gPSBfcmVmNDtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChGb2N1c0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBub2RlID0+IHJlZnMuY29udGVudE5vZGUgPSBub2RlXG4gICAgfSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBcImRhdGEtcmVhY2gtZGlhbG9nLW92ZXJsYXlcIjogdHJ1ZSxcbiAgICAgIG9uQ2xpY2s6IHdyYXBFdmVudChvbkNsaWNrLCBldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBvbkRpc21pc3MoKTtcbiAgICAgIH0pLFxuICAgICAgb25LZXlEb3duOiB3cmFwRXZlbnQob25LZXlEb3duLCBldmVudCA9PiB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgb25EaXNtaXNzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgcmVmOiBub2RlID0+IHtcbiAgICAgICAgcmVmcy5vdmVybGF5Tm9kZSA9IG5vZGU7XG4gICAgICAgIGZvcndhcmRSZWYgJiYgZm9yd2FyZFJlZihub2RlKTtcbiAgICAgIH1cbiAgICB9LCBwcm9wcykpKTtcbiAgfSkpIDogbnVsbCk7XG59KTtcbkRpYWxvZ092ZXJsYXkucHJvcFR5cGVzID0ge1xuICBpbml0aWFsRm9jdXNSZWY6ICgpID0+IHt9XG59O1xuXG5sZXQgc3RvcFByb3BhZ2F0aW9uID0gZXZlbnQgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbmxldCBEaWFsb2dDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZigoX3JlZjUsIGZvcndhcmRSZWYpID0+IHtcbiAgbGV0IHtcbiAgICBvbkNsaWNrLFxuICAgIG9uS2V5RG93blxuICB9ID0gX3JlZjUsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNSwgX2V4Y2x1ZGVkMik7XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRm9jdXNDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBjb250ZW50UmVmID0+IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIFwiYXJpYS1tb2RhbFwiOiBcInRydWVcIixcbiAgICBcImRhdGEtcmVhY2gtZGlhbG9nLWNvbnRlbnRcIjogdHJ1ZSxcbiAgICB0YWJJbmRleDogXCItMVwiLFxuICAgIG9uQ2xpY2s6IHdyYXBFdmVudChvbkNsaWNrLCBzdG9wUHJvcGFnYXRpb24pLFxuICAgIHJlZjogbm9kZSA9PiB7XG4gICAgICBjb250ZW50UmVmKG5vZGUpO1xuICAgICAgZm9yd2FyZFJlZiAmJiBmb3J3YXJkUmVmKG5vZGUpO1xuICAgIH1cbiAgfSwgcHJvcHMpKSk7XG59KTtcblxubGV0IERpYWxvZyA9IF9yZWY2ID0+IHtcbiAgbGV0IHtcbiAgICBjb250YWluZXIsXG4gICAgaXNPcGVuLFxuICAgIG9uRGlzbWlzcyA9IGtcbiAgfSA9IF9yZWY2LFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjYsIF9leGNsdWRlZDMpO1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KERpYWxvZ092ZXJsYXksIHtcbiAgICBjb250YWluZXI6IGNvbnRhaW5lcixcbiAgICBpc09wZW46IGlzT3BlbixcbiAgICBvbkRpc21pc3M6IG9uRGlzbWlzc1xuICB9LCBjcmVhdGVFbGVtZW50KERpYWxvZ0NvbnRlbnQsIHByb3BzKSk7XG59O1xuXG5leHBvcnQgeyBEaWFsb2dPdmVybGF5LCBEaWFsb2dDb250ZW50LCBEaWFsb2cgfTsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZUNvbnRleHQsIGNyZWF0ZUNvbnRleHQsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IERpYWxvZywgRGlhbG9nT3ZlcmxheSwgRGlhbG9nQ29udGVudCB9IGZyb20gJy4vcmVhY2gvZGlhbG9nJztcbmltcG9ydCB7IFRyYW5zaXRpb24gfSBmcm9tICdyZWFjdC1zcHJpbmcvcmVuZGVycHJvcHMnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5jb25zdCBkZWZhdWx0SXNWaXNpYmxlID0gaSA9PiAhIWk7XG5cbmNvbnN0IE92ZXJsYXkgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBpdGVtcyxcbiAgICBpc1Zpc2libGUgPSBkZWZhdWx0SXNWaXNpYmxlLFxuICAgIHJlbmRlcixcbiAgICBjbGFzc05hbWUsXG4gICAgaW5pdGlhbEZvY3VzUmVmLFxuICAgIG9uRGlzbWlzc1xuICB9ID0gX3JlZjtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbiwge1xuICAgIGl0ZW1zOiBpdGVtcyxcbiAgICBvblN0YXJ0OiAoKSA9PiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdFtpc1Zpc2libGUoaXRlbXMpID8gJ2FkZCcgOiAncmVtb3ZlJ10oJ2N0LWRhc2hib2FyZC1vdmVybGF5LW9wZW4nKSxcbiAgICBjb25maWc6IHtcbiAgICAgIGR1cmF0aW9uOiAyMDBcbiAgICB9LFxuICAgIGZyb206IHtcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICB5OiAtMTBcbiAgICB9LFxuICAgIGVudGVyOiB7XG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgbGVhdmU6IHtcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICB5OiAxMFxuICAgIH1cbiAgfSwgaXRlbXMgPT4gaXNWaXNpYmxlKGl0ZW1zKSAmJiAocHJvcHMgPT4gY3JlYXRlRWxlbWVudChEaWFsb2dPdmVybGF5LCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIG9wYWNpdHk6IHByb3BzLm9wYWNpdHlcbiAgICB9LFxuICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keSxcbiAgICBvbkRpc21pc3M6ICgpID0+IG9uRGlzbWlzcygpLFxuICAgIGluaXRpYWxGb2N1c1JlZjogaW5pdGlhbEZvY3VzUmVmXG4gIH0sIGNyZWF0ZUVsZW1lbnQoRGlhbG9nQ29udGVudCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHN0eWxlOiB7XG4gICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwcHgsICR7cHJvcHMueX1weCwgMHB4KWBcbiAgICB9XG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIGNsYXNzTmFtZTogXCJjbG9zZS1idXR0b25cIixcbiAgICBvbkNsaWNrOiAoKSA9PiBvbkRpc21pc3MoKVxuICB9LCBcIlxceEQ3XCIpLCByZW5kZXIoaXRlbXMsIHByb3BzKSkpKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBPdmVybGF5OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7136\n')},4616:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Oi\": () => (/* binding */ getValueForDevice),\n/* harmony export */ \"S0\": () => (/* binding */ isOptionEnabledFor),\n/* harmony export */ \"T\": () => (/* reexport safe */ customizer_sync_helpers_dist_promote_into_responsive__WEBPACK_IMPORTED_MODULE_2__.T),\n/* harmony export */ \"W\": () => (/* binding */ isOptionResponsiveFor),\n/* harmony export */ \"ZP\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var customizer_sync_helpers_dist_promote_into_responsive__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(600);\n/* harmony import */ var _options_GenericOptionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6095);\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n/**\n * true\n * false\n * skip\n */\n\nconst isOptionEnabledFor = (currentDevice, responsiveDescriptor) => _objectSpread({\n desktop: true,\n tablet: true,\n mobile: true\n}, typeof responsiveDescriptor === 'boolean' ? {} : responsiveDescriptor || {})[currentDevice];\nconst isOptionResponsiveFor = function (option) {\n let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let {\n ignoreHidden = false\n } = args;\n let OptionComponent = (0,_options_GenericOptionType__WEBPACK_IMPORTED_MODULE_3__/* .getOptionFor */ .fg)(option);\n\n if (OptionComponent.hiddenResponsive) {\n if (!ignoreHidden) {\n return true;\n }\n }\n\n return !!option.responsive;\n};\nconst getValueForDevice = _ref => {\n let {\n value,\n option,\n device\n } = _ref;\n const devices = ['desktop', 'tablet', 'mobile'];\n\n if (device === 'tablet' && isOptionEnabledFor(device, option.responsive) === 'skip') {\n return value.mobile;\n }\n\n return value[device];\n};\n\nconst ResponsiveControls = _ref2 => {\n let {\n device,\n setDevice,\n responsiveDescriptor\n } = _ref2;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"ct-control-options\"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"ul\", {\n className: \"ct-responsive-controls ct-devices\"\n }, ['desktop', 'tablet', 'mobile'].filter(d => isOptionEnabledFor(d, responsiveDescriptor) !== 'skip').map(d => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"li\", {\n onClick: () => setDevice(d),\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()({\n active: d === device,\n 'ct-disabled': !isOptionEnabledFor(d, responsiveDescriptor)\n }, `ct-${d}`),\n key: d\n }))));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ResponsiveControls);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYxNi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9jb21wb25lbnRzL3Jlc3BvbnNpdmUtY29udHJvbHMuanM/MjZmOCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuZXhwb3J0IHsgbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZSB9IGZyb20gJ2N1c3RvbWl6ZXItc3luYy1oZWxwZXJzL2Rpc3QvcHJvbW90ZS1pbnRvLXJlc3BvbnNpdmUnO1xuaW1wb3J0IHsgZ2V0T3B0aW9uRm9yIH0gZnJvbSAnLi4vLi4vb3B0aW9ucy9HZW5lcmljT3B0aW9uVHlwZSc7XG4vKipcbiAqIHRydWVcbiAqIGZhbHNlXG4gKiBza2lwXG4gKi9cblxuZXhwb3J0IGNvbnN0IGlzT3B0aW9uRW5hYmxlZEZvciA9IChjdXJyZW50RGV2aWNlLCByZXNwb25zaXZlRGVzY3JpcHRvcikgPT4gX29iamVjdFNwcmVhZCh7XG4gIGRlc2t0b3A6IHRydWUsXG4gIHRhYmxldDogdHJ1ZSxcbiAgbW9iaWxlOiB0cnVlXG59LCB0eXBlb2YgcmVzcG9uc2l2ZURlc2NyaXB0b3IgPT09ICdib29sZWFuJyA/IHt9IDogcmVzcG9uc2l2ZURlc2NyaXB0b3IgfHwge30pW2N1cnJlbnREZXZpY2VdO1xuZXhwb3J0IGNvbnN0IGlzT3B0aW9uUmVzcG9uc2l2ZUZvciA9IGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgbGV0IGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBsZXQge1xuICAgIGlnbm9yZUhpZGRlbiA9IGZhbHNlXG4gIH0gPSBhcmdzO1xuICBsZXQgT3B0aW9uQ29tcG9uZW50ID0gZ2V0T3B0aW9uRm9yKG9wdGlvbik7XG5cbiAgaWYgKE9wdGlvbkNvbXBvbmVudC5oaWRkZW5SZXNwb25zaXZlKSB7XG4gICAgaWYgKCFpZ25vcmVIaWRkZW4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAhIW9wdGlvbi5yZXNwb25zaXZlO1xufTtcbmV4cG9ydCBjb25zdCBnZXRWYWx1ZUZvckRldmljZSA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHZhbHVlLFxuICAgIG9wdGlvbixcbiAgICBkZXZpY2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGRldmljZXMgPSBbJ2Rlc2t0b3AnLCAndGFibGV0JywgJ21vYmlsZSddO1xuXG4gIGlmIChkZXZpY2UgPT09ICd0YWJsZXQnICYmIGlzT3B0aW9uRW5hYmxlZEZvcihkZXZpY2UsIG9wdGlvbi5yZXNwb25zaXZlKSA9PT0gJ3NraXAnKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1vYmlsZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVtkZXZpY2VdO1xufTtcblxuY29uc3QgUmVzcG9uc2l2ZUNvbnRyb2xzID0gX3JlZjIgPT4ge1xuICBsZXQge1xuICAgIGRldmljZSxcbiAgICBzZXREZXZpY2UsXG4gICAgcmVzcG9uc2l2ZURlc2NyaXB0b3JcbiAgfSA9IF9yZWYyO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWNvbnRyb2wtb3B0aW9uc1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXJlc3BvbnNpdmUtY29udHJvbHMgY3QtZGV2aWNlc1wiXG4gIH0sIFsnZGVza3RvcCcsICd0YWJsZXQnLCAnbW9iaWxlJ10uZmlsdGVyKGQgPT4gaXNPcHRpb25FbmFibGVkRm9yKGQsIHJlc3BvbnNpdmVEZXNjcmlwdG9yKSAhPT0gJ3NraXAnKS5tYXAoZCA9PiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIG9uQ2xpY2s6ICgpID0+IHNldERldmljZShkKSxcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoe1xuICAgICAgYWN0aXZlOiBkID09PSBkZXZpY2UsXG4gICAgICAnY3QtZGlzYWJsZWQnOiAhaXNPcHRpb25FbmFibGVkRm9yKGQsIHJlc3BvbnNpdmVEZXNjcmlwdG9yKVxuICAgIH0sIGBjdC0ke2R9YCksXG4gICAga2V5OiBkXG4gIH0pKSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUmVzcG9uc2l2ZUNvbnRyb2xzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4616\n")},5458:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"$M\": () => (/* binding */ useDeviceManagerState),\n/* harmony export */ \"Id\": () => (/* binding */ useDeviceManagerActions),\n/* harmony export */ \"Or\": () => (/* binding */ useDeviceManager),\n/* harmony export */ \"jd\": () => (/* binding */ DeviceManagerProvider)\n/* harmony export */ });\n/* unused harmony exports DeviceManagerStateContext, DeviceManagerActionsContext */\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n\nconst DeviceManagerStateContext = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createContext)();\nconst DeviceManagerActionsContext = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createContext)();\nconst useDeviceManagerState = () => {\n const context = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useContext)(DeviceManagerStateContext);\n return context || {\n currentView: 'desktop'\n };\n};\nconst useDeviceManagerActions = () => {\n const context = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useContext)(DeviceManagerActionsContext);\n return context || {};\n};\nconst useDeviceManager = function () {\n let args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const {\n withTablet = true\n } = args;\n const [currentView, setCurrentView] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)(wp.customize && wp.customize.previewedDevice ? wp.customize.previewedDevice() : 'desktop');\n\n const listener = () => {\n setCurrentView(wp.customize && wp.customize.previewedDevice ? wp.customize.previewedDevice() : 'desktop');\n };\n\n (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!wp.customize) return;\n setTimeout(() => wp.customize.previewedDevice.bind(listener), 1000);\n return () => {\n if (!wp.customize) return;\n wp.customize.previewedDevice.unbind(listener);\n };\n }, []);\n return [withTablet ? currentView : currentView === 'tablet' ? 'mobile' : currentView, device => {\n setCurrentView(device);\n wp.customize && wp.customize.previewedDevice.set(device);\n }];\n};\nconst DeviceManagerProvider = _ref => {\n let {\n children\n } = _ref;\n const [currentView, setDevice] = useDeviceManager();\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(DeviceManagerStateContext.Provider, {\n value: {\n currentView\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(DeviceManagerActionsContext.Provider, {\n value: {\n setDevice\n }\n }, children));\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ1OC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL2N1c3RvbWl6ZXIvY29tcG9uZW50cy91c2VEZXZpY2VNYW5hZ2VyLmpzPzNiMGEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIGNyZWF0ZUNvbnRleHQsIGNyZWF0ZUVsZW1lbnQsIHVzZUNvbnRleHQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuZXhwb3J0IGNvbnN0IERldmljZU1hbmFnZXJTdGF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0KCk7XG5leHBvcnQgY29uc3QgRGV2aWNlTWFuYWdlckFjdGlvbnNDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuZXhwb3J0IGNvbnN0IHVzZURldmljZU1hbmFnZXJTdGF0ZSA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRGV2aWNlTWFuYWdlclN0YXRlQ29udGV4dCk7XG4gIHJldHVybiBjb250ZXh0IHx8IHtcbiAgICBjdXJyZW50VmlldzogJ2Rlc2t0b3AnXG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IHVzZURldmljZU1hbmFnZXJBY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChEZXZpY2VNYW5hZ2VyQWN0aW9uc0NvbnRleHQpO1xuICByZXR1cm4gY29udGV4dCB8fCB7fTtcbn07XG5leHBvcnQgY29uc3QgdXNlRGV2aWNlTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICBjb25zdCB7XG4gICAgd2l0aFRhYmxldCA9IHRydWVcbiAgfSA9IGFyZ3M7XG4gIGNvbnN0IFtjdXJyZW50Vmlldywgc2V0Q3VycmVudFZpZXddID0gdXNlU3RhdGUod3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZWREZXZpY2UgPyB3cC5jdXN0b21pemUucHJldmlld2VkRGV2aWNlKCkgOiAnZGVza3RvcCcpO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgIHNldEN1cnJlbnRWaWV3KHdwLmN1c3RvbWl6ZSAmJiB3cC5jdXN0b21pemUucHJldmlld2VkRGV2aWNlID8gd3AuY3VzdG9taXplLnByZXZpZXdlZERldmljZSgpIDogJ2Rlc2t0b3AnKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghd3AuY3VzdG9taXplKSByZXR1cm47XG4gICAgc2V0VGltZW91dCgoKSA9PiB3cC5jdXN0b21pemUucHJldmlld2VkRGV2aWNlLmJpbmQobGlzdGVuZXIpLCAxMDAwKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKCF3cC5jdXN0b21pemUpIHJldHVybjtcbiAgICAgIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZWREZXZpY2UudW5iaW5kKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbd2l0aFRhYmxldCA/IGN1cnJlbnRWaWV3IDogY3VycmVudFZpZXcgPT09ICd0YWJsZXQnID8gJ21vYmlsZScgOiBjdXJyZW50VmlldywgZGV2aWNlID0+IHtcbiAgICBzZXRDdXJyZW50VmlldyhkZXZpY2UpO1xuICAgIHdwLmN1c3RvbWl6ZSAmJiB3cC5jdXN0b21pemUucHJldmlld2VkRGV2aWNlLnNldChkZXZpY2UpO1xuICB9XTtcbn07XG5leHBvcnQgY29uc3QgRGV2aWNlTWFuYWdlclByb3ZpZGVyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWY7XG4gIGNvbnN0IFtjdXJyZW50Vmlldywgc2V0RGV2aWNlXSA9IHVzZURldmljZU1hbmFnZXIoKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRGV2aWNlTWFuYWdlclN0YXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB7XG4gICAgICBjdXJyZW50Vmlld1xuICAgIH1cbiAgfSwgY3JlYXRlRWxlbWVudChEZXZpY2VNYW5hZ2VyQWN0aW9uc0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgc2V0RGV2aWNlXG4gICAgfVxuICB9LCBjaGlsZHJlbikpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5458\n")},7229:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Z\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _sortablejs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4617);\n/* harmony import */ var _sortablejs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_sortablejs__WEBPACK_IMPORTED_MODULE_1__);\nconst _excluded = [\"tag\", \"options\", \"onChange\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nconst store = {\n nextSibling: null,\n activeComponent: null\n};\n\nclass Sortable extends _wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n\n _defineProperty(this, \"sortable\", null);\n }\n\n componentDidMount() {\n var _this = this;\n\n const options = _objectSpread({}, this.props.options);\n\n ['onChoose', 'onStart', 'onEnd', 'onAdd', 'onUpdate', 'onSort', 'onRemove', 'onFilter', 'onMove', 'onClone'].forEach(name => {\n const eventHandler = options[name];\n\n options[name] = function () {\n for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {\n params[_key] = arguments[_key];\n }\n\n const [evt] = params;\n\n if (name === 'onChoose') {\n store.nextSibling = evt.item.nextElementSibling;\n store.activeComponent = _this;\n } else if ((name === 'onAdd' || name === 'onUpdate') && _this.props.onChange) {\n const items = _this.sortable.toArray();\n\n const remote = store.activeComponent;\n const remoteItems = remote.sortable.toArray();\n const referenceNode = store.nextSibling && store.nextSibling.parentNode !== null ? store.nextSibling : null;\n evt.from.insertBefore(evt.item, referenceNode);\n\n if (remote !== _this) {\n const remoteOptions = remote.props.options || {};\n\n if (typeof remoteOptions.group === 'object' && remoteOptions.group.pull === 'clone') {\n // Remove the node with the same data-reactid\n // evt.item.parentNode.removeChild(evt.item)\n ;\n [...evt.item.parentNode.children].filter(el => el.dataset.id === evt.item.dataset.id && el !== evt.item).map(el => el.remove());\n }\n\n remote.props.onChange && remote.props.onChange(remoteItems, remote.sortable, evt);\n }\n\n _this.props.onChange && _this.props.onChange(items, _this.sortable, evt);\n }\n\n if (evt.type === 'move') {\n const [evt, originalEvent] = params;\n const canMove = eventHandler ? eventHandler(evt, originalEvent) : true;\n return canMove;\n }\n\n setTimeout(() => {\n eventHandler && eventHandler(evt);\n }, 0);\n };\n });\n this.sortable = _sortablejs__WEBPACK_IMPORTED_MODULE_1___default().create(this.node, options);\n }\n\n componentWillUnmount() {\n if (this.sortable) {\n this.sortable.destroy();\n this.sortable = null;\n }\n }\n\n render() {\n const _this$props = this.props,\n {\n tag: Component,\n options,\n onChange\n } = _this$props,\n props = _objectWithoutProperties(_this$props, _excluded);\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(Component, _extends({}, props, {\n ref: node => this.node = node\n }));\n }\n\n}\n\n_defineProperty(Sortable, \"defaultProps\", {\n options: {},\n tag: 'div',\n style: {}\n});\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Sortable);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIyOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9wYW5lbHMtYnVpbGRlci9wbGFjZW1lbnRzL1NvcnRhYmxlLmpzPzkzMGMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgX2V4Y2x1ZGVkID0gW1widGFnXCIsIFwib3B0aW9uc1wiLCBcIm9uQ2hhbmdlXCJdO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBTb3J0YWJsZUpTLCB7IFNvcnRhYmxlIGFzIFNvcnRhYmxlQ2hhbmdlZCB9IGZyb20gJy4vc29ydGFibGVqcyc7XG5jb25zdCBzdG9yZSA9IHtcbiAgbmV4dFNpYmxpbmc6IG51bGwsXG4gIGFjdGl2ZUNvbXBvbmVudDogbnVsbFxufTtcblxuY2xhc3MgU29ydGFibGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic29ydGFibGVcIiwgbnVsbCk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoe30sIHRoaXMucHJvcHMub3B0aW9ucyk7XG5cbiAgICBbJ29uQ2hvb3NlJywgJ29uU3RhcnQnLCAnb25FbmQnLCAnb25BZGQnLCAnb25VcGRhdGUnLCAnb25Tb3J0JywgJ29uUmVtb3ZlJywgJ29uRmlsdGVyJywgJ29uTW92ZScsICdvbkNsb25lJ10uZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50SGFuZGxlciA9IG9wdGlvbnNbbmFtZV07XG5cbiAgICAgIG9wdGlvbnNbbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwYXJhbXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgcGFyYW1zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2V2dF0gPSBwYXJhbXM7XG5cbiAgICAgICAgaWYgKG5hbWUgPT09ICdvbkNob29zZScpIHtcbiAgICAgICAgICBzdG9yZS5uZXh0U2libGluZyA9IGV2dC5pdGVtLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICBzdG9yZS5hY3RpdmVDb21wb25lbnQgPSBfdGhpcztcbiAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PT0gJ29uQWRkJyB8fCBuYW1lID09PSAnb25VcGRhdGUnKSAmJiBfdGhpcy5wcm9wcy5vbkNoYW5nZSkge1xuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gX3RoaXMuc29ydGFibGUudG9BcnJheSgpO1xuXG4gICAgICAgICAgY29uc3QgcmVtb3RlID0gc3RvcmUuYWN0aXZlQ29tcG9uZW50O1xuICAgICAgICAgIGNvbnN0IHJlbW90ZUl0ZW1zID0gcmVtb3RlLnNvcnRhYmxlLnRvQXJyYXkoKTtcbiAgICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlID0gc3RvcmUubmV4dFNpYmxpbmcgJiYgc3RvcmUubmV4dFNpYmxpbmcucGFyZW50Tm9kZSAhPT0gbnVsbCA/IHN0b3JlLm5leHRTaWJsaW5nIDogbnVsbDtcbiAgICAgICAgICBldnQuZnJvbS5pbnNlcnRCZWZvcmUoZXZ0Lml0ZW0sIHJlZmVyZW5jZU5vZGUpO1xuXG4gICAgICAgICAgaWYgKHJlbW90ZSAhPT0gX3RoaXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW90ZU9wdGlvbnMgPSByZW1vdGUucHJvcHMub3B0aW9ucyB8fCB7fTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZW1vdGVPcHRpb25zLmdyb3VwID09PSAnb2JqZWN0JyAmJiByZW1vdGVPcHRpb25zLmdyb3VwLnB1bGwgPT09ICdjbG9uZScpIHtcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBub2RlIHdpdGggdGhlIHNhbWUgZGF0YS1yZWFjdGlkXG4gICAgICAgICAgICAgIC8vIGV2dC5pdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZXZ0Lml0ZW0pXG4gICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgWy4uLmV2dC5pdGVtLnBhcmVudE5vZGUuY2hpbGRyZW5dLmZpbHRlcihlbCA9PiBlbC5kYXRhc2V0LmlkID09PSBldnQuaXRlbS5kYXRhc2V0LmlkICYmIGVsICE9PSBldnQuaXRlbSkubWFwKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVtb3RlLnByb3BzLm9uQ2hhbmdlICYmIHJlbW90ZS5wcm9wcy5vbkNoYW5nZShyZW1vdGVJdGVtcywgcmVtb3RlLnNvcnRhYmxlLCBldnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlICYmIF90aGlzLnByb3BzLm9uQ2hhbmdlKGl0ZW1zLCBfdGhpcy5zb3J0YWJsZSwgZXZ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldnQudHlwZSA9PT0gJ21vdmUnKSB7XG4gICAgICAgICAgY29uc3QgW2V2dCwgb3JpZ2luYWxFdmVudF0gPSBwYXJhbXM7XG4gICAgICAgICAgY29uc3QgY2FuTW92ZSA9IGV2ZW50SGFuZGxlciA/IGV2ZW50SGFuZGxlcihldnQsIG9yaWdpbmFsRXZlbnQpIDogdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gY2FuTW92ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGV2ZW50SGFuZGxlciAmJiBldmVudEhhbmRsZXIoZXZ0KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuc29ydGFibGUgPSBTb3J0YWJsZUpTLmNyZWF0ZSh0aGlzLm5vZGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMuc29ydGFibGUpIHtcbiAgICAgIHRoaXMuc29ydGFibGUuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zb3J0YWJsZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB7XG4gICAgICB0YWc6IENvbXBvbmVudCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZVxuICAgIH0gPSBfdGhpcyRwcm9wcyxcbiAgICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICByZWY6IG5vZGUgPT4gdGhpcy5ub2RlID0gbm9kZVxuICAgIH0pKTtcbiAgfVxuXG59XG5cbl9kZWZpbmVQcm9wZXJ0eShTb3J0YWJsZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBvcHRpb25zOiB7fSxcbiAgdGFnOiAnZGl2JyxcbiAgc3R5bGU6IHt9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgU29ydGFibGU7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7229\n")},8382:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SU\": () => (/* binding */ customItemsSeparator),\n/* harmony export */ \"t_\": () => (/* binding */ getOriginalId)\n/* harmony export */ });\n/* unused harmony export shortenItemId */\nconst customItemsSeparator = () => '~';\nconst getOriginalId = id => id.split('~')[0];\nconst shortenItemId = id => {\n let components = id.split(customItemsSeparator());\n\n if (components.length === 1) {\n return components[0];\n }\n\n return components[1].substring(0, 6);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODM4Mi5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL3BsYWNlbWVudHMvaGVscGVycy5qcz81YzI5Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBjdXN0b21JdGVtc1NlcGFyYXRvciA9ICgpID0+ICd+JztcbmV4cG9ydCBjb25zdCBnZXRPcmlnaW5hbElkID0gaWQgPT4gaWQuc3BsaXQoJ34nKVswXTtcbmV4cG9ydCBjb25zdCBzaG9ydGVuSXRlbUlkID0gaWQgPT4ge1xuICBsZXQgY29tcG9uZW50cyA9IGlkLnNwbGl0KGN1c3RvbUl0ZW1zU2VwYXJhdG9yKCkpO1xuXG4gIGlmIChjb21wb25lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBjb21wb25lbnRzWzBdO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBvbmVudHNbMV0uc3Vic3RyaW5nKDAsIDYpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8382\n")},4617:function(module){eval('const _excluded = ["evt"];\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**!\n * Sortable 1.11.0\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\n(function (global, factory) {\n true ? module.exports = factory() : 0;\n})(this, function () {\n "use strict";\n\n const __warn = "" + "Importing Sortable directly from GitHub is deprecated.\\n" + "This file will not receive any more updates.\\n" + "Please follow the usage instructions to continue getting support: https://github.com/SortableJS/Sortable"; // console.warn(__warn);\n\n\n var version = "1.11.0";\n\n function userAgent(pattern) {\n if (typeof window !== "undefined" && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n }\n\n const IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\n const Edge = userAgent(/Edge/i);\n const FireFox = userAgent(/firefox/i);\n const Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\n const IOS = userAgent(/iP(ad|od|hone)/i);\n const ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n const captureMode = {\n capture: false,\n passive: false\n };\n\n function on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n }\n\n function off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n }\n\n function matches(\n /**HTMLElement*/\n el,\n /**String*/\n selector) {\n if (!selector) return;\n selector[0] === ">" && (selector = selector.substring(1));\n\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n\n return false;\n }\n\n function getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n }\n\n function closest(\n /**HTMLElement*/\n el,\n /**String*/\n selector,\n /**HTMLElement*/\n ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n\n do {\n if (selector != null && (selector[0] === ">" ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n\n return null;\n }\n\n const R_SPACE = /\\s+/g;\n\n function toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? "add" : "remove"](name);\n } else {\n let className = (" " + el.className + " ").replace(R_SPACE, " ").replace(" " + name + " ", " ");\n el.className = (className + (state ? " " + name : "")).replace(R_SPACE, " ");\n }\n }\n }\n\n function css(el, prop, val) {\n let style = el && el.style;\n\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, "");\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf("webkit") === -1) {\n prop = "-webkit-" + prop;\n }\n\n style[prop] = val + (typeof val === "string" ? "" : "px");\n }\n }\n }\n\n function matrix(el, selfOnly) {\n let appliedTransforms = "";\n\n if (typeof el === "string") {\n appliedTransforms = el;\n } else {\n do {\n //@ts-ignore\n let transform = css(el, "transform");\n\n if (transform && transform !== "none") {\n appliedTransforms = transform + " " + appliedTransforms;\n }\n /* jshint boss:true */\n\n } while (!selfOnly && (el = el.parentNode));\n } //@ts-ignore\n\n\n const matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n\n return matrixFn && new matrixFn(appliedTransforms);\n }\n\n function find(ctx, tagName, iterator) {\n if (ctx) {\n let list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n\n return list;\n }\n\n return [];\n }\n\n function getWindowScrollingElement() {\n let scrollingElement = document.scrollingElement;\n\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n }\n /**\n * Returns the "bounding client rect" of given element\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\n * @param {[Boolean]} undoScale Whether the container\'s scale() should be undone\n * @param {[HTMLElement]} container The parent the element will be placed in\n * @return {Object} The boundingClientRect of el, with specified adjustments\n */\n\n\n function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n let elRect, top, left, bottom, right, height, width;\n\n if (el !== window && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && ( //@ts-ignore\n css(container, "transform") !== "none" || relativeToNonStaticParent && //@ts-ignore\n css(container, "position") !== "static")) {\n let containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container\n //@ts-ignore\n\n top -= containerRect.top + parseInt(css(container, "border-top-width")); //@ts-ignore\n\n left -= containerRect.left + parseInt(css(container, "border-left-width"));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n\n } while (container = container.parentNode);\n }\n }\n\n if (undoScale && el !== window) {\n // Adjust for scale()\n //@ts-ignore\n let elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n }\n /**\n * Checks if a side of an element is scrolled past a side of its parents\n * @param {HTMLElement} el The element who\'s side being scrolled out of view is in question\n * @param {String} elSide Side of the element in question (\'top\', \'left\', \'right\', \'bottom\')\n * @param {String} parentSide Side of the parent in question (\'top\', \'left\', \'right\', \'bottom\')\n * @return {HTMLElement} The parent scroll element that the el\'s side is scrolled past, or null if there is no such element\n */\n\n\n function isScrolledPast(el, elSide, parentSide) {\n let parent = getParentAutoScrollElement(el, true),\n //@ts-ignore\n elSideVal = getRect(el)[elSide];\n /* jshint boss:true */\n\n while (parent) {\n //@ts-ignore\n let parentSideVal = getRect(parent)[parentSide],\n visible;\n\n if (parentSide === "top" || parentSide === "left") {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n\n return false;\n }\n /**\n * Gets nth child of el, ignoring hidden children, sortable\'s elements (does not ignore clone if it\'s visible)\n * and non-draggable elements\n * @param {HTMLElement} el The parent element\n * @param {Number} childNum The index of the child\n * @param {Object} options Parent Sortable\'s options\n * @return {HTMLElement} The child at index childNum, or null if not found\n */\n\n\n function getChild(el, childNum, options) {\n let currentChild = 0,\n i = 0,\n children = el.children;\n\n while (i < children.length) {\n if (children[i].style.display !== "none" && //@ts-ignore\n children[i] !== Sortable.ghost && //@ts-ignore\n children[i] !== Sortable.dragged && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n\n currentChild++;\n }\n\n i++;\n }\n\n return null;\n }\n /**\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\n * @param {HTMLElement} el Parent element\n * @param {selector} selector Any other elements that should be ignored\n * @return {HTMLElement} The last child, ignoring ghostEl\n */\n\n\n function lastChild(el, selector) {\n let last = el.lastElementChild;\n\n while (last && ( //@ts-ignore\n last === Sortable.ghost || //@ts-ignore\n css(last, "display") === "none" || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n\n return last || null;\n }\n /**\n * Returns the index of an element within its parent for a selected set of\n * elements\n * @param {HTMLElement} el\n * @param {selector} selector\n * @return {number}\n */\n\n\n function index(el, selector) {\n let index = 0;\n\n if (!el || !el.parentNode) {\n return -1;\n }\n /* jshint boss:true */\n\n\n while (el = el.previousElementSibling) {\n //@ts-ignore\n if (el.nodeName.toUpperCase() !== "TEMPLATE" && !el.matches(\'.ct-pointer\') && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n\n return index;\n }\n /**\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\n * The value is returned in real pixels.\n * @param {HTMLElement} el\n * @return {Array} Offsets in the format of [left, top]\n */\n\n\n function getRelativeScrollOffset(el) {\n let offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n\n if (el) {\n do {\n //@ts-ignore\n let elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n\n return [offsetLeft, offsetTop];\n }\n /**\n * Returns the index of the object within the given array\n * @param {Array} arr Array that may or may not hold the object\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\n * @return {Number} The index of the object in the array, or -1\n */\n\n\n function indexOfObject(arr, obj) {\n for (let i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n for (let key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n\n return -1;\n }\n\n function getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n let elem = el;\n let gotSelf = false;\n\n do {\n // we don\'t need to get elem css if it isn\'t even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n //@ts-ignore\n let elemCSS = css(elem);\n\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll")) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n\n } while (elem = elem.parentNode);\n\n return getWindowScrollingElement();\n }\n\n function extend(dst, src) {\n if (dst && src) {\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n\n return dst;\n }\n\n function isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n }\n\n let _throttleTimeout;\n\n function throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n let args = arguments,\n _this = this;\n\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n }\n\n function cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n }\n\n function scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n }\n\n function clone(el) {\n //@ts-ignore\n let Polymer = window.Polymer; //@ts-ignore\n\n let $ = window.jQuery || window.Zepto;\n\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n }\n\n function setRect(el, rect) {\n css(el, "position", "absolute");\n css(el, "top", rect.top);\n css(el, "left", rect.left);\n css(el, "width", rect.width);\n css(el, "height", rect.height);\n }\n\n function unsetRect(el) {\n css(el, "position", "");\n css(el, "top", "");\n css(el, "left", "");\n css(el, "width", "");\n css(el, "height", "");\n }\n\n const expando = "Sortable" + new Date().getTime();\n\n function AnimationStateManager() {\n let animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n let children = [].slice.call(this.el.children);\n children.forEach(child => {\n if (css(child, "display") === "none" || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n\n let fromRect = _objectSpread({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation\n\n\n if (child.thisAnimationDuration) {\n let childMatrix = matrix(child, true);\n\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n\n child.fromRect = fromRect;\n });\n },\n\n addAnimationState(state) {\n animationStates.push(state);\n },\n\n removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target\n }), 1);\n },\n\n animateAll(callback) {\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === "function") callback();\n return;\n }\n\n let animating = false,\n animationTime = 0;\n animationStates.forEach(state => {\n let time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n\n target.toRect = toRect;\n\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, this.options);\n }\n } // if fromRect != toRect: animate\n\n\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n\n if (!time) {\n time = this.options.animation;\n }\n\n this.animate(target, animatingRect, toRect, time);\n }\n\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n\n if (!animating) {\n if (typeof callback === "function") callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === "function") callback();\n }, animationTime);\n }\n\n animationStates = [];\n },\n\n animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, "transition", "");\n css(target, "transform", "");\n let elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, "transform", "translate3d(" + translateX + "px," + translateY + "px,0)");\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, "transition", "transform " + duration + "ms" + (this.options.easing ? " " + this.options.easing : ""));\n css(target, "transform", "translate3d(0,0,0)");\n typeof target.animated === "number" && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, "transition", "");\n css(target, "transform", "");\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n\n };\n }\n\n function repaint(target) {\n return target.offsetWidth;\n }\n\n function calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n }\n\n let plugins = [];\n const defaults = {\n initializeByDefault: true\n };\n var PluginManager = {\n mount(plugin) {\n // Set default static properties\n for (let option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n\n plugins.push(plugin);\n },\n\n pluginEvent(eventName, sortable, evt) {\n this.eventCanceled = false;\n\n evt.cancel = () => {\n this.eventCanceled = true;\n };\n\n const eventNameGlobal = eventName + "Global";\n plugins.forEach(plugin => {\n if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable\n\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread({\n sortable\n }, evt));\n } // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n\n\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread({\n sortable\n }, evt));\n }\n });\n },\n\n initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(plugin => {\n const pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n let initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized; // Add default options from plugin\n\n Object.assign(defaults, initialized.defaults);\n });\n\n for (let option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n let modified = this.modifyOption(sortable, option, sortable.options[option]);\n\n if (typeof modified !== "undefined") {\n sortable.options[option] = modified;\n }\n }\n },\n\n getEventProperties(name, sortable) {\n let eventProperties = {};\n plugins.forEach(plugin => {\n if (typeof plugin.eventProperties !== "function") return;\n Object.assign(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n\n modifyOption(sortable, name, value) {\n let modifiedValue;\n plugins.forEach(plugin => {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable\'s instance of this plugin\n\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === "function") {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n\n };\n\n function dispatchEvent(_ref) {\n let {\n sortable,\n rootEl,\n name,\n targetEl,\n cloneEl,\n toEl,\n fromEl,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n originalEvent,\n putSortable,\n extraEventProperties\n } = _ref;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n let evt,\n options = sortable.options,\n onName = "on" + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent("Event");\n evt.initEvent(name, true, true);\n }\n\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n\n let allEventProperties = _objectSpread(_objectSpread({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n\n for (let option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n }\n /**!\n * Sortable\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\n\n\n let pluginEvent = function (eventName, sortable) {\n let _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n let {\n evt: originalEvent\n } = _ref2,\n data = _objectWithoutProperties(_ref2, _excluded);\n\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread({\n dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n dragStarted: moved,\n putSortable,\n activeSortable: Sortable.active,\n originalEvent,\n oldIndex,\n oldDraggableIndex,\n newIndex,\n newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n\n cloneNowHidden() {\n cloneHidden = true;\n },\n\n cloneNowShown() {\n cloneHidden = false;\n },\n\n dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable,\n name,\n originalEvent\n });\n }\n\n }, data));\n };\n\n function _dispatchEvent(info) {\n dispatchEvent(_objectSpread({\n putSortable,\n cloneEl,\n targetEl: dragEl,\n rootEl,\n oldIndex,\n oldDraggableIndex,\n newIndex,\n newDraggableIndex\n }, info));\n }\n\n let dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n _silent = false,\n savedInputChecked = [];\n /** @const */\n\n const documentExists = typeof document !== "undefined",\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? "cssFloat" : "float",\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && "draggable" in document.createElement("div"),\n supportCssPointerEvents = function () {\n if (!documentExists) return; // false when <= IE11\n\n if (IE11OrLess) {\n return false;\n }\n\n let el = document.createElement("x");\n el.style.cssText = "pointer-events:auto";\n return el.style.pointerEvents === "auto";\n }(),\n _detectDirection = function (el, options) {\n let elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n\n if (elCSS.display === "flex") {\n return elCSS.flexDirection === "column" || elCSS.flexDirection === "column-reverse" ? "vertical" : "horizontal";\n }\n\n if (elCSS.display === "grid") {\n return elCSS.gridTemplateColumns.split(" ").length <= 1 ? "vertical" : "horizontal";\n }\n\n if (child1 && firstChildCSS.float && firstChildCSS.float !== "none") {\n let touchingSideChild2 = firstChildCSS.float === "left" ? "left" : "right";\n return child2 && (secondChildCSS.clear === "both" || secondChildCSS.clear === touchingSideChild2) ? "vertical" : "horizontal";\n }\n\n return child1 && (firstChildCSS.display === "block" || firstChildCSS.display === "flex" || firstChildCSS.display === "table" || firstChildCSS.display === "grid" || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === "none" || child2 && elCSS[CSSFloatProperty] === "none" && firstChildWidth + secondChildWidth > elWidth) ? "vertical" : "horizontal";\n },\n _dragElInRowColumn = function (dragRect, targetRect, vertical) {\n let dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n\n /**\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\n * @param {Number} x X position\n * @param {Number} y Y position\n * @return {HTMLElement} Element of the first found nearest Sortable\n */\n _detectNearestEmptySortable = function (x, y) {\n let ret;\n sortables.some(sortable => {\n if (lastChild(sortable)) return;\n let rect = getRect(sortable),\n threshold = sortable[expando].options.emptyInsertThreshold,\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n\n if (threshold && insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function (options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n let sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === "clone") {\n return value;\n } else if (typeof value === "function") {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n let otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === "string" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n\n let group = {};\n let originalGroup = options.group;\n\n if (!originalGroup || typeof originalGroup != "object") {\n originalGroup = {\n name: originalGroup\n };\n }\n\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function () {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, "display", "none");\n }\n },\n _unhideGhostForTarget = function () {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, "display", "");\n }\n }; // #1184 fix - Prevent click event on fallback if dragged but item not changed position\n\n\n if (documentExists) {\n document.addEventListener("click", function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n }\n\n let nearestEmptyInsertDetectEvent = function (evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n\n let nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n\n if (nearest) {\n // Create imitation event\n let event = {};\n\n for (let i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n\n nearest[expando]._onDragOver(event);\n }\n }\n };\n\n let _checkOutsideTargetEl = function (evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n };\n /**\n * @class Sortable\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\n function Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw `Sortable: \\`el\\` must be an HTMLElement, not ${{}.toString.call(el)}`;\n }\n\n this.el = el; // root element\n\n this.options = options = Object.assign({}, options); // Export instance\n\n el[expando] = this;\n let defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? ">li" : ">*",\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function () {\n return _detectDirection(el, this.options);\n },\n ghostClass: "sortable-ghost",\n chosenClass: "sortable-chosen",\n dragClass: "sortable-drag",\n ignore: "a, img",\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function (dataTransfer, dragEl) {\n dataTransfer.setData("Text", dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: "data-id",\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: "sortable-fallback",\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && "PointerEvent" in window,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults); // Set default options\n\n for (let name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n\n _prepareGroup(options); // Bind all private methods\n\n\n for (let fn in this) {\n if (fn.charAt(0) === "_" && typeof this[fn] === "function") {\n this[fn] = this[fn].bind(this);\n }\n } // Setup drag mode\n\n\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n } // Bind events\n\n\n if (options.supportPointer) {\n on(el, "pointerdown", this._onTapStart);\n } else {\n on(el, "mousedown", this._onTapStart);\n on(el, "touchstart", this._onTapStart);\n }\n\n if (this.nativeDraggable) {\n on(el, "dragover", this);\n on(el, "dragenter", this);\n }\n\n sortables.push(this.el); // Restore sorting\n\n options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager\n\n Object.assign(this, AnimationStateManager());\n }\n\n Sortable.prototype =\n /** @lends Sortable.prototype */\n {\n constructor: Sortable,\n _isOutsideThisEl: function (target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function (evt, target) {\n return typeof this.options.direction === "function" ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function (\n /** Event|TouchEvent */\n evt) {\n if (!evt.cancelable) return;\n\n let _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === "touch" && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n\n _saveInputCheckedState(el); // Don\'t trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n\n\n if (dragEl) {\n return;\n }\n\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n } // cancel dnd if original target is content editable\n\n\n if (originalTarget.isContentEditable) {\n return;\n } // Safari ignores further event handling after mousedown\n\n\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === "SELECT") {\n return;\n }\n\n target = closest(target, options.draggable, el, false);\n\n if (target && target.animated) {\n return;\n }\n\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n } // Get the index of the dragged element within its parent\n\n\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable); // Check filter\n\n if (typeof filter === "function") {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: "filter",\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n\n pluginEvent("filter", _this, {\n evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(",").some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: "filter",\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n\n pluginEvent("filter", _this, {\n evt\n });\n return true;\n }\n });\n\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n } // Prepare `dragstart`\n\n\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function (\n /** Event */\n evt,\n /** Touch */\n touch,\n /** HTMLElement */\n target) {\n let _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n\n if (target && !dragEl && target.parentNode === el) {\n let dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl; // PORTME: added offset\n\n let offset = 0;\n const targetBoundingRect = target.getBoundingClientRect();\n\n if (targetBoundingRect.left + 95 < (touch || evt).clientX) {\n offset = (touch || evt).clientX - targetBoundingRect.left - 95 / 2;\n }\n\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX - offset,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX - offset;\n this._lastY = (touch || evt).clientY;\n dragEl.style["will-change"] = "all";\n\n dragStartFn = function () {\n pluginEvent("delayEnded", _this, {\n evt\n });\n\n if (Sortable.eventCanceled) {\n _this._onDrop();\n\n return;\n } // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n\n\n _this._disableDelayedDragEvents();\n\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n } // Bind the events: dragstart/dragend\n\n\n _this._triggerDragStart(evt, touch); // Drag start event\n\n\n _dispatchEvent({\n sortable: _this,\n name: "choose",\n originalEvent: evt\n }); // Chosen item\n\n\n toggleClass(dragEl, options.chosenClass, true);\n }; // Disable "draggable"\n\n\n options.ignore.split(",").forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, "dragover", nearestEmptyInsertDetectEvent);\n on(ownerDocument, "mousemove", nearestEmptyInsertDetectEvent);\n on(ownerDocument, "touchmove", nearestEmptyInsertDetectEvent);\n on(ownerDocument, "mouseup", _this._onDrop);\n on(ownerDocument, "touchend", _this._onDrop);\n on(ownerDocument, "touchcancel", _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)\n\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n\n pluginEvent("delayStart", this, {\n evt\n }); // Delay is impossible for native DnD in Edge or IE\n\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n } // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n\n\n on(ownerDocument, "mouseup", _this._disableDelayedDrag);\n on(ownerDocument, "touchend", _this._disableDelayedDrag);\n on(ownerDocument, "touchcancel", _this._disableDelayedDrag);\n on(ownerDocument, "mousemove", _this._delayedDragTouchMoveHandler);\n on(ownerDocument, "touchmove", _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, "pointermove", _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function (\n /** TouchEvent|PointerEvent **/\n e) {\n let touch = e.touches ? e.touches[0] : e;\n\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function () {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function () {\n let ownerDocument = this.el.ownerDocument;\n off(ownerDocument, "mouseup", this._disableDelayedDrag);\n off(ownerDocument, "touchend", this._disableDelayedDrag);\n off(ownerDocument, "touchcancel", this._disableDelayedDrag);\n off(ownerDocument, "mousemove", this._delayedDragTouchMoveHandler);\n off(ownerDocument, "touchmove", this._delayedDragTouchMoveHandler);\n off(ownerDocument, "pointermove", this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function (\n /** Event */\n evt,\n /** Touch */\n touch) {\n touch = touch || evt.pointerType == "touch" && evt;\n\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, "pointermove", this._onTouchMove);\n } else if (touch) {\n on(document, "touchmove", this._onTouchMove);\n } else {\n on(document, "mousemove", this._onTouchMove);\n }\n } else {\n on(dragEl, "dragend", this);\n on(rootEl, "dragstart", this._onDragStart);\n }\n\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function (fallback, evt) {\n awaitingDragStarted = false;\n\n if (rootEl && dragEl) {\n pluginEvent("dragStarted", this, {\n evt\n });\n\n if (this.nativeDraggable) {\n on(document, "dragover", _checkOutsideTargetEl);\n }\n\n let options = this.options; // Apply effect\n\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost(); // Drag start event\n\n _dispatchEvent({\n sortable: this,\n name: "start",\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function () {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n\n _hideGhostForTarget();\n\n let target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n let parent = target;\n\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n\n if (parent) {\n do {\n if (parent[expando]) {\n let inserted;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n\n target = parent; // store last element\n } while (\n /* jshint boss:true */\n parent = parent.parentNode);\n }\n\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function (\n /**TouchEvent*/\n evt) {\n if (tapEvt) {\n let options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging\n\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n\n this._onDragStart(evt, true);\n }\n\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n\n let cssMatrix = `matrix(${ghostMatrix.a},${ghostMatrix.b},${ghostMatrix.c},${ghostMatrix.d},${ghostMatrix.e},${ghostMatrix.f})`;\n css(ghostEl, "webkitTransform", cssMatrix);\n css(ghostEl, "mozTransform", cssMatrix);\n css(ghostEl, "msTransform", cssMatrix);\n css(ghostEl, "transform", cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function () {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n let container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options; // Position absolutely\n\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n\n while (css(ghostRelativeParent, "position") === "static" && css(ghostRelativeParent, "transform") === "none" && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, "transition", "");\n css(ghostEl, "transform", "");\n css(ghostEl, "box-sizing", "border-box");\n css(ghostEl, "margin", 0);\n css(ghostEl, "top", rect.top);\n css(ghostEl, "left", rect.left);\n css(ghostEl, "width", rect.width);\n css(ghostEl, "height", rect.height);\n css(ghostEl, "opacity", "0.8");\n css(ghostEl, "position", PositionGhostAbsolutely ? "absolute" : "fixed");\n css(ghostEl, "zIndex", "100000");\n css(ghostEl, "pointerEvents", "none");\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl); // Set transform-origin\n\n css(ghostEl, "transform-origin", tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + "% " + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + "%");\n }\n },\n _onDragStart: function (\n /**Event*/\n evt,\n /**boolean*/\n fallback) {\n let _this = this;\n\n let dataTransfer = evt.dataTransfer;\n let options = _this.options;\n pluginEvent("dragStart", this, {\n evt\n });\n\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n }\n\n pluginEvent("setupClone", this);\n\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.draggable = false;\n cloneEl.style["will-change"] = "";\n\n this._hideClone();\n\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n } // #1143: IFrame support workaround\n\n\n _this.cloneId = _nextTick(function () {\n pluginEvent("clone", _this);\n if (Sortable.eventCanceled) return;\n\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n\n _this._hideClone();\n\n _dispatchEvent({\n sortable: _this,\n name: "clone"\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events\n\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, "mouseup", _this._onDrop);\n off(document, "touchend", _this._onDrop);\n off(document, "touchcancel", _this._onDrop);\n\n if (dataTransfer) {\n dataTransfer.effectAllowed = "move";\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n\n on(document, "drop", _this); // #1276 fix:\n\n css(dragEl, "transform", "translateZ(0)");\n }\n\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, "selectstart", _this);\n moved = true;\n\n if (Safari) {\n css(document.body, "user-select", "none");\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function (\n /**Event*/\n evt) {\n let el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n\n if (_silent) return;\n\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread({\n evt,\n isOwner,\n axis: vertical ? "vertical" : "horizontal",\n revert,\n dragRect,\n targetRect,\n canSort,\n fromSortable,\n target,\n completed,\n\n onMove(target, after) {\n return onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n\n changed\n }, extra));\n } // Capture animation state\n\n\n function capture() {\n dragOverEvent("dragOverAnimationCapture");\n\n _this.captureAnimationState();\n\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n } // Return invocation when dragEl is inserted (or completed)\n\n\n function completed(insertion) {\n dragOverEvent("dragOverCompleted", {\n insertion\n });\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n\n if (_this !== fromSortable) {\n // Set ghost class to new sortable\'s ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n } // Animation\n\n\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n\n _this.animateAll(function () {\n dragOverEvent("dragOverAnimationComplete");\n _this._ignoreWhileAnimating = null;\n });\n\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n } // Null lastTarget if it is not inside a previously swapped element\n\n\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n } // no bubbling and not fallback\n\n\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted\n\n\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n } // Call when dragEl has been inserted\n\n\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n _dispatchEvent({\n sortable: _this,\n name: "change",\n toEl: el,\n newIndex,\n newDraggableIndex,\n originalEvent: evt\n });\n }\n\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n\n target = closest(target, options.draggable, el, true);\n dragOverEvent("dragOver");\n if (Sortable.eventCanceled) return completedFired;\n\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n\n ignoreNextClick = false;\n\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === "vertical";\n dragRect = getRect(dragEl);\n dragOverEvent("dragOverValid");\n if (Sortable.eventCanceled) return completedFired;\n\n if (revert) {\n parentEl = rootEl; // actualization\n\n capture();\n\n this._hideClone();\n\n dragOverEvent("revert");\n\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n\n return completed(true);\n }\n\n let elLastChild = lastChild(el, options.draggable);\n\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n } // assign target only if condition is true\n\n\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n\n if (target) {\n targetRect = getRect(target);\n }\n\n if (onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n el.appendChild(dragEl);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n let direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? "top" : "left",\n scrolledPastTop = isScrolledPast(target, "top", "top") || isScrolledPast(dragEl, "top", "top"),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n let sibling;\n\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n let dragIndex = index(dragEl);\n\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, "display") === "none" || sibling === ghostEl));\n } // If dragEl is already beside target: Do not insert\n\n\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n\n lastTarget = target;\n lastDirection = direction;\n let nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n let moveVector = onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n } // Undo chrome\'s scroll adjustment (has no effect on other browsers)\n\n\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n\n parentEl = dragEl.parentNode; // actualization\n // must be done before animation\n\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n\n changed();\n return completed(true);\n }\n }\n\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function () {\n off(document, "mousemove", this._onTouchMove);\n off(document, "touchmove", this._onTouchMove);\n off(document, "pointermove", this._onTouchMove);\n off(document, "dragover", nearestEmptyInsertDetectEvent);\n off(document, "mousemove", nearestEmptyInsertDetectEvent);\n off(document, "touchmove", nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function () {\n let ownerDocument = this.el.ownerDocument;\n off(ownerDocument, "mouseup", this._onDrop);\n off(ownerDocument, "touchend", this._onDrop);\n off(ownerDocument, "pointerup", this._onDrop);\n off(ownerDocument, "touchcancel", this._onDrop);\n off(document, "selectstart", this);\n },\n _onDrop: function (\n /**Event*/\n evt) {\n let el = this.el,\n options = this.options; // Get the index of the dragged element within its parent\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent("drop", this, {\n evt\n });\n parentEl = dragEl && dragEl.parentNode; // Get again after plugin event\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n if (Sortable.eventCanceled) {\n this._nulling();\n\n return;\n }\n\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n\n _cancelNextTick(this.cloneId);\n\n _cancelNextTick(this._dragStartId); // Unbind events\n\n\n if (this.nativeDraggable) {\n off(document, "drop", this);\n off(el, "dragstart", this._onDragStart);\n }\n\n this._offMoveEvents();\n\n this._offUpEvents();\n\n if (Safari) {\n css(document.body, "user-select", "");\n }\n\n css(dragEl, "transform", "");\n\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== "clone") {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, "dragend", this);\n }\n\n _disableDraggable(dragEl);\n\n dragEl.style["will-change"] = ""; // Remove classes\n // ghostClass is added in dragStarted\n\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n\n toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event\n\n _dispatchEvent({\n sortable: this,\n name: "unchoose",\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: "add",\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n }); // Remove event\n\n\n _dispatchEvent({\n sortable: this,\n name: "remove",\n toEl: parentEl,\n originalEvent: evt\n }); // drag from one list and drop into another\n\n\n _dispatchEvent({\n rootEl: parentEl,\n name: "sort",\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: "sort",\n toEl: parentEl,\n originalEvent: evt\n });\n }\n\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: "update",\n toEl: parentEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: "sort",\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n\n _dispatchEvent({\n sortable: this,\n name: "end",\n toEl: parentEl,\n originalEvent: evt\n }); // Save sorting\n\n\n this.save();\n } else {\n // PORTME: added the dispatch block\n _dispatchEvent({\n sortable: this,\n name: \'end\',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n\n this._nulling();\n },\n _nulling: function () {\n pluginEvent("nulling", this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function (\n /**Event*/\n evt) {\n switch (evt.type) {\n case "drop":\n case "dragend":\n this._onDrop(evt);\n\n break;\n\n case "dragenter":\n case "dragover":\n if (dragEl) {\n this._onDragOver(evt);\n\n _globalDragOver(evt);\n }\n\n break;\n\n case "selectstart":\n evt.preventDefault();\n break;\n }\n },\n\n /**\n * Serializes the item into an array of string.\n * @returns {String[]}\n */\n toArray: function () {\n let order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n\n for (; i < n; i++) {\n el = children[i];\n\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n\n return order;\n },\n\n /**\n * Sorts the elements according to the array.\n * @param {String[]} order order of the items\n */\n sort: function (order) {\n let items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n let el = rootEl.children[i];\n\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n },\n\n /**\n * Save the current sorting\n */\n save: function () {\n let store = this.options.store;\n store && store.set && store.set(this);\n },\n\n /**\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n * @param {HTMLElement} el\n * @param {String} [selector] default: `options.draggable`\n * @returns {HTMLElement|null}\n */\n closest: function (el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n\n /**\n * Set/get option\n * @param {string} name\n * @param {*} [value]\n * @returns {*}\n */\n option: function (name, value) {\n let options = this.options;\n\n if (value === void 0) {\n return options[name];\n } else {\n let modifiedValue = PluginManager.modifyOption(this, name, value);\n\n if (typeof modifiedValue !== "undefined") {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n\n if (name === "group") {\n _prepareGroup(options);\n }\n }\n },\n\n /**\n * Destroy\n */\n destroy: function () {\n pluginEvent("destroy", this);\n let el = this.el;\n el[expando] = null;\n off(el, "mousedown", this._onTapStart);\n off(el, "touchstart", this._onTapStart);\n off(el, "pointerdown", this._onTapStart);\n\n if (this.nativeDraggable) {\n off(el, "dragover", this);\n off(el, "dragenter", this);\n } // Remove draggable attributes\n\n\n Array.prototype.forEach.call(el.querySelectorAll("[draggable]"), function (el) {\n el.removeAttribute("draggable");\n });\n\n this._onDrop();\n\n this._disableDelayedDragEvents();\n\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function () {\n if (!cloneHidden) {\n pluginEvent("hideClone", this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, "display", "none");\n\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n\n cloneHidden = true;\n }\n },\n _showClone: function (putSortable) {\n if (putSortable.lastPutMode !== "clone") {\n this._hideClone();\n\n return;\n }\n\n if (cloneHidden) {\n pluginEvent("showClone", this);\n if (Sortable.eventCanceled) return; // show clone at dragEl or original position\n\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n\n css(cloneEl, "display", "");\n cloneHidden = false;\n }\n }\n };\n\n function _globalDragOver(\n /**Event*/\n evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = "move";\n }\n\n evt.cancelable && evt.preventDefault();\n }\n\n function onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n let evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal; // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent("move", {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent("Event");\n evt.initEvent("move", true, true);\n }\n\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n\n return retVal;\n }\n\n function _disableDraggable(el) {\n el.draggable = false;\n }\n\n function _unsilent() {\n _silent = false;\n }\n\n function _ghostIsLast(evt, vertical, sortable) {\n let rect = getRect(lastChild(sortable.el, sortable.options.draggable));\n const spacer = 10;\n return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;\n }\n\n function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n let mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n\n invert = invert || invertSwap;\n\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n\n return 0;\n }\n /**\n * Gets the direction dragEl must be swapped relative to target in order to make it\n * seem that dragEl has been "inserted" into that element\'s position\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\n * @return {Number} Direction dragEl must be swapped\n */\n\n\n function _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n }\n /**\n * Generate id\n * @param {HTMLElement} el\n * @returns {String}\n * @private\n */\n\n\n function _generateId(el) {\n let str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n\n while (i--) {\n sum += str.charCodeAt(i);\n }\n\n return sum.toString(36);\n }\n\n function _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n let inputs = root.getElementsByTagName("input");\n let idx = inputs.length;\n\n while (idx--) {\n let el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n }\n\n function _nextTick(fn) {\n return setTimeout(fn, 0);\n }\n\n function _cancelNextTick(id) {\n return clearTimeout(id);\n } // Fixed #973:\n\n\n if (documentExists) {\n on(document, "touchmove", function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n } // Export utils\n\n\n Sortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function (el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n };\n /**\n * Get the Sortable instance of an element\n * @param {HTMLElement} element The element\n * @return {Sortable|undefined} The instance of Sortable\n */\n\n Sortable.get = function (element) {\n return element[expando];\n };\n /**\n * Mount a plugin to Sortable\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\n */\n\n\n Sortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(plugin => {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw `Sortable: Mounted plugin must be a constructor function, not ${{}.toString.call(plugin)}`;\n }\n\n if (plugin.utils) Sortable.utils = _objectSpread(_objectSpread({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n };\n /**\n * Create sortable instance\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\n Sortable.create = function (el, options) {\n return new Sortable(el, options);\n }; // Export\n\n\n Sortable.version = version;\n let autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\n\n function AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n }; // Bind all private methods\n\n for (let fn in this) {\n if (fn.charAt(0) === "_" && typeof this[fn] === "function") {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n\n AutoScroll.prototype = {\n dragStarted(_ref3) {\n let {\n originalEvent\n } = _ref3;\n\n if (this.sortable.nativeDraggable) {\n on(document, "dragover", this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, "pointermove", this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, "touchmove", this._handleFallbackAutoScroll);\n } else {\n on(document, "mousemove", this._handleFallbackAutoScroll);\n }\n }\n },\n\n dragOverCompleted(_ref4) {\n let {\n originalEvent\n } = _ref4;\n\n // For when bubbling is canceled and using fallback (fallback \'touchmove\' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n\n drop() {\n if (this.sortable.nativeDraggable) {\n off(document, "dragover", this._handleAutoScroll);\n } else {\n off(document, "pointermove", this._handleFallbackAutoScroll);\n off(document, "touchmove", this._handleFallbackAutoScroll);\n off(document, "mousemove", this._handleFallbackAutoScroll);\n }\n\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n\n nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n\n _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n\n _handleAutoScroll(evt, fallback) {\n const x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt; // IE does not seem to have native autoscroll,\n // Edge\'s autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n\n if (fallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change\n\n let ogElemScroller = getParentAutoScrollElement(elem, true);\n\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour\n\n pointerElemChangedInterval = setInterval(() => {\n let newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n\n autoScroll(evt, this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n\n };\n return Object.assign(AutoScroll, {\n pluginName: "scroll",\n initializeByDefault: true\n });\n }\n\n function clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n }\n\n function clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n }\n\n const autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n const x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n let scrollThisInstance = false,\n scrollCustomFn; // New scroll root, set scrollEl\n\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n\n let layersOut = 0;\n let currentParent = scrollEl;\n\n do {\n let el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX,\n canScrollY,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll" || elCSS.overflowX === "visible");\n canScrollY = height < scrollHeight && (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll" || elCSS.overflowY === "visible");\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll");\n canScrollY = height < scrollHeight && (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll");\n }\n\n let vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n let vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n\n if (!autoScrolls[layersOut]) {\n for (let i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n\n }\n\n let scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n let scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n\n if (typeof scrollCustomFn === "function") {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== "continue") {\n return;\n }\n }\n\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n }, 30);\n\n const drop = function (_ref5) {\n let {\n originalEvent,\n putSortable,\n dragEl,\n activeSortable,\n dispatchSortableEvent,\n hideGhostForTarget,\n unhideGhostForTarget\n } = _ref5;\n if (!originalEvent) return;\n let toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n let touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n let target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent("spill");\n this.onSpill({\n dragEl,\n putSortable\n });\n }\n };\n\n function Revert() {}\n\n Revert.prototype = {\n startIndex: null,\n\n dragStart(_ref6) {\n let {\n oldDraggableIndex\n } = _ref6;\n this.startIndex = oldDraggableIndex;\n },\n\n onSpill(_ref7) {\n let {\n dragEl,\n putSortable\n } = _ref7;\n this.sortable.captureAnimationState();\n\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n\n let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n\n this.sortable.animateAll();\n\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n\n drop\n };\n Object.assign(Revert, {\n pluginName: "revertOnSpill"\n });\n\n function Remove() {}\n\n Remove.prototype = {\n onSpill(_ref8) {\n let {\n dragEl,\n putSortable\n } = _ref8;\n const parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n\n drop\n };\n Object.assign(Remove, {\n pluginName: "removeOnSpill"\n });\n let lastSwapEl;\n\n function SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: "sortable-swap-highlight"\n };\n }\n\n Swap.prototype = {\n dragStart(_ref9) {\n let {\n dragEl\n } = _ref9;\n lastSwapEl = dragEl;\n },\n\n dragOverValid(_ref10) {\n let {\n completed,\n target,\n onMove,\n activeSortable,\n changed,\n cancel\n } = _ref10;\n if (!activeSortable.options.swap) return;\n let el = this.sortable.el,\n options = this.options;\n\n if (target && target !== el) {\n let prevSwapEl = lastSwapEl;\n\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n\n changed();\n completed(true);\n cancel();\n },\n\n drop(_ref11) {\n let {\n activeSortable,\n putSortable,\n dragEl\n } = _ref11;\n let toSortable = putSortable || this.sortable;\n let options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n\n nulling() {\n lastSwapEl = null;\n }\n\n };\n return Object.assign(Swap, {\n pluginName: "swap",\n\n eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n\n });\n }\n\n function swapNodes(n1, n2) {\n let p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n }\n\n let multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\n\n function MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (let fn in this) {\n if (fn.charAt(0) === "_" && typeof this[fn] === "function") {\n this[fn] = this[fn].bind(this);\n }\n }\n\n if (sortable.options.supportPointer) {\n on(document, "pointerup", this._deselectMultiDrag);\n } else {\n on(document, "mouseup", this._deselectMultiDrag);\n on(document, "touchend", this._deselectMultiDrag);\n }\n\n on(document, "keydown", this._checkKeyDown);\n on(document, "keyup", this._checkKeyUp);\n this.defaults = {\n selectedClass: "sortable-selected",\n multiDragKey: null,\n\n setData(dataTransfer, dragEl) {\n let data = "";\n\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach((multiDragElement, i) => {\n data += (!i ? "" : ", ") + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n\n dataTransfer.setData("Text", data);\n }\n\n };\n }\n\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n\n delayStartGlobal(_ref12) {\n let {\n dragEl: dragged\n } = _ref12;\n dragEl$1 = dragged;\n },\n\n delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n\n setupClone(_ref13) {\n let {\n sortable,\n cancel\n } = _ref13;\n if (!this.isMultiDrag) return;\n\n for (let i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style["will-change"] = "";\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n\n sortable._hideClone();\n\n cancel();\n },\n\n clone(_ref14) {\n let {\n sortable,\n rootEl,\n dispatchSortableEvent,\n cancel\n } = _ref14;\n if (!this.isMultiDrag) return;\n\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent("clone");\n cancel();\n }\n }\n },\n\n showClone(_ref15) {\n let {\n cloneNowShown,\n rootEl,\n cancel\n } = _ref15;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(clone => {\n css(clone, "display", "");\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n\n hideClone(_ref16) {\n let {\n sortable,\n cloneNowHidden,\n cancel\n } = _ref16;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(clone => {\n css(clone, "display", "none");\n\n if (this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n\n dragStartGlobal(_ref17) {\n let {\n sortable\n } = _ref17;\n\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n\n multiDragElements.forEach(multiDragElement => {\n multiDragElement.sortableIndex = index(multiDragElement);\n }); // Sort multi-drag elements\n\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n\n dragStarted(_ref18) {\n let {\n sortable\n } = _ref18;\n if (!this.isMultiDrag) return;\n\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n\n if (this.options.animation) {\n multiDragElements.forEach(multiDragElement => {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, "position", "absolute");\n });\n let dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(multiDragElement => {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n\n sortable.animateAll(() => {\n folding = false;\n initialFolding = false;\n\n if (this.options.animation) {\n multiDragElements.forEach(multiDragElement => {\n unsetRect(multiDragElement);\n });\n } // Remove all auxiliary multidrag items from el, if sorting enabled\n\n\n if (this.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n\n dragOver(_ref19) {\n let {\n target,\n completed,\n cancel\n } = _ref19;\n\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n\n revert(_ref20) {\n let {\n fromSortable,\n rootEl,\n sortable,\n dragRect\n } = _ref20;\n\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(multiDragElement => {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n\n dragOverCompleted(_ref21) {\n let {\n sortable,\n isOwner,\n insertion,\n activeSortable,\n parentEl,\n putSortable\n } = _ref21;\n let options = this.options;\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n\n initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location\n\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements\'s rects to dragEl\'s rect when multi-drag elements are invisible\n let dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(multiDragElement => {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n\n\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n\n if (multiDragElements.length > 1) {\n let clonesHiddenBefore = clonesHidden;\n\n activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden\n\n\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(clone => {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n\n dragOverAnimationCapture(_ref22) {\n let {\n dragRect,\n isOwner,\n activeSortable\n } = _ref22;\n multiDragElements.forEach(multiDragElement => {\n multiDragElement.thisAnimationDuration = null;\n });\n\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = Object.assign({}, dragRect);\n let dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n\n dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n\n drop(_ref23) {\n let {\n originalEvent: evt,\n rootEl,\n parentEl,\n sortable,\n dispatchSortableEvent,\n oldIndex,\n putSortable\n } = _ref23;\n let toSortable = putSortable || this.sortable;\n if (!evt) return;\n let options = this.options,\n children = parentEl.children; // Multi-drag selection\n\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable,\n rootEl,\n name: "select",\n targetEl: dragEl$1,\n originalEvt: evt\n }); // Modifier activated, select from last to dragEl\n\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n let lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n let n, i;\n\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable,\n rootEl,\n name: "select",\n targetEl: children[i],\n originalEvt: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable,\n rootEl,\n name: "deselect",\n targetEl: dragEl$1,\n originalEvt: evt\n });\n }\n } // Multi-drag drop\n\n\n if (dragStarted && this.isMultiDrag) {\n // Do not "unfold" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n let dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ":not(." + this.options.selectedClass + ")");\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(multiDragElement => {\n multiDragElement.thisAnimationDuration = null;\n\n if (multiDragElement !== dragEl$1) {\n let rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect; // Prepare unfold animation\n\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n\n\n removeMultiDragElements();\n multiDragElements.forEach(multiDragElement => {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n\n multiDragIndex++;\n }); // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n\n if (oldIndex === index(dragEl$1)) {\n let update = false;\n multiDragElements.forEach(multiDragElement => {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n\n if (update) {\n dispatchSortableEvent("update");\n }\n }\n } // Must be done after capturing individual rects (scroll bar)\n\n\n multiDragElements.forEach(multiDragElement => {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n\n multiDragSortable = toSortable;\n } // Remove clones if necessary\n\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== "clone") {\n multiDragClones.forEach(clone => {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n\n nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n\n destroyGlobal() {\n this._deselectMultiDrag();\n\n off(document, "pointerup", this._deselectMultiDrag);\n off(document, "mouseup", this._deselectMultiDrag);\n off(document, "touchend", this._deselectMultiDrag);\n off(document, "keydown", this._checkKeyDown);\n off(document, "keyup", this._checkKeyUp);\n },\n\n _deselectMultiDrag(evt) {\n if (typeof dragStarted !== "undefined" && dragStarted) return; // Only deselect if selection is in this sortable\n\n if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable\n\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click\n\n if (evt && evt.button !== 0) return;\n\n while (multiDragElements.length) {\n let el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: "deselect",\n targetEl: el,\n originalEvt: evt\n });\n }\n },\n\n _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n\n _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n\n };\n return Object.assign(MultiDrag, {\n // Static methods & properties\n pluginName: "multiDrag",\n utils: {\n /**\n * Selects the provided multi-drag item\n * @param {HTMLElement} el The element to be selected\n */\n select(el) {\n let sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n\n multiDragSortable = sortable;\n }\n\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n\n /**\n * Deselects the provided multi-drag item\n * @param {HTMLElement} el The element to be deselected\n */\n deselect(el) {\n let sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n\n },\n\n eventProperties() {\n const oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(multiDragElement => {\n oldIndicies.push({\n multiDragElement,\n index: multiDragElement.sortableIndex\n }); // multiDragElements will already be sorted if folding\n\n let newIndex;\n\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ":not(." + this.options.selectedClass + ")");\n } else {\n newIndex = index(multiDragElement);\n }\n\n newIndicies.push({\n multiDragElement,\n index: newIndex\n });\n });\n return {\n items: [...multiDragElements],\n clones: [...multiDragClones],\n oldIndicies,\n newIndicies\n };\n },\n\n optionListeners: {\n multiDragKey(key) {\n key = key.toLowerCase();\n\n if (key === "ctrl") {\n key = "Control";\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n\n return key;\n }\n\n }\n });\n }\n\n function insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach((multiDragElement, i) => {\n let target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n }\n /**\n * Insert multi-drag clones\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\n * @param {HTMLElement} rootEl\n */\n\n\n function insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach((clone, i) => {\n let target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n }\n\n function removeMultiDragElements() {\n multiDragElements.forEach(multiDragElement => {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n }\n\n Sortable.mount(new AutoScrollPlugin());\n Sortable.mount(Remove, Revert);\n Sortable.mount(new SwapPlugin());\n Sortable.mount(new MultiDragPlugin());\n return Sortable;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYxNy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL2N1c3RvbWl6ZXIvcGFuZWxzLWJ1aWxkZXIvcGxhY2VtZW50cy9zb3J0YWJsZWpzLmpzPzc0ZWEiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgX2V4Y2x1ZGVkID0gW1wiZXZ0XCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG4vKiohXG4gKiBTb3J0YWJsZSAxLjExLjBcbiAqIEBhdXRob3JcdFJ1YmFYYSAgIDx0cmFzaEBydWJheGEub3JnPlxuICogQGF1dGhvclx0b3dlbm0gICAgPG93ZW4yMzM1NUBnbWFpbC5jb20+XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDogdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Tb3J0YWJsZSA9IGZhY3RvcnkoKSk7XG59KSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIGNvbnN0IF9fd2FybiA9IFwiXCIgKyBcIkltcG9ydGluZyBTb3J0YWJsZSBkaXJlY3RseSBmcm9tIEdpdEh1YiBpcyBkZXByZWNhdGVkLlxcblwiICsgXCJUaGlzIGZpbGUgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbW9yZSB1cGRhdGVzLlxcblwiICsgXCJQbGVhc2UgZm9sbG93IHRoZSB1c2FnZSBpbnN0cnVjdGlvbnMgdG8gY29udGludWUgZ2V0dGluZyBzdXBwb3J0OiBodHRwczovL2dpdGh1Yi5jb20vU29ydGFibGVKUy9Tb3J0YWJsZVwiOyAvLyBjb25zb2xlLndhcm4oX193YXJuKTtcblxuXG4gIHZhciB2ZXJzaW9uID0gXCIxLjExLjBcIjtcblxuICBmdW5jdGlvbiB1c2VyQWdlbnQocGF0dGVybikge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5uYXZpZ2F0b3IpIHtcbiAgICAgIHJldHVybiAhISAvKkBfX1BVUkVfXyovbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChwYXR0ZXJuKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBJRTExT3JMZXNzID0gdXNlckFnZW50KC8oPzpUcmlkZW50LipydlsgOl0/MTFcXC58bXNpZXxpZW1vYmlsZXxXaW5kb3dzIFBob25lKS9pKTtcbiAgY29uc3QgRWRnZSA9IHVzZXJBZ2VudCgvRWRnZS9pKTtcbiAgY29uc3QgRmlyZUZveCA9IHVzZXJBZ2VudCgvZmlyZWZveC9pKTtcbiAgY29uc3QgU2FmYXJpID0gdXNlckFnZW50KC9zYWZhcmkvaSkgJiYgIXVzZXJBZ2VudCgvY2hyb21lL2kpICYmICF1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG4gIGNvbnN0IElPUyA9IHVzZXJBZ2VudCgvaVAoYWR8b2R8aG9uZSkvaSk7XG4gIGNvbnN0IENocm9tZUZvckFuZHJvaWQgPSB1c2VyQWdlbnQoL2Nocm9tZS9pKSAmJiB1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG4gIGNvbnN0IGNhcHR1cmVNb2RlID0ge1xuICAgIGNhcHR1cmU6IGZhbHNlLFxuICAgIHBhc3NpdmU6IGZhbHNlXG4gIH07XG5cbiAgZnVuY3Rpb24gb24oZWwsIGV2ZW50LCBmbikge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvZmYoZWwsIGV2ZW50LCBmbikge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBtYXRjaGVzKFxuICAvKipIVE1MRWxlbWVudCovXG4gIGVsLFxuICAvKipTdHJpbmcqL1xuICBzZWxlY3Rvcikge1xuICAgIGlmICghc2VsZWN0b3IpIHJldHVybjtcbiAgICBzZWxlY3RvclswXSA9PT0gXCI+XCIgJiYgKHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyaW5nKDEpKTtcblxuICAgIGlmIChlbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVsLm1hdGNoZXMpIHtcbiAgICAgICAgICByZXR1cm4gZWwubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgICAgIH0gZWxzZSBpZiAoZWwubXNNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgICByZXR1cm4gZWwubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsLndlYmtpdE1hdGNoZXNTZWxlY3Rvcikge1xuICAgICAgICAgIHJldHVybiBlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQYXJlbnRPckhvc3QoZWwpIHtcbiAgICByZXR1cm4gZWwuaG9zdCAmJiBlbCAhPT0gZG9jdW1lbnQgJiYgZWwuaG9zdC5ub2RlVHlwZSA/IGVsLmhvc3QgOiBlbC5wYXJlbnROb2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VzdChcbiAgLyoqSFRNTEVsZW1lbnQqL1xuICBlbCxcbiAgLyoqU3RyaW5nKi9cbiAgc2VsZWN0b3IsXG4gIC8qKkhUTUxFbGVtZW50Ki9cbiAgY3R4LCBpbmNsdWRlQ1RYKSB7XG4gICAgaWYgKGVsKSB7XG4gICAgICBjdHggPSBjdHggfHwgZG9jdW1lbnQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwgJiYgKHNlbGVjdG9yWzBdID09PSBcIj5cIiA/IGVsLnBhcmVudE5vZGUgPT09IGN0eCAmJiBtYXRjaGVzKGVsLCBzZWxlY3RvcikgOiBtYXRjaGVzKGVsLCBzZWxlY3RvcikpIHx8IGluY2x1ZGVDVFggJiYgZWwgPT09IGN0eCkge1xuICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbCA9PT0gY3R4KSBicmVhaztcbiAgICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuICAgICAgfSB3aGlsZSAoZWwgPSBnZXRQYXJlbnRPckhvc3QoZWwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IFJfU1BBQ0UgPSAvXFxzKy9nO1xuXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGVsLCBuYW1lLCBzdGF0ZSkge1xuICAgIGlmIChlbCAmJiBuYW1lKSB7XG4gICAgICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdFtzdGF0ZSA/IFwiYWRkXCIgOiBcInJlbW92ZVwiXShuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSAoXCIgXCIgKyBlbC5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZShSX1NQQUNFLCBcIiBcIikucmVwbGFjZShcIiBcIiArIG5hbWUgKyBcIiBcIiwgXCIgXCIpO1xuICAgICAgICBlbC5jbGFzc05hbWUgPSAoY2xhc3NOYW1lICsgKHN0YXRlID8gXCIgXCIgKyBuYW1lIDogXCJcIikpLnJlcGxhY2UoUl9TUEFDRSwgXCIgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNzcyhlbCwgcHJvcCwgdmFsKSB7XG4gICAgbGV0IHN0eWxlID0gZWwgJiYgZWwuc3R5bGU7XG5cbiAgICBpZiAoc3R5bGUpIHtcbiAgICAgIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgICAgICAgIHZhbCA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsLmN1cnJlbnRTdHlsZSkge1xuICAgICAgICAgIHZhbCA9IGVsLmN1cnJlbnRTdHlsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wID09PSB2b2lkIDAgPyB2YWwgOiB2YWxbcHJvcF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShwcm9wIGluIHN0eWxlKSAmJiBwcm9wLmluZGV4T2YoXCJ3ZWJraXRcIikgPT09IC0xKSB7XG4gICAgICAgICAgcHJvcCA9IFwiLXdlYmtpdC1cIiArIHByb3A7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZVtwcm9wXSA9IHZhbCArICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gXCJcIiA6IFwicHhcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWF0cml4KGVsLCBzZWxmT25seSkge1xuICAgIGxldCBhcHBsaWVkVHJhbnNmb3JtcyA9IFwiXCI7XG5cbiAgICBpZiAodHlwZW9mIGVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBhcHBsaWVkVHJhbnNmb3JtcyA9IGVsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkbyB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBsZXQgdHJhbnNmb3JtID0gY3NzKGVsLCBcInRyYW5zZm9ybVwiKTtcblxuICAgICAgICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICBhcHBsaWVkVHJhbnNmb3JtcyA9IHRyYW5zZm9ybSArIFwiIFwiICsgYXBwbGllZFRyYW5zZm9ybXM7XG4gICAgICAgIH1cbiAgICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG4gICAgICB9IHdoaWxlICghc2VsZk9ubHkgJiYgKGVsID0gZWwucGFyZW50Tm9kZSkpO1xuICAgIH0gLy9AdHMtaWdub3JlXG5cblxuICAgIGNvbnN0IG1hdHJpeEZuID0gd2luZG93LkRPTU1hdHJpeCB8fCB3aW5kb3cuV2ViS2l0Q1NTTWF0cml4IHx8IHdpbmRvdy5DU1NNYXRyaXggfHwgd2luZG93Lk1TQ1NTTWF0cml4O1xuICAgIC8qanNoaW50IC1XMDU2ICovXG5cbiAgICByZXR1cm4gbWF0cml4Rm4gJiYgbmV3IG1hdHJpeEZuKGFwcGxpZWRUcmFuc2Zvcm1zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmQoY3R4LCB0YWdOYW1lLCBpdGVyYXRvcikge1xuICAgIGlmIChjdHgpIHtcbiAgICAgIGxldCBsaXN0ID0gY3R4LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpLFxuICAgICAgICAgIGkgPSAwLFxuICAgICAgICAgIG4gPSBsaXN0Lmxlbmd0aDtcblxuICAgICAgaWYgKGl0ZXJhdG9yKSB7XG4gICAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgaXRlcmF0b3IobGlzdFtpXSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpIHtcbiAgICBsZXQgc2Nyb2xsaW5nRWxlbWVudCA9IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ7XG5cbiAgICBpZiAoc2Nyb2xsaW5nRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHNjcm9sbGluZ0VsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBcImJvdW5kaW5nIGNsaWVudCByZWN0XCIgb2YgZ2l2ZW4gZWxlbWVudFxuICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nQ2xpZW50UmVjdCBpcyB3YW50ZWRcbiAgICogQHBhcmFtICB7W0Jvb2xlYW5dfSByZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrICBXaGV0aGVyIHRoZSByZWN0IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpbmVyXG4gICAqIEBwYXJhbSAge1tCb29sZWFuXX0gcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCAgV2hldGhlciB0aGUgcmVjdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJlbGF0aXZlIHBhcmVudCBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpZW5yXG4gICAqIEBwYXJhbSAge1tCb29sZWFuXX0gdW5kb1NjYWxlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgY29udGFpbmVyJ3Mgc2NhbGUoKSBzaG91bGQgYmUgdW5kb25lXG4gICAqIEBwYXJhbSAge1tIVE1MRWxlbWVudF19IGNvbnRhaW5lciAgICAgICAgICAgICAgVGhlIHBhcmVudCB0aGUgZWxlbWVudCB3aWxsIGJlIHBsYWNlZCBpblxuICAgKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBib3VuZGluZ0NsaWVudFJlY3Qgb2YgZWwsIHdpdGggc3BlY2lmaWVkIGFkanVzdG1lbnRzXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0UmVjdChlbCwgcmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jaywgcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCwgdW5kb1NjYWxlLCBjb250YWluZXIpIHtcbiAgICBpZiAoIWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBlbCAhPT0gd2luZG93KSByZXR1cm47XG4gICAgbGV0IGVsUmVjdCwgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCBoZWlnaHQsIHdpZHRoO1xuXG4gICAgaWYgKGVsICE9PSB3aW5kb3cgJiYgZWwgIT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgICAgZWxSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0b3AgPSBlbFJlY3QudG9wO1xuICAgICAgbGVmdCA9IGVsUmVjdC5sZWZ0O1xuICAgICAgYm90dG9tID0gZWxSZWN0LmJvdHRvbTtcbiAgICAgIHJpZ2h0ID0gZWxSZWN0LnJpZ2h0O1xuICAgICAgaGVpZ2h0ID0gZWxSZWN0LmhlaWdodDtcbiAgICAgIHdpZHRoID0gZWxSZWN0LndpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b3AgPSAwO1xuICAgICAgbGVmdCA9IDA7XG4gICAgICBib3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICByaWdodCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICB9XG5cbiAgICBpZiAoKHJlbGF0aXZlVG9Db250YWluaW5nQmxvY2sgfHwgcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCkgJiYgZWwgIT09IHdpbmRvdykge1xuICAgICAgLy8gQWRqdXN0IGZvciB0cmFuc2xhdGUoKVxuICAgICAgY29udGFpbmVyID0gY29udGFpbmVyIHx8IGVsLnBhcmVudE5vZGU7IC8vIHNvbHZlcyAjMTEyMyAoc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzc5NTM4MDYvNjA4ODMxMilcbiAgICAgIC8vIE5vdCBuZWVkZWQgb24gPD0gSUUxMVxuXG4gICAgICBpZiAoIUlFMTFPckxlc3MpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiAoIC8vQHRzLWlnbm9yZVxuICAgICAgICAgIGNzcyhjb250YWluZXIsIFwidHJhbnNmb3JtXCIpICE9PSBcIm5vbmVcIiB8fCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50ICYmIC8vQHRzLWlnbm9yZVxuICAgICAgICAgIGNzcyhjb250YWluZXIsIFwicG9zaXRpb25cIikgIT09IFwic3RhdGljXCIpKSB7XG4gICAgICAgICAgICBsZXQgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gU2V0IHJlbGF0aXZlIHRvIGVkZ2VzIG9mIHBhZGRpbmcgYm94IG9mIGNvbnRhaW5lclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG5cbiAgICAgICAgICAgIHRvcCAtPSBjb250YWluZXJSZWN0LnRvcCArIHBhcnNlSW50KGNzcyhjb250YWluZXIsIFwiYm9yZGVyLXRvcC13aWR0aFwiKSk7IC8vQHRzLWlnbm9yZVxuXG4gICAgICAgICAgICBsZWZ0IC09IGNvbnRhaW5lclJlY3QubGVmdCArIHBhcnNlSW50KGNzcyhjb250YWluZXIsIFwiYm9yZGVyLWxlZnQtd2lkdGhcIikpO1xuICAgICAgICAgICAgYm90dG9tID0gdG9wICsgZWxSZWN0LmhlaWdodDtcbiAgICAgICAgICAgIHJpZ2h0ID0gbGVmdCArIGVsUmVjdC53aWR0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgICAgICAgfSB3aGlsZSAoY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1bmRvU2NhbGUgJiYgZWwgIT09IHdpbmRvdykge1xuICAgICAgLy8gQWRqdXN0IGZvciBzY2FsZSgpXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGxldCBlbE1hdHJpeCA9IG1hdHJpeChjb250YWluZXIgfHwgZWwpLFxuICAgICAgICAgIHNjYWxlWCA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmEsXG4gICAgICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZDtcblxuICAgICAgaWYgKGVsTWF0cml4KSB7XG4gICAgICAgIHRvcCAvPSBzY2FsZVk7XG4gICAgICAgIGxlZnQgLz0gc2NhbGVYO1xuICAgICAgICB3aWR0aCAvPSBzY2FsZVg7XG4gICAgICAgIGhlaWdodCAvPSBzY2FsZVk7XG4gICAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDtcbiAgICAgICAgcmlnaHQgPSBsZWZ0ICsgd2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogdG9wLFxuICAgICAgbGVmdDogbGVmdCxcbiAgICAgIGJvdHRvbTogYm90dG9tLFxuICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzaWRlIG9mIGFuIGVsZW1lbnQgaXMgc2Nyb2xsZWQgcGFzdCBhIHNpZGUgb2YgaXRzIHBhcmVudHNcbiAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICBlbCAgICAgICAgICAgVGhlIGVsZW1lbnQgd2hvJ3Mgc2lkZSBiZWluZyBzY3JvbGxlZCBvdXQgb2YgdmlldyBpcyBpbiBxdWVzdGlvblxuICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgIGVsU2lkZSAgICAgICBTaWRlIG9mIHRoZSBlbGVtZW50IGluIHF1ZXN0aW9uICgndG9wJywgJ2xlZnQnLCAncmlnaHQnLCAnYm90dG9tJylcbiAgICogQHBhcmFtICB7U3RyaW5nfSAgICAgICBwYXJlbnRTaWRlICAgU2lkZSBvZiB0aGUgcGFyZW50IGluIHF1ZXN0aW9uICgndG9wJywgJ2xlZnQnLCAncmlnaHQnLCAnYm90dG9tJylcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgICAgICAgVGhlIHBhcmVudCBzY3JvbGwgZWxlbWVudCB0aGF0IHRoZSBlbCdzIHNpZGUgaXMgc2Nyb2xsZWQgcGFzdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGVsZW1lbnRcbiAgICovXG5cblxuICBmdW5jdGlvbiBpc1Njcm9sbGVkUGFzdChlbCwgZWxTaWRlLCBwYXJlbnRTaWRlKSB7XG4gICAgbGV0IHBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCB0cnVlKSxcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgZWxTaWRlVmFsID0gZ2V0UmVjdChlbClbZWxTaWRlXTtcbiAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGxldCBwYXJlbnRTaWRlVmFsID0gZ2V0UmVjdChwYXJlbnQpW3BhcmVudFNpZGVdLFxuICAgICAgICAgIHZpc2libGU7XG5cbiAgICAgIGlmIChwYXJlbnRTaWRlID09PSBcInRvcFwiIHx8IHBhcmVudFNpZGUgPT09IFwibGVmdFwiKSB7XG4gICAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPj0gcGFyZW50U2lkZVZhbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPD0gcGFyZW50U2lkZVZhbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF2aXNpYmxlKSByZXR1cm4gcGFyZW50O1xuICAgICAgaWYgKHBhcmVudCA9PT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSBicmVhaztcbiAgICAgIHBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KHBhcmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBudGggY2hpbGQgb2YgZWwsIGlnbm9yaW5nIGhpZGRlbiBjaGlsZHJlbiwgc29ydGFibGUncyBlbGVtZW50cyAoZG9lcyBub3QgaWdub3JlIGNsb25lIGlmIGl0J3MgdmlzaWJsZSlcbiAgICogYW5kIG5vbi1kcmFnZ2FibGUgZWxlbWVudHNcbiAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGNoaWxkTnVtICAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGlsZFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgICAgICAgUGFyZW50IFNvcnRhYmxlJ3Mgb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgVGhlIGNoaWxkIGF0IGluZGV4IGNoaWxkTnVtLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldENoaWxkKGVsLCBjaGlsZE51bSwgb3B0aW9ucykge1xuICAgIGxldCBjdXJyZW50Q2hpbGQgPSAwLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgY2hpbGRyZW4gPSBlbC5jaGlsZHJlbjtcblxuICAgIHdoaWxlIChpIDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBpZiAoY2hpbGRyZW5baV0uc3R5bGUuZGlzcGxheSAhPT0gXCJub25lXCIgJiYgLy9AdHMtaWdub3JlXG4gICAgICBjaGlsZHJlbltpXSAhPT0gU29ydGFibGUuZ2hvc3QgJiYgLy9AdHMtaWdub3JlXG4gICAgICBjaGlsZHJlbltpXSAhPT0gU29ydGFibGUuZHJhZ2dlZCAmJiBjbG9zZXN0KGNoaWxkcmVuW2ldLCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIGZhbHNlKSkge1xuICAgICAgICBpZiAoY3VycmVudENoaWxkID09PSBjaGlsZE51bSkge1xuICAgICAgICAgIHJldHVybiBjaGlsZHJlbltpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRDaGlsZCsrO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgY2hpbGQgaW4gdGhlIGVsLCBpZ25vcmluZyBnaG9zdEVsIG9yIGludmlzaWJsZSBlbGVtZW50cyAoY2xvbmVzKVxuICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgUGFyZW50IGVsZW1lbnRcbiAgICogQHBhcmFtICB7c2VsZWN0b3J9IHNlbGVjdG9yICAgIEFueSBvdGhlciBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgbGFzdCBjaGlsZCwgaWdub3JpbmcgZ2hvc3RFbFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGxhc3RDaGlsZChlbCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgbGFzdCA9IGVsLmxhc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICB3aGlsZSAobGFzdCAmJiAoIC8vQHRzLWlnbm9yZVxuICAgIGxhc3QgPT09IFNvcnRhYmxlLmdob3N0IHx8IC8vQHRzLWlnbm9yZVxuICAgIGNzcyhsYXN0LCBcImRpc3BsYXlcIikgPT09IFwibm9uZVwiIHx8IHNlbGVjdG9yICYmICFtYXRjaGVzKGxhc3QsIHNlbGVjdG9yKSkpIHtcbiAgICAgIGxhc3QgPSBsYXN0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3QgfHwgbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgYW4gZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudCBmb3IgYSBzZWxlY3RlZCBzZXQgb2ZcbiAgICogZWxlbWVudHNcbiAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXG4gICAqIEBwYXJhbSAge3NlbGVjdG9yfSBzZWxlY3RvclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaW5kZXgoZWwsIHNlbGVjdG9yKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIGlmICghZWwgfHwgIWVsLnBhcmVudE5vZGUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG5cbiAgICB3aGlsZSAoZWwgPSBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChlbC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSBcIlRFTVBMQVRFXCIgJiYgIWVsLm1hdGNoZXMoJy5jdC1wb2ludGVyJykgJiYgZWwgIT09IFNvcnRhYmxlLmNsb25lICYmICghc2VsZWN0b3IgfHwgbWF0Y2hlcyhlbCwgc2VsZWN0b3IpKSkge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIG9mZnNldCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgYWRkZWQgd2l0aCBhbGwgdGhlIHNjcm9sbCBvZmZzZXRzIG9mIHBhcmVudCBlbGVtZW50cy5cbiAgICogVGhlIHZhbHVlIGlzIHJldHVybmVkIGluIHJlYWwgcGl4ZWxzLlxuICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxcbiAgICogQHJldHVybiB7QXJyYXl9ICAgICAgICAgICAgIE9mZnNldHMgaW4gdGhlIGZvcm1hdCBvZiBbbGVmdCwgdG9wXVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGVsKSB7XG4gICAgbGV0IG9mZnNldExlZnQgPSAwLFxuICAgICAgICBvZmZzZXRUb3AgPSAwLFxuICAgICAgICB3aW5TY3JvbGxlciA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcblxuICAgIGlmIChlbCkge1xuICAgICAgZG8ge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgbGV0IGVsTWF0cml4ID0gbWF0cml4KGVsKSxcbiAgICAgICAgICAgIHNjYWxlWCA9IGVsTWF0cml4LmEsXG4gICAgICAgICAgICBzY2FsZVkgPSBlbE1hdHJpeC5kO1xuICAgICAgICBvZmZzZXRMZWZ0ICs9IGVsLnNjcm9sbExlZnQgKiBzY2FsZVg7XG4gICAgICAgIG9mZnNldFRvcCArPSBlbC5zY3JvbGxUb3AgKiBzY2FsZVk7XG4gICAgICB9IHdoaWxlIChlbCAhPT0gd2luU2Nyb2xsZXIgJiYgKGVsID0gZWwucGFyZW50Tm9kZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBbb2Zmc2V0TGVmdCwgb2Zmc2V0VG9wXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB3aXRoaW4gdGhlIGdpdmVuIGFycmF5XG4gICAqIEBwYXJhbSAge0FycmF5fSBhcnIgICBBcnJheSB0aGF0IG1heSBvciBtYXkgbm90IGhvbGQgdGhlIG9iamVjdFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9iaiAgQW4gb2JqZWN0IHRoYXQgaGFzIGEga2V5LXZhbHVlIHBhaXIgdW5pcXVlIHRvIGFuZCBpZGVudGljYWwgdG8gYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgb2JqZWN0IHlvdSB3YW50IHRvIGZpbmRcbiAgICogQHJldHVybiB7TnVtYmVyfSAgICAgIFRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IGluIHRoZSBhcnJheSwgb3IgLTFcbiAgICovXG5cblxuICBmdW5jdGlvbiBpbmRleE9mT2JqZWN0KGFyciwgb2JqKSB7XG4gICAgZm9yIChsZXQgaSBpbiBhcnIpIHtcbiAgICAgIGlmICghYXJyLmhhc093blByb3BlcnR5KGkpKSBjb250aW51ZTtcblxuICAgICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqW2tleV0gPT09IGFycltpXVtrZXldKSByZXR1cm4gTnVtYmVyKGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCBpbmNsdWRlU2VsZikge1xuICAgIC8vIHNraXAgdG8gd2luZG93XG4gICAgaWYgKCFlbCB8fCAhZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgIGxldCBlbGVtID0gZWw7XG4gICAgbGV0IGdvdFNlbGYgPSBmYWxzZTtcblxuICAgIGRvIHtcbiAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZ2V0IGVsZW0gY3NzIGlmIGl0IGlzbid0IGV2ZW4gb3ZlcmZsb3dpbmcgaW4gdGhlIGZpcnN0IHBsYWNlIChwZXJmb3JtYW5jZSlcbiAgICAgIGlmIChlbGVtLmNsaWVudFdpZHRoIDwgZWxlbS5zY3JvbGxXaWR0aCB8fCBlbGVtLmNsaWVudEhlaWdodCA8IGVsZW0uc2Nyb2xsSGVpZ2h0KSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBsZXQgZWxlbUNTUyA9IGNzcyhlbGVtKTtcblxuICAgICAgICBpZiAoZWxlbS5jbGllbnRXaWR0aCA8IGVsZW0uc2Nyb2xsV2lkdGggJiYgKGVsZW1DU1Mub3ZlcmZsb3dYID09IFwiYXV0b1wiIHx8IGVsZW1DU1Mub3ZlcmZsb3dYID09IFwic2Nyb2xsXCIpIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQgJiYgKGVsZW1DU1Mub3ZlcmZsb3dZID09IFwiYXV0b1wiIHx8IGVsZW1DU1Mub3ZlcmZsb3dZID09IFwic2Nyb2xsXCIpKSB7XG4gICAgICAgICAgaWYgKCFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCB8fCBlbGVtID09PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICAgIGlmIChnb3RTZWxmIHx8IGluY2x1ZGVTZWxmKSByZXR1cm4gZWxlbTtcbiAgICAgICAgICBnb3RTZWxmID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG4gICAgfSB3aGlsZSAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSk7XG5cbiAgICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXh0ZW5kKGRzdCwgc3JjKSB7XG4gICAgaWYgKGRzdCAmJiBzcmMpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzcmMpIHtcbiAgICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkc3Q7XG4gIH1cblxuICBmdW5jdGlvbiBpc1JlY3RFcXVhbChyZWN0MSwgcmVjdDIpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChyZWN0MS50b3ApID09PSBNYXRoLnJvdW5kKHJlY3QyLnRvcCkgJiYgTWF0aC5yb3VuZChyZWN0MS5sZWZ0KSA9PT0gTWF0aC5yb3VuZChyZWN0Mi5sZWZ0KSAmJiBNYXRoLnJvdW5kKHJlY3QxLmhlaWdodCkgPT09IE1hdGgucm91bmQocmVjdDIuaGVpZ2h0KSAmJiBNYXRoLnJvdW5kKHJlY3QxLndpZHRoKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi53aWR0aCk7XG4gIH1cblxuICBsZXQgX3Rocm90dGxlVGltZW91dDtcblxuICBmdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgbXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhyb3R0bGVUaW1lb3V0KSB7XG4gICAgICAgIGxldCBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNhbGxiYWNrLmNhbGwoX3RoaXMsIGFyZ3NbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KF90aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aHJvdHRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhyb3R0bGVUaW1lb3V0ID0gdm9pZCAwO1xuICAgICAgICB9LCBtcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbFRocm90dGxlKCkge1xuICAgIGNsZWFyVGltZW91dChfdGhyb3R0bGVUaW1lb3V0KTtcbiAgICBfdGhyb3R0bGVUaW1lb3V0ID0gdm9pZCAwO1xuICB9XG5cbiAgZnVuY3Rpb24gc2Nyb2xsQnkoZWwsIHgsIHkpIHtcbiAgICBlbC5zY3JvbGxMZWZ0ICs9IHg7XG4gICAgZWwuc2Nyb2xsVG9wICs9IHk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZShlbCkge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGxldCBQb2x5bWVyID0gd2luZG93LlBvbHltZXI7IC8vQHRzLWlnbm9yZVxuXG4gICAgbGV0ICQgPSB3aW5kb3cualF1ZXJ5IHx8IHdpbmRvdy5aZXB0bztcblxuICAgIGlmIChQb2x5bWVyICYmIFBvbHltZXIuZG9tKSB7XG4gICAgICByZXR1cm4gUG9seW1lci5kb20oZWwpLmNsb25lTm9kZSh0cnVlKTtcbiAgICB9IGVsc2UgaWYgKCQpIHtcbiAgICAgIHJldHVybiAkKGVsKS5jbG9uZSh0cnVlKVswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRSZWN0KGVsLCByZWN0KSB7XG4gICAgY3NzKGVsLCBcInBvc2l0aW9uXCIsIFwiYWJzb2x1dGVcIik7XG4gICAgY3NzKGVsLCBcInRvcFwiLCByZWN0LnRvcCk7XG4gICAgY3NzKGVsLCBcImxlZnRcIiwgcmVjdC5sZWZ0KTtcbiAgICBjc3MoZWwsIFwid2lkdGhcIiwgcmVjdC53aWR0aCk7XG4gICAgY3NzKGVsLCBcImhlaWdodFwiLCByZWN0LmhlaWdodCk7XG4gIH1cblxuICBmdW5jdGlvbiB1bnNldFJlY3QoZWwpIHtcbiAgICBjc3MoZWwsIFwicG9zaXRpb25cIiwgXCJcIik7XG4gICAgY3NzKGVsLCBcInRvcFwiLCBcIlwiKTtcbiAgICBjc3MoZWwsIFwibGVmdFwiLCBcIlwiKTtcbiAgICBjc3MoZWwsIFwid2lkdGhcIiwgXCJcIik7XG4gICAgY3NzKGVsLCBcImhlaWdodFwiLCBcIlwiKTtcbiAgfVxuXG4gIGNvbnN0IGV4cGFuZG8gPSBcIlNvcnRhYmxlXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICBmdW5jdGlvbiBBbmltYXRpb25TdGF0ZU1hbmFnZXIoKSB7XG4gICAgbGV0IGFuaW1hdGlvblN0YXRlcyA9IFtdLFxuICAgICAgICBhbmltYXRpb25DYWxsYmFja0lkO1xuICAgIHJldHVybiB7XG4gICAgICBjYXB0dXJlQW5pbWF0aW9uU3RhdGUoKSB7XG4gICAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbmltYXRpb24pIHJldHVybjtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10uc2xpY2UuY2FsbCh0aGlzLmVsLmNoaWxkcmVuKTtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgaWYgKGNzcyhjaGlsZCwgXCJkaXNwbGF5XCIpID09PSBcIm5vbmVcIiB8fCBjaGlsZCA9PT0gU29ydGFibGUuZ2hvc3QpIHJldHVybjtcbiAgICAgICAgICBhbmltYXRpb25TdGF0ZXMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IGNoaWxkLFxuICAgICAgICAgICAgcmVjdDogZ2V0UmVjdChjaGlsZClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGxldCBmcm9tUmVjdCA9IF9vYmplY3RTcHJlYWQoe30sIGFuaW1hdGlvblN0YXRlc1thbmltYXRpb25TdGF0ZXMubGVuZ3RoIC0gMV0ucmVjdCk7IC8vIElmIGFuaW1hdGluZzogY29tcGVuc2F0ZSBmb3IgY3VycmVudCBhbmltYXRpb25cblxuXG4gICAgICAgICAgaWYgKGNoaWxkLnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgICAgbGV0IGNoaWxkTWF0cml4ID0gbWF0cml4KGNoaWxkLCB0cnVlKTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkTWF0cml4KSB7XG4gICAgICAgICAgICAgIGZyb21SZWN0LnRvcCAtPSBjaGlsZE1hdHJpeC5mO1xuICAgICAgICAgICAgICBmcm9tUmVjdC5sZWZ0IC09IGNoaWxkTWF0cml4LmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGQuZnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICBhZGRBbmltYXRpb25TdGF0ZShzdGF0ZSkge1xuICAgICAgICBhbmltYXRpb25TdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgICB9LFxuXG4gICAgICByZW1vdmVBbmltYXRpb25TdGF0ZSh0YXJnZXQpIHtcbiAgICAgICAgYW5pbWF0aW9uU3RhdGVzLnNwbGljZShpbmRleE9mT2JqZWN0KGFuaW1hdGlvblN0YXRlcywge1xuICAgICAgICAgIHRhcmdldFxuICAgICAgICB9KSwgMSk7XG4gICAgICB9LFxuXG4gICAgICBhbmltYXRlQWxsKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChhbmltYXRpb25DYWxsYmFja0lkKTtcbiAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIGNhbGxiYWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFuaW1hdGluZyA9IGZhbHNlLFxuICAgICAgICAgICAgYW5pbWF0aW9uVGltZSA9IDA7XG4gICAgICAgIGFuaW1hdGlvblN0YXRlcy5mb3JFYWNoKHN0YXRlID0+IHtcbiAgICAgICAgICBsZXQgdGltZSA9IDAsXG4gICAgICAgICAgICAgIHRhcmdldCA9IHN0YXRlLnRhcmdldCxcbiAgICAgICAgICAgICAgZnJvbVJlY3QgPSB0YXJnZXQuZnJvbVJlY3QsXG4gICAgICAgICAgICAgIHRvUmVjdCA9IGdldFJlY3QodGFyZ2V0KSxcbiAgICAgICAgICAgICAgcHJldkZyb21SZWN0ID0gdGFyZ2V0LnByZXZGcm9tUmVjdCxcbiAgICAgICAgICAgICAgcHJldlRvUmVjdCA9IHRhcmdldC5wcmV2VG9SZWN0LFxuICAgICAgICAgICAgICBhbmltYXRpbmdSZWN0ID0gc3RhdGUucmVjdCxcbiAgICAgICAgICAgICAgdGFyZ2V0TWF0cml4ID0gbWF0cml4KHRhcmdldCwgdHJ1ZSk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0TWF0cml4KSB7XG4gICAgICAgICAgICAvLyBDb21wZW5zYXRlIGZvciBjdXJyZW50IGFuaW1hdGlvblxuICAgICAgICAgICAgdG9SZWN0LnRvcCAtPSB0YXJnZXRNYXRyaXguZjtcbiAgICAgICAgICAgIHRvUmVjdC5sZWZ0IC09IHRhcmdldE1hdHJpeC5lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRhcmdldC50b1JlY3QgPSB0b1JlY3Q7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgICAgLy8gQ291bGQgYWxzbyBjaGVjayBpZiBhbmltYXRpbmdSZWN0IGlzIGJldHdlZW4gZnJvbVJlY3QgYW5kIHRvUmVjdFxuICAgICAgICAgICAgaWYgKGlzUmVjdEVxdWFsKHByZXZGcm9tUmVjdCwgdG9SZWN0KSAmJiAhaXNSZWN0RXF1YWwoZnJvbVJlY3QsIHRvUmVjdCkgJiYgLy8gTWFrZSBzdXJlIGFuaW1hdGluZ1JlY3QgaXMgb24gbGluZSBiZXR3ZWVuIHRvUmVjdCAmIGZyb21SZWN0XG4gICAgICAgICAgICAoYW5pbWF0aW5nUmVjdC50b3AgLSB0b1JlY3QudG9wKSAvIChhbmltYXRpbmdSZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkgPT09IChmcm9tUmVjdC50b3AgLSB0b1JlY3QudG9wKSAvIChmcm9tUmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpKSB7XG4gICAgICAgICAgICAgIC8vIElmIHJldHVybmluZyB0byBzYW1lIHBsYWNlIGFzIHN0YXJ0ZWQgZnJvbSBhbmltYXRpb24gYW5kIG9uIHNhbWUgYXhpc1xuICAgICAgICAgICAgICB0aW1lID0gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgcHJldkZyb21SZWN0LCBwcmV2VG9SZWN0LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gaWYgZnJvbVJlY3QgIT0gdG9SZWN0OiBhbmltYXRlXG5cblxuICAgICAgICAgIGlmICghaXNSZWN0RXF1YWwodG9SZWN0LCBmcm9tUmVjdCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5wcmV2RnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgICAgICAgIHRhcmdldC5wcmV2VG9SZWN0ID0gdG9SZWN0O1xuXG4gICAgICAgICAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgICAgICAgdGltZSA9IHRoaXMub3B0aW9ucy5hbmltYXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSh0YXJnZXQsIGFuaW1hdGluZ1JlY3QsIHRvUmVjdCwgdGltZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICAgIGFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgICBhbmltYXRpb25UaW1lID0gTWF0aC5tYXgoYW5pbWF0aW9uVGltZSwgdGltZSk7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGFyZ2V0LmFuaW1hdGlvblJlc2V0VGltZXIpO1xuICAgICAgICAgICAgdGFyZ2V0LmFuaW1hdGlvblJlc2V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdGFyZ2V0LmFuaW1hdGlvblRpbWUgPSAwO1xuICAgICAgICAgICAgICB0YXJnZXQucHJldkZyb21SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgdGFyZ2V0LmZyb21SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSBudWxsO1xuICAgICAgICAgICAgICB0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIH0sIHRpbWUpO1xuICAgICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IHRpbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGFuaW1hdGlvbkNhbGxiYWNrSWQpO1xuXG4gICAgICAgIGlmICghYW5pbWF0aW5nKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSBjYWxsYmFjaygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIikgY2FsbGJhY2soKTtcbiAgICAgICAgICB9LCBhbmltYXRpb25UaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgICAgfSxcblxuICAgICAgYW5pbWF0ZSh0YXJnZXQsIGN1cnJlbnRSZWN0LCB0b1JlY3QsIGR1cmF0aW9uKSB7XG4gICAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICAgIGNzcyh0YXJnZXQsIFwidHJhbnNpdGlvblwiLCBcIlwiKTtcbiAgICAgICAgICBjc3ModGFyZ2V0LCBcInRyYW5zZm9ybVwiLCBcIlwiKTtcbiAgICAgICAgICBsZXQgZWxNYXRyaXggPSBtYXRyaXgodGhpcy5lbCksXG4gICAgICAgICAgICAgIHNjYWxlWCA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmEsXG4gICAgICAgICAgICAgIHNjYWxlWSA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmQsXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVggPSAoY3VycmVudFJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSAvIChzY2FsZVggfHwgMSksXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVkgPSAoY3VycmVudFJlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoc2NhbGVZIHx8IDEpO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdYID0gISF0cmFuc2xhdGVYO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gISF0cmFuc2xhdGVZO1xuICAgICAgICAgIGNzcyh0YXJnZXQsIFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlM2QoXCIgKyB0cmFuc2xhdGVYICsgXCJweCxcIiArIHRyYW5zbGF0ZVkgKyBcInB4LDApXCIpO1xuICAgICAgICAgIHRoaXMuZm9yUmVwYWludER1bW15ID0gcmVwYWludCh0YXJnZXQpOyAvLyByZXBhaW50XG5cbiAgICAgICAgICBjc3ModGFyZ2V0LCBcInRyYW5zaXRpb25cIiwgXCJ0cmFuc2Zvcm0gXCIgKyBkdXJhdGlvbiArIFwibXNcIiArICh0aGlzLm9wdGlvbnMuZWFzaW5nID8gXCIgXCIgKyB0aGlzLm9wdGlvbnMuZWFzaW5nIDogXCJcIikpO1xuICAgICAgICAgIGNzcyh0YXJnZXQsIFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlM2QoMCwwLDApXCIpO1xuICAgICAgICAgIHR5cGVvZiB0YXJnZXQuYW5pbWF0ZWQgPT09IFwibnVtYmVyXCIgJiYgY2xlYXJUaW1lb3V0KHRhcmdldC5hbmltYXRlZCk7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjc3ModGFyZ2V0LCBcInRyYW5zaXRpb25cIiwgXCJcIik7XG4gICAgICAgICAgICBjc3ModGFyZ2V0LCBcInRyYW5zZm9ybVwiLCBcIlwiKTtcbiAgICAgICAgICAgIHRhcmdldC5hbmltYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1ggPSBmYWxzZTtcbiAgICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gZmFsc2U7XG4gICAgICAgICAgfSwgZHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVwYWludCh0YXJnZXQpIHtcbiAgICByZXR1cm4gdGFyZ2V0Lm9mZnNldFdpZHRoO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgZnJvbVJlY3QsIHRvUmVjdCwgb3B0aW9ucykge1xuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coZnJvbVJlY3QudG9wIC0gYW5pbWF0aW5nUmVjdC50b3AsIDIpICsgTWF0aC5wb3coZnJvbVJlY3QubGVmdCAtIGFuaW1hdGluZ1JlY3QubGVmdCwgMikpIC8gTWF0aC5zcXJ0KE1hdGgucG93KGZyb21SZWN0LnRvcCAtIHRvUmVjdC50b3AsIDIpICsgTWF0aC5wb3coZnJvbVJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0LCAyKSkgKiBvcHRpb25zLmFuaW1hdGlvbjtcbiAgfVxuXG4gIGxldCBwbHVnaW5zID0gW107XG4gIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbiAgfTtcbiAgdmFyIFBsdWdpbk1hbmFnZXIgPSB7XG4gICAgbW91bnQocGx1Z2luKSB7XG4gICAgICAvLyBTZXQgZGVmYXVsdCBzdGF0aWMgcHJvcGVydGllc1xuICAgICAgZm9yIChsZXQgb3B0aW9uIGluIGRlZmF1bHRzKSB7XG4gICAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pICYmICEob3B0aW9uIGluIHBsdWdpbikpIHtcbiAgICAgICAgICBwbHVnaW5bb3B0aW9uXSA9IGRlZmF1bHRzW29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgfSxcblxuICAgIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUsIGV2dCkge1xuICAgICAgdGhpcy5ldmVudENhbmNlbGVkID0gZmFsc2U7XG5cbiAgICAgIGV2dC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRDYW5jZWxlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBldmVudE5hbWVHbG9iYWwgPSBldmVudE5hbWUgKyBcIkdsb2JhbFwiO1xuICAgICAgcGx1Z2lucy5mb3JFYWNoKHBsdWdpbiA9PiB7XG4gICAgICAgIGlmICghc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdKSByZXR1cm47IC8vIEZpcmUgZ2xvYmFsIGV2ZW50cyBpZiBpdCBleGlzdHMgaW4gdGhpcyBzb3J0YWJsZVxuXG4gICAgICAgIGlmIChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lR2xvYmFsXSkge1xuICAgICAgICAgIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgc29ydGFibGVcbiAgICAgICAgICB9LCBldnQpKTtcbiAgICAgICAgfSAvLyBPbmx5IGZpcmUgcGx1Z2luIGV2ZW50IGlmIHBsdWdpbiBpcyBlbmFibGVkIGluIHRoaXMgc29ydGFibGUsXG4gICAgICAgIC8vIGFuZCBwbHVnaW4gaGFzIGV2ZW50IGRlZmluZWRcblxuXG4gICAgICAgIGlmIChzb3J0YWJsZS5vcHRpb25zW3BsdWdpbi5wbHVnaW5OYW1lXSAmJiBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXSkge1xuICAgICAgICAgIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVdKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgc29ydGFibGVcbiAgICAgICAgICB9LCBldnQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGluaXRpYWxpemVQbHVnaW5zKHNvcnRhYmxlLCBlbCwgZGVmYXVsdHMsIG9wdGlvbnMpIHtcbiAgICAgIHBsdWdpbnMuZm9yRWFjaChwbHVnaW4gPT4ge1xuICAgICAgICBjb25zdCBwbHVnaW5OYW1lID0gcGx1Z2luLnBsdWdpbk5hbWU7XG4gICAgICAgIGlmICghc29ydGFibGUub3B0aW9uc1twbHVnaW5OYW1lXSAmJiAhcGx1Z2luLmluaXRpYWxpemVCeURlZmF1bHQpIHJldHVybjtcbiAgICAgICAgbGV0IGluaXRpYWxpemVkID0gbmV3IHBsdWdpbihzb3J0YWJsZSwgZWwsIHNvcnRhYmxlLm9wdGlvbnMpO1xuICAgICAgICBpbml0aWFsaXplZC5zb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgICBpbml0aWFsaXplZC5vcHRpb25zID0gc29ydGFibGUub3B0aW9ucztcbiAgICAgICAgc29ydGFibGVbcGx1Z2luTmFtZV0gPSBpbml0aWFsaXplZDsgLy8gQWRkIGRlZmF1bHQgb3B0aW9ucyBmcm9tIHBsdWdpblxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIGluaXRpYWxpemVkLmRlZmF1bHRzKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGxldCBvcHRpb24gaW4gc29ydGFibGUub3B0aW9ucykge1xuICAgICAgICBpZiAoIXNvcnRhYmxlLm9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uKSkgY29udGludWU7XG4gICAgICAgIGxldCBtb2RpZmllZCA9IHRoaXMubW9kaWZ5T3B0aW9uKHNvcnRhYmxlLCBvcHRpb24sIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSA9IG1vZGlmaWVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEV2ZW50UHJvcGVydGllcyhuYW1lLCBzb3J0YWJsZSkge1xuICAgICAgbGV0IGV2ZW50UHJvcGVydGllcyA9IHt9O1xuICAgICAgcGx1Z2lucy5mb3JFYWNoKHBsdWdpbiA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLmV2ZW50UHJvcGVydGllcyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXZlbnRQcm9wZXJ0aWVzLCBwbHVnaW4uZXZlbnRQcm9wZXJ0aWVzLmNhbGwoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdLCBuYW1lKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBldmVudFByb3BlcnRpZXM7XG4gICAgfSxcblxuICAgIG1vZGlmeU9wdGlvbihzb3J0YWJsZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgIGxldCBtb2RpZmllZFZhbHVlO1xuICAgICAgcGx1Z2lucy5mb3JFYWNoKHBsdWdpbiA9PiB7XG4gICAgICAgIC8vIFBsdWdpbiBtdXN0IGV4aXN0IG9uIHRoZSBTb3J0YWJsZVxuICAgICAgICBpZiAoIXNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSkgcmV0dXJuOyAvLyBJZiBzdGF0aWMgb3B0aW9uIGxpc3RlbmVyIGV4aXN0cyBmb3IgdGhpcyBvcHRpb24sIGNhbGwgaW4gdGhlIGNvbnRleHQgb2YgdGhlIFNvcnRhYmxlJ3MgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW5cblxuICAgICAgICBpZiAocGx1Z2luLm9wdGlvbkxpc3RlbmVycyAmJiB0eXBlb2YgcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgbW9kaWZpZWRWYWx1ZSA9IHBsdWdpbi5vcHRpb25MaXN0ZW5lcnNbbmFtZV0uY2FsbChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbW9kaWZpZWRWYWx1ZTtcbiAgICB9XG5cbiAgfTtcblxuICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgc29ydGFibGUsXG4gICAgICByb290RWwsXG4gICAgICBuYW1lLFxuICAgICAgdGFyZ2V0RWwsXG4gICAgICBjbG9uZUVsLFxuICAgICAgdG9FbCxcbiAgICAgIGZyb21FbCxcbiAgICAgIG9sZEluZGV4LFxuICAgICAgbmV3SW5kZXgsXG4gICAgICBvbGREcmFnZ2FibGVJbmRleCxcbiAgICAgIG5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgb3JpZ2luYWxFdmVudCxcbiAgICAgIHB1dFNvcnRhYmxlLFxuICAgICAgZXh0cmFFdmVudFByb3BlcnRpZXNcbiAgICB9ID0gX3JlZjtcbiAgICBzb3J0YWJsZSA9IHNvcnRhYmxlIHx8IHJvb3RFbCAmJiByb290RWxbZXhwYW5kb107XG4gICAgaWYgKCFzb3J0YWJsZSkgcmV0dXJuO1xuICAgIGxldCBldnQsXG4gICAgICAgIG9wdGlvbnMgPSBzb3J0YWJsZS5vcHRpb25zLFxuICAgICAgICBvbk5hbWUgPSBcIm9uXCIgKyBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zdWJzdHIoMSk7IC8vIFN1cHBvcnQgZm9yIG5ldyBDdXN0b21FdmVudCBmZWF0dXJlXG5cbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmICFJRTExT3JMZXNzICYmICFFZGdlKSB7XG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQobmFtZSwge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICAgIGV2dC5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZXZ0LnRvID0gdG9FbCB8fCByb290RWw7XG4gICAgZXZ0LmZyb20gPSBmcm9tRWwgfHwgcm9vdEVsO1xuICAgIGV2dC5pdGVtID0gdGFyZ2V0RWwgfHwgcm9vdEVsO1xuICAgIGV2dC5jbG9uZSA9IGNsb25lRWw7XG4gICAgZXZ0Lm9sZEluZGV4ID0gb2xkSW5kZXg7XG4gICAgZXZ0Lm5ld0luZGV4ID0gbmV3SW5kZXg7XG4gICAgZXZ0Lm9sZERyYWdnYWJsZUluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gICAgZXZ0Lm5ld0RyYWdnYWJsZUluZGV4ID0gbmV3RHJhZ2dhYmxlSW5kZXg7XG4gICAgZXZ0Lm9yaWdpbmFsRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuICAgIGV2dC5wdWxsTW9kZSA9IHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUubGFzdFB1dE1vZGUgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgYWxsRXZlbnRQcm9wZXJ0aWVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBleHRyYUV2ZW50UHJvcGVydGllcyksIFBsdWdpbk1hbmFnZXIuZ2V0RXZlbnRQcm9wZXJ0aWVzKG5hbWUsIHNvcnRhYmxlKSk7XG5cbiAgICBmb3IgKGxldCBvcHRpb24gaW4gYWxsRXZlbnRQcm9wZXJ0aWVzKSB7XG4gICAgICBldnRbb3B0aW9uXSA9IGFsbEV2ZW50UHJvcGVydGllc1tvcHRpb25dO1xuICAgIH1cblxuICAgIGlmIChyb290RWwpIHtcbiAgICAgIHJvb3RFbC5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnNbb25OYW1lXSkge1xuICAgICAgb3B0aW9uc1tvbk5hbWVdLmNhbGwoc29ydGFibGUsIGV2dCk7XG4gICAgfVxuICB9XG4gIC8qKiFcbiAgICogU29ydGFibGVcbiAgICogQGF1dGhvclx0UnViYVhhICAgPHRyYXNoQHJ1YmF4YS5vcmc+XG4gICAqIEBhdXRob3JcdG93ZW5tICAgIDxvd2VuMjMzNTVAZ21haWwuY29tPlxuICAgKiBAbGljZW5zZSBNSVRcbiAgICovXG5cblxuICBsZXQgcGx1Z2luRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBzb3J0YWJsZSkge1xuICAgIGxldCBfcmVmMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBsZXQge1xuICAgICAgZXZ0OiBvcmlnaW5hbEV2ZW50XG4gICAgfSA9IF9yZWYyLFxuICAgICAgICBkYXRhID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gICAgUGx1Z2luTWFuYWdlci5wbHVnaW5FdmVudC5iaW5kKFNvcnRhYmxlKShldmVudE5hbWUsIHNvcnRhYmxlLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGRyYWdFbCxcbiAgICAgIHBhcmVudEVsLFxuICAgICAgZ2hvc3RFbCxcbiAgICAgIHJvb3RFbCxcbiAgICAgIG5leHRFbCxcbiAgICAgIGxhc3REb3duRWwsXG4gICAgICBjbG9uZUVsLFxuICAgICAgY2xvbmVIaWRkZW4sXG4gICAgICBkcmFnU3RhcnRlZDogbW92ZWQsXG4gICAgICBwdXRTb3J0YWJsZSxcbiAgICAgIGFjdGl2ZVNvcnRhYmxlOiBTb3J0YWJsZS5hY3RpdmUsXG4gICAgICBvcmlnaW5hbEV2ZW50LFxuICAgICAgb2xkSW5kZXgsXG4gICAgICBvbGREcmFnZ2FibGVJbmRleCxcbiAgICAgIG5ld0luZGV4LFxuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgICBoaWRlR2hvc3RGb3JUYXJnZXQ6IF9oaWRlR2hvc3RGb3JUYXJnZXQsXG4gICAgICB1bmhpZGVHaG9zdEZvclRhcmdldDogX3VuaGlkZUdob3N0Rm9yVGFyZ2V0LFxuXG4gICAgICBjbG9uZU5vd0hpZGRlbigpIHtcbiAgICAgICAgY2xvbmVIaWRkZW4gPSB0cnVlO1xuICAgICAgfSxcblxuICAgICAgY2xvbmVOb3dTaG93bigpIHtcbiAgICAgICAgY2xvbmVIaWRkZW4gPSBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudChuYW1lKSB7XG4gICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZSxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICB9LCBkYXRhKSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gX2Rpc3BhdGNoRXZlbnQoaW5mbykge1xuICAgIGRpc3BhdGNoRXZlbnQoX29iamVjdFNwcmVhZCh7XG4gICAgICBwdXRTb3J0YWJsZSxcbiAgICAgIGNsb25lRWwsXG4gICAgICB0YXJnZXRFbDogZHJhZ0VsLFxuICAgICAgcm9vdEVsLFxuICAgICAgb2xkSW5kZXgsXG4gICAgICBvbGREcmFnZ2FibGVJbmRleCxcbiAgICAgIG5ld0luZGV4LFxuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXhcbiAgICB9LCBpbmZvKSk7XG4gIH1cblxuICBsZXQgZHJhZ0VsLFxuICAgICAgcGFyZW50RWwsXG4gICAgICBnaG9zdEVsLFxuICAgICAgcm9vdEVsLFxuICAgICAgbmV4dEVsLFxuICAgICAgbGFzdERvd25FbCxcbiAgICAgIGNsb25lRWwsXG4gICAgICBjbG9uZUhpZGRlbixcbiAgICAgIG9sZEluZGV4LFxuICAgICAgbmV3SW5kZXgsXG4gICAgICBvbGREcmFnZ2FibGVJbmRleCxcbiAgICAgIG5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgYWN0aXZlR3JvdXAsXG4gICAgICBwdXRTb3J0YWJsZSxcbiAgICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZSxcbiAgICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlLFxuICAgICAgc29ydGFibGVzID0gW10sXG4gICAgICB0YXBFdnQsXG4gICAgICB0b3VjaEV2dCxcbiAgICAgIGxhc3REeCxcbiAgICAgIGxhc3REeSxcbiAgICAgIHRhcERpc3RhbmNlTGVmdCxcbiAgICAgIHRhcERpc3RhbmNlVG9wLFxuICAgICAgbW92ZWQsXG4gICAgICBsYXN0VGFyZ2V0LFxuICAgICAgbGFzdERpcmVjdGlvbixcbiAgICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlLFxuICAgICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9IGZhbHNlLFxuICAgICAgdGFyZ2V0TW92ZURpc3RhbmNlLFxuICAgICAgLy8gRm9yIHBvc2l0aW9uaW5nIGdob3N0IGFic29sdXRlbHlcbiAgZ2hvc3RSZWxhdGl2ZVBhcmVudCxcbiAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsID0gW10sXG4gICAgICAvLyAobGVmdCwgdG9wKVxuICBfc2lsZW50ID0gZmFsc2UsXG4gICAgICBzYXZlZElucHV0Q2hlY2tlZCA9IFtdO1xuICAvKiogQGNvbnN0ICovXG5cbiAgY29uc3QgZG9jdW1lbnRFeGlzdHMgPSB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIsXG4gICAgICAgIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5ID0gSU9TLFxuICAgICAgICBDU1NGbG9hdFByb3BlcnR5ID0gRWRnZSB8fCBJRTExT3JMZXNzID8gXCJjc3NGbG9hdFwiIDogXCJmbG9hdFwiLFxuICAgICAgICAvLyBUaGlzIHdpbGwgbm90IHBhc3MgZm9yIElFOSwgYmVjYXVzZSBJRTkgRG5EIG9ubHkgd29ya3Mgb24gYW5jaG9yc1xuICBzdXBwb3J0RHJhZ2dhYmxlID0gZG9jdW1lbnRFeGlzdHMgJiYgIUNocm9tZUZvckFuZHJvaWQgJiYgIUlPUyAmJiBcImRyYWdnYWJsZVwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgIHN1cHBvcnRDc3NQb2ludGVyRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghZG9jdW1lbnRFeGlzdHMpIHJldHVybjsgLy8gZmFsc2Ugd2hlbiA8PSBJRTExXG5cbiAgICBpZiAoSUUxMU9yTGVzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ4XCIpO1xuICAgIGVsLnN0eWxlLmNzc1RleHQgPSBcInBvaW50ZXItZXZlbnRzOmF1dG9cIjtcbiAgICByZXR1cm4gZWwuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gXCJhdXRvXCI7XG4gIH0oKSxcbiAgICAgICAgX2RldGVjdERpcmVjdGlvbiA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucykge1xuICAgIGxldCBlbENTUyA9IGNzcyhlbCksXG4gICAgICAgIGVsV2lkdGggPSBwYXJzZUludChlbENTUy53aWR0aCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nTGVmdCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nUmlnaHQpIC0gcGFyc2VJbnQoZWxDU1MuYm9yZGVyTGVmdFdpZHRoKSAtIHBhcnNlSW50KGVsQ1NTLmJvcmRlclJpZ2h0V2lkdGgpLFxuICAgICAgICBjaGlsZDEgPSBnZXRDaGlsZChlbCwgMCwgb3B0aW9ucyksXG4gICAgICAgIGNoaWxkMiA9IGdldENoaWxkKGVsLCAxLCBvcHRpb25zKSxcbiAgICAgICAgZmlyc3RDaGlsZENTUyA9IGNoaWxkMSAmJiBjc3MoY2hpbGQxKSxcbiAgICAgICAgc2Vjb25kQ2hpbGRDU1MgPSBjaGlsZDIgJiYgY3NzKGNoaWxkMiksXG4gICAgICAgIGZpcnN0Q2hpbGRXaWR0aCA9IGZpcnN0Q2hpbGRDU1MgJiYgcGFyc2VJbnQoZmlyc3RDaGlsZENTUy5tYXJnaW5MZWZ0KSArIHBhcnNlSW50KGZpcnN0Q2hpbGRDU1MubWFyZ2luUmlnaHQpICsgZ2V0UmVjdChjaGlsZDEpLndpZHRoLFxuICAgICAgICBzZWNvbmRDaGlsZFdpZHRoID0gc2Vjb25kQ2hpbGRDU1MgJiYgcGFyc2VJbnQoc2Vjb25kQ2hpbGRDU1MubWFyZ2luTGVmdCkgKyBwYXJzZUludChzZWNvbmRDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMikud2lkdGg7XG5cbiAgICBpZiAoZWxDU1MuZGlzcGxheSA9PT0gXCJmbGV4XCIpIHtcbiAgICAgIHJldHVybiBlbENTUy5mbGV4RGlyZWN0aW9uID09PSBcImNvbHVtblwiIHx8IGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09IFwiY29sdW1uLXJldmVyc2VcIiA/IFwidmVydGljYWxcIiA6IFwiaG9yaXpvbnRhbFwiO1xuICAgIH1cblxuICAgIGlmIChlbENTUy5kaXNwbGF5ID09PSBcImdyaWRcIikge1xuICAgICAgcmV0dXJuIGVsQ1NTLmdyaWRUZW1wbGF0ZUNvbHVtbnMuc3BsaXQoXCIgXCIpLmxlbmd0aCA8PSAxID8gXCJ2ZXJ0aWNhbFwiIDogXCJob3Jpem9udGFsXCI7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkMSAmJiBmaXJzdENoaWxkQ1NTLmZsb2F0ICYmIGZpcnN0Q2hpbGRDU1MuZmxvYXQgIT09IFwibm9uZVwiKSB7XG4gICAgICBsZXQgdG91Y2hpbmdTaWRlQ2hpbGQyID0gZmlyc3RDaGlsZENTUy5mbG9hdCA9PT0gXCJsZWZ0XCIgPyBcImxlZnRcIiA6IFwicmlnaHRcIjtcbiAgICAgIHJldHVybiBjaGlsZDIgJiYgKHNlY29uZENoaWxkQ1NTLmNsZWFyID09PSBcImJvdGhcIiB8fCBzZWNvbmRDaGlsZENTUy5jbGVhciA9PT0gdG91Y2hpbmdTaWRlQ2hpbGQyKSA/IFwidmVydGljYWxcIiA6IFwiaG9yaXpvbnRhbFwiO1xuICAgIH1cblxuICAgIHJldHVybiBjaGlsZDEgJiYgKGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gXCJibG9ja1wiIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gXCJmbGV4XCIgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSBcInRhYmxlXCIgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSBcImdyaWRcIiB8fCBmaXJzdENoaWxkV2lkdGggPj0gZWxXaWR0aCAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gXCJub25lXCIgfHwgY2hpbGQyICYmIGVsQ1NTW0NTU0Zsb2F0UHJvcGVydHldID09PSBcIm5vbmVcIiAmJiBmaXJzdENoaWxkV2lkdGggKyBzZWNvbmRDaGlsZFdpZHRoID4gZWxXaWR0aCkgPyBcInZlcnRpY2FsXCIgOiBcImhvcml6b250YWxcIjtcbiAgfSxcbiAgICAgICAgX2RyYWdFbEluUm93Q29sdW1uID0gZnVuY3Rpb24gKGRyYWdSZWN0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCkge1xuICAgIGxldCBkcmFnRWxTMU9wcCA9IHZlcnRpY2FsID8gZHJhZ1JlY3QubGVmdCA6IGRyYWdSZWN0LnRvcCxcbiAgICAgICAgZHJhZ0VsUzJPcHAgPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LnJpZ2h0IDogZHJhZ1JlY3QuYm90dG9tLFxuICAgICAgICBkcmFnRWxPcHBMZW5ndGggPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LndpZHRoIDogZHJhZ1JlY3QuaGVpZ2h0LFxuICAgICAgICB0YXJnZXRTMU9wcCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5sZWZ0IDogdGFyZ2V0UmVjdC50b3AsXG4gICAgICAgIHRhcmdldFMyT3BwID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LnJpZ2h0IDogdGFyZ2V0UmVjdC5ib3R0b20sXG4gICAgICAgIHRhcmdldE9wcExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC53aWR0aCA6IHRhcmdldFJlY3QuaGVpZ2h0O1xuICAgIHJldHVybiBkcmFnRWxTMU9wcCA9PT0gdGFyZ2V0UzFPcHAgfHwgZHJhZ0VsUzJPcHAgPT09IHRhcmdldFMyT3BwIHx8IGRyYWdFbFMxT3BwICsgZHJhZ0VsT3BwTGVuZ3RoIC8gMiA9PT0gdGFyZ2V0UzFPcHAgKyB0YXJnZXRPcHBMZW5ndGggLyAyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIGZpcnN0IG5lYXJlc3QgZW1wdHkgc29ydGFibGUgdG8gWCBhbmQgWSBwb3NpdGlvbiB1c2luZyBlbXB0eUluc2VydFRocmVzaG9sZC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICAgICAgWCBwb3NpdGlvblxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgICAgICBZIHBvc2l0aW9uXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgIEVsZW1lbnQgb2YgdGhlIGZpcnN0IGZvdW5kIG5lYXJlc3QgU29ydGFibGVcbiAgICovXG4gIF9kZXRlY3ROZWFyZXN0RW1wdHlTb3J0YWJsZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgbGV0IHJldDtcbiAgICBzb3J0YWJsZXMuc29tZShzb3J0YWJsZSA9PiB7XG4gICAgICBpZiAobGFzdENoaWxkKHNvcnRhYmxlKSkgcmV0dXJuO1xuICAgICAgbGV0IHJlY3QgPSBnZXRSZWN0KHNvcnRhYmxlKSxcbiAgICAgICAgICB0aHJlc2hvbGQgPSBzb3J0YWJsZVtleHBhbmRvXS5vcHRpb25zLmVtcHR5SW5zZXJ0VGhyZXNob2xkLFxuICAgICAgICAgIGluc2lkZUhvcml6b250YWxseSA9IHggPj0gcmVjdC5sZWZ0IC0gdGhyZXNob2xkICYmIHggPD0gcmVjdC5yaWdodCArIHRocmVzaG9sZCxcbiAgICAgICAgICBpbnNpZGVWZXJ0aWNhbGx5ID0geSA+PSByZWN0LnRvcCAtIHRocmVzaG9sZCAmJiB5IDw9IHJlY3QuYm90dG9tICsgdGhyZXNob2xkO1xuXG4gICAgICBpZiAodGhyZXNob2xkICYmIGluc2lkZUhvcml6b250YWxseSAmJiBpbnNpZGVWZXJ0aWNhbGx5KSB7XG4gICAgICAgIHJldHVybiByZXQgPSBzb3J0YWJsZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICAgICAgICBfcHJlcGFyZUdyb3VwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBmdW5jdGlvbiB0b0ZuKHZhbHVlLCBwdWxsKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCkge1xuICAgICAgICBsZXQgc2FtZUdyb3VwID0gdG8ub3B0aW9ucy5ncm91cC5uYW1lICYmIGZyb20ub3B0aW9ucy5ncm91cC5uYW1lICYmIHRvLm9wdGlvbnMuZ3JvdXAubmFtZSA9PT0gZnJvbS5vcHRpb25zLmdyb3VwLm5hbWU7XG5cbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgKHB1bGwgfHwgc2FtZUdyb3VwKSkge1xuICAgICAgICAgIC8vIERlZmF1bHQgcHVsbCB2YWx1ZVxuICAgICAgICAgIC8vIERlZmF1bHQgcHVsbCBhbmQgcHV0IHZhbHVlIGlmIHNhbWUgZ3JvdXBcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChwdWxsICYmIHZhbHVlID09PSBcImNsb25lXCIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gdG9Gbih2YWx1ZSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpLCBwdWxsKSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBvdGhlckdyb3VwID0gKHB1bGwgPyB0byA6IGZyb20pLm9wdGlvbnMuZ3JvdXAubmFtZTtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlID09PSBvdGhlckdyb3VwIHx8IHZhbHVlLmpvaW4gJiYgdmFsdWUuaW5kZXhPZihvdGhlckdyb3VwKSA+IC0xO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBncm91cCA9IHt9O1xuICAgIGxldCBvcmlnaW5hbEdyb3VwID0gb3B0aW9ucy5ncm91cDtcblxuICAgIGlmICghb3JpZ2luYWxHcm91cCB8fCB0eXBlb2Ygb3JpZ2luYWxHcm91cCAhPSBcIm9iamVjdFwiKSB7XG4gICAgICBvcmlnaW5hbEdyb3VwID0ge1xuICAgICAgICBuYW1lOiBvcmlnaW5hbEdyb3VwXG4gICAgICB9O1xuICAgIH1cblxuICAgIGdyb3VwLm5hbWUgPSBvcmlnaW5hbEdyb3VwLm5hbWU7XG4gICAgZ3JvdXAuY2hlY2tQdWxsID0gdG9GbihvcmlnaW5hbEdyb3VwLnB1bGwsIHRydWUpO1xuICAgIGdyb3VwLmNoZWNrUHV0ID0gdG9GbihvcmlnaW5hbEdyb3VwLnB1dCk7XG4gICAgZ3JvdXAucmV2ZXJ0Q2xvbmUgPSBvcmlnaW5hbEdyb3VwLnJldmVydENsb25lO1xuICAgIG9wdGlvbnMuZ3JvdXAgPSBncm91cDtcbiAgfSxcbiAgICAgICAgX2hpZGVHaG9zdEZvclRhcmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN1cHBvcnRDc3NQb2ludGVyRXZlbnRzICYmIGdob3N0RWwpIHtcbiAgICAgIGNzcyhnaG9zdEVsLCBcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgIH1cbiAgfSxcbiAgICAgICAgX3VuaGlkZUdob3N0Rm9yVGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgJiYgZ2hvc3RFbCkge1xuICAgICAgY3NzKGdob3N0RWwsIFwiZGlzcGxheVwiLCBcIlwiKTtcbiAgICB9XG4gIH07IC8vICMxMTg0IGZpeCAtIFByZXZlbnQgY2xpY2sgZXZlbnQgb24gZmFsbGJhY2sgaWYgZHJhZ2dlZCBidXQgaXRlbSBub3QgY2hhbmdlZCBwb3NpdGlvblxuXG5cbiAgaWYgKGRvY3VtZW50RXhpc3RzKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIGlmIChpZ25vcmVOZXh0Q2xpY2spIHtcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICYmIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIGxldCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICBldnQgPSBldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0O1xuXG4gICAgICBsZXQgbmVhcmVzdCA9IF9kZXRlY3ROZWFyZXN0RW1wdHlTb3J0YWJsZShldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuXG4gICAgICBpZiAobmVhcmVzdCkge1xuICAgICAgICAvLyBDcmVhdGUgaW1pdGF0aW9uIGV2ZW50XG4gICAgICAgIGxldCBldmVudCA9IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGkgaW4gZXZ0KSB7XG4gICAgICAgICAgaWYgKGV2dC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgZXZlbnRbaV0gPSBldnRbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQucm9vdEVsID0gbmVhcmVzdDtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQgPSB2b2lkIDA7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IHZvaWQgMDtcblxuICAgICAgICBuZWFyZXN0W2V4cGFuZG9dLl9vbkRyYWdPdmVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgbGV0IF9jaGVja091dHNpZGVUYXJnZXRFbCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKGV2dC50YXJnZXQpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBjbGFzcyAgU29ydGFibGVcbiAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICBlbFxuICAgKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgIFtvcHRpb25zXVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIFNvcnRhYmxlKGVsLCBvcHRpb25zKSB7XG4gICAgaWYgKCEoZWwgJiYgZWwubm9kZVR5cGUgJiYgZWwubm9kZVR5cGUgPT09IDEpKSB7XG4gICAgICB0aHJvdyBgU29ydGFibGU6IFxcYGVsXFxgIG11c3QgYmUgYW4gSFRNTEVsZW1lbnQsIG5vdCAke3t9LnRvU3RyaW5nLmNhbGwoZWwpfWA7XG4gICAgfVxuXG4gICAgdGhpcy5lbCA9IGVsOyAvLyByb290IGVsZW1lbnRcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTsgLy8gRXhwb3J0IGluc3RhbmNlXG5cbiAgICBlbFtleHBhbmRvXSA9IHRoaXM7XG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgZ3JvdXA6IG51bGwsXG4gICAgICBzb3J0OiB0cnVlLFxuICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgc3RvcmU6IG51bGwsXG4gICAgICBoYW5kbGU6IG51bGwsXG4gICAgICBkcmFnZ2FibGU6IC9eW3VvXWwkL2kudGVzdChlbC5ub2RlTmFtZSkgPyBcIj5saVwiIDogXCI+KlwiLFxuICAgICAgc3dhcFRocmVzaG9sZDogMSxcbiAgICAgIC8vIHBlcmNlbnRhZ2U7IDAgPD0geCA8PSAxXG4gICAgICBpbnZlcnRTd2FwOiBmYWxzZSxcbiAgICAgIC8vIGludmVydCBhbHdheXNcbiAgICAgIGludmVydGVkU3dhcFRocmVzaG9sZDogbnVsbCxcbiAgICAgIC8vIHdpbGwgYmUgc2V0IHRvIHNhbWUgYXMgc3dhcFRocmVzaG9sZCBpZiBkZWZhdWx0XG4gICAgICByZW1vdmVDbG9uZU9uSGlkZTogdHJ1ZSxcbiAgICAgIGRpcmVjdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX2RldGVjdERpcmVjdGlvbihlbCwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH0sXG4gICAgICBnaG9zdENsYXNzOiBcInNvcnRhYmxlLWdob3N0XCIsXG4gICAgICBjaG9zZW5DbGFzczogXCJzb3J0YWJsZS1jaG9zZW5cIixcbiAgICAgIGRyYWdDbGFzczogXCJzb3J0YWJsZS1kcmFnXCIsXG4gICAgICBpZ25vcmU6IFwiYSwgaW1nXCIsXG4gICAgICBmaWx0ZXI6IG51bGwsXG4gICAgICBwcmV2ZW50T25GaWx0ZXI6IHRydWUsXG4gICAgICBhbmltYXRpb246IDAsXG4gICAgICBlYXNpbmc6IG51bGwsXG4gICAgICBzZXREYXRhOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyLCBkcmFnRWwpIHtcbiAgICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoXCJUZXh0XCIsIGRyYWdFbC50ZXh0Q29udGVudCk7XG4gICAgICB9LFxuICAgICAgZHJvcEJ1YmJsZTogZmFsc2UsXG4gICAgICBkcmFnb3ZlckJ1YmJsZTogZmFsc2UsXG4gICAgICBkYXRhSWRBdHRyOiBcImRhdGEtaWRcIixcbiAgICAgIGRlbGF5OiAwLFxuICAgICAgZGVsYXlPblRvdWNoT25seTogZmFsc2UsXG4gICAgICB0b3VjaFN0YXJ0VGhyZXNob2xkOiAoTnVtYmVyLnBhcnNlSW50ID8gTnVtYmVyIDogd2luZG93KS5wYXJzZUludCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMTApIHx8IDEsXG4gICAgICBmb3JjZUZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIGZhbGxiYWNrQ2xhc3M6IFwic29ydGFibGUtZmFsbGJhY2tcIixcbiAgICAgIGZhbGxiYWNrT25Cb2R5OiBmYWxzZSxcbiAgICAgIGZhbGxiYWNrVG9sZXJhbmNlOiAwLFxuICAgICAgZmFsbGJhY2tPZmZzZXQ6IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSxcbiAgICAgIHN1cHBvcnRQb2ludGVyOiBTb3J0YWJsZS5zdXBwb3J0UG9pbnRlciAhPT0gZmFsc2UgJiYgXCJQb2ludGVyRXZlbnRcIiBpbiB3aW5kb3csXG4gICAgICBlbXB0eUluc2VydFRocmVzaG9sZDogNVxuICAgIH07XG4gICAgUGx1Z2luTWFuYWdlci5pbml0aWFsaXplUGx1Z2lucyh0aGlzLCBlbCwgZGVmYXVsdHMpOyAvLyBTZXQgZGVmYXVsdCBvcHRpb25zXG5cbiAgICBmb3IgKGxldCBuYW1lIGluIGRlZmF1bHRzKSB7XG4gICAgICAhKG5hbWUgaW4gb3B0aW9ucykgJiYgKG9wdGlvbnNbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXSk7XG4gICAgfVxuXG4gICAgX3ByZXBhcmVHcm91cChvcHRpb25zKTsgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG5cblxuICAgIGZvciAobGV0IGZuIGluIHRoaXMpIHtcbiAgICAgIGlmIChmbi5jaGFyQXQoMCkgPT09IFwiX1wiICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9IC8vIFNldHVwIGRyYWcgbW9kZVxuXG5cbiAgICB0aGlzLm5hdGl2ZURyYWdnYWJsZSA9IG9wdGlvbnMuZm9yY2VGYWxsYmFjayA/IGZhbHNlIDogc3VwcG9ydERyYWdnYWJsZTtcblxuICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgLy8gVG91Y2ggc3RhcnQgdGhyZXNob2xkIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG5hdGl2ZSBkcmFnc3RhcnQgdGhyZXNob2xkXG4gICAgICB0aGlzLm9wdGlvbnMudG91Y2hTdGFydFRocmVzaG9sZCA9IDE7XG4gICAgfSAvLyBCaW5kIGV2ZW50c1xuXG5cbiAgICBpZiAob3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgb24oZWwsIFwicG9pbnRlcmRvd25cIiwgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uKGVsLCBcIm1vdXNlZG93blwiLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICAgIG9uKGVsLCBcInRvdWNoc3RhcnRcIiwgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvbihlbCwgXCJkcmFnb3ZlclwiLCB0aGlzKTtcbiAgICAgIG9uKGVsLCBcImRyYWdlbnRlclwiLCB0aGlzKTtcbiAgICB9XG5cbiAgICBzb3J0YWJsZXMucHVzaCh0aGlzLmVsKTsgLy8gUmVzdG9yZSBzb3J0aW5nXG5cbiAgICBvcHRpb25zLnN0b3JlICYmIG9wdGlvbnMuc3RvcmUuZ2V0ICYmIHRoaXMuc29ydChvcHRpb25zLnN0b3JlLmdldCh0aGlzKSB8fCBbXSk7IC8vIEFkZCBhbmltYXRpb24gc3RhdGUgbWFuYWdlclxuXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBBbmltYXRpb25TdGF0ZU1hbmFnZXIoKSk7XG4gIH1cblxuICBTb3J0YWJsZS5wcm90b3R5cGUgPVxuICAvKiogQGxlbmRzIFNvcnRhYmxlLnByb3RvdHlwZSAqL1xuICB7XG4gICAgY29uc3RydWN0b3I6IFNvcnRhYmxlLFxuICAgIF9pc091dHNpZGVUaGlzRWw6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIGlmICghdGhpcy5lbC5jb250YWlucyh0YXJnZXQpICYmIHRhcmdldCAhPT0gdGhpcy5lbCkge1xuICAgICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9nZXREaXJlY3Rpb246IGZ1bmN0aW9uIChldnQsIHRhcmdldCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uLmNhbGwodGhpcywgZXZ0LCB0YXJnZXQsIGRyYWdFbCkgOiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIH0sXG4gICAgX29uVGFwU3RhcnQ6IGZ1bmN0aW9uIChcbiAgICAvKiogRXZlbnR8VG91Y2hFdmVudCAqL1xuICAgIGV2dCkge1xuICAgICAgaWYgKCFldnQuY2FuY2VsYWJsZSkgcmV0dXJuO1xuXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzLFxuICAgICAgICAgIGVsID0gdGhpcy5lbCxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHByZXZlbnRPbkZpbHRlciA9IG9wdGlvbnMucHJldmVudE9uRmlsdGVyLFxuICAgICAgICAgIHR5cGUgPSBldnQudHlwZSxcbiAgICAgICAgICB0b3VjaCA9IGV2dC50b3VjaGVzICYmIGV2dC50b3VjaGVzWzBdIHx8IGV2dC5wb2ludGVyVHlwZSAmJiBldnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiAmJiBldnQsXG4gICAgICAgICAgdGFyZ2V0ID0gKHRvdWNoIHx8IGV2dCkudGFyZ2V0LFxuICAgICAgICAgIG9yaWdpbmFsVGFyZ2V0ID0gZXZ0LnRhcmdldC5zaGFkb3dSb290ICYmIChldnQucGF0aCAmJiBldnQucGF0aFswXSB8fCBldnQuY29tcG9zZWRQYXRoICYmIGV2dC5jb21wb3NlZFBhdGgoKVswXSkgfHwgdGFyZ2V0LFxuICAgICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuXG4gICAgICBfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlKGVsKTsgLy8gRG9uJ3QgdHJpZ2dlciBzdGFydCBldmVudCB3aGVuIGFuIGVsZW1lbnQgaXMgYmVlbiBkcmFnZ2VkLCBvdGhlcndpc2UgdGhlIGV2dC5vbGRpbmRleCBhbHdheXMgd3Jvbmcgd2hlbiBzZXQgb3B0aW9uLmdyb3VwLlxuXG5cbiAgICAgIGlmIChkcmFnRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoL21vdXNlZG93bnxwb2ludGVyZG93bi8udGVzdCh0eXBlKSAmJiBldnQuYnV0dG9uICE9PSAwIHx8IG9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBvbmx5IGxlZnQgYnV0dG9uIGFuZCBlbmFibGVkXG4gICAgICB9IC8vIGNhbmNlbCBkbmQgaWYgb3JpZ2luYWwgdGFyZ2V0IGlzIGNvbnRlbnQgZWRpdGFibGVcblxuXG4gICAgICBpZiAob3JpZ2luYWxUYXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBTYWZhcmkgaWdub3JlcyBmdXJ0aGVyIGV2ZW50IGhhbmRsaW5nIGFmdGVyIG1vdXNlZG93blxuXG5cbiAgICAgIGlmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgJiYgU2FmYXJpICYmIHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgZmFsc2UpO1xuXG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5hbmltYXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0RG93bkVsID09PSB0YXJnZXQpIHtcbiAgICAgICAgLy8gSWdub3JpbmcgZHVwbGljYXRlIGBkb3duYFxuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRyYWdnZWQgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudFxuXG5cbiAgICAgIG9sZEluZGV4ID0gaW5kZXgodGFyZ2V0KTtcbiAgICAgIG9sZERyYWdnYWJsZUluZGV4ID0gaW5kZXgodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSk7IC8vIENoZWNrIGZpbHRlclxuXG4gICAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlmIChmaWx0ZXIuY2FsbCh0aGlzLCBldnQsIHRhcmdldCwgdGhpcykpIHtcbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgICByb290RWw6IG9yaWdpbmFsVGFyZ2V0LFxuICAgICAgICAgICAgbmFtZTogXCJmaWx0ZXJcIixcbiAgICAgICAgICAgIHRhcmdldEVsOiB0YXJnZXQsXG4gICAgICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgICAgIGZyb21FbDogZWxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBsdWdpbkV2ZW50KFwiZmlsdGVyXCIsIF90aGlzLCB7XG4gICAgICAgICAgICBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBjYW5jZWwgZG5kXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyKSB7XG4gICAgICAgIGZpbHRlciA9IGZpbHRlci5zcGxpdChcIixcIikuc29tZShmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgICBjcml0ZXJpYSA9IGNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIGNyaXRlcmlhLnRyaW0oKSwgZWwsIGZhbHNlKTtcblxuICAgICAgICAgIGlmIChjcml0ZXJpYSkge1xuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgICAgIHJvb3RFbDogY3JpdGVyaWEsXG4gICAgICAgICAgICAgIG5hbWU6IFwiZmlsdGVyXCIsXG4gICAgICAgICAgICAgIHRhcmdldEVsOiB0YXJnZXQsXG4gICAgICAgICAgICAgIGZyb21FbDogZWwsXG4gICAgICAgICAgICAgIHRvRWw6IGVsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcGx1Z2luRXZlbnQoXCJmaWx0ZXJcIiwgX3RoaXMsIHtcbiAgICAgICAgICAgICAgZXZ0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgIHByZXZlbnRPbkZpbHRlciAmJiBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47IC8vIGNhbmNlbCBkbmRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5oYW5kbGUgJiYgIWNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIG9wdGlvbnMuaGFuZGxlLCBlbCwgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gUHJlcGFyZSBgZHJhZ3N0YXJ0YFxuXG5cbiAgICAgIHRoaXMuX3ByZXBhcmVEcmFnU3RhcnQoZXZ0LCB0b3VjaCwgdGFyZ2V0KTtcbiAgICB9LFxuICAgIF9wcmVwYXJlRHJhZ1N0YXJ0OiBmdW5jdGlvbiAoXG4gICAgLyoqIEV2ZW50ICovXG4gICAgZXZ0LFxuICAgIC8qKiBUb3VjaCAqL1xuICAgIHRvdWNoLFxuICAgIC8qKiBIVE1MRWxlbWVudCAqL1xuICAgIHRhcmdldCkge1xuICAgICAgbGV0IF90aGlzID0gdGhpcyxcbiAgICAgICAgICBlbCA9IF90aGlzLmVsLFxuICAgICAgICAgIG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLFxuICAgICAgICAgIG93bmVyRG9jdW1lbnQgPSBlbC5vd25lckRvY3VtZW50LFxuICAgICAgICAgIGRyYWdTdGFydEZuO1xuXG4gICAgICBpZiAodGFyZ2V0ICYmICFkcmFnRWwgJiYgdGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICAgIGxldCBkcmFnUmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgcm9vdEVsID0gZWw7XG4gICAgICAgIGRyYWdFbCA9IHRhcmdldDtcbiAgICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTtcbiAgICAgICAgbmV4dEVsID0gZHJhZ0VsLm5leHRTaWJsaW5nO1xuICAgICAgICBsYXN0RG93bkVsID0gdGFyZ2V0O1xuICAgICAgICBhY3RpdmVHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG4gICAgICAgIFNvcnRhYmxlLmRyYWdnZWQgPSBkcmFnRWw7IC8vIFBPUlRNRTogYWRkZWQgb2Zmc2V0XG5cbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGNvbnN0IHRhcmdldEJvdW5kaW5nUmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAodGFyZ2V0Qm91bmRpbmdSZWN0LmxlZnQgKyA5NSA8ICh0b3VjaCB8fCBldnQpLmNsaWVudFgpIHtcbiAgICAgICAgICBvZmZzZXQgPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRYIC0gdGFyZ2V0Qm91bmRpbmdSZWN0LmxlZnQgLSA5NSAvIDI7XG4gICAgICAgIH1cblxuICAgICAgICB0YXBFdnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiBkcmFnRWwsXG4gICAgICAgICAgY2xpZW50WDogKHRvdWNoIHx8IGV2dCkuY2xpZW50WCAtIG9mZnNldCxcbiAgICAgICAgICBjbGllbnRZOiAodG91Y2ggfHwgZXZ0KS5jbGllbnRZXG4gICAgICAgIH07XG4gICAgICAgIHRhcERpc3RhbmNlTGVmdCA9IHRhcEV2dC5jbGllbnRYIC0gZHJhZ1JlY3QubGVmdDtcbiAgICAgICAgdGFwRGlzdGFuY2VUb3AgPSB0YXBFdnQuY2xpZW50WSAtIGRyYWdSZWN0LnRvcDtcbiAgICAgICAgdGhpcy5fbGFzdFggPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRYIC0gb2Zmc2V0O1xuICAgICAgICB0aGlzLl9sYXN0WSA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFk7XG4gICAgICAgIGRyYWdFbC5zdHlsZVtcIndpbGwtY2hhbmdlXCJdID0gXCJhbGxcIjtcblxuICAgICAgICBkcmFnU3RhcnRGbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwbHVnaW5FdmVudChcImRlbGF5RW5kZWRcIiwgX3RoaXMsIHtcbiAgICAgICAgICAgIGV2dFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICAgIF90aGlzLl9vbkRyb3AoKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gLy8gRGVsYXllZCBkcmFnIGhhcyBiZWVuIHRyaWdnZXJlZFxuICAgICAgICAgIC8vIHdlIGNhbiByZS1lbmFibGUgdGhlIGV2ZW50czogdG91Y2htb3ZlL21vdXNlbW92ZVxuXG5cbiAgICAgICAgICBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG5cbiAgICAgICAgICBpZiAoIUZpcmVGb3ggJiYgX3RoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9IC8vIEJpbmQgdGhlIGV2ZW50czogZHJhZ3N0YXJ0L2RyYWdlbmRcblxuXG4gICAgICAgICAgX3RoaXMuX3RyaWdnZXJEcmFnU3RhcnQoZXZ0LCB0b3VjaCk7IC8vIERyYWcgc3RhcnQgZXZlbnRcblxuXG4gICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgICAgbmFtZTogXCJjaG9vc2VcIixcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pOyAvLyBDaG9zZW4gaXRlbVxuXG5cbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuY2hvc2VuQ2xhc3MsIHRydWUpO1xuICAgICAgICB9OyAvLyBEaXNhYmxlIFwiZHJhZ2dhYmxlXCJcblxuXG4gICAgICAgIG9wdGlvbnMuaWdub3JlLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICAgIGZpbmQoZHJhZ0VsLCBjcml0ZXJpYS50cmltKCksIF9kaXNhYmxlRHJhZ2dhYmxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsIFwiZHJhZ292ZXJcIiwgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsIFwidG91Y2htb3ZlXCIsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgXCJtb3VzZXVwXCIsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCBcInRvdWNoZW5kXCIsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCBcInRvdWNoY2FuY2VsXCIsIF90aGlzLl9vbkRyb3ApOyAvLyBNYWtlIGRyYWdFbCBkcmFnZ2FibGUgKG11c3QgYmUgYmVmb3JlIGRlbGF5IGZvciBGaXJlRm94KVxuXG4gICAgICAgIGlmIChGaXJlRm94ICYmIHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgPSA0O1xuICAgICAgICAgIGRyYWdFbC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGx1Z2luRXZlbnQoXCJkZWxheVN0YXJ0XCIsIHRoaXMsIHtcbiAgICAgICAgICBldnRcbiAgICAgICAgfSk7IC8vIERlbGF5IGlzIGltcG9zc2libGUgZm9yIG5hdGl2ZSBEbkQgaW4gRWRnZSBvciBJRVxuXG4gICAgICAgIGlmIChvcHRpb25zLmRlbGF5ICYmICghb3B0aW9ucy5kZWxheU9uVG91Y2hPbmx5IHx8IHRvdWNoKSAmJiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8ICEoRWRnZSB8fCBJRTExT3JMZXNzKSkpIHtcbiAgICAgICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgICAgICAgdGhpcy5fb25Ecm9wKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IC8vIElmIHRoZSB1c2VyIG1vdmVzIHRoZSBwb2ludGVyIG9yIGxldCBnbyB0aGUgY2xpY2sgb3IgdG91Y2hcbiAgICAgICAgICAvLyBiZWZvcmUgdGhlIGRlbGF5IGhhcyBiZWVuIHJlYWNoZWQ6XG4gICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZGVsYXllZCBkcmFnXG5cblxuICAgICAgICAgIG9uKG93bmVyRG9jdW1lbnQsIFwibW91c2V1cFwiLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgICBvbihvd25lckRvY3VtZW50LCBcInRvdWNoZW5kXCIsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICAgIG9uKG93bmVyRG9jdW1lbnQsIFwidG91Y2hjYW5jZWxcIiwgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgICAgb24ob3duZXJEb2N1bWVudCwgXCJtb3VzZW1vdmVcIiwgX3RoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICAgICAgb24ob3duZXJEb2N1bWVudCwgXCJ0b3VjaG1vdmVcIiwgX3RoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICAgICAgb3B0aW9ucy5zdXBwb3J0UG9pbnRlciAmJiBvbihvd25lckRvY3VtZW50LCBcInBvaW50ZXJtb3ZlXCIsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICAgIF90aGlzLl9kcmFnU3RhcnRUaW1lciA9IHNldFRpbWVvdXQoZHJhZ1N0YXJ0Rm4sIG9wdGlvbnMuZGVsYXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRyYWdTdGFydEZuKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIF9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXI6IGZ1bmN0aW9uIChcbiAgICAvKiogVG91Y2hFdmVudHxQb2ludGVyRXZlbnQgKiovXG4gICAgZSkge1xuICAgICAgbGV0IHRvdWNoID0gZS50b3VjaGVzID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgaWYgKE1hdGgubWF4KE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl9sYXN0WSkpID49IE1hdGguZmxvb3IodGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgLyAodGhpcy5uYXRpdmVEcmFnZ2FibGUgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkpKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2Rpc2FibGVEZWxheWVkRHJhZzogZnVuY3Rpb24gKCkge1xuICAgICAgZHJhZ0VsICYmIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuXG4gICAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcbiAgICB9LFxuICAgIF9kaXNhYmxlRGVsYXllZERyYWdFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgICAgb2ZmKG93bmVyRG9jdW1lbnQsIFwibW91c2V1cFwiLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgb2ZmKG93bmVyRG9jdW1lbnQsIFwidG91Y2hlbmRcIiwgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgIG9mZihvd25lckRvY3VtZW50LCBcInRvdWNoY2FuY2VsXCIsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICBvZmYob3duZXJEb2N1bWVudCwgXCJtb3VzZW1vdmVcIiwgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgIG9mZihvd25lckRvY3VtZW50LCBcInRvdWNobW92ZVwiLCB0aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgb2ZmKG93bmVyRG9jdW1lbnQsIFwicG9pbnRlcm1vdmVcIiwgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICB9LFxuICAgIF90cmlnZ2VyRHJhZ1N0YXJ0OiBmdW5jdGlvbiAoXG4gICAgLyoqIEV2ZW50ICovXG4gICAgZXZ0LFxuICAgIC8qKiBUb3VjaCAqL1xuICAgIHRvdWNoKSB7XG4gICAgICB0b3VjaCA9IHRvdWNoIHx8IGV2dC5wb2ludGVyVHlwZSA9PSBcInRvdWNoXCIgJiYgZXZ0O1xuXG4gICAgICBpZiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8IHRvdWNoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgXCJwb2ludGVybW92ZVwiLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodG91Y2gpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgXCJ0b3VjaG1vdmVcIiwgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uKGRyYWdFbCwgXCJkcmFnZW5kXCIsIHRoaXMpO1xuICAgICAgICBvbihyb290RWwsIFwiZHJhZ3N0YXJ0XCIsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikge1xuICAgICAgICAgIC8vIFRpbWVvdXQgbmVjY2Vzc2FyeSBmb3IgSUU5XG4gICAgICAgICAgX25leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgIH0sXG4gICAgX2RyYWdTdGFydGVkOiBmdW5jdGlvbiAoZmFsbGJhY2ssIGV2dCkge1xuICAgICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAocm9vdEVsICYmIGRyYWdFbCkge1xuICAgICAgICBwbHVnaW5FdmVudChcImRyYWdTdGFydGVkXCIsIHRoaXMsIHtcbiAgICAgICAgICBldnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsIFwiZHJhZ292ZXJcIiwgX2NoZWNrT3V0c2lkZVRhcmdldEVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zOyAvLyBBcHBseSBlZmZlY3RcblxuICAgICAgICAhZmFsbGJhY2sgJiYgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmRyYWdDbGFzcywgZmFsc2UpO1xuICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG4gICAgICAgIFNvcnRhYmxlLmFjdGl2ZSA9IHRoaXM7XG4gICAgICAgIGZhbGxiYWNrICYmIHRoaXMuX2FwcGVuZEdob3N0KCk7IC8vIERyYWcgc3RhcnQgZXZlbnRcblxuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgbmFtZTogXCJzdGFydFwiLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX251bGxpbmcoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9lbXVsYXRlRHJhZ092ZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0b3VjaEV2dCkge1xuICAgICAgICB0aGlzLl9sYXN0WCA9IHRvdWNoRXZ0LmNsaWVudFg7XG4gICAgICAgIHRoaXMuX2xhc3RZID0gdG91Y2hFdnQuY2xpZW50WTtcblxuICAgICAgICBfaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG5cbiAgICAgICAgbGV0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0YXJnZXQ7XG5cbiAgICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQuc2hhZG93Um9vdCkge1xuICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5zaGFkb3dSb290LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICAgICAgaWYgKHRhcmdldCA9PT0gcGFyZW50KSBicmVhaztcbiAgICAgICAgICBwYXJlbnQgPSB0YXJnZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKHRhcmdldCk7XG5cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRbZXhwYW5kb10pIHtcbiAgICAgICAgICAgICAgbGV0IGluc2VydGVkO1xuICAgICAgICAgICAgICBpbnNlcnRlZCA9IHBhcmVudFtleHBhbmRvXS5fb25EcmFnT3Zlcih7XG4gICAgICAgICAgICAgICAgY2xpZW50WDogdG91Y2hFdnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgICBjbGllbnRZOiB0b3VjaEV2dC5jbGllbnRZLFxuICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgIHJvb3RFbDogcGFyZW50XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmIChpbnNlcnRlZCAmJiAhdGhpcy5vcHRpb25zLmRyYWdvdmVyQnViYmxlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFyZ2V0ID0gcGFyZW50OyAvLyBzdG9yZSBsYXN0IGVsZW1lbnRcbiAgICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3VuaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIChcbiAgICAvKipUb3VjaEV2ZW50Ki9cbiAgICBldnQpIHtcbiAgICAgIGlmICh0YXBFdnQpIHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICBmYWxsYmFja1RvbGVyYW5jZSA9IG9wdGlvbnMuZmFsbGJhY2tUb2xlcmFuY2UsXG4gICAgICAgICAgICBmYWxsYmFja09mZnNldCA9IG9wdGlvbnMuZmFsbGJhY2tPZmZzZXQsXG4gICAgICAgICAgICB0b3VjaCA9IGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQsXG4gICAgICAgICAgICBnaG9zdE1hdHJpeCA9IGdob3N0RWwgJiYgbWF0cml4KGdob3N0RWwsIHRydWUpLFxuICAgICAgICAgICAgc2NhbGVYID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5hLFxuICAgICAgICAgICAgc2NhbGVZID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5kLFxuICAgICAgICAgICAgcmVsYXRpdmVTY3JvbGxPZmZzZXQgPSBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICYmIGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGdob3N0UmVsYXRpdmVQYXJlbnQpLFxuICAgICAgICAgICAgZHggPSAodG91Y2guY2xpZW50WCAtIHRhcEV2dC5jbGllbnRYICsgZmFsbGJhY2tPZmZzZXQueCkgLyAoc2NhbGVYIHx8IDEpICsgKHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID8gcmVsYXRpdmVTY3JvbGxPZmZzZXRbMF0gLSBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbFswXSA6IDApIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgICAgIGR5ID0gKHRvdWNoLmNsaWVudFkgLSB0YXBFdnQuY2xpZW50WSArIGZhbGxiYWNrT2Zmc2V0LnkpIC8gKHNjYWxlWSB8fCAxKSArIChyZWxhdGl2ZVNjcm9sbE9mZnNldCA/IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0WzFdIC0gZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGxbMV0gOiAwKSAvIChzY2FsZVkgfHwgMSk7IC8vIG9ubHkgc2V0IHRoZSBzdGF0dXMgdG8gZHJhZ2dpbmcsIHdoZW4gd2UgYXJlIGFjdHVhbGx5IGRyYWdnaW5nXG5cbiAgICAgICAgaWYgKCFTb3J0YWJsZS5hY3RpdmUgJiYgIWF3YWl0aW5nRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgICBpZiAoZmFsbGJhY2tUb2xlcmFuY2UgJiYgTWF0aC5tYXgoTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMuX2xhc3RYKSwgTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMuX2xhc3RZKSkgPCBmYWxsYmFja1RvbGVyYW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX29uRHJhZ1N0YXJ0KGV2dCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2hvc3RFbCkge1xuICAgICAgICAgIGlmIChnaG9zdE1hdHJpeCkge1xuICAgICAgICAgICAgZ2hvc3RNYXRyaXguZSArPSBkeCAtIChsYXN0RHggfHwgMCk7XG4gICAgICAgICAgICBnaG9zdE1hdHJpeC5mICs9IGR5IC0gKGxhc3REeSB8fCAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2hvc3RNYXRyaXggPSB7XG4gICAgICAgICAgICAgIGE6IDEsXG4gICAgICAgICAgICAgIGI6IDAsXG4gICAgICAgICAgICAgIGM6IDAsXG4gICAgICAgICAgICAgIGQ6IDEsXG4gICAgICAgICAgICAgIGU6IGR4LFxuICAgICAgICAgICAgICBmOiBkeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgY3NzTWF0cml4ID0gYG1hdHJpeCgke2dob3N0TWF0cml4LmF9LCR7Z2hvc3RNYXRyaXguYn0sJHtnaG9zdE1hdHJpeC5jfSwke2dob3N0TWF0cml4LmR9LCR7Z2hvc3RNYXRyaXguZX0sJHtnaG9zdE1hdHJpeC5mfSlgO1xuICAgICAgICAgIGNzcyhnaG9zdEVsLCBcIndlYmtpdFRyYW5zZm9ybVwiLCBjc3NNYXRyaXgpO1xuICAgICAgICAgIGNzcyhnaG9zdEVsLCBcIm1velRyYW5zZm9ybVwiLCBjc3NNYXRyaXgpO1xuICAgICAgICAgIGNzcyhnaG9zdEVsLCBcIm1zVHJhbnNmb3JtXCIsIGNzc01hdHJpeCk7XG4gICAgICAgICAgY3NzKGdob3N0RWwsIFwidHJhbnNmb3JtXCIsIGNzc01hdHJpeCk7XG4gICAgICAgICAgbGFzdER4ID0gZHg7XG4gICAgICAgICAgbGFzdER5ID0gZHk7XG4gICAgICAgICAgdG91Y2hFdnQgPSB0b3VjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2FwcGVuZEdob3N0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBCdWcgaWYgdXNpbmcgc2NhbGUoKTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjYzNzA1OFxuICAgICAgLy8gTm90IGJlaW5nIGFkanVzdGVkIGZvclxuICAgICAgaWYgKCFnaG9zdEVsKSB7XG4gICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLm9wdGlvbnMuZmFsbGJhY2tPbkJvZHkgPyBkb2N1bWVudC5ib2R5IDogcm9vdEVsLFxuICAgICAgICAgICAgcmVjdCA9IGdldFJlY3QoZHJhZ0VsLCB0cnVlLCBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSwgdHJ1ZSwgY29udGFpbmVyKSxcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7IC8vIFBvc2l0aW9uIGFic29sdXRlbHlcblxuICAgICAgICBpZiAoUG9zaXRpb25HaG9zdEFic29sdXRlbHkpIHtcbiAgICAgICAgICAvLyBHZXQgcmVsYXRpdmVseSBwb3NpdGlvbmVkIHBhcmVudFxuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBjb250YWluZXI7XG5cbiAgICAgICAgICB3aGlsZSAoY3NzKGdob3N0UmVsYXRpdmVQYXJlbnQsIFwicG9zaXRpb25cIikgPT09IFwic3RhdGljXCIgJiYgY3NzKGdob3N0UmVsYXRpdmVQYXJlbnQsIFwidHJhbnNmb3JtXCIpID09PSBcIm5vbmVcIiAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdob3N0UmVsYXRpdmVQYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZ2hvc3RSZWxhdGl2ZVBhcmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ID09PSBkb2N1bWVudCkgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgICAgIHJlY3QudG9wICs9IGdob3N0UmVsYXRpdmVQYXJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGdob3N0UmVsYXRpdmVQYXJlbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGdob3N0UmVsYXRpdmVQYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2hvc3RFbCA9IGRyYWdFbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmZhbGxiYWNrQ2xhc3MsIHRydWUpO1xuICAgICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmRyYWdDbGFzcywgdHJ1ZSk7XG4gICAgICAgIGNzcyhnaG9zdEVsLCBcInRyYW5zaXRpb25cIiwgXCJcIik7XG4gICAgICAgIGNzcyhnaG9zdEVsLCBcInRyYW5zZm9ybVwiLCBcIlwiKTtcbiAgICAgICAgY3NzKGdob3N0RWwsIFwiYm94LXNpemluZ1wiLCBcImJvcmRlci1ib3hcIik7XG4gICAgICAgIGNzcyhnaG9zdEVsLCBcIm1hcmdpblwiLCAwKTtcbiAgICAgICAgY3NzKGdob3N0RWwsIFwidG9wXCIsIHJlY3QudG9wKTtcbiAgICAgICAgY3NzKGdob3N0RWwsIFwibGVmdFwiLCByZWN0LmxlZnQpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgXCJ3aWR0aFwiLCByZWN0LndpZHRoKTtcbiAgICAgICAgY3NzKGdob3N0RWwsIFwiaGVpZ2h0XCIsIHJlY3QuaGVpZ2h0KTtcbiAgICAgICAgY3NzKGdob3N0RWwsIFwib3BhY2l0eVwiLCBcIjAuOFwiKTtcbiAgICAgICAgY3NzKGdob3N0RWwsIFwicG9zaXRpb25cIiwgUG9zaXRpb25HaG9zdEFic29sdXRlbHkgPyBcImFic29sdXRlXCIgOiBcImZpeGVkXCIpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgXCJ6SW5kZXhcIiwgXCIxMDAwMDBcIik7XG4gICAgICAgIGNzcyhnaG9zdEVsLCBcInBvaW50ZXJFdmVudHNcIiwgXCJub25lXCIpO1xuICAgICAgICBTb3J0YWJsZS5naG9zdCA9IGdob3N0RWw7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChnaG9zdEVsKTsgLy8gU2V0IHRyYW5zZm9ybS1vcmlnaW5cblxuICAgICAgICBjc3MoZ2hvc3RFbCwgXCJ0cmFuc2Zvcm0tb3JpZ2luXCIsIHRhcERpc3RhbmNlTGVmdCAvIHBhcnNlSW50KGdob3N0RWwuc3R5bGUud2lkdGgpICogMTAwICsgXCIlIFwiICsgdGFwRGlzdGFuY2VUb3AgLyBwYXJzZUludChnaG9zdEVsLnN0eWxlLmhlaWdodCkgKiAxMDAgKyBcIiVcIik7XG4gICAgICB9XG4gICAgfSxcbiAgICBfb25EcmFnU3RhcnQ6IGZ1bmN0aW9uIChcbiAgICAvKipFdmVudCovXG4gICAgZXZ0LFxuICAgIC8qKmJvb2xlYW4qL1xuICAgIGZhbGxiYWNrKSB7XG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBsZXQgZGF0YVRyYW5zZmVyID0gZXZ0LmRhdGFUcmFuc2ZlcjtcbiAgICAgIGxldCBvcHRpb25zID0gX3RoaXMub3B0aW9ucztcbiAgICAgIHBsdWdpbkV2ZW50KFwiZHJhZ1N0YXJ0XCIsIHRoaXMsIHtcbiAgICAgICAgZXZ0XG4gICAgICB9KTtcblxuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgdGhpcy5fb25Ecm9wKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwbHVnaW5FdmVudChcInNldHVwQ2xvbmVcIiwgdGhpcyk7XG5cbiAgICAgIGlmICghU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgICBjbG9uZUVsID0gY2xvbmUoZHJhZ0VsKTtcbiAgICAgICAgY2xvbmVFbC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgY2xvbmVFbC5zdHlsZVtcIndpbGwtY2hhbmdlXCJdID0gXCJcIjtcblxuICAgICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgICB0b2dnbGVDbGFzcyhjbG9uZUVsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgU29ydGFibGUuY2xvbmUgPSBjbG9uZUVsO1xuICAgICAgfSAvLyAjMTE0MzogSUZyYW1lIHN1cHBvcnQgd29ya2Fyb3VuZFxuXG5cbiAgICAgIF90aGlzLmNsb25lSWQgPSBfbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBwbHVnaW5FdmVudChcImNsb25lXCIsIF90aGlzKTtcbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjtcblxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgICBuYW1lOiBcImNsb25lXCJcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgICFmYWxsYmFjayAmJiB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTsgLy8gU2V0IHByb3BlciBkcm9wIGV2ZW50c1xuXG4gICAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgICAgaWdub3JlTmV4dENsaWNrID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuX2xvb3BJZCA9IHNldEludGVydmFsKF90aGlzLl9lbXVsYXRlRHJhZ092ZXIsIDUwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVuZG8gd2hhdCB3YXMgc2V0IGluIF9wcmVwYXJlRHJhZ1N0YXJ0IGJlZm9yZSBkcmFnIHN0YXJ0ZWRcbiAgICAgICAgb2ZmKGRvY3VtZW50LCBcIm1vdXNldXBcIiwgX3RoaXMuX29uRHJvcCk7XG4gICAgICAgIG9mZihkb2N1bWVudCwgXCJ0b3VjaGVuZFwiLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCBcInRvdWNoY2FuY2VsXCIsIF90aGlzLl9vbkRyb3ApO1xuXG4gICAgICAgIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICBkYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwibW92ZVwiO1xuICAgICAgICAgIG9wdGlvbnMuc2V0RGF0YSAmJiBvcHRpb25zLnNldERhdGEuY2FsbChfdGhpcywgZGF0YVRyYW5zZmVyLCBkcmFnRWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgb24oZG9jdW1lbnQsIFwiZHJvcFwiLCBfdGhpcyk7IC8vICMxMjc2IGZpeDpcblxuICAgICAgICBjc3MoZHJhZ0VsLCBcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZVooMClcIik7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgX3RoaXMuX2RyYWdTdGFydElkID0gX25leHRUaWNrKF90aGlzLl9kcmFnU3RhcnRlZC5iaW5kKF90aGlzLCBmYWxsYmFjaywgZXZ0KSk7XG4gICAgICBvbihkb2N1bWVudCwgXCJzZWxlY3RzdGFydFwiLCBfdGhpcyk7XG4gICAgICBtb3ZlZCA9IHRydWU7XG5cbiAgICAgIGlmIChTYWZhcmkpIHtcbiAgICAgICAgY3NzKGRvY3VtZW50LmJvZHksIFwidXNlci1zZWxlY3RcIiwgXCJub25lXCIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLy8gUmV0dXJucyB0cnVlIC0gaWYgbm8gZnVydGhlciBhY3Rpb24gaXMgbmVlZGVkIChlaXRoZXIgaW5zZXJ0ZWQgb3IgYW5vdGhlciBjb25kaXRpb24pXG4gICAgX29uRHJhZ092ZXI6IGZ1bmN0aW9uIChcbiAgICAvKipFdmVudCovXG4gICAgZXZ0KSB7XG4gICAgICBsZXQgZWwgPSB0aGlzLmVsLFxuICAgICAgICAgIHRhcmdldCA9IGV2dC50YXJnZXQsXG4gICAgICAgICAgZHJhZ1JlY3QsXG4gICAgICAgICAgdGFyZ2V0UmVjdCxcbiAgICAgICAgICByZXZlcnQsXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBncm91cCA9IG9wdGlvbnMuZ3JvdXAsXG4gICAgICAgICAgYWN0aXZlU29ydGFibGUgPSBTb3J0YWJsZS5hY3RpdmUsXG4gICAgICAgICAgaXNPd25lciA9IGFjdGl2ZUdyb3VwID09PSBncm91cCxcbiAgICAgICAgICBjYW5Tb3J0ID0gb3B0aW9ucy5zb3J0LFxuICAgICAgICAgIGZyb21Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICAgIHZlcnRpY2FsLFxuICAgICAgICAgIF90aGlzID0gdGhpcyxcbiAgICAgICAgICBjb21wbGV0ZWRGaXJlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoX3NpbGVudCkgcmV0dXJuO1xuXG4gICAgICBmdW5jdGlvbiBkcmFnT3ZlckV2ZW50KG5hbWUsIGV4dHJhKSB7XG4gICAgICAgIHBsdWdpbkV2ZW50KG5hbWUsIF90aGlzLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBldnQsXG4gICAgICAgICAgaXNPd25lcixcbiAgICAgICAgICBheGlzOiB2ZXJ0aWNhbCA/IFwidmVydGljYWxcIiA6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgIHJldmVydCxcbiAgICAgICAgICBkcmFnUmVjdCxcbiAgICAgICAgICB0YXJnZXRSZWN0LFxuICAgICAgICAgIGNhblNvcnQsXG4gICAgICAgICAgZnJvbVNvcnRhYmxlLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBjb21wbGV0ZWQsXG5cbiAgICAgICAgICBvbk1vdmUodGFyZ2V0LCBhZnRlcikge1xuICAgICAgICAgICAgcmV0dXJuIG9uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIGdldFJlY3QodGFyZ2V0KSwgZXZ0LCBhZnRlcik7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGNoYW5nZWRcbiAgICAgICAgfSwgZXh0cmEpKTtcbiAgICAgIH0gLy8gQ2FwdHVyZSBhbmltYXRpb24gc3RhdGVcblxuXG4gICAgICBmdW5jdGlvbiBjYXB0dXJlKCkge1xuICAgICAgICBkcmFnT3ZlckV2ZW50KFwiZHJhZ092ZXJBbmltYXRpb25DYXB0dXJlXCIpO1xuXG4gICAgICAgIF90aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuXG4gICAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJldHVybiBpbnZvY2F0aW9uIHdoZW4gZHJhZ0VsIGlzIGluc2VydGVkIChvciBjb21wbGV0ZWQpXG5cblxuICAgICAgZnVuY3Rpb24gY29tcGxldGVkKGluc2VydGlvbikge1xuICAgICAgICBkcmFnT3ZlckV2ZW50KFwiZHJhZ092ZXJDb21wbGV0ZWRcIiwge1xuICAgICAgICAgIGluc2VydGlvblxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5zZXJ0aW9uKSB7XG4gICAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuX2hpZGVDbG9uZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKF90aGlzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgICAgLy8gU2V0IGdob3N0IGNsYXNzIHRvIG5ldyBzb3J0YWJsZSdzIGdob3N0IGNsYXNzXG4gICAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzIDogYWN0aXZlU29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHB1dFNvcnRhYmxlICE9PSBfdGhpcyAmJiBfdGhpcyAhPT0gU29ydGFibGUuYWN0aXZlKSB7XG4gICAgICAgICAgICBwdXRTb3J0YWJsZSA9IF90aGlzO1xuICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXMgPT09IFNvcnRhYmxlLmFjdGl2ZSAmJiBwdXRTb3J0YWJsZSkge1xuICAgICAgICAgICAgcHV0U29ydGFibGUgPSBudWxsO1xuICAgICAgICAgIH0gLy8gQW5pbWF0aW9uXG5cblxuICAgICAgICAgIGlmIChmcm9tU29ydGFibGUgPT09IF90aGlzKSB7XG4gICAgICAgICAgICBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPSB0YXJnZXQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuYW5pbWF0ZUFsbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkcmFnT3ZlckV2ZW50KFwiZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZVwiKTtcbiAgICAgICAgICAgIF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IG51bGw7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgICAgZnJvbVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICAgIGZyb21Tb3J0YWJsZS5faWdub3JlV2hpbGVBbmltYXRpbmcgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBOdWxsIGxhc3RUYXJnZXQgaWYgaXQgaXMgbm90IGluc2lkZSBhIHByZXZpb3VzbHkgc3dhcHBlZCBlbGVtZW50XG5cblxuICAgICAgICBpZiAodGFyZ2V0ID09PSBkcmFnRWwgJiYgIWRyYWdFbC5hbmltYXRlZCB8fCB0YXJnZXQgPT09IGVsICYmICF0YXJnZXQuYW5pbWF0ZWQpIHtcbiAgICAgICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgfSAvLyBubyBidWJibGluZyBhbmQgbm90IGZhbGxiYWNrXG5cblxuICAgICAgICBpZiAoIW9wdGlvbnMuZHJhZ292ZXJCdWJibGUgJiYgIWV2dC5yb290RWwgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudCkge1xuICAgICAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7IC8vIERvIG5vdCBkZXRlY3QgZm9yIGVtcHR5IGluc2VydCBpZiBhbHJlYWR5IGluc2VydGVkXG5cblxuICAgICAgICAgICFpbnNlcnRpb24gJiYgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQoZXZ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgICFvcHRpb25zLmRyYWdvdmVyQnViYmxlICYmIGV2dC5zdG9wUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm4gY29tcGxldGVkRmlyZWQgPSB0cnVlO1xuICAgICAgfSAvLyBDYWxsIHdoZW4gZHJhZ0VsIGhhcyBiZWVuIGluc2VydGVkXG5cblxuICAgICAgZnVuY3Rpb24gY2hhbmdlZCgpIHtcbiAgICAgICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IGluZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG4gICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgbmFtZTogXCJjaGFuZ2VcIixcbiAgICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgICBuZXdJbmRleCxcbiAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleCxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldnQucHJldmVudERlZmF1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgdHJ1ZSk7XG4gICAgICBkcmFnT3ZlckV2ZW50KFwiZHJhZ092ZXJcIik7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuXG4gICAgICBpZiAoZHJhZ0VsLmNvbnRhaW5zKGV2dC50YXJnZXQpIHx8IHRhcmdldC5hbmltYXRlZCAmJiB0YXJnZXQuYW5pbWF0aW5nWCAmJiB0YXJnZXQuYW5pbWF0aW5nWSB8fCBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPT09IHRhcmdldCkge1xuICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2U7XG5cbiAgICAgIGlmIChhY3RpdmVTb3J0YWJsZSAmJiAhb3B0aW9ucy5kaXNhYmxlZCAmJiAoaXNPd25lciA/IGNhblNvcnQgfHwgKHJldmVydCA9ICFyb290RWwuY29udGFpbnMoZHJhZ0VsKSkgLy8gUmV2ZXJ0aW5nIGl0ZW0gaW50byB0aGUgb3JpZ2luYWwgbGlzdFxuICAgICAgOiBwdXRTb3J0YWJsZSA9PT0gdGhpcyB8fCAodGhpcy5sYXN0UHV0TW9kZSA9IGFjdGl2ZUdyb3VwLmNoZWNrUHVsbCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSAmJiBncm91cC5jaGVja1B1dCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSkge1xuICAgICAgICB2ZXJ0aWNhbCA9IHRoaXMuX2dldERpcmVjdGlvbihldnQsIHRhcmdldCkgPT09IFwidmVydGljYWxcIjtcbiAgICAgICAgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCk7XG4gICAgICAgIGRyYWdPdmVyRXZlbnQoXCJkcmFnT3ZlclZhbGlkXCIpO1xuICAgICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuXG4gICAgICAgIGlmIChyZXZlcnQpIHtcbiAgICAgICAgICBwYXJlbnRFbCA9IHJvb3RFbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgY2FwdHVyZSgpO1xuXG4gICAgICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgICAgICBkcmFnT3ZlckV2ZW50KFwicmV2ZXJ0XCIpO1xuXG4gICAgICAgICAgaWYgKCFTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgICBpZiAobmV4dEVsKSB7XG4gICAgICAgICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBuZXh0RWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbExhc3RDaGlsZCA9IGxhc3RDaGlsZChlbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG4gICAgICAgIGlmICghZWxMYXN0Q2hpbGQgfHwgX2dob3N0SXNMYXN0KGV2dCwgdmVydGljYWwsIHRoaXMpICYmICFlbExhc3RDaGlsZC5hbmltYXRlZCkge1xuICAgICAgICAgIC8vIElmIGFscmVhZHkgYXQgZW5kIG9mIGxpc3Q6IERvIG5vdCBpbnNlcnRcbiAgICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgPT09IGRyYWdFbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgICAgfSAvLyBhc3NpZ24gdGFyZ2V0IG9ubHkgaWYgY29uZGl0aW9uIGlzIHRydWVcblxuXG4gICAgICAgICAgaWYgKGVsTGFzdENoaWxkICYmIGVsID09PSBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXQgPSBlbExhc3RDaGlsZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsICEhdGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNhcHR1cmUoKTtcbiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgICBwYXJlbnRFbCA9IGVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5wYXJlbnROb2RlID09PSBlbCkge1xuICAgICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IDAsXG4gICAgICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCxcbiAgICAgICAgICAgICAgZGlmZmVyZW50TGV2ZWwgPSBkcmFnRWwucGFyZW50Tm9kZSAhPT0gZWwsXG4gICAgICAgICAgICAgIGRpZmZlcmVudFJvd0NvbCA9ICFfZHJhZ0VsSW5Sb3dDb2x1bW4oZHJhZ0VsLmFuaW1hdGVkICYmIGRyYWdFbC50b1JlY3QgfHwgZHJhZ1JlY3QsIHRhcmdldC5hbmltYXRlZCAmJiB0YXJnZXQudG9SZWN0IHx8IHRhcmdldFJlY3QsIHZlcnRpY2FsKSxcbiAgICAgICAgICAgICAgc2lkZTEgPSB2ZXJ0aWNhbCA/IFwidG9wXCIgOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgc2Nyb2xsZWRQYXN0VG9wID0gaXNTY3JvbGxlZFBhc3QodGFyZ2V0LCBcInRvcFwiLCBcInRvcFwiKSB8fCBpc1Njcm9sbGVkUGFzdChkcmFnRWwsIFwidG9wXCIsIFwidG9wXCIpLFxuICAgICAgICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxlZFBhc3RUb3AgPyBzY3JvbGxlZFBhc3RUb3Auc2Nyb2xsVG9wIDogdm9pZCAwO1xuXG4gICAgICAgICAgaWYgKGxhc3RUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwID0gdGFyZ2V0UmVjdFtzaWRlMV07XG4gICAgICAgICAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSBmYWxzZTtcbiAgICAgICAgICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSAhZGlmZmVyZW50Um93Q29sICYmIG9wdGlvbnMuaW52ZXJ0U3dhcCB8fCBkaWZmZXJlbnRMZXZlbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaXJlY3Rpb24gPSBfZ2V0U3dhcERpcmVjdGlvbihldnQsIHRhcmdldCwgdGFyZ2V0UmVjdCwgdmVydGljYWwsIGRpZmZlcmVudFJvd0NvbCA/IDEgOiBvcHRpb25zLnN3YXBUaHJlc2hvbGQsIG9wdGlvbnMuaW52ZXJ0ZWRTd2FwVGhyZXNob2xkID09IG51bGwgPyBvcHRpb25zLnN3YXBUaHJlc2hvbGQgOiBvcHRpb25zLmludmVydGVkU3dhcFRocmVzaG9sZCwgaXNDaXJjdW1zdGFudGlhbEludmVydCwgbGFzdFRhcmdldCA9PT0gdGFyZ2V0KTtcbiAgICAgICAgICBsZXQgc2libGluZztcblxuICAgICAgICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRhcmdldCBpcyBiZXNpZGUgZHJhZ0VsIGluIHJlc3BlY3RpdmUgZGlyZWN0aW9uIChpZ25vcmluZyBoaWRkZW4gZWxlbWVudHMpXG4gICAgICAgICAgICBsZXQgZHJhZ0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcblxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBkcmFnSW5kZXggLT0gZGlyZWN0aW9uO1xuICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50RWwuY2hpbGRyZW5bZHJhZ0luZGV4XTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHNpYmxpbmcgJiYgKGNzcyhzaWJsaW5nLCBcImRpc3BsYXlcIikgPT09IFwibm9uZVwiIHx8IHNpYmxpbmcgPT09IGdob3N0RWwpKTtcbiAgICAgICAgICB9IC8vIElmIGRyYWdFbCBpcyBhbHJlYWR5IGJlc2lkZSB0YXJnZXQ6IERvIG5vdCBpbnNlcnRcblxuXG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gMCB8fCBzaWJsaW5nID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxhc3RUYXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgbGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgICBsZXQgbmV4dFNpYmxpbmcgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICAgICAgICBhZnRlciA9IGZhbHNlO1xuICAgICAgICAgIGFmdGVyID0gZGlyZWN0aW9uID09PSAxO1xuICAgICAgICAgIGxldCBtb3ZlVmVjdG9yID0gb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCBhZnRlcik7XG5cbiAgICAgICAgICBpZiAobW92ZVZlY3RvciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmIChtb3ZlVmVjdG9yID09PSAxIHx8IG1vdmVWZWN0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGFmdGVyID0gbW92ZVZlY3RvciA9PT0gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3NpbGVudCA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KF91bnNpbGVudCwgMzApO1xuICAgICAgICAgICAgY2FwdHVyZSgpO1xuXG4gICAgICAgICAgICBpZiAoYWZ0ZXIgJiYgIW5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBhZnRlciA/IG5leHRTaWJsaW5nIDogdGFyZ2V0KTtcbiAgICAgICAgICAgIH0gLy8gVW5kbyBjaHJvbWUncyBzY3JvbGwgYWRqdXN0bWVudCAoaGFzIG5vIGVmZmVjdCBvbiBvdGhlciBicm93c2VycylcblxuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsZWRQYXN0VG9wKSB7XG4gICAgICAgICAgICAgIHNjcm9sbEJ5KHNjcm9sbGVkUGFzdFRvcCwgMCwgc2Nyb2xsQmVmb3JlIC0gc2Nyb2xsZWRQYXN0VG9wLnNjcm9sbFRvcCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmVudEVsID0gZHJhZ0VsLnBhcmVudE5vZGU7IC8vIGFjdHVhbGl6YXRpb25cbiAgICAgICAgICAgIC8vIG11c3QgYmUgZG9uZSBiZWZvcmUgYW5pbWF0aW9uXG5cbiAgICAgICAgICAgIGlmICh0YXJnZXRCZWZvcmVGaXJzdFN3YXAgIT09IHVuZGVmaW5lZCAmJiAhaXNDaXJjdW1zdGFudGlhbEludmVydCkge1xuICAgICAgICAgICAgICB0YXJnZXRNb3ZlRGlzdGFuY2UgPSBNYXRoLmFicyh0YXJnZXRCZWZvcmVGaXJzdFN3YXAgLSBnZXRSZWN0KHRhcmdldClbc2lkZTFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWwuY29udGFpbnMoZHJhZ0VsKSkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIF9pZ25vcmVXaGlsZUFuaW1hdGluZzogbnVsbCxcbiAgICBfb2ZmTW92ZUV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgb2ZmKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICBvZmYoZG9jdW1lbnQsIFwidG91Y2htb3ZlXCIsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIG9mZihkb2N1bWVudCwgXCJwb2ludGVybW92ZVwiLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICBvZmYoZG9jdW1lbnQsIFwiZHJhZ292ZXJcIiwgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb2ZmKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvZmYoZG9jdW1lbnQsIFwidG91Y2htb3ZlXCIsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICB9LFxuICAgIF9vZmZVcEV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG93bmVyRG9jdW1lbnQgPSB0aGlzLmVsLm93bmVyRG9jdW1lbnQ7XG4gICAgICBvZmYob3duZXJEb2N1bWVudCwgXCJtb3VzZXVwXCIsIHRoaXMuX29uRHJvcCk7XG4gICAgICBvZmYob3duZXJEb2N1bWVudCwgXCJ0b3VjaGVuZFwiLCB0aGlzLl9vbkRyb3ApO1xuICAgICAgb2ZmKG93bmVyRG9jdW1lbnQsIFwicG9pbnRlcnVwXCIsIHRoaXMuX29uRHJvcCk7XG4gICAgICBvZmYob3duZXJEb2N1bWVudCwgXCJ0b3VjaGNhbmNlbFwiLCB0aGlzLl9vbkRyb3ApO1xuICAgICAgb2ZmKGRvY3VtZW50LCBcInNlbGVjdHN0YXJ0XCIsIHRoaXMpO1xuICAgIH0sXG4gICAgX29uRHJvcDogZnVuY3Rpb24gKFxuICAgIC8qKkV2ZW50Ki9cbiAgICBldnQpIHtcbiAgICAgIGxldCBlbCA9IHRoaXMuZWwsXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG5cbiAgICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgICBwbHVnaW5FdmVudChcImRyb3BcIiwgdGhpcywge1xuICAgICAgICBldnRcbiAgICAgIH0pO1xuICAgICAgcGFyZW50RWwgPSBkcmFnRWwgJiYgZHJhZ0VsLnBhcmVudE5vZGU7IC8vIEdldCBhZ2FpbiBhZnRlciBwbHVnaW4gZXZlbnRcblxuICAgICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgdGhpcy5fbnVsbGluZygpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9IGZhbHNlO1xuICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2U7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2xvb3BJZCk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuXG4gICAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5jbG9uZUlkKTtcblxuICAgICAgX2NhbmNlbE5leHRUaWNrKHRoaXMuX2RyYWdTdGFydElkKTsgLy8gVW5iaW5kIGV2ZW50c1xuXG5cbiAgICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICBvZmYoZG9jdW1lbnQsIFwiZHJvcFwiLCB0aGlzKTtcbiAgICAgICAgb2ZmKGVsLCBcImRyYWdzdGFydFwiLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29mZk1vdmVFdmVudHMoKTtcblxuICAgICAgdGhpcy5fb2ZmVXBFdmVudHMoKTtcblxuICAgICAgaWYgKFNhZmFyaSkge1xuICAgICAgICBjc3MoZG9jdW1lbnQuYm9keSwgXCJ1c2VyLXNlbGVjdFwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgY3NzKGRyYWdFbCwgXCJ0cmFuc2Zvcm1cIiwgXCJcIik7XG5cbiAgICAgIGlmIChldnQpIHtcbiAgICAgICAgaWYgKG1vdmVkKSB7XG4gICAgICAgICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgIW9wdGlvbnMuZHJvcEJ1YmJsZSAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBnaG9zdEVsICYmIGdob3N0RWwucGFyZW50Tm9kZSAmJiBnaG9zdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZ2hvc3RFbCk7XG5cbiAgICAgICAgaWYgKHJvb3RFbCA9PT0gcGFyZW50RWwgfHwgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09IFwiY2xvbmVcIikge1xuICAgICAgICAgIC8vIFJlbW92ZSBjbG9uZShzKVxuICAgICAgICAgIGNsb25lRWwgJiYgY2xvbmVFbC5wYXJlbnROb2RlICYmIGNsb25lRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkcmFnRWwpIHtcbiAgICAgICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICAgIG9mZihkcmFnRWwsIFwiZHJhZ2VuZFwiLCB0aGlzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfZGlzYWJsZURyYWdnYWJsZShkcmFnRWwpO1xuXG4gICAgICAgICAgZHJhZ0VsLnN0eWxlW1wid2lsbC1jaGFuZ2VcIl0gPSBcIlwiOyAvLyBSZW1vdmUgY2xhc3Nlc1xuICAgICAgICAgIC8vIGdob3N0Q2xhc3MgaXMgYWRkZWQgaW4gZHJhZ1N0YXJ0ZWRcblxuICAgICAgICAgIGlmIChtb3ZlZCAmJiAhYXdhaXRpbmdEcmFnU3RhcnRlZCkge1xuICAgICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBwdXRTb3J0YWJsZSA/IHB1dFNvcnRhYmxlLm9wdGlvbnMuZ2hvc3RDbGFzcyA6IHRoaXMub3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTsgLy8gRHJhZyBzdG9wIGV2ZW50XG5cbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgIG5hbWU6IFwidW5jaG9vc2VcIixcbiAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgbmV3SW5kZXg6IG51bGwsXG4gICAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleDogbnVsbCxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHJvb3RFbCAhPT0gcGFyZW50RWwpIHtcbiAgICAgICAgICAgIGlmIChuZXdJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgIC8vIEFkZCBldmVudFxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgICBuYW1lOiBcImFkZFwiLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTsgLy8gUmVtb3ZlIGV2ZW50XG5cblxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJyZW1vdmVcIixcbiAgICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgICAgfSk7IC8vIGRyYWcgZnJvbSBvbmUgbGlzdCBhbmQgZHJvcCBpbnRvIGFub3RoZXJcblxuXG4gICAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICByb290RWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwic29ydFwiLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJzb3J0XCIsXG4gICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5zYXZlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChuZXdJbmRleCAhPT0gb2xkSW5kZXgpIHtcbiAgICAgICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAvLyBkcmFnICYgZHJvcCB3aXRoaW4gdGhlIHNhbWUgbGlzdFxuICAgICAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgbmFtZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwic29ydFwiLFxuICAgICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICAgIC8qIGpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgICAgICAgICAgaWYgKG5ld0luZGV4ID09IG51bGwgfHwgbmV3SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgIG5ld0luZGV4ID0gb2xkSW5kZXg7XG4gICAgICAgICAgICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgIG5hbWU6IFwiZW5kXCIsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pOyAvLyBTYXZlIHNvcnRpbmdcblxuXG4gICAgICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUE9SVE1FOiBhZGRlZCB0aGUgZGlzcGF0Y2ggYmxvY2tcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgIG5hbWU6ICdlbmQnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fbnVsbGluZygpO1xuICAgIH0sXG4gICAgX251bGxpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsdWdpbkV2ZW50KFwibnVsbGluZ1wiLCB0aGlzKTtcbiAgICAgIHJvb3RFbCA9IGRyYWdFbCA9IHBhcmVudEVsID0gZ2hvc3RFbCA9IG5leHRFbCA9IGNsb25lRWwgPSBsYXN0RG93bkVsID0gY2xvbmVIaWRkZW4gPSB0YXBFdnQgPSB0b3VjaEV2dCA9IG1vdmVkID0gbmV3SW5kZXggPSBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZEluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXggPSBsYXN0VGFyZ2V0ID0gbGFzdERpcmVjdGlvbiA9IHB1dFNvcnRhYmxlID0gYWN0aXZlR3JvdXAgPSBTb3J0YWJsZS5kcmFnZ2VkID0gU29ydGFibGUuZ2hvc3QgPSBTb3J0YWJsZS5jbG9uZSA9IFNvcnRhYmxlLmFjdGl2ZSA9IG51bGw7XG4gICAgICBzYXZlZElucHV0Q2hlY2tlZC5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBlbC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgc2F2ZWRJbnB1dENoZWNrZWQubGVuZ3RoID0gbGFzdER4ID0gbGFzdER5ID0gMDtcbiAgICB9LFxuICAgIGhhbmRsZUV2ZW50OiBmdW5jdGlvbiAoXG4gICAgLyoqRXZlbnQqL1xuICAgIGV2dCkge1xuICAgICAgc3dpdGNoIChldnQudHlwZSkge1xuICAgICAgICBjYXNlIFwiZHJvcFwiOlxuICAgICAgICBjYXNlIFwiZHJhZ2VuZFwiOlxuICAgICAgICAgIHRoaXMuX29uRHJvcChldnQpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcImRyYWdlbnRlclwiOlxuICAgICAgICBjYXNlIFwiZHJhZ292ZXJcIjpcbiAgICAgICAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkRyYWdPdmVyKGV2dCk7XG5cbiAgICAgICAgICAgIF9nbG9iYWxEcmFnT3ZlcihldnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJzZWxlY3RzdGFydFwiOlxuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIHRoZSBpdGVtIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmdbXX1cbiAgICAgKi9cbiAgICB0b0FycmF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgb3JkZXIgPSBbXSxcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuZWwuY2hpbGRyZW4sXG4gICAgICAgICAgaSA9IDAsXG4gICAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgICBlbCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgICAgIGlmIChjbG9zZXN0KGVsLCBvcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpKSB7XG4gICAgICAgICAgb3JkZXIucHVzaChlbC5nZXRBdHRyaWJ1dGUob3B0aW9ucy5kYXRhSWRBdHRyKSB8fCBfZ2VuZXJhdGVJZChlbCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU29ydHMgdGhlIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtICB7U3RyaW5nW119ICBvcmRlciAgb3JkZXIgb2YgdGhlIGl0ZW1zXG4gICAgICovXG4gICAgc29ydDogZnVuY3Rpb24gKG9yZGVyKSB7XG4gICAgICBsZXQgaXRlbXMgPSB7fSxcbiAgICAgICAgICByb290RWwgPSB0aGlzLmVsO1xuICAgICAgdGhpcy50b0FycmF5KCkuZm9yRWFjaChmdW5jdGlvbiAoaWQsIGkpIHtcbiAgICAgICAgbGV0IGVsID0gcm9vdEVsLmNoaWxkcmVuW2ldO1xuXG4gICAgICAgIGlmIChjbG9zZXN0KGVsLCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCByb290RWwsIGZhbHNlKSkge1xuICAgICAgICAgIGl0ZW1zW2lkXSA9IGVsO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmIChpdGVtc1tpZF0pIHtcbiAgICAgICAgICByb290RWwucmVtb3ZlQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhdmUgdGhlIGN1cnJlbnQgc29ydGluZ1xuICAgICAqL1xuICAgIHNhdmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBzdG9yZSA9IHRoaXMub3B0aW9ucy5zdG9yZTtcbiAgICAgIHN0b3JlICYmIHN0b3JlLnNldCAmJiBzdG9yZS5zZXQodGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCwgZ2V0IHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgYnkgdGVzdGluZyB0aGUgZWxlbWVudCBpdHNlbGYgYW5kIHRyYXZlcnNpbmcgdXAgdGhyb3VnaCBpdHMgYW5jZXN0b3JzIGluIHRoZSBET00gdHJlZS5cbiAgICAgKiBAcGFyYW0gICB7SFRNTEVsZW1lbnR9ICBlbFxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgICAgIFtzZWxlY3Rvcl0gIGRlZmF1bHQ6IGBvcHRpb25zLmRyYWdnYWJsZWBcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICAgKi9cbiAgICBjbG9zZXN0OiBmdW5jdGlvbiAoZWwsIHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdChlbCwgc2VsZWN0b3IgfHwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQvZ2V0IG9wdGlvblxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0gICB7Kn0gICAgICBbdmFsdWVdXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgb3B0aW9uOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gb3B0aW9uc1tuYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtb2RpZmllZFZhbHVlID0gUGx1Z2luTWFuYWdlci5tb2RpZnlPcHRpb24odGhpcywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWRWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIG9wdGlvbnNbbmFtZV0gPSBtb2RpZmllZFZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lID09PSBcImdyb3VwXCIpIHtcbiAgICAgICAgICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICBwbHVnaW5FdmVudChcImRlc3Ryb3lcIiwgdGhpcyk7XG4gICAgICBsZXQgZWwgPSB0aGlzLmVsO1xuICAgICAgZWxbZXhwYW5kb10gPSBudWxsO1xuICAgICAgb2ZmKGVsLCBcIm1vdXNlZG93blwiLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICAgIG9mZihlbCwgXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgICAgb2ZmKGVsLCBcInBvaW50ZXJkb3duXCIsIHRoaXMuX29uVGFwU3RhcnQpO1xuXG4gICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb2ZmKGVsLCBcImRyYWdvdmVyXCIsIHRoaXMpO1xuICAgICAgICBvZmYoZWwsIFwiZHJhZ2VudGVyXCIsIHRoaXMpO1xuICAgICAgfSAvLyBSZW1vdmUgZHJhZ2dhYmxlIGF0dHJpYnV0ZXNcblxuXG4gICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZHJhZ2dhYmxlXVwiKSwgZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcImRyYWdnYWJsZVwiKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgICAgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG5cbiAgICAgIHNvcnRhYmxlcy5zcGxpY2Uoc29ydGFibGVzLmluZGV4T2YodGhpcy5lbCksIDEpO1xuICAgICAgdGhpcy5lbCA9IGVsID0gbnVsbDtcbiAgICB9LFxuICAgIF9oaWRlQ2xvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghY2xvbmVIaWRkZW4pIHtcbiAgICAgICAgcGx1Z2luRXZlbnQoXCJoaWRlQ2xvbmVcIiwgdGhpcyk7XG4gICAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47XG4gICAgICAgIGNzcyhjbG9uZUVsLCBcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUgJiYgY2xvbmVFbC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgY2xvbmVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lRWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvbmVIaWRkZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgX3Nob3dDbG9uZTogZnVuY3Rpb24gKHB1dFNvcnRhYmxlKSB7XG4gICAgICBpZiAocHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09IFwiY2xvbmVcIikge1xuICAgICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChjbG9uZUhpZGRlbikge1xuICAgICAgICBwbHVnaW5FdmVudChcInNob3dDbG9uZVwiLCB0aGlzKTtcbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjsgLy8gc2hvdyBjbG9uZSBhdCBkcmFnRWwgb3Igb3JpZ2luYWwgcG9zaXRpb25cblxuICAgICAgICBpZiAoZHJhZ0VsLnBhcmVudE5vZGUgPT0gcm9vdEVsICYmICF0aGlzLm9wdGlvbnMuZ3JvdXAucmV2ZXJ0Q2xvbmUpIHtcbiAgICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV4dEVsKSB7XG4gICAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBuZXh0RWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JvdXAucmV2ZXJ0Q2xvbmUpIHtcbiAgICAgICAgICB0aGlzLmFuaW1hdGUoZHJhZ0VsLCBjbG9uZUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNzcyhjbG9uZUVsLCBcImRpc3BsYXlcIiwgXCJcIik7XG4gICAgICAgIGNsb25lSGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIF9nbG9iYWxEcmFnT3ZlcihcbiAgLyoqRXZlbnQqL1xuICBldnQpIHtcbiAgICBpZiAoZXZ0LmRhdGFUcmFuc2Zlcikge1xuICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJtb3ZlXCI7XG4gICAgfVxuXG4gICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdmUoZnJvbUVsLCB0b0VsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXRFbCwgdGFyZ2V0UmVjdCwgb3JpZ2luYWxFdmVudCwgd2lsbEluc2VydEFmdGVyKSB7XG4gICAgbGV0IGV2dCxcbiAgICAgICAgc29ydGFibGUgPSBmcm9tRWxbZXhwYW5kb10sXG4gICAgICAgIG9uTW92ZUZuID0gc29ydGFibGUub3B0aW9ucy5vbk1vdmUsXG4gICAgICAgIHJldFZhbDsgLy8gU3VwcG9ydCBmb3IgbmV3IEN1c3RvbUV2ZW50IGZlYXR1cmVcblxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgIUlFMTFPckxlc3MgJiYgIUVkZ2UpIHtcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChcIm1vdmVcIiwge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICAgIGV2dC5pbml0RXZlbnQoXCJtb3ZlXCIsIHRydWUsIHRydWUpO1xuICAgIH1cblxuICAgIGV2dC50byA9IHRvRWw7XG4gICAgZXZ0LmZyb20gPSBmcm9tRWw7XG4gICAgZXZ0LmRyYWdnZWQgPSBkcmFnRWw7XG4gICAgZXZ0LmRyYWdnZWRSZWN0ID0gZHJhZ1JlY3Q7XG4gICAgZXZ0LnJlbGF0ZWQgPSB0YXJnZXRFbCB8fCB0b0VsO1xuICAgIGV2dC5yZWxhdGVkUmVjdCA9IHRhcmdldFJlY3QgfHwgZ2V0UmVjdCh0b0VsKTtcbiAgICBldnQud2lsbEluc2VydEFmdGVyID0gd2lsbEluc2VydEFmdGVyO1xuICAgIGV2dC5vcmlnaW5hbEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcbiAgICBmcm9tRWwuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gICAgaWYgKG9uTW92ZUZuKSB7XG4gICAgICByZXRWYWwgPSBvbk1vdmVGbi5jYWxsKHNvcnRhYmxlLCBldnQsIG9yaWdpbmFsRXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXRWYWw7XG4gIH1cblxuICBmdW5jdGlvbiBfZGlzYWJsZURyYWdnYWJsZShlbCkge1xuICAgIGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gX3Vuc2lsZW50KCkge1xuICAgIF9zaWxlbnQgPSBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9naG9zdElzTGFzdChldnQsIHZlcnRpY2FsLCBzb3J0YWJsZSkge1xuICAgIGxldCByZWN0ID0gZ2V0UmVjdChsYXN0Q2hpbGQoc29ydGFibGUuZWwsIHNvcnRhYmxlLm9wdGlvbnMuZHJhZ2dhYmxlKSk7XG4gICAgY29uc3Qgc3BhY2VyID0gMTA7XG4gICAgcmV0dXJuIHZlcnRpY2FsID8gZXZ0LmNsaWVudFggPiByZWN0LnJpZ2h0ICsgc3BhY2VyIHx8IGV2dC5jbGllbnRYIDw9IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LmJvdHRvbSAmJiBldnQuY2xpZW50WCA+PSByZWN0LmxlZnQgOiBldnQuY2xpZW50WCA+IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LnRvcCB8fCBldnQuY2xpZW50WCA8PSByZWN0LnJpZ2h0ICYmIGV2dC5jbGllbnRZID4gcmVjdC5ib3R0b20gKyBzcGFjZXI7XG4gIH1cblxuICBmdW5jdGlvbiBfZ2V0U3dhcERpcmVjdGlvbihldnQsIHRhcmdldCwgdGFyZ2V0UmVjdCwgdmVydGljYWwsIHN3YXBUaHJlc2hvbGQsIGludmVydGVkU3dhcFRocmVzaG9sZCwgaW52ZXJ0U3dhcCwgaXNMYXN0VGFyZ2V0KSB7XG4gICAgbGV0IG1vdXNlT25BeGlzID0gdmVydGljYWwgPyBldnQuY2xpZW50WSA6IGV2dC5jbGllbnRYLFxuICAgICAgICB0YXJnZXRMZW5ndGggPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QuaGVpZ2h0IDogdGFyZ2V0UmVjdC53aWR0aCxcbiAgICAgICAgdGFyZ2V0UzEgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QudG9wIDogdGFyZ2V0UmVjdC5sZWZ0LFxuICAgICAgICB0YXJnZXRTMiA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5ib3R0b20gOiB0YXJnZXRSZWN0LnJpZ2h0LFxuICAgICAgICBpbnZlcnQgPSBmYWxzZTtcblxuICAgIGlmICghaW52ZXJ0U3dhcCkge1xuICAgICAgLy8gTmV2ZXIgaW52ZXJ0IG9yIGNyZWF0ZSBkcmFnRWwgc2hhZG93IHdoZW4gdGFyZ2V0IG1vdmVtZW5ldCBjYXVzZXMgbW91c2UgdG8gbW92ZSBwYXN0IHRoZSBlbmQgb2YgcmVndWxhciBzd2FwVGhyZXNob2xkXG4gICAgICBpZiAoaXNMYXN0VGFyZ2V0ICYmIHRhcmdldE1vdmVEaXN0YW5jZSA8IHRhcmdldExlbmd0aCAqIHN3YXBUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gbXVsdGlwbGllZCBvbmx5IGJ5IHN3YXBUaHJlc2hvbGQgYmVjYXVzZSBtb3VzZSB3aWxsIGFscmVhZHkgYmUgaW5zaWRlIHRhcmdldCBieSAoMSAtIHRocmVzaG9sZCkgKiB0YXJnZXRMZW5ndGggLyAyXG4gICAgICAgIC8vIGNoZWNrIGlmIHBhc3QgZmlyc3QgaW52ZXJ0IHRocmVzaG9sZCBvbiBzaWRlIG9wcG9zaXRlIG9mIGxhc3REaXJlY3Rpb25cbiAgICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggJiYgKGxhc3REaXJlY3Rpb24gPT09IDEgPyBtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMiA6IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyKSkge1xuICAgICAgICAgIC8vIHBhc3QgZmlyc3QgaW52ZXJ0IHRocmVzaG9sZCwgZG8gbm90IHJlc3RyaWN0IGludmVydGVkIHRocmVzaG9sZCB0byBkcmFnRWwgc2hhZG93XG4gICAgICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzdEZpcnN0SW52ZXJ0VGhyZXNoKSB7XG4gICAgICAgICAgLy8gZHJhZ0VsIHNoYWRvdyAodGFyZ2V0IG1vdmUgZGlzdGFuY2Ugc2hhZG93KVxuICAgICAgICAgIGlmIChsYXN0RGlyZWN0aW9uID09PSAxID8gbW91c2VPbkF4aXMgPCB0YXJnZXRTMSArIHRhcmdldE1vdmVEaXN0YW5jZSAvLyBvdmVyIGRyYWdFbCBzaGFkb3dcbiAgICAgICAgICA6IG1vdXNlT25BeGlzID4gdGFyZ2V0UzIgLSB0YXJnZXRNb3ZlRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiAtbGFzdERpcmVjdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW52ZXJ0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVndWxhclxuICAgICAgICBpZiAobW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqICgxIC0gc3dhcFRocmVzaG9sZCkgLyAyICYmIG1vdXNlT25BeGlzIDwgdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiAoMSAtIHN3YXBUaHJlc2hvbGQpIC8gMikge1xuICAgICAgICAgIHJldHVybiBfZ2V0SW5zZXJ0RGlyZWN0aW9uKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnZlcnQgPSBpbnZlcnQgfHwgaW52ZXJ0U3dhcDtcblxuICAgIGlmIChpbnZlcnQpIHtcbiAgICAgIC8vIEludmVydCBvZiByZWd1bGFyXG4gICAgICBpZiAobW91c2VPbkF4aXMgPCB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIgfHwgbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIpIHtcbiAgICAgICAgcmV0dXJuIG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggLyAyID8gMSA6IC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkaXJlY3Rpb24gZHJhZ0VsIG11c3QgYmUgc3dhcHBlZCByZWxhdGl2ZSB0byB0YXJnZXQgaW4gb3JkZXIgdG8gbWFrZSBpdFxuICAgKiBzZWVtIHRoYXQgZHJhZ0VsIGhhcyBiZWVuIFwiaW5zZXJ0ZWRcIiBpbnRvIHRoYXQgZWxlbWVudCdzIHBvc2l0aW9uXG4gICAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSB0YXJnZXQgICAgICAgVGhlIHRhcmdldCB3aG9zZSBwb3NpdGlvbiBkcmFnRWwgaXMgYmVpbmcgaW5zZXJ0ZWQgYXRcbiAgICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZHJhZ0VsIG11c3QgYmUgc3dhcHBlZFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KSB7XG4gICAgaWYgKGluZGV4KGRyYWdFbCkgPCBpbmRleCh0YXJnZXQpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGUgaWRcbiAgICogQHBhcmFtICAge0hUTUxFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIF9nZW5lcmF0ZUlkKGVsKSB7XG4gICAgbGV0IHN0ciA9IGVsLnRhZ05hbWUgKyBlbC5jbGFzc05hbWUgKyBlbC5zcmMgKyBlbC5ocmVmICsgZWwudGV4dENvbnRlbnQsXG4gICAgICAgIGkgPSBzdHIubGVuZ3RoLFxuICAgICAgICBzdW0gPSAwO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgc3VtICs9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cblxuICAgIHJldHVybiBzdW0udG9TdHJpbmcoMzYpO1xuICB9XG5cbiAgZnVuY3Rpb24gX3NhdmVJbnB1dENoZWNrZWRTdGF0ZShyb290KSB7XG4gICAgc2F2ZWRJbnB1dENoZWNrZWQubGVuZ3RoID0gMDtcbiAgICBsZXQgaW5wdXRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpO1xuICAgIGxldCBpZHggPSBpbnB1dHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGlkeC0tKSB7XG4gICAgICBsZXQgZWwgPSBpbnB1dHNbaWR4XTtcbiAgICAgIGVsLmNoZWNrZWQgJiYgc2F2ZWRJbnB1dENoZWNrZWQucHVzaChlbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX25leHRUaWNrKGZuKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZm4sIDApO1xuICB9XG5cbiAgZnVuY3Rpb24gX2NhbmNlbE5leHRUaWNrKGlkKSB7XG4gICAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG4gIH0gLy8gRml4ZWQgIzk3MzpcblxuXG4gIGlmIChkb2N1bWVudEV4aXN0cykge1xuICAgIG9uKGRvY3VtZW50LCBcInRvdWNobW92ZVwiLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICBpZiAoKFNvcnRhYmxlLmFjdGl2ZSB8fCBhd2FpdGluZ0RyYWdTdGFydGVkKSAmJiBldnQuY2FuY2VsYWJsZSkge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSAvLyBFeHBvcnQgdXRpbHNcblxuXG4gIFNvcnRhYmxlLnV0aWxzID0ge1xuICAgIG9uOiBvbixcbiAgICBvZmY6IG9mZixcbiAgICBjc3M6IGNzcyxcbiAgICBmaW5kOiBmaW5kLFxuICAgIGlzOiBmdW5jdGlvbiAoZWwsIHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gISFjbG9zZXN0KGVsLCBzZWxlY3RvciwgZWwsIGZhbHNlKTtcbiAgICB9LFxuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgICBjbG9zZXN0OiBjbG9zZXN0LFxuICAgIHRvZ2dsZUNsYXNzOiB0b2dnbGVDbGFzcyxcbiAgICBjbG9uZTogY2xvbmUsXG4gICAgaW5kZXg6IGluZGV4LFxuICAgIG5leHRUaWNrOiBfbmV4dFRpY2ssXG4gICAgY2FuY2VsTmV4dFRpY2s6IF9jYW5jZWxOZXh0VGljayxcbiAgICBkZXRlY3REaXJlY3Rpb246IF9kZXRlY3REaXJlY3Rpb24sXG4gICAgZ2V0Q2hpbGQ6IGdldENoaWxkXG4gIH07XG4gIC8qKlxuICAgKiBHZXQgdGhlIFNvcnRhYmxlIGluc3RhbmNlIG9mIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnRcbiAgICogQHJldHVybiB7U29ydGFibGV8dW5kZWZpbmVkfSAgICAgICAgIFRoZSBpbnN0YW5jZSBvZiBTb3J0YWJsZVxuICAgKi9cblxuICBTb3J0YWJsZS5nZXQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50W2V4cGFuZG9dO1xuICB9O1xuICAvKipcbiAgICogTW91bnQgYSBwbHVnaW4gdG8gU29ydGFibGVcbiAgICogQHBhcmFtICB7Li4uU29ydGFibGVQbHVnaW58U29ydGFibGVQbHVnaW5bXX0gcGx1Z2lucyAgICAgICBQbHVnaW5zIGJlaW5nIG1vdW50ZWRcbiAgICovXG5cblxuICBTb3J0YWJsZS5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGx1Z2lucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHBsdWdpbnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnNbMF0uY29uc3RydWN0b3IgPT09IEFycmF5KSBwbHVnaW5zID0gcGx1Z2luc1swXTtcbiAgICBwbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHtcbiAgICAgIGlmICghcGx1Z2luLnByb3RvdHlwZSB8fCAhcGx1Z2luLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICB0aHJvdyBgU29ydGFibGU6IE1vdW50ZWQgcGx1Z2luIG11c3QgYmUgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgbm90ICR7e30udG9TdHJpbmcuY2FsbChwbHVnaW4pfWA7XG4gICAgICB9XG5cbiAgICAgIGlmIChwbHVnaW4udXRpbHMpIFNvcnRhYmxlLnV0aWxzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBTb3J0YWJsZS51dGlscyksIHBsdWdpbi51dGlscyk7XG4gICAgICBQbHVnaW5NYW5hZ2VyLm1vdW50KHBsdWdpbik7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBDcmVhdGUgc29ydGFibGUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gIGVsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgIFtvcHRpb25zXVxuICAgKi9cblxuXG4gIFNvcnRhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgU29ydGFibGUoZWwsIG9wdGlvbnMpO1xuICB9OyAvLyBFeHBvcnRcblxuXG4gIFNvcnRhYmxlLnZlcnNpb24gPSB2ZXJzaW9uO1xuICBsZXQgYXV0b1Njcm9sbHMgPSBbXSxcbiAgICAgIHNjcm9sbEVsLFxuICAgICAgc2Nyb2xsUm9vdEVsLFxuICAgICAgc2Nyb2xsaW5nID0gZmFsc2UsXG4gICAgICBsYXN0QXV0b1Njcm9sbFgsXG4gICAgICBsYXN0QXV0b1Njcm9sbFksXG4gICAgICB0b3VjaEV2dCQxLFxuICAgICAgcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWw7XG5cbiAgZnVuY3Rpb24gQXV0b1Njcm9sbFBsdWdpbigpIHtcbiAgICBmdW5jdGlvbiBBdXRvU2Nyb2xsKCkge1xuICAgICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgICAgc2Nyb2xsOiB0cnVlLFxuICAgICAgICBzY3JvbGxTZW5zaXRpdml0eTogMzAsXG4gICAgICAgIHNjcm9sbFNwZWVkOiAxMCxcbiAgICAgICAgYnViYmxlU2Nyb2xsOiB0cnVlXG4gICAgICB9OyAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcblxuICAgICAgZm9yIChsZXQgZm4gaW4gdGhpcykge1xuICAgICAgICBpZiAoZm4uY2hhckF0KDApID09PSBcIl9cIiAmJiB0eXBlb2YgdGhpc1tmbl0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIEF1dG9TY3JvbGwucHJvdG90eXBlID0ge1xuICAgICAgZHJhZ1N0YXJ0ZWQoX3JlZjMpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50XG4gICAgICAgIH0gPSBfcmVmMztcblxuICAgICAgICBpZiAodGhpcy5zb3J0YWJsZS5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgXCJkcmFnb3ZlclwiLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAgICAgICBvbihkb2N1bWVudCwgXCJwb2ludGVybW92ZVwiLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxFdmVudC50b3VjaGVzKSB7XG4gICAgICAgICAgICBvbihkb2N1bWVudCwgXCJ0b3VjaG1vdmVcIiwgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb24oZG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkcmFnT3ZlckNvbXBsZXRlZChfcmVmNCkge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnRcbiAgICAgICAgfSA9IF9yZWY0O1xuXG4gICAgICAgIC8vIEZvciB3aGVuIGJ1YmJsaW5nIGlzIGNhbmNlbGVkIGFuZCB1c2luZyBmYWxsYmFjayAoZmFsbGJhY2sgJ3RvdWNobW92ZScgYWx3YXlzIHJlYWNoZWQpXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmRyYWdPdmVyQnViYmxlICYmICFvcmlnaW5hbEV2ZW50LnJvb3RFbCkge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwob3JpZ2luYWxFdmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRyb3AoKSB7XG4gICAgICAgIGlmICh0aGlzLnNvcnRhYmxlLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICAgIG9mZihkb2N1bWVudCwgXCJkcmFnb3ZlclwiLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmYoZG9jdW1lbnQsIFwicG9pbnRlcm1vdmVcIiwgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgICBvZmYoZG9jdW1lbnQsIFwidG91Y2htb3ZlXCIsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgICAgb2ZmKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpO1xuICAgICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICAgIGNhbmNlbFRocm90dGxlKCk7XG4gICAgICB9LFxuXG4gICAgICBudWxsaW5nKCkge1xuICAgICAgICB0b3VjaEV2dCQxID0gc2Nyb2xsUm9vdEVsID0gc2Nyb2xsRWwgPSBzY3JvbGxpbmcgPSBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IGxhc3RBdXRvU2Nyb2xsWCA9IGxhc3RBdXRvU2Nyb2xsWSA9IG51bGw7XG4gICAgICAgIGF1dG9TY3JvbGxzLmxlbmd0aCA9IDA7XG4gICAgICB9LFxuXG4gICAgICBfaGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKGV2dCkge1xuICAgICAgICB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKGV2dCwgdHJ1ZSk7XG4gICAgICB9LFxuXG4gICAgICBfaGFuZGxlQXV0b1Njcm9sbChldnQsIGZhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHggPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WCxcbiAgICAgICAgICAgICAgeSA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRZLFxuICAgICAgICAgICAgICBlbGVtID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgdG91Y2hFdnQkMSA9IGV2dDsgLy8gSUUgZG9lcyBub3Qgc2VlbSB0byBoYXZlIG5hdGl2ZSBhdXRvc2Nyb2xsLFxuICAgICAgICAvLyBFZGdlJ3MgYXV0b3Njcm9sbCBzZWVtcyB0b28gY29uZGl0aW9uYWwsXG4gICAgICAgIC8vIE1BQ09TIFNhZmFyaSBkb2VzIG5vdCBoYXZlIGF1dG9zY3JvbGwsXG4gICAgICAgIC8vIEZpcmVmb3ggYW5kIENocm9tZSBhcmUgZ29vZFxuXG4gICAgICAgIGlmIChmYWxsYmFjayB8fCBFZGdlIHx8IElFMTFPckxlc3MgfHwgU2FmYXJpKSB7XG4gICAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZWxlbSwgZmFsbGJhY2spOyAvLyBMaXN0ZW5lciBmb3IgcG9pbnRlciBlbGVtZW50IGNoYW5nZVxuXG4gICAgICAgICAgbGV0IG9nRWxlbVNjcm9sbGVyID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgdHJ1ZSk7XG5cbiAgICAgICAgICBpZiAoc2Nyb2xsaW5nICYmICghcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgfHwgeCAhPT0gbGFzdEF1dG9TY3JvbGxYIHx8IHkgIT09IGxhc3RBdXRvU2Nyb2xsWSkpIHtcbiAgICAgICAgICAgIHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsICYmIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKTsgLy8gRGV0ZWN0IGZvciBwb2ludGVyIGVsZW0gY2hhbmdlLCBlbXVsYXRpbmcgbmF0aXZlIERuRCBiZWhhdmlvdXJcblxuICAgICAgICAgICAgcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBuZXdFbGVtID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgaWYgKG5ld0VsZW0gIT09IG9nRWxlbVNjcm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgb2dFbGVtU2Nyb2xsZXIgPSBuZXdFbGVtO1xuICAgICAgICAgICAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGF1dG9TY3JvbGwoZXZ0LCB0aGlzLm9wdGlvbnMsIG5ld0VsZW0sIGZhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgICAgIGxhc3RBdXRvU2Nyb2xsWCA9IHg7XG4gICAgICAgICAgICBsYXN0QXV0b1Njcm9sbFkgPSB5O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBEbkQgaXMgZW5hYmxlZCAoYW5kIGJyb3dzZXIgaGFzIGdvb2QgYXV0b3Njcm9sbGluZyksIGZpcnN0IGF1dG9zY3JvbGwgd2lsbCBhbHJlYWR5IHNjcm9sbCwgc28gZ2V0IHBhcmVudCBhdXRvc2Nyb2xsIG9mIGZpcnN0IGF1dG9zY3JvbGxcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idWJibGVTY3JvbGwgfHwgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgdHJ1ZSkgPT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgICAgICAgICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF1dG9TY3JvbGwoZXZ0LCB0aGlzLm9wdGlvbnMsIGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIGZhbHNlKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKEF1dG9TY3JvbGwsIHtcbiAgICAgIHBsdWdpbk5hbWU6IFwic2Nyb2xsXCIsXG4gICAgICBpbml0aWFsaXplQnlEZWZhdWx0OiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckF1dG9TY3JvbGxzKCkge1xuICAgIGF1dG9TY3JvbGxzLmZvckVhY2goZnVuY3Rpb24gKGF1dG9TY3JvbGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoYXV0b1Njcm9sbC5waWQpO1xuICAgIH0pO1xuICAgIGF1dG9TY3JvbGxzID0gW107XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCkge1xuICAgIGNsZWFySW50ZXJ2YWwocG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwpO1xuICB9XG5cbiAgY29uc3QgYXV0b1Njcm9sbCA9IHRocm90dGxlKGZ1bmN0aW9uIChldnQsIG9wdGlvbnMsIHJvb3RFbCwgaXNGYWxsYmFjaykge1xuICAgIC8vIEJ1ZzogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1NTIxXG4gICAgaWYgKCFvcHRpb25zLnNjcm9sbCkgcmV0dXJuO1xuICAgIGNvbnN0IHggPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WCxcbiAgICAgICAgICB5ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFksXG4gICAgICAgICAgc2VucyA9IG9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHksXG4gICAgICAgICAgc3BlZWQgPSBvcHRpb25zLnNjcm9sbFNwZWVkLFxuICAgICAgICAgIHdpblNjcm9sbGVyID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgIGxldCBzY3JvbGxUaGlzSW5zdGFuY2UgPSBmYWxzZSxcbiAgICAgICAgc2Nyb2xsQ3VzdG9tRm47IC8vIE5ldyBzY3JvbGwgcm9vdCwgc2V0IHNjcm9sbEVsXG5cbiAgICBpZiAoc2Nyb2xsUm9vdEVsICE9PSByb290RWwpIHtcbiAgICAgIHNjcm9sbFJvb3RFbCA9IHJvb3RFbDtcbiAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgIHNjcm9sbEVsID0gb3B0aW9ucy5zY3JvbGw7XG4gICAgICBzY3JvbGxDdXN0b21GbiA9IG9wdGlvbnMuc2Nyb2xsRm47XG5cbiAgICAgIGlmIChzY3JvbGxFbCA9PT0gdHJ1ZSkge1xuICAgICAgICBzY3JvbGxFbCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KHJvb3RFbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxheWVyc091dCA9IDA7XG4gICAgbGV0IGN1cnJlbnRQYXJlbnQgPSBzY3JvbGxFbDtcblxuICAgIGRvIHtcbiAgICAgIGxldCBlbCA9IGN1cnJlbnRQYXJlbnQsXG4gICAgICAgICAgcmVjdCA9IGdldFJlY3QoZWwpLFxuICAgICAgICAgIHRvcCA9IHJlY3QudG9wLFxuICAgICAgICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tLFxuICAgICAgICAgIGxlZnQgPSByZWN0LmxlZnQsXG4gICAgICAgICAgcmlnaHQgPSByZWN0LnJpZ2h0LFxuICAgICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSByZWN0LmhlaWdodCxcbiAgICAgICAgICBjYW5TY3JvbGxYLFxuICAgICAgICAgIGNhblNjcm9sbFksXG4gICAgICAgICAgc2Nyb2xsV2lkdGggPSBlbC5zY3JvbGxXaWR0aCxcbiAgICAgICAgICBzY3JvbGxIZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgZWxDU1MgPSBjc3MoZWwpLFxuICAgICAgICAgIHNjcm9sbFBvc1ggPSBlbC5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHNjcm9sbFBvc1kgPSBlbC5zY3JvbGxUb3A7XG5cbiAgICAgIGlmIChlbCA9PT0gd2luU2Nyb2xsZXIpIHtcbiAgICAgICAgY2FuU2Nyb2xsWCA9IHdpZHRoIDwgc2Nyb2xsV2lkdGggJiYgKGVsQ1NTLm92ZXJmbG93WCA9PT0gXCJhdXRvXCIgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSBcInNjcm9sbFwiIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gXCJ2aXNpYmxlXCIpO1xuICAgICAgICBjYW5TY3JvbGxZID0gaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0ICYmIChlbENTUy5vdmVyZmxvd1kgPT09IFwiYXV0b1wiIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gXCJzY3JvbGxcIiB8fCBlbENTUy5vdmVyZmxvd1kgPT09IFwidmlzaWJsZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhblNjcm9sbFggPSB3aWR0aCA8IHNjcm9sbFdpZHRoICYmIChlbENTUy5vdmVyZmxvd1ggPT09IFwiYXV0b1wiIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gXCJzY3JvbGxcIik7XG4gICAgICAgIGNhblNjcm9sbFkgPSBoZWlnaHQgPCBzY3JvbGxIZWlnaHQgJiYgKGVsQ1NTLm92ZXJmbG93WSA9PT0gXCJhdXRvXCIgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSBcInNjcm9sbFwiKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZ4ID0gY2FuU2Nyb2xsWCAmJiAoTWF0aC5hYnMocmlnaHQgLSB4KSA8PSBzZW5zICYmIHNjcm9sbFBvc1ggKyB3aWR0aCA8IHNjcm9sbFdpZHRoKSAtIChNYXRoLmFicyhsZWZ0IC0geCkgPD0gc2VucyAmJiAhIXNjcm9sbFBvc1gpO1xuICAgICAgbGV0IHZ5ID0gY2FuU2Nyb2xsWSAmJiAoTWF0aC5hYnMoYm90dG9tIC0geSkgPD0gc2VucyAmJiBzY3JvbGxQb3NZICsgaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0KSAtIChNYXRoLmFicyh0b3AgLSB5KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWSk7XG5cbiAgICAgIGlmICghYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBsYXllcnNPdXQ7IGkrKykge1xuICAgICAgICAgIGlmICghYXV0b1Njcm9sbHNbaV0pIHtcbiAgICAgICAgICAgIGF1dG9TY3JvbGxzW2ldID0ge307XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ4ICE9IHZ4IHx8IGF1dG9TY3JvbGxzW2xheWVyc091dF0udnkgIT0gdnkgfHwgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5lbCAhPT0gZWwpIHtcbiAgICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5lbCA9IGVsO1xuICAgICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ4ID0gdng7XG4gICAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0udnkgPSB2eTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnBpZCk7XG5cbiAgICAgICAgaWYgKHZ4ICE9IDAgfHwgdnkgIT0gMCkge1xuICAgICAgICAgIHNjcm9sbFRoaXNJbnN0YW5jZSA9IHRydWU7XG4gICAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi9cblxuICAgICAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0ucGlkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gZW11bGF0ZSBkcmFnIG92ZXIgZHVyaW5nIGF1dG9zY3JvbGwgKGZhbGxiYWNrKSwgZW11bGF0aW5nIG5hdGl2ZSBEbkQgYmVoYXZpb3VyXG4gICAgICAgICAgICBpZiAoaXNGYWxsYmFjayAmJiB0aGlzLmxheWVyID09PSAwKSB7XG4gICAgICAgICAgICAgIFNvcnRhYmxlLmFjdGl2ZS5fb25Ub3VjaE1vdmUodG91Y2hFdnQkMSk7IC8vIFRvIG1vdmUgZ2hvc3QgaWYgaXQgaXMgcG9zaXRpb25lZCBhYnNvbHV0ZWx5XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHNjcm9sbE9mZnNldFkgPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eSA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ5ICogc3BlZWQgOiAwO1xuICAgICAgICAgICAgbGV0IHNjcm9sbE9mZnNldFggPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eCA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ4ICogc3BlZWQgOiAwO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNjcm9sbEN1c3RvbUZuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgaWYgKHNjcm9sbEN1c3RvbUZuLmNhbGwoU29ydGFibGUuZHJhZ2dlZC5wYXJlbnROb2RlW2V4cGFuZG9dLCBzY3JvbGxPZmZzZXRYLCBzY3JvbGxPZmZzZXRZLCBldnQsIHRvdWNoRXZ0JDEsIGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLmVsKSAhPT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjcm9sbEJ5KGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLmVsLCBzY3JvbGxPZmZzZXRYLCBzY3JvbGxPZmZzZXRZKTtcbiAgICAgICAgICB9LmJpbmQoe1xuICAgICAgICAgICAgbGF5ZXI6IGxheWVyc091dFxuICAgICAgICAgIH0pLCAyNCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGF5ZXJzT3V0Kys7XG4gICAgfSB3aGlsZSAob3B0aW9ucy5idWJibGVTY3JvbGwgJiYgY3VycmVudFBhcmVudCAhPT0gd2luU2Nyb2xsZXIgJiYgKGN1cnJlbnRQYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChjdXJyZW50UGFyZW50LCBmYWxzZSkpKTtcblxuICAgIHNjcm9sbGluZyA9IHNjcm9sbFRoaXNJbnN0YW5jZTsgLy8gaW4gY2FzZSBhbm90aGVyIGZ1bmN0aW9uIGNhdGNoZXMgc2Nyb2xsaW5nIGFzIGZhbHNlIGluIGJldHdlZW4gd2hlbiBpdCBpcyBub3RcbiAgfSwgMzApO1xuXG4gIGNvbnN0IGRyb3AgPSBmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICBsZXQge1xuICAgICAgb3JpZ2luYWxFdmVudCxcbiAgICAgIHB1dFNvcnRhYmxlLFxuICAgICAgZHJhZ0VsLFxuICAgICAgYWN0aXZlU29ydGFibGUsXG4gICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICBoaWRlR2hvc3RGb3JUYXJnZXQsXG4gICAgICB1bmhpZGVHaG9zdEZvclRhcmdldFxuICAgIH0gPSBfcmVmNTtcbiAgICBpZiAoIW9yaWdpbmFsRXZlbnQpIHJldHVybjtcbiAgICBsZXQgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlO1xuICAgIGhpZGVHaG9zdEZvclRhcmdldCgpO1xuICAgIGxldCB0b3VjaCA9IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPyBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogb3JpZ2luYWxFdmVudDtcbiAgICBsZXQgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgICB1bmhpZGVHaG9zdEZvclRhcmdldCgpO1xuXG4gICAgaWYgKHRvU29ydGFibGUgJiYgIXRvU29ydGFibGUuZWwuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KFwic3BpbGxcIik7XG4gICAgICB0aGlzLm9uU3BpbGwoe1xuICAgICAgICBkcmFnRWwsXG4gICAgICAgIHB1dFNvcnRhYmxlXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gUmV2ZXJ0KCkge31cblxuICBSZXZlcnQucHJvdG90eXBlID0ge1xuICAgIHN0YXJ0SW5kZXg6IG51bGwsXG5cbiAgICBkcmFnU3RhcnQoX3JlZjYpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIG9sZERyYWdnYWJsZUluZGV4XG4gICAgICB9ID0gX3JlZjY7XG4gICAgICB0aGlzLnN0YXJ0SW5kZXggPSBvbGREcmFnZ2FibGVJbmRleDtcbiAgICB9LFxuXG4gICAgb25TcGlsbChfcmVmNykge1xuICAgICAgbGV0IHtcbiAgICAgICAgZHJhZ0VsLFxuICAgICAgICBwdXRTb3J0YWJsZVxuICAgICAgfSA9IF9yZWY3O1xuICAgICAgdGhpcy5zb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgaWYgKHB1dFNvcnRhYmxlKSB7XG4gICAgICAgIHB1dFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV4dFNpYmxpbmcgPSBnZXRDaGlsZCh0aGlzLnNvcnRhYmxlLmVsLCB0aGlzLnN0YXJ0SW5kZXgsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgICB0aGlzLnNvcnRhYmxlLmVsLmluc2VydEJlZm9yZShkcmFnRWwsIG5leHRTaWJsaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydGFibGUuZWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0YWJsZS5hbmltYXRlQWxsKCk7XG5cbiAgICAgIGlmIChwdXRTb3J0YWJsZSkge1xuICAgICAgICBwdXRTb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGRyb3BcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihSZXZlcnQsIHtcbiAgICBwbHVnaW5OYW1lOiBcInJldmVydE9uU3BpbGxcIlxuICB9KTtcblxuICBmdW5jdGlvbiBSZW1vdmUoKSB7fVxuXG4gIFJlbW92ZS5wcm90b3R5cGUgPSB7XG4gICAgb25TcGlsbChfcmVmOCkge1xuICAgICAgbGV0IHtcbiAgICAgICAgZHJhZ0VsLFxuICAgICAgICBwdXRTb3J0YWJsZVxuICAgICAgfSA9IF9yZWY4O1xuICAgICAgY29uc3QgcGFyZW50U29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgICAgcGFyZW50U29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICBkcmFnRWwucGFyZW50Tm9kZSAmJiBkcmFnRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkcmFnRWwpO1xuICAgICAgcGFyZW50U29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgIH0sXG5cbiAgICBkcm9wXG4gIH07XG4gIE9iamVjdC5hc3NpZ24oUmVtb3ZlLCB7XG4gICAgcGx1Z2luTmFtZTogXCJyZW1vdmVPblNwaWxsXCJcbiAgfSk7XG4gIGxldCBsYXN0U3dhcEVsO1xuXG4gIGZ1bmN0aW9uIFN3YXBQbHVnaW4oKSB7XG4gICAgZnVuY3Rpb24gU3dhcCgpIHtcbiAgICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICAgIHN3YXBDbGFzczogXCJzb3J0YWJsZS1zd2FwLWhpZ2hsaWdodFwiXG4gICAgICB9O1xuICAgIH1cblxuICAgIFN3YXAucHJvdG90eXBlID0ge1xuICAgICAgZHJhZ1N0YXJ0KF9yZWY5KSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgZHJhZ0VsXG4gICAgICAgIH0gPSBfcmVmOTtcbiAgICAgICAgbGFzdFN3YXBFbCA9IGRyYWdFbDtcbiAgICAgIH0sXG5cbiAgICAgIGRyYWdPdmVyVmFsaWQoX3JlZjEwKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY29tcGxldGVkLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBvbk1vdmUsXG4gICAgICAgICAgYWN0aXZlU29ydGFibGUsXG4gICAgICAgICAgY2hhbmdlZCxcbiAgICAgICAgICBjYW5jZWxcbiAgICAgICAgfSA9IF9yZWYxMDtcbiAgICAgICAgaWYgKCFhY3RpdmVTb3J0YWJsZS5vcHRpb25zLnN3YXApIHJldHVybjtcbiAgICAgICAgbGV0IGVsID0gdGhpcy5zb3J0YWJsZS5lbCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgbGV0IHByZXZTd2FwRWwgPSBsYXN0U3dhcEVsO1xuXG4gICAgICAgICAgaWYgKG9uTW92ZSh0YXJnZXQpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdG9nZ2xlQ2xhc3ModGFyZ2V0LCBvcHRpb25zLnN3YXBDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgICBsYXN0U3dhcEVsID0gdGFyZ2V0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0U3dhcEVsID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJldlN3YXBFbCAmJiBwcmV2U3dhcEVsICE9PSBsYXN0U3dhcEVsKSB7XG4gICAgICAgICAgICB0b2dnbGVDbGFzcyhwcmV2U3dhcEVsLCBvcHRpb25zLnN3YXBDbGFzcywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgY29tcGxldGVkKHRydWUpO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgIH0sXG5cbiAgICAgIGRyb3AoX3JlZjExKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUsXG4gICAgICAgICAgcHV0U29ydGFibGUsXG4gICAgICAgICAgZHJhZ0VsXG4gICAgICAgIH0gPSBfcmVmMTE7XG4gICAgICAgIGxldCB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGxhc3RTd2FwRWwgJiYgdG9nZ2xlQ2xhc3MobGFzdFN3YXBFbCwgb3B0aW9ucy5zd2FwQ2xhc3MsIGZhbHNlKTtcblxuICAgICAgICBpZiAobGFzdFN3YXBFbCAmJiAob3B0aW9ucy5zd2FwIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLm9wdGlvbnMuc3dhcCkpIHtcbiAgICAgICAgICBpZiAoZHJhZ0VsICE9PSBsYXN0U3dhcEVsKSB7XG4gICAgICAgICAgICB0b1NvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRvU29ydGFibGUgIT09IGFjdGl2ZVNvcnRhYmxlKSBhY3RpdmVTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICAgIHN3YXBOb2RlcyhkcmFnRWwsIGxhc3RTd2FwRWwpO1xuICAgICAgICAgICAgdG9Tb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgICAgICBpZiAodG9Tb3J0YWJsZSAhPT0gYWN0aXZlU29ydGFibGUpIGFjdGl2ZVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIG51bGxpbmcoKSB7XG4gICAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgICAgfVxuXG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihTd2FwLCB7XG4gICAgICBwbHVnaW5OYW1lOiBcInN3YXBcIixcblxuICAgICAgZXZlbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN3YXBJdGVtOiBsYXN0U3dhcEVsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN3YXBOb2RlcyhuMSwgbjIpIHtcbiAgICBsZXQgcDEgPSBuMS5wYXJlbnROb2RlLFxuICAgICAgICBwMiA9IG4yLnBhcmVudE5vZGUsXG4gICAgICAgIGkxLFxuICAgICAgICBpMjtcbiAgICBpZiAoIXAxIHx8ICFwMiB8fCBwMS5pc0VxdWFsTm9kZShuMikgfHwgcDIuaXNFcXVhbE5vZGUobjEpKSByZXR1cm47XG4gICAgaTEgPSBpbmRleChuMSk7XG4gICAgaTIgPSBpbmRleChuMik7XG5cbiAgICBpZiAocDEuaXNFcXVhbE5vZGUocDIpICYmIGkxIDwgaTIpIHtcbiAgICAgIGkyKys7XG4gICAgfVxuXG4gICAgcDEuaW5zZXJ0QmVmb3JlKG4yLCBwMS5jaGlsZHJlbltpMV0pO1xuICAgIHAyLmluc2VydEJlZm9yZShuMSwgcDIuY2hpbGRyZW5baTJdKTtcbiAgfVxuXG4gIGxldCBtdWx0aURyYWdFbGVtZW50cyA9IFtdLFxuICAgICAgbXVsdGlEcmFnQ2xvbmVzID0gW10sXG4gICAgICBsYXN0TXVsdGlEcmFnU2VsZWN0LFxuICAgICAgLy8gZm9yIHNlbGVjdGlvbiB3aXRoIG1vZGlmaWVyIGtleSBkb3duIChTSElGVClcbiAgbXVsdGlEcmFnU29ydGFibGUsXG4gICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlLFxuICAgICAgLy8gSW5pdGlhbCBtdWx0aS1kcmFnIGZvbGQgd2hlbiBkcmFnIHN0YXJ0ZWRcbiAgZm9sZGluZyA9IGZhbHNlLFxuICAgICAgLy8gRm9sZGluZyBhbnkgb3RoZXIgdGltZVxuICBkcmFnU3RhcnRlZCA9IGZhbHNlLFxuICAgICAgZHJhZ0VsJDEsXG4gICAgICBjbG9uZXNGcm9tUmVjdCxcbiAgICAgIGNsb25lc0hpZGRlbjtcblxuICBmdW5jdGlvbiBNdWx0aURyYWdQbHVnaW4oKSB7XG4gICAgZnVuY3Rpb24gTXVsdGlEcmFnKHNvcnRhYmxlKSB7XG4gICAgICAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcbiAgICAgIGZvciAobGV0IGZuIGluIHRoaXMpIHtcbiAgICAgICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gXCJfXCIgJiYgdHlwZW9mIHRoaXNbZm5dID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNvcnRhYmxlLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsIFwicG9pbnRlcnVwXCIsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCBcIm1vdXNldXBcIiwgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgICBvbihkb2N1bWVudCwgXCJ0b3VjaGVuZFwiLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICB9XG5cbiAgICAgIG9uKGRvY3VtZW50LCBcImtleWRvd25cIiwgdGhpcy5fY2hlY2tLZXlEb3duKTtcbiAgICAgIG9uKGRvY3VtZW50LCBcImtleXVwXCIsIHRoaXMuX2NoZWNrS2V5VXApO1xuICAgICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgICAgc2VsZWN0ZWRDbGFzczogXCJzb3J0YWJsZS1zZWxlY3RlZFwiLFxuICAgICAgICBtdWx0aURyYWdLZXk6IG51bGwsXG5cbiAgICAgICAgc2V0RGF0YShkYXRhVHJhbnNmZXIsIGRyYWdFbCkge1xuICAgICAgICAgIGxldCBkYXRhID0gXCJcIjtcblxuICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggJiYgbXVsdGlEcmFnU29ydGFibGUgPT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKChtdWx0aURyYWdFbGVtZW50LCBpKSA9PiB7XG4gICAgICAgICAgICAgIGRhdGEgKz0gKCFpID8gXCJcIiA6IFwiLCBcIikgKyBtdWx0aURyYWdFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSBkcmFnRWwudGV4dENvbnRlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoXCJUZXh0XCIsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgIH07XG4gICAgfVxuXG4gICAgTXVsdGlEcmFnLnByb3RvdHlwZSA9IHtcbiAgICAgIG11bHRpRHJhZ0tleURvd246IGZhbHNlLFxuICAgICAgaXNNdWx0aURyYWc6IGZhbHNlLFxuXG4gICAgICBkZWxheVN0YXJ0R2xvYmFsKF9yZWYxMikge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGRyYWdFbDogZHJhZ2dlZFxuICAgICAgICB9ID0gX3JlZjEyO1xuICAgICAgICBkcmFnRWwkMSA9IGRyYWdnZWQ7XG4gICAgICB9LFxuXG4gICAgICBkZWxheUVuZGVkKCkge1xuICAgICAgICB0aGlzLmlzTXVsdGlEcmFnID0gfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpO1xuICAgICAgfSxcblxuICAgICAgc2V0dXBDbG9uZShfcmVmMTMpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBzb3J0YWJsZSxcbiAgICAgICAgICBjYW5jZWxcbiAgICAgICAgfSA9IF9yZWYxMztcbiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdWx0aURyYWdFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG11bHRpRHJhZ0Nsb25lcy5wdXNoKGNsb25lKG11bHRpRHJhZ0VsZW1lbnRzW2ldKSk7XG4gICAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLnNvcnRhYmxlSW5kZXggPSBtdWx0aURyYWdFbGVtZW50c1tpXS5zb3J0YWJsZUluZGV4O1xuICAgICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uc3R5bGVbXCJ3aWxsLWNoYW5nZVwiXSA9IFwiXCI7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MobXVsdGlEcmFnQ2xvbmVzW2ldLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzW2ldID09PSBkcmFnRWwkMSAmJiB0b2dnbGVDbGFzcyhtdWx0aURyYWdDbG9uZXNbaV0sIHRoaXMub3B0aW9ucy5jaG9zZW5DbGFzcywgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgc29ydGFibGUuX2hpZGVDbG9uZSgpO1xuXG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgfSxcblxuICAgICAgY2xvbmUoX3JlZjE0KSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsLFxuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgICBjYW5jZWxcbiAgICAgICAgfSA9IF9yZWYxNDtcbiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoICYmIG11bHRpRHJhZ1NvcnRhYmxlID09PSBzb3J0YWJsZSkge1xuICAgICAgICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKHRydWUsIHJvb3RFbCk7XG4gICAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoXCJjbG9uZVwiKTtcbiAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgc2hvd0Nsb25lKF9yZWYxNSkge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGNsb25lTm93U2hvd24sXG4gICAgICAgICAgcm9vdEVsLFxuICAgICAgICAgIGNhbmNlbFxuICAgICAgICB9ID0gX3JlZjE1O1xuICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGZhbHNlLCByb290RWwpO1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChjbG9uZSA9PiB7XG4gICAgICAgICAgY3NzKGNsb25lLCBcImRpc3BsYXlcIiwgXCJcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBjbG9uZU5vd1Nob3duKCk7XG4gICAgICAgIGNsb25lc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgIH0sXG5cbiAgICAgIGhpZGVDbG9uZShfcmVmMTYpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBzb3J0YWJsZSxcbiAgICAgICAgICBjbG9uZU5vd0hpZGRlbixcbiAgICAgICAgICBjYW5jZWxcbiAgICAgICAgfSA9IF9yZWYxNjtcbiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGNsb25lID0+IHtcbiAgICAgICAgICBjc3MoY2xvbmUsIFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG5cbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlICYmIGNsb25lLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNsb25lTm93SGlkZGVuKCk7XG4gICAgICAgIGNsb25lc0hpZGRlbiA9IHRydWU7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgfSxcblxuICAgICAgZHJhZ1N0YXJ0R2xvYmFsKF9yZWYxNykge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHNvcnRhYmxlXG4gICAgICAgIH0gPSBfcmVmMTc7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnICYmIG11bHRpRHJhZ1NvcnRhYmxlKSB7XG4gICAgICAgICAgbXVsdGlEcmFnU29ydGFibGUubXVsdGlEcmFnLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChtdWx0aURyYWdFbGVtZW50ID0+IHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgfSk7IC8vIFNvcnQgbXVsdGktZHJhZyBlbGVtZW50c1xuXG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzID0gbXVsdGlEcmFnRWxlbWVudHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBhLnNvcnRhYmxlSW5kZXggLSBiLnNvcnRhYmxlSW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICBkcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgICB9LFxuXG4gICAgICBkcmFnU3RhcnRlZChfcmVmMTgpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBzb3J0YWJsZVxuICAgICAgICB9ID0gX3JlZjE4O1xuICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgICAvLyBDYXB0dXJlIHJlY3RzLFxuICAgICAgICAgIC8vIGhpZGUgbXVsdGkgZHJhZyBlbGVtZW50cyAoYnkgcG9zaXRpb25pbmcgdGhlbSBhYnNvbHV0ZSksXG4gICAgICAgICAgLy8gc2V0IG11bHRpIGRyYWcgZWxlbWVudHMgcmVjdHMgdG8gZHJhZ1JlY3QsXG4gICAgICAgICAgLy8gc2hvdyBtdWx0aSBkcmFnIGVsZW1lbnRzLFxuICAgICAgICAgIC8vIGFuaW1hdGUgdG8gcmVjdHMsXG4gICAgICAgICAgLy8gdW5zZXQgcmVjdHMgJiByZW1vdmUgZnJvbSBET01cbiAgICAgICAgICBzb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKG11bHRpRHJhZ0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgICAgY3NzKG11bHRpRHJhZ0VsZW1lbnQsIFwicG9zaXRpb25cIiwgXCJhYnNvbHV0ZVwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGRyYWdSZWN0ID0gZ2V0UmVjdChkcmFnRWwkMSwgZmFsc2UsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChtdWx0aURyYWdFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICAgIHNldFJlY3QobXVsdGlEcmFnRWxlbWVudCwgZHJhZ1JlY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGluaXRpYWxGb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzb3J0YWJsZS5hbmltYXRlQWxsKCgpID0+IHtcbiAgICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgICAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKG11bHRpRHJhZ0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IC8vIFJlbW92ZSBhbGwgYXV4aWxpYXJ5IG11bHRpZHJhZyBpdGVtcyBmcm9tIGVsLCBpZiBzb3J0aW5nIGVuYWJsZWRcblxuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zb3J0KSB7XG4gICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICBkcmFnT3ZlcihfcmVmMTkpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgY29tcGxldGVkLFxuICAgICAgICAgIGNhbmNlbFxuICAgICAgICB9ID0gX3JlZjE5O1xuXG4gICAgICAgIGlmIChmb2xkaW5nICYmIH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKHRhcmdldCkpIHtcbiAgICAgICAgICBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICByZXZlcnQoX3JlZjIwKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLFxuICAgICAgICAgIHJvb3RFbCxcbiAgICAgICAgICBzb3J0YWJsZSxcbiAgICAgICAgICBkcmFnUmVjdFxuICAgICAgICB9ID0gX3JlZjIwO1xuXG4gICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gU2V0dXAgdW5mb2xkIGFuaW1hdGlvblxuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2gobXVsdGlEcmFnRWxlbWVudCA9PiB7XG4gICAgICAgICAgICBzb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgIHRhcmdldDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICAgICAgcmVjdDogZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LmZyb21SZWN0ID0gZHJhZ1JlY3Q7XG4gICAgICAgICAgICBmcm9tU29ydGFibGUucmVtb3ZlQW5pbWF0aW9uU3RhdGUobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICAgIGluc2VydE11bHRpRHJhZ0VsZW1lbnRzKCF0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUsIHJvb3RFbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRyYWdPdmVyQ29tcGxldGVkKF9yZWYyMSkge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgIGlzT3duZXIsXG4gICAgICAgICAgaW5zZXJ0aW9uLFxuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICAgIHBhcmVudEVsLFxuICAgICAgICAgIHB1dFNvcnRhYmxlXG4gICAgICAgIH0gPSBfcmVmMjE7XG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgICAvLyBDbG9uZXMgbXVzdCBiZSBoaWRkZW4gYmVmb3JlIGZvbGRpbmcgYW5pbWF0aW9uIHRvIGNhcHR1cmUgZHJhZ1JlY3RBYnNvbHV0ZSBwcm9wZXJseVxuICAgICAgICAgIGlmIChpc093bmVyKSB7XG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZTsgLy8gSWYgbGVhdmluZyBzb3J0OmZhbHNlIHJvb3QsIG9yIGFscmVhZHkgZm9sZGluZyAtIEZvbGQgdG8gbmV3IGxvY2F0aW9uXG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gJiYgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSAmJiAoZm9sZGluZyB8fCAhaXNPd25lciAmJiAhYWN0aXZlU29ydGFibGUub3B0aW9ucy5zb3J0ICYmICFwdXRTb3J0YWJsZSkpIHtcbiAgICAgICAgICAgIC8vIEZvbGQ6IFNldCBhbGwgbXVsdGkgZHJhZyBlbGVtZW50cydzIHJlY3RzIHRvIGRyYWdFbCdzIHJlY3Qgd2hlbiBtdWx0aS1kcmFnIGVsZW1lbnRzIGFyZSBpbnZpc2libGVcbiAgICAgICAgICAgIGxldCBkcmFnUmVjdEFic29sdXRlID0gZ2V0UmVjdChkcmFnRWwkMSwgZmFsc2UsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChtdWx0aURyYWdFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICAgIHNldFJlY3QobXVsdGlEcmFnRWxlbWVudCwgZHJhZ1JlY3RBYnNvbHV0ZSk7IC8vIE1vdmUgZWxlbWVudChzKSB0byBlbmQgb2YgcGFyZW50RWwgc28gdGhhdCBpdCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBtdWx0aS1kcmFnIGNsb25lcyBpbnNlcnRpb24gaWYgdGhleSBhcmUgaW5zZXJ0ZWRcbiAgICAgICAgICAgICAgLy8gd2hpbGUgZm9sZGluZywgYW5kIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgdGhlbSBhZ2FpbiBiZWNhdXNlIG9sZCBzb3J0YWJsZSB3aWxsIG5vIGxvbmdlciBiZSBmcm9tU29ydGFibGVcblxuICAgICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9sZGluZyA9IHRydWU7XG4gICAgICAgICAgfSAvLyBDbG9uZXMgbXVzdCBiZSBzaG93biAoYW5kIGNoZWNrIHRvIHJlbW92ZSBtdWx0aSBkcmFncykgYWZ0ZXIgZm9sZGluZyB3aGVuIGludGVyZmVyaW5nIG11bHRpRHJhZ0VsZW1lbnRzIGFyZSBtb3ZlZCBvdXRcblxuXG4gICAgICAgICAgaWYgKCFpc093bmVyKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHJlbW92ZSBpZiBub3QgZm9sZGluZyAoZm9sZGluZyB3aWxsIHJlbW92ZSB0aGVtIGFueXdheXMpXG4gICAgICAgICAgICBpZiAoIWZvbGRpbmcpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgbGV0IGNsb25lc0hpZGRlbkJlZm9yZSA9IGNsb25lc0hpZGRlbjtcblxuICAgICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKHNvcnRhYmxlKTsgLy8gVW5mb2xkIGFuaW1hdGlvbiBmb3IgY2xvbmVzIGlmIHNob3dpbmcgZnJvbSBoaWRkZW5cblxuXG4gICAgICAgICAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhY2xvbmVzSGlkZGVuICYmIGNsb25lc0hpZGRlbkJlZm9yZSkge1xuICAgICAgICAgICAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGNsb25lID0+IHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLmFkZEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBjbG9uZSxcbiAgICAgICAgICAgICAgICAgICAgcmVjdDogY2xvbmVzRnJvbVJlY3RcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgY2xvbmUuZnJvbVJlY3QgPSBjbG9uZXNGcm9tUmVjdDtcbiAgICAgICAgICAgICAgICAgIGNsb25lLnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9zaG93Q2xvbmUoc29ydGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZHJhZ092ZXJBbmltYXRpb25DYXB0dXJlKF9yZWYyMikge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGRyYWdSZWN0LFxuICAgICAgICAgIGlzT3duZXIsXG4gICAgICAgICAgYWN0aXZlU29ydGFibGVcbiAgICAgICAgfSA9IF9yZWYyMjtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChtdWx0aURyYWdFbGVtZW50ID0+IHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhaXNPd25lciAmJiBhY3RpdmVTb3J0YWJsZS5tdWx0aURyYWcuaXNNdWx0aURyYWcpIHtcbiAgICAgICAgICBjbG9uZXNGcm9tUmVjdCA9IE9iamVjdC5hc3NpZ24oe30sIGRyYWdSZWN0KTtcbiAgICAgICAgICBsZXQgZHJhZ01hdHJpeCA9IG1hdHJpeChkcmFnRWwkMSwgdHJ1ZSk7XG4gICAgICAgICAgY2xvbmVzRnJvbVJlY3QudG9wIC09IGRyYWdNYXRyaXguZjtcbiAgICAgICAgICBjbG9uZXNGcm9tUmVjdC5sZWZ0IC09IGRyYWdNYXRyaXguZTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKGZvbGRpbmcpIHtcbiAgICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZHJvcChfcmVmMjMpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnQsXG4gICAgICAgICAgcm9vdEVsLFxuICAgICAgICAgIHBhcmVudEVsLFxuICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgICBvbGRJbmRleCxcbiAgICAgICAgICBwdXRTb3J0YWJsZVxuICAgICAgICB9ID0gX3JlZjIzO1xuICAgICAgICBsZXQgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IHRoaXMuc29ydGFibGU7XG4gICAgICAgIGlmICghZXZ0KSByZXR1cm47XG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnRFbC5jaGlsZHJlbjsgLy8gTXVsdGktZHJhZyBzZWxlY3Rpb25cblxuICAgICAgICBpZiAoIWRyYWdTdGFydGVkKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMubXVsdGlEcmFnS2V5ICYmICF0aGlzLm11bHRpRHJhZ0tleURvd24pIHtcbiAgICAgICAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsJDEsIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSk7XG5cbiAgICAgICAgICBpZiAoIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSkge1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChkcmFnRWwkMSk7XG4gICAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgICAgIHJvb3RFbCxcbiAgICAgICAgICAgICAgbmFtZTogXCJzZWxlY3RcIixcbiAgICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgICB9KTsgLy8gTW9kaWZpZXIgYWN0aXZhdGVkLCBzZWxlY3QgZnJvbSBsYXN0IHRvIGRyYWdFbFxuXG4gICAgICAgICAgICBpZiAoZXZ0LnNoaWZ0S2V5ICYmIGxhc3RNdWx0aURyYWdTZWxlY3QgJiYgc29ydGFibGUuZWwuY29udGFpbnMobGFzdE11bHRpRHJhZ1NlbGVjdCkpIHtcbiAgICAgICAgICAgICAgbGV0IGxhc3RJbmRleCA9IGluZGV4KGxhc3RNdWx0aURyYWdTZWxlY3QpLFxuICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gaW5kZXgoZHJhZ0VsJDEpO1xuXG4gICAgICAgICAgICAgIGlmICh+bGFzdEluZGV4ICYmIH5jdXJyZW50SW5kZXggJiYgbGFzdEluZGV4ICE9PSBjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAvLyBNdXN0IGluY2x1ZGUgbGFzdE11bHRpRHJhZ1NlbGVjdCAoc2VsZWN0IGl0KSwgaW4gY2FzZSBtb2RpZmllZCBzZWxlY3Rpb24gZnJvbSBubyBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAvLyAoYnV0IHByZXZpb3VzIHNlbGVjdGlvbiBleGlzdGVkKVxuICAgICAgICAgICAgICAgIGxldCBuLCBpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgICAgaSA9IGxhc3RJbmRleDtcbiAgICAgICAgICAgICAgICAgIG4gPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGkgPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgICBuID0gbGFzdEluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgICAgICAgaWYgKH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGNoaWxkcmVuW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB0b2dnbGVDbGFzcyhjaGlsZHJlbltpXSwgb3B0aW9ucy5zZWxlY3RlZENsYXNzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICByb290RWwsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2VsZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVsOiBjaGlsZHJlbltpXSxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsYXN0TXVsdGlEcmFnU2VsZWN0ID0gZHJhZ0VsJDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpLCAxKTtcbiAgICAgICAgICAgIGxhc3RNdWx0aURyYWdTZWxlY3QgPSBudWxsO1xuICAgICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICByb290RWwsXG4gICAgICAgICAgICAgIG5hbWU6IFwiZGVzZWxlY3RcIixcbiAgICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gTXVsdGktZHJhZyBkcm9wXG5cblxuICAgICAgICBpZiAoZHJhZ1N0YXJ0ZWQgJiYgdGhpcy5pc011bHRpRHJhZykge1xuICAgICAgICAgIC8vIERvIG5vdCBcInVuZm9sZFwiIGFmdGVyIGFyb3VuZCBkcmFnRWwgaWYgcmV2ZXJ0ZWRcbiAgICAgICAgICBpZiAoKHBhcmVudEVsW2V4cGFuZG9dLm9wdGlvbnMuc29ydCB8fCBwYXJlbnRFbCAhPT0gcm9vdEVsKSAmJiBtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsZXQgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxKSxcbiAgICAgICAgICAgICAgICBtdWx0aURyYWdJbmRleCA9IGluZGV4KGRyYWdFbCQxLCBcIjpub3QoLlwiICsgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyBcIilcIik7XG4gICAgICAgICAgICBpZiAoIWluaXRpYWxGb2xkaW5nICYmIG9wdGlvbnMuYW5pbWF0aW9uKSBkcmFnRWwkMS50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgdG9Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgICAgICAgaWYgKCFpbml0aWFsRm9sZGluZykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICBkcmFnRWwkMS5mcm9tUmVjdCA9IGRyYWdSZWN0O1xuICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2gobXVsdGlEcmFnRWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ICE9PSBkcmFnRWwkMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IGZvbGRpbmcgPyBnZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpIDogZHJhZ1JlY3Q7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSByZWN0OyAvLyBQcmVwYXJlIHVuZm9sZCBhbmltYXRpb25cblxuICAgICAgICAgICAgICAgICAgICB0b1NvcnRhYmxlLmFkZEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgcmVjdDogcmVjdFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSAvLyBNdWx0aSBkcmFnIGVsZW1lbnRzIGFyZSBub3QgbmVjZXNzYXJpbHkgcmVtb3ZlZCBmcm9tIHRoZSBET00gb24gZHJvcCwgc28gdG8gcmVpbnNlcnRcbiAgICAgICAgICAgICAgLy8gcHJvcGVybHkgdGhleSBtdXN0IGFsbCBiZSByZW1vdmVkXG5cblxuICAgICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKG11bHRpRHJhZ0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblttdWx0aURyYWdJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgIHBhcmVudEVsLmluc2VydEJlZm9yZShtdWx0aURyYWdFbGVtZW50LCBjaGlsZHJlblttdWx0aURyYWdJbmRleF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtdWx0aURyYWdJbmRleCsrO1xuICAgICAgICAgICAgICB9KTsgLy8gSWYgaW5pdGlhbCBmb2xkaW5nIGlzIGRvbmUsIHRoZSBlbGVtZW50cyBtYXkgaGF2ZSBjaGFuZ2VkIHBvc2l0aW9uIGJlY2F1c2UgdGhleSBhcmUgbm93XG4gICAgICAgICAgICAgIC8vIHVuZm9sZGluZyBhcm91bmQgZHJhZ0VsLCBldmVuIHRob3VnaCBkcmFnRWwgbWF5IG5vdCBoYXZlIGhpcyBpbmRleCBjaGFuZ2VkLCBzbyB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gbXVzdCBiZSBmaXJlZCBoZXJlIGFzIFNvcnRhYmxlIHdpbGwgbm90LlxuXG4gICAgICAgICAgICAgIGlmIChvbGRJbmRleCA9PT0gaW5kZXgoZHJhZ0VsJDEpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2gobXVsdGlEcmFnRWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ICE9PSBpbmRleChtdWx0aURyYWdFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoXCJ1cGRhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIE11c3QgYmUgZG9uZSBhZnRlciBjYXB0dXJpbmcgaW5kaXZpZHVhbCByZWN0cyAoc2Nyb2xsIGJhcilcblxuXG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKG11bHRpRHJhZ0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRvU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgICAgfSAvLyBSZW1vdmUgY2xvbmVzIGlmIG5lY2Vzc2FyeVxuXG5cbiAgICAgICAgaWYgKHJvb3RFbCA9PT0gcGFyZW50RWwgfHwgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09IFwiY2xvbmVcIikge1xuICAgICAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGNsb25lID0+IHtcbiAgICAgICAgICAgIGNsb25lLnBhcmVudE5vZGUgJiYgY2xvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIG51bGxpbmdHbG9iYWwoKSB7XG4gICAgICAgIHRoaXMuaXNNdWx0aURyYWcgPSBkcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMubGVuZ3RoID0gMDtcbiAgICAgIH0sXG5cbiAgICAgIGRlc3Ryb3lHbG9iYWwoKSB7XG4gICAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG5cbiAgICAgICAgb2ZmKGRvY3VtZW50LCBcInBvaW50ZXJ1cFwiLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICAgIG9mZihkb2N1bWVudCwgXCJtb3VzZXVwXCIsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCBcInRvdWNoZW5kXCIsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCBcImtleWRvd25cIiwgdGhpcy5fY2hlY2tLZXlEb3duKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCBcImtleXVwXCIsIHRoaXMuX2NoZWNrS2V5VXApO1xuICAgICAgfSxcblxuICAgICAgX2Rlc2VsZWN0TXVsdGlEcmFnKGV2dCkge1xuICAgICAgICBpZiAodHlwZW9mIGRyYWdTdGFydGVkICE9PSBcInVuZGVmaW5lZFwiICYmIGRyYWdTdGFydGVkKSByZXR1cm47IC8vIE9ubHkgZGVzZWxlY3QgaWYgc2VsZWN0aW9uIGlzIGluIHRoaXMgc29ydGFibGVcblxuICAgICAgICBpZiAobXVsdGlEcmFnU29ydGFibGUgIT09IHRoaXMuc29ydGFibGUpIHJldHVybjsgLy8gT25seSBkZXNlbGVjdCBpZiB0YXJnZXQgaXMgbm90IGl0ZW0gaW4gdGhpcyBzb3J0YWJsZVxuXG4gICAgICAgIGlmIChldnQgJiYgY2xvc2VzdChldnQudGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLnNvcnRhYmxlLmVsLCBmYWxzZSkpIHJldHVybjsgLy8gT25seSBkZXNlbGVjdCBpZiBsZWZ0IGNsaWNrXG5cbiAgICAgICAgaWYgKGV2dCAmJiBldnQuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICAgICAgd2hpbGUgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGxldCBlbCA9IG11bHRpRHJhZ0VsZW1lbnRzWzBdO1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogdGhpcy5zb3J0YWJsZSxcbiAgICAgICAgICAgIHJvb3RFbDogdGhpcy5zb3J0YWJsZS5lbCxcbiAgICAgICAgICAgIG5hbWU6IFwiZGVzZWxlY3RcIixcbiAgICAgICAgICAgIHRhcmdldEVsOiBlbCxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZ0OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgX2NoZWNrS2V5RG93bihldnQpIHtcbiAgICAgICAgaWYgKGV2dC5rZXkgPT09IHRoaXMub3B0aW9ucy5tdWx0aURyYWdLZXkpIHtcbiAgICAgICAgICB0aGlzLm11bHRpRHJhZ0tleURvd24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBfY2hlY2tLZXlVcChldnQpIHtcbiAgICAgICAgaWYgKGV2dC5rZXkgPT09IHRoaXMub3B0aW9ucy5tdWx0aURyYWdLZXkpIHtcbiAgICAgICAgICB0aGlzLm11bHRpRHJhZ0tleURvd24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihNdWx0aURyYWcsIHtcbiAgICAgIC8vIFN0YXRpYyBtZXRob2RzICYgcHJvcGVydGllc1xuICAgICAgcGx1Z2luTmFtZTogXCJtdWx0aURyYWdcIixcbiAgICAgIHV0aWxzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZWxlY3RzIHRoZSBwcm92aWRlZCBtdWx0aS1kcmFnIGl0ZW1cbiAgICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIHNlbGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICBzZWxlY3QoZWwpIHtcbiAgICAgICAgICBsZXQgc29ydGFibGUgPSBlbC5wYXJlbnROb2RlW2V4cGFuZG9dO1xuICAgICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGVsKSkgcmV0dXJuO1xuXG4gICAgICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICYmIG11bHRpRHJhZ1NvcnRhYmxlICE9PSBzb3J0YWJsZSkge1xuICAgICAgICAgICAgbXVsdGlEcmFnU29ydGFibGUubXVsdGlEcmFnLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuXG4gICAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIHRydWUpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXNlbGVjdHMgdGhlIHByb3ZpZGVkIG11bHRpLWRyYWcgaXRlbVxuICAgICAgICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgVGhlIGVsZW1lbnQgdG8gYmUgZGVzZWxlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgZGVzZWxlY3QoZWwpIHtcbiAgICAgICAgICBsZXQgc29ydGFibGUgPSBlbC5wYXJlbnROb2RlW2V4cGFuZG9dLFxuICAgICAgICAgICAgICBpbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZWwpO1xuICAgICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8ICF+aW5kZXgpIHJldHVybjtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhlbCwgc29ydGFibGUub3B0aW9ucy5zZWxlY3RlZENsYXNzLCBmYWxzZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICB9LFxuXG4gICAgICBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICAgIGNvbnN0IG9sZEluZGljaWVzID0gW10sXG4gICAgICAgICAgICAgIG5ld0luZGljaWVzID0gW107XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2gobXVsdGlEcmFnRWxlbWVudCA9PiB7XG4gICAgICAgICAgb2xkSW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgICAgaW5kZXg6IG11bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleFxuICAgICAgICAgIH0pOyAvLyBtdWx0aURyYWdFbGVtZW50cyB3aWxsIGFscmVhZHkgYmUgc29ydGVkIGlmIGZvbGRpbmdcblxuICAgICAgICAgIGxldCBuZXdJbmRleDtcblxuICAgICAgICAgIGlmIChmb2xkaW5nICYmIG11bHRpRHJhZ0VsZW1lbnQgIT09IGRyYWdFbCQxKSB7XG4gICAgICAgICAgICBuZXdJbmRleCA9IC0xO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZm9sZGluZykge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50LCBcIjpub3QoLlwiICsgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyBcIilcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3SW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgICAgaW5kZXg6IG5ld0luZGV4XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiBbLi4ubXVsdGlEcmFnRWxlbWVudHNdLFxuICAgICAgICAgIGNsb25lczogWy4uLm11bHRpRHJhZ0Nsb25lc10sXG4gICAgICAgICAgb2xkSW5kaWNpZXMsXG4gICAgICAgICAgbmV3SW5kaWNpZXNcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIG9wdGlvbkxpc3RlbmVyczoge1xuICAgICAgICBtdWx0aURyYWdLZXkoa2V5KSB7XG4gICAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICBpZiAoa2V5ID09PSBcImN0cmxcIikge1xuICAgICAgICAgICAga2V5ID0gXCJDb250cm9sXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAga2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cigxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydE11bHRpRHJhZ0VsZW1lbnRzKGNsb25lc0luc2VydGVkLCByb290RWwpIHtcbiAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKChtdWx0aURyYWdFbGVtZW50LCBpKSA9PiB7XG4gICAgICBsZXQgdGFyZ2V0ID0gcm9vdEVsLmNoaWxkcmVuW211bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleCArIChjbG9uZXNJbnNlcnRlZCA/IE51bWJlcihpKSA6IDApXTtcblxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIHRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEluc2VydCBtdWx0aS1kcmFnIGNsb25lc1xuICAgKiBAcGFyYW0gIHtbQm9vbGVhbl19IGVsZW1lbnRzSW5zZXJ0ZWQgIFdoZXRoZXIgdGhlIG11bHRpLWRyYWcgZWxlbWVudHMgYXJlIGluc2VydGVkXG4gICAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290RWxcbiAgICovXG5cblxuICBmdW5jdGlvbiBpbnNlcnRNdWx0aURyYWdDbG9uZXMoZWxlbWVudHNJbnNlcnRlZCwgcm9vdEVsKSB7XG4gICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goKGNsb25lLCBpKSA9PiB7XG4gICAgICBsZXQgdGFyZ2V0ID0gcm9vdEVsLmNoaWxkcmVuW2Nsb25lLnNvcnRhYmxlSW5kZXggKyAoZWxlbWVudHNJbnNlcnRlZCA/IE51bWJlcihpKSA6IDApXTtcblxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lLCB0YXJnZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCkge1xuICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2gobXVsdGlEcmFnRWxlbWVudCA9PiB7XG4gICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnQucGFyZW50Tm9kZSAmJiBtdWx0aURyYWdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBTb3J0YWJsZS5tb3VudChuZXcgQXV0b1Njcm9sbFBsdWdpbigpKTtcbiAgU29ydGFibGUubW91bnQoUmVtb3ZlLCBSZXZlcnQpO1xuICBTb3J0YWJsZS5tb3VudChuZXcgU3dhcFBsdWdpbigpKTtcbiAgU29ydGFibGUubW91bnQobmV3IE11bHRpRHJhZ1BsdWdpbigpKTtcbiAgcmV0dXJuIFNvcnRhYmxlO1xufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4617\n')},3654:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"DeviceManagerProvider\": () => (/* reexport */ useDeviceManager/* DeviceManagerProvider */.jd),\n \"ImageUploader\": () => (/* reexport */ ct_image_uploader[\"default\"]),\n \"OptionsPanel\": () => (/* reexport */ OptionsPanel/* default */.Z),\n \"OutsideClickHandler\": () => (/* reexport */ react_outside_click_handler[\"default\"]),\n \"Overlay\": () => (/* reexport */ Overlay/* default */.Z),\n \"Panel\": () => (/* reexport */ ct_panel[\"default\"]),\n \"PanelLevel\": () => (/* reexport */ PanelLevel/* default */.Z),\n \"PanelMetaWrapper\": () => (/* reexport */ ct_panel.PanelMetaWrapper),\n \"Select\": () => (/* reexport */ ct_select[\"default\"]),\n \"Switch\": () => (/* reexport */ ct_switch[\"default\"]),\n \"Transition\": () => (/* reexport */ renderprops/* Transition */.uT),\n \"animated\": () => (/* reexport */ renderprops/* animated */.q),\n \"bezierEasing\": () => (/* reexport */ (src_default())),\n \"getValueFromInput\": () => (/* reexport */ get_value_from_input/* getValueFromInput */.n6),\n \"onDocumentLoaded\": () => (/* binding */ onDocumentLoaded),\n \"usePopoverMaker\": () => (/* reexport */ usePopoverMaker/* default */.Z)\n});\n\n// EXTERNAL MODULE: ./static/js/public-path.js\nvar public_path = __webpack_require__(8683);\n// EXTERNAL MODULE: external \"jQuery\"\nvar external_jQuery_ = __webpack_require__(5311);\nvar external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_);\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./static/js/options/OptionsPanel.js + 7 modules\nvar OptionsPanel = __webpack_require__(7429);\n// EXTERNAL MODULE: external \"ctEvents\"\nvar external_ctEvents_ = __webpack_require__(2243);\nvar external_ctEvents_default = /*#__PURE__*/__webpack_require__.n(external_ctEvents_);\n;// CONCATENATED MODULE: ./static/js/options/OptionsRoot.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\nconst INITIAL_VALUE = '__INITIAL__';\n\nconst OptionsRoot = _ref => {\n let {\n value,\n options,\n input_name,\n input_id,\n hasRevertButton\n } = _ref;\n const [internalValue, setInternalValue] = (0,external_window_wp_element_.useState)(value);\n const input = (0,external_window_wp_element_.useRef)();\n const handleChange = (0,external_window_wp_element_.useCallback)(_ref2 => {\n let {\n id,\n value,\n input: inputRef\n } = _ref2;\n\n if (inputRef === input.current) {\n setInternalValue(internalValue => _objectSpread(_objectSpread({}, internalValue), {}, {\n [id]: value\n }));\n }\n }, []);\n (0,external_window_wp_element_.useEffect)(() => {\n external_ctEvents_default().on('ct:options:trigger-change', handleChange);\n return () => {\n external_ctEvents_default().off('ct:options:trigger-change', handleChange);\n };\n }, []);\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-options-root\"\n }, (0,external_window_wp_element_.createElement)(\"input\", {\n value: JSON.stringify(Array.isArray(internalValue) ? {} : internalValue),\n onChange: () => {},\n name: input_name,\n id: input_id,\n type: \"hidden\",\n ref: input\n }), (0,external_window_wp_element_.createElement)(OptionsPanel/* default */.Z, {\n hasRevertButton: hasRevertButton,\n onChange: (key, newValue) => {\n setInternalValue(internalValue => _objectSpread(_objectSpread({}, internalValue), {}, {\n [key]: newValue\n }));\n external_jQuery_default()(input.current).change();\n },\n value: internalValue,\n options: options\n }));\n};\n\n/* harmony default export */ const options_OptionsRoot = (OptionsRoot);\n// EXTERNAL MODULE: ./static/js/options/helpers/get-value-from-input.js\nvar get_value_from_input = __webpack_require__(7069);\n;// CONCATENATED MODULE: ./static/js/options/initPanels.js\n\n\n\n\nconst initAllPanels = () => [...document.querySelectorAll('.ct-options-panel')].map(singleTarget => {\n if (singleTarget.closest('[id=\"available-widgets\"]')) {\n return;\n }\n\n if (singleTarget.ctHasOptions) return;\n singleTarget.ctHasOptions = true;\n external_jQuery_default()(singleTarget).on('remove', () => setTimeout(() => initAllPanels()));\n external_jQuery_default()(singleTarget).on('remove', () => () => initAllPanels());\n (0,external_window_wp_element_.render)((0,external_window_wp_element_.createElement)(options_OptionsRoot, {\n options: JSON.parse(singleTarget.firstElementChild.dataset.ctOptions),\n value: (0,get_value_from_input/* getValueFromInput */.n6)(JSON.parse(singleTarget.firstElementChild.dataset.ctOptions), JSON.parse(singleTarget.firstElementChild.value), null, false),\n input_id: singleTarget.firstElementChild.id,\n input_name: singleTarget.firstElementChild.name,\n hasRevertButton: Object.keys(singleTarget.dataset).indexOf('disableReverseButton') === -1\n }), singleTarget);\n});\n;// CONCATENATED MODULE: ./static/js/backend/widgets.js\n\nconst initWidget = widget => {\n if (widget.querySelector('.ct-options-panel') && widget.querySelector('.ct-options-panel').innerHTML.indexOf('__i__') > -1) {\n const panel = widget.querySelector('.ct-options-panel');\n const widgetNumber = widget.querySelector('input.multi_number').value;\n panel.innerHTML = panel.innerHTML.replace(/__i__|%i%/g, widgetNumber);\n }\n\n initAllPanels();\n};\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n;// CONCATENATED MODULE: ./static/js/backend/woo-variation.js\n\n\n\n\n\nconst initWooVariation = variationWrapper => {\n const uploadImage = variationWrapper.querySelector('.upload_image');\n\n if (!uploadImage) {\n return;\n }\n\n const div = document.createElement('p');\n div.classList.add('form-row');\n div.classList.add('form-row-full');\n div.classList.add('ct-variation-image-gallery');\n uploadImage.nextElementSibling.insertAdjacentElement('afterend', div);\n const input = variationWrapper.querySelector('[name*=\"blocksy_post_meta_options\"]');\n\n if (!input) {\n return;\n }\n\n const options = {\n gallery_source: {\n label: (0,external_window_wp_i18n_.__)('Variation Gallery Source', 'blocksy'),\n type: 'ct-radio',\n value: 'default',\n design: 'inline',\n divider: 'bottom',\n choices: {\n default: (0,external_window_wp_i18n_.__)('Default', 'blocksy'),\n custom: (0,external_window_wp_i18n_.__)('Custom', 'blocksy')\n }\n },\n condition: {\n type: 'ct-condition',\n condition: {\n gallery_source: 'custom'\n },\n options: {\n images: {\n label: (0,external_window_wp_i18n_.__)('Variation Image Gallery', 'blocksy'),\n type: 'ct-multi-image-uploader',\n design: _ref => {\n let {\n value\n } = _ref;\n return value.length === 0 ? 'inline' : 'block';\n },\n value: []\n }\n }\n }\n };\n (0,external_window_wp_element_.render)((0,external_window_wp_element_.createElement)(options_OptionsRoot, {\n options: options,\n value: (0,get_value_from_input/* getValueFromInput */.n6)(options, JSON.parse(input.value), null, false),\n input_id: input.id,\n input_name: input.name,\n hasRevertButton: false\n }), div);\n};\nconst initAllWooVariations = () => {\n ;\n [...document.querySelectorAll('.woocommerce_variations .woocommerce_variation')].map(variationWrapper => {\n if (variationWrapper.hasBlocksyOptions) {\n return;\n }\n\n variationWrapper.hasBlocksyOptions = true;\n initWooVariation(variationWrapper);\n });\n};\n// EXTERNAL MODULE: ./node_modules/deep-equal/index.js\nvar deep_equal = __webpack_require__(251);\nvar deep_equal_default = /*#__PURE__*/__webpack_require__.n(deep_equal);\n;// CONCATENATED MODULE: ./static/js/backend/taxonomies.js\nfunction taxonomies_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction taxonomies_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? taxonomies_ownKeys(Object(source), !0).forEach(function (key) { taxonomies_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : taxonomies_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction taxonomies_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\nconst TaxonomyRoot = _ref => {\n let {\n options,\n input_name,\n value\n } = _ref;\n const [internalValue, setInternalValue] = (0,external_window_wp_element_.useState)(value);\n const input = (0,external_window_wp_element_.useRef)();\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(\"input\", {\n value: JSON.stringify(Array.isArray(internalValue) ? {} : internalValue),\n onChange: () => {},\n name: input_name,\n type: \"hidden\",\n ref: input\n }), (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(OptionsPanel/* default */.Z, {\n value: internalValue,\n options: {\n accent_color: options.accent_color\n },\n onChange: (key, newValue) => {\n setInternalValue(internalValue => taxonomies_objectSpread(taxonomies_objectSpread({}, internalValue), {}, {\n [key]: newValue\n }));\n external_jQuery_default()(input.current).change();\n }\n }), document.querySelector('.term-blocksy-accent-color-wrap td')), (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(\"button\", {\n type: \"button\",\n disabled: deep_equal_default()(options.accent_color.value, internalValue.accent_color),\n className: \"ct-revert\",\n onClick: () => {\n setInternalValue(internalValue => taxonomies_objectSpread(taxonomies_objectSpread({}, internalValue), {}, {\n accent_color: options.accent_color.value\n }));\n external_jQuery_default()(input.current).change();\n }\n }), document.querySelector('.term-blocksy-accent-color-wrap th label')), (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(OptionsPanel/* default */.Z, {\n value: internalValue,\n options: {\n image: options.image\n },\n onChange: (key, newValue) => {\n setInternalValue(internalValue => taxonomies_objectSpread(taxonomies_objectSpread({}, internalValue), {}, {\n [key]: newValue\n }));\n external_jQuery_default()(input.current).change();\n }\n }), document.querySelector('.term-blocksy-image-wrap td')));\n};\n\nconst initTaxonomies = () => {\n const maybeTaxonomyField = document.querySelector('[name*=\"blocksy_taxonomy_meta_options\"]');\n\n if (!maybeTaxonomyField) {\n return;\n }\n\n let options = {\n image: {\n label: (0,external_window_wp_i18n_.__)('Transparent State Logo', 'blocksy'),\n type: 'ct-image-uploader',\n value: '',\n attr: {\n 'data-type': 'large'\n },\n design: 'none',\n emptyLabel: (0,external_window_wp_i18n_.__)('Select Image', 'blocksy')\n },\n accent_color: {\n label: (0,external_window_wp_i18n_.__)('Site Title Color', 'blocksy'),\n type: 'ct-color-picker',\n design: 'none',\n value: {\n default: {\n color: 'CT_CSS_SKIP_RULE'\n },\n hover: {\n color: 'CT_CSS_SKIP_RULE'\n },\n background_initial: {\n color: 'CT_CSS_SKIP_RULE'\n },\n background_hover: {\n color: 'CT_CSS_SKIP_RULE'\n }\n },\n pickers: [{\n title: (0,external_window_wp_i18n_.__)('Text Initial', 'blocksy'),\n id: 'default'\n }, {\n title: (0,external_window_wp_i18n_.__)('Text Hover', 'blocksy'),\n id: 'hover'\n }, {\n title: (0,external_window_wp_i18n_.__)('Background Initial', 'blocksy'),\n id: 'background_initial'\n }, {\n title: (0,external_window_wp_i18n_.__)('Background Hover', 'blocksy'),\n id: 'background_hover'\n }]\n }\n };\n (0,external_window_wp_element_.render)((0,external_window_wp_element_.createElement)(TaxonomyRoot, {\n input_name: maybeTaxonomyField.name,\n options: options,\n value: (0,get_value_from_input/* getValueFromInput */.n6)(options, JSON.parse(maybeTaxonomyField.value), null, false)\n }), maybeTaxonomyField.parentNode);\n};\n// EXTERNAL MODULE: ./static/js/customizer/components/Overlay.js + 4 modules\nvar Overlay = __webpack_require__(7136);\n// EXTERNAL MODULE: ./static/js/options/options/ct-panel.js\nvar ct_panel = __webpack_require__(3731);\n// EXTERNAL MODULE: ./static/js/customizer/components/useDeviceManager.js\nvar useDeviceManager = __webpack_require__(5458);\n// EXTERNAL MODULE: ./static/js/options/components/PanelLevel.js + 1 modules\nvar PanelLevel = __webpack_require__(956);\n// EXTERNAL MODULE: ./static/js/options/options/ct-switch.js\nvar ct_switch = __webpack_require__(9497);\n// EXTERNAL MODULE: ./static/js/options/options/ct-image-uploader.js\nvar ct_image_uploader = __webpack_require__(3048);\n// EXTERNAL MODULE: ./static/js/options/options/ct-select.js + 3 modules\nvar ct_select = __webpack_require__(1404);\n// EXTERNAL MODULE: ./static/js/options/options/react-outside-click-handler.js\nvar react_outside_click_handler = __webpack_require__(8204);\n// EXTERNAL MODULE: ./node_modules/react-spring/renderprops.js\nvar renderprops = __webpack_require__(4823);\n// EXTERNAL MODULE: ./node_modules/bezier-easing/src/index.js\nvar src = __webpack_require__(3431);\nvar src_default = /*#__PURE__*/__webpack_require__.n(src);\n// EXTERNAL MODULE: ./static/js/options/helpers/usePopoverMaker.js\nvar usePopoverMaker = __webpack_require__(9144);\n;// CONCATENATED MODULE: ./static/js/options.js\n\n\n\n\n\n\n\nif ((external_jQuery_default()) && (external_jQuery_default()).fn) {\n external_jQuery_default()(document).on('widget-added', (event, widget) => {\n initWidget(widget[0]);\n });\n initAllWooVariations();\n setTimeout(() => {\n external_jQuery_default()(document.body).on('woocommerce_variations_added woocommerce_variations_loaded', function () {\n initAllWooVariations();\n });\n }, 1000);\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n initAllPanels();\n initTaxonomies();\n [...document.querySelectorAll('.notice-blocksy-plugin'), ...document.querySelectorAll('[data-dismiss]')].map(el => __webpack_require__.e(/* import() */ 149).then(__webpack_require__.bind(__webpack_require__, 2149)).then(_ref => {\n let {\n mount\n } = _ref;\n return mount(el);\n }));\n\n if ((external_jQuery_default())) {\n external_jQuery_default()(document).on('click', '[href*=\"technical_support\"][href*=\"ct-dashboard\"]', e => {\n e.preventDefault();\n location.href = 'https://creativethemes.com/blocksy/support';\n });\n }\n});\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst onDocumentLoaded = cb => {\n if (/comp|inter|loaded/.test(document.readyState)) {\n cb();\n } else {\n document.addEventListener('DOMContentLoaded', cb, false);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY1NC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9PcHRpb25zUm9vdC5qcz8xNDBlIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvaW5pdFBhbmVscy5qcz83MjdmIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL2JhY2tlbmQvd2lkZ2V0cy5qcz9lNTYwIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL2JhY2tlbmQvd29vLXZhcmlhdGlvbi5qcz9hY2RiIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL2JhY2tlbmQvdGF4b25vbWllcy5qcz80NmNhIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMuanM/ZDIyNSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIGNyZWF0ZVJlZiwgdXNlUmVmLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgT3B0aW9uc1BhbmVsIGZyb20gJy4vT3B0aW9uc1BhbmVsLmpzJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgY3RFdmVudHMgZnJvbSAnY3QtZXZlbnRzJztcbmNvbnN0IElOSVRJQUxfVkFMVUUgPSAnX19JTklUSUFMX18nO1xuXG5jb25zdCBPcHRpb25zUm9vdCA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHZhbHVlLFxuICAgIG9wdGlvbnMsXG4gICAgaW5wdXRfbmFtZSxcbiAgICBpbnB1dF9pZCxcbiAgICBoYXNSZXZlcnRCdXR0b25cbiAgfSA9IF9yZWY7XG4gIGNvbnN0IFtpbnRlcm5hbFZhbHVlLCBzZXRJbnRlcm5hbFZhbHVlXSA9IHVzZVN0YXRlKHZhbHVlKTtcbiAgY29uc3QgaW5wdXQgPSB1c2VSZWYoKTtcbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZCxcbiAgICAgIHZhbHVlLFxuICAgICAgaW5wdXQ6IGlucHV0UmVmXG4gICAgfSA9IF9yZWYyO1xuXG4gICAgaWYgKGlucHV0UmVmID09PSBpbnB1dC5jdXJyZW50KSB7XG4gICAgICBzZXRJbnRlcm5hbFZhbHVlKGludGVybmFsVmFsdWUgPT4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbnRlcm5hbFZhbHVlKSwge30sIHtcbiAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjdEV2ZW50cy5vbignY3Q6b3B0aW9uczp0cmlnZ2VyLWNoYW5nZScsIGhhbmRsZUNoYW5nZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGN0RXZlbnRzLm9mZignY3Q6b3B0aW9uczp0cmlnZ2VyLWNoYW5nZScsIGhhbmRsZUNoYW5nZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LW9wdGlvbnMtcm9vdFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG4gICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KEFycmF5LmlzQXJyYXkoaW50ZXJuYWxWYWx1ZSkgPyB7fSA6IGludGVybmFsVmFsdWUpLFxuICAgIG9uQ2hhbmdlOiAoKSA9PiB7fSxcbiAgICBuYW1lOiBpbnB1dF9uYW1lLFxuICAgIGlkOiBpbnB1dF9pZCxcbiAgICB0eXBlOiBcImhpZGRlblwiLFxuICAgIHJlZjogaW5wdXRcbiAgfSksIGNyZWF0ZUVsZW1lbnQoT3B0aW9uc1BhbmVsLCB7XG4gICAgaGFzUmV2ZXJ0QnV0dG9uOiBoYXNSZXZlcnRCdXR0b24sXG4gICAgb25DaGFuZ2U6IChrZXksIG5ld1ZhbHVlKSA9PiB7XG4gICAgICBzZXRJbnRlcm5hbFZhbHVlKGludGVybmFsVmFsdWUgPT4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbnRlcm5hbFZhbHVlKSwge30sIHtcbiAgICAgICAgW2tleV06IG5ld1ZhbHVlXG4gICAgICB9KSk7XG4gICAgICAkKGlucHV0LmN1cnJlbnQpLmNoYW5nZSgpO1xuICAgIH0sXG4gICAgdmFsdWU6IGludGVybmFsVmFsdWUsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBPcHRpb25zUm9vdDsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCByZW5kZXIgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IE9wdGlvbnNSb290IGZyb20gJy4vT3B0aW9uc1Jvb3QuanMnO1xuaW1wb3J0IHsgZ2V0VmFsdWVGcm9tSW5wdXQgfSBmcm9tICcuL2hlbHBlcnMvZ2V0LXZhbHVlLWZyb20taW5wdXQnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmV4cG9ydCBjb25zdCBpbml0QWxsUGFuZWxzID0gKCkgPT4gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jdC1vcHRpb25zLXBhbmVsJyldLm1hcChzaW5nbGVUYXJnZXQgPT4ge1xuICBpZiAoc2luZ2xlVGFyZ2V0LmNsb3Nlc3QoJ1tpZD1cImF2YWlsYWJsZS13aWRnZXRzXCJdJykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2luZ2xlVGFyZ2V0LmN0SGFzT3B0aW9ucykgcmV0dXJuO1xuICBzaW5nbGVUYXJnZXQuY3RIYXNPcHRpb25zID0gdHJ1ZTtcbiAgJChzaW5nbGVUYXJnZXQpLm9uKCdyZW1vdmUnLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IGluaXRBbGxQYW5lbHMoKSkpO1xuICAkKHNpbmdsZVRhcmdldCkub24oJ3JlbW92ZScsICgpID0+ICgpID0+IGluaXRBbGxQYW5lbHMoKSk7XG4gIHJlbmRlcihjcmVhdGVFbGVtZW50KE9wdGlvbnNSb290LCB7XG4gICAgb3B0aW9uczogSlNPTi5wYXJzZShzaW5nbGVUYXJnZXQuZmlyc3RFbGVtZW50Q2hpbGQuZGF0YXNldC5jdE9wdGlvbnMpLFxuICAgIHZhbHVlOiBnZXRWYWx1ZUZyb21JbnB1dChKU09OLnBhcnNlKHNpbmdsZVRhcmdldC5maXJzdEVsZW1lbnRDaGlsZC5kYXRhc2V0LmN0T3B0aW9ucyksIEpTT04ucGFyc2Uoc2luZ2xlVGFyZ2V0LmZpcnN0RWxlbWVudENoaWxkLnZhbHVlKSwgbnVsbCwgZmFsc2UpLFxuICAgIGlucHV0X2lkOiBzaW5nbGVUYXJnZXQuZmlyc3RFbGVtZW50Q2hpbGQuaWQsXG4gICAgaW5wdXRfbmFtZTogc2luZ2xlVGFyZ2V0LmZpcnN0RWxlbWVudENoaWxkLm5hbWUsXG4gICAgaGFzUmV2ZXJ0QnV0dG9uOiBPYmplY3Qua2V5cyhzaW5nbGVUYXJnZXQuZGF0YXNldCkuaW5kZXhPZignZGlzYWJsZVJldmVyc2VCdXR0b24nKSA9PT0gLTFcbiAgfSksIHNpbmdsZVRhcmdldCk7XG59KTsiLCJpbXBvcnQgeyBpbml0QWxsUGFuZWxzIH0gZnJvbSAnLi4vb3B0aW9ucy9pbml0UGFuZWxzJztcbmV4cG9ydCBjb25zdCBpbml0V2lkZ2V0ID0gd2lkZ2V0ID0+IHtcbiAgaWYgKHdpZGdldC5xdWVyeVNlbGVjdG9yKCcuY3Qtb3B0aW9ucy1wYW5lbCcpICYmIHdpZGdldC5xdWVyeVNlbGVjdG9yKCcuY3Qtb3B0aW9ucy1wYW5lbCcpLmlubmVySFRNTC5pbmRleE9mKCdfX2lfXycpID4gLTEpIHtcbiAgICBjb25zdCBwYW5lbCA9IHdpZGdldC5xdWVyeVNlbGVjdG9yKCcuY3Qtb3B0aW9ucy1wYW5lbCcpO1xuICAgIGNvbnN0IHdpZGdldE51bWJlciA9IHdpZGdldC5xdWVyeVNlbGVjdG9yKCdpbnB1dC5tdWx0aV9udW1iZXInKS52YWx1ZTtcbiAgICBwYW5lbC5pbm5lckhUTUwgPSBwYW5lbC5pbm5lckhUTUwucmVwbGFjZSgvX19pX198JWklL2csIHdpZGdldE51bWJlcik7XG4gIH1cblxuICBpbml0QWxsUGFuZWxzKCk7XG59OyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHJlbmRlciB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgT3B0aW9uc1Jvb3QgZnJvbSAnLi4vb3B0aW9ucy9PcHRpb25zUm9vdCc7XG5pbXBvcnQgeyBnZXRWYWx1ZUZyb21JbnB1dCB9IGZyb20gJy4uL29wdGlvbnMvaGVscGVycy9nZXQtdmFsdWUtZnJvbS1pbnB1dCc7XG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmV4cG9ydCBjb25zdCBpbml0V29vVmFyaWF0aW9uID0gdmFyaWF0aW9uV3JhcHBlciA9PiB7XG4gIGNvbnN0IHVwbG9hZEltYWdlID0gdmFyaWF0aW9uV3JhcHBlci5xdWVyeVNlbGVjdG9yKCcudXBsb2FkX2ltYWdlJyk7XG5cbiAgaWYgKCF1cGxvYWRJbWFnZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcbiAgZGl2LmNsYXNzTGlzdC5hZGQoJ2Zvcm0tcm93Jyk7XG4gIGRpdi5jbGFzc0xpc3QuYWRkKCdmb3JtLXJvdy1mdWxsJyk7XG4gIGRpdi5jbGFzc0xpc3QuYWRkKCdjdC12YXJpYXRpb24taW1hZ2UtZ2FsbGVyeScpO1xuICB1cGxvYWRJbWFnZS5uZXh0RWxlbWVudFNpYmxpbmcuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGRpdik7XG4gIGNvbnN0IGlucHV0ID0gdmFyaWF0aW9uV3JhcHBlci5xdWVyeVNlbGVjdG9yKCdbbmFtZSo9XCJibG9ja3N5X3Bvc3RfbWV0YV9vcHRpb25zXCJdJyk7XG5cbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgZ2FsbGVyeV9zb3VyY2U6IHtcbiAgICAgIGxhYmVsOiBfXygnVmFyaWF0aW9uIEdhbGxlcnkgU291cmNlJywgJ2Jsb2Nrc3knKSxcbiAgICAgIHR5cGU6ICdjdC1yYWRpbycsXG4gICAgICB2YWx1ZTogJ2RlZmF1bHQnLFxuICAgICAgZGVzaWduOiAnaW5saW5lJyxcbiAgICAgIGRpdmlkZXI6ICdib3R0b20nLFxuICAgICAgY2hvaWNlczoge1xuICAgICAgICBkZWZhdWx0OiBfXygnRGVmYXVsdCcsICdibG9ja3N5JyksXG4gICAgICAgIGN1c3RvbTogX18oJ0N1c3RvbScsICdibG9ja3N5JylcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbmRpdGlvbjoge1xuICAgICAgdHlwZTogJ2N0LWNvbmRpdGlvbicsXG4gICAgICBjb25kaXRpb246IHtcbiAgICAgICAgZ2FsbGVyeV9zb3VyY2U6ICdjdXN0b20nXG4gICAgICB9LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBpbWFnZXM6IHtcbiAgICAgICAgICBsYWJlbDogX18oJ1ZhcmlhdGlvbiBJbWFnZSBHYWxsZXJ5JywgJ2Jsb2Nrc3knKSxcbiAgICAgICAgICB0eXBlOiAnY3QtbXVsdGktaW1hZ2UtdXBsb2FkZXInLFxuICAgICAgICAgIGRlc2lnbjogX3JlZiA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID09PSAwID8gJ2lubGluZScgOiAnYmxvY2snO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsdWU6IFtdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJlbmRlcihjcmVhdGVFbGVtZW50KE9wdGlvbnNSb290LCB7XG4gICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB2YWx1ZTogZ2V0VmFsdWVGcm9tSW5wdXQob3B0aW9ucywgSlNPTi5wYXJzZShpbnB1dC52YWx1ZSksIG51bGwsIGZhbHNlKSxcbiAgICBpbnB1dF9pZDogaW5wdXQuaWQsXG4gICAgaW5wdXRfbmFtZTogaW5wdXQubmFtZSxcbiAgICBoYXNSZXZlcnRCdXR0b246IGZhbHNlXG4gIH0pLCBkaXYpO1xufTtcbmV4cG9ydCBjb25zdCBpbml0QWxsV29vVmFyaWF0aW9ucyA9ICgpID0+IHtcbiAgO1xuICBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLndvb2NvbW1lcmNlX3ZhcmlhdGlvbnMgLndvb2NvbW1lcmNlX3ZhcmlhdGlvbicpXS5tYXAodmFyaWF0aW9uV3JhcHBlciA9PiB7XG4gICAgaWYgKHZhcmlhdGlvbldyYXBwZXIuaGFzQmxvY2tzeU9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXJpYXRpb25XcmFwcGVyLmhhc0Jsb2Nrc3lPcHRpb25zID0gdHJ1ZTtcbiAgICBpbml0V29vVmFyaWF0aW9uKHZhcmlhdGlvbldyYXBwZXIpO1xuICB9KTtcbn07IiwiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUsIEZyYWdtZW50LCBjcmVhdGVFbGVtZW50LCBjcmVhdGVQb3J0YWwsIHJlbmRlciB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IE9wdGlvbnNQYW5lbCBmcm9tICcuLi9vcHRpb25zL09wdGlvbnNQYW5lbCc7XG5pbXBvcnQgeyBnZXRWYWx1ZUZyb21JbnB1dCB9IGZyb20gJy4uL29wdGlvbnMvaGVscGVycy9nZXQtdmFsdWUtZnJvbS1pbnB1dCc7XG5pbXBvcnQgZGVlcEVxdWFsIGZyb20gJ2RlZXAtZXF1YWwnO1xuXG5jb25zdCBUYXhvbm9teVJvb3QgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb25zLFxuICAgIGlucHV0X25hbWUsXG4gICAgdmFsdWVcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IFtpbnRlcm5hbFZhbHVlLCBzZXRJbnRlcm5hbFZhbHVlXSA9IHVzZVN0YXRlKHZhbHVlKTtcbiAgY29uc3QgaW5wdXQgPSB1c2VSZWYoKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG4gICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KEFycmF5LmlzQXJyYXkoaW50ZXJuYWxWYWx1ZSkgPyB7fSA6IGludGVybmFsVmFsdWUpLFxuICAgIG9uQ2hhbmdlOiAoKSA9PiB7fSxcbiAgICBuYW1lOiBpbnB1dF9uYW1lLFxuICAgIHR5cGU6IFwiaGlkZGVuXCIsXG4gICAgcmVmOiBpbnB1dFxuICB9KSwgY3JlYXRlUG9ydGFsKGNyZWF0ZUVsZW1lbnQoT3B0aW9uc1BhbmVsLCB7XG4gICAgdmFsdWU6IGludGVybmFsVmFsdWUsXG4gICAgb3B0aW9uczoge1xuICAgICAgYWNjZW50X2NvbG9yOiBvcHRpb25zLmFjY2VudF9jb2xvclxuICAgIH0sXG4gICAgb25DaGFuZ2U6IChrZXksIG5ld1ZhbHVlKSA9PiB7XG4gICAgICBzZXRJbnRlcm5hbFZhbHVlKGludGVybmFsVmFsdWUgPT4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbnRlcm5hbFZhbHVlKSwge30sIHtcbiAgICAgICAgW2tleV06IG5ld1ZhbHVlXG4gICAgICB9KSk7XG4gICAgICAkKGlucHV0LmN1cnJlbnQpLmNoYW5nZSgpO1xuICAgIH1cbiAgfSksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50ZXJtLWJsb2Nrc3ktYWNjZW50LWNvbG9yLXdyYXAgdGQnKSksIGNyZWF0ZVBvcnRhbChjcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGRpc2FibGVkOiBkZWVwRXF1YWwob3B0aW9ucy5hY2NlbnRfY29sb3IudmFsdWUsIGludGVybmFsVmFsdWUuYWNjZW50X2NvbG9yKSxcbiAgICBjbGFzc05hbWU6IFwiY3QtcmV2ZXJ0XCIsXG4gICAgb25DbGljazogKCkgPT4ge1xuICAgICAgc2V0SW50ZXJuYWxWYWx1ZShpbnRlcm5hbFZhbHVlID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW50ZXJuYWxWYWx1ZSksIHt9LCB7XG4gICAgICAgIGFjY2VudF9jb2xvcjogb3B0aW9ucy5hY2NlbnRfY29sb3IudmFsdWVcbiAgICAgIH0pKTtcbiAgICAgICQoaW5wdXQuY3VycmVudCkuY2hhbmdlKCk7XG4gICAgfVxuICB9KSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRlcm0tYmxvY2tzeS1hY2NlbnQtY29sb3Itd3JhcCB0aCBsYWJlbCcpKSwgY3JlYXRlUG9ydGFsKGNyZWF0ZUVsZW1lbnQoT3B0aW9uc1BhbmVsLCB7XG4gICAgdmFsdWU6IGludGVybmFsVmFsdWUsXG4gICAgb3B0aW9uczoge1xuICAgICAgaW1hZ2U6IG9wdGlvbnMuaW1hZ2VcbiAgICB9LFxuICAgIG9uQ2hhbmdlOiAoa2V5LCBuZXdWYWx1ZSkgPT4ge1xuICAgICAgc2V0SW50ZXJuYWxWYWx1ZShpbnRlcm5hbFZhbHVlID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW50ZXJuYWxWYWx1ZSksIHt9LCB7XG4gICAgICAgIFtrZXldOiBuZXdWYWx1ZVxuICAgICAgfSkpO1xuICAgICAgJChpbnB1dC5jdXJyZW50KS5jaGFuZ2UoKTtcbiAgICB9XG4gIH0pLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGVybS1ibG9ja3N5LWltYWdlLXdyYXAgdGQnKSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluaXRUYXhvbm9taWVzID0gKCkgPT4ge1xuICBjb25zdCBtYXliZVRheG9ub215RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZSo9XCJibG9ja3N5X3RheG9ub215X21ldGFfb3B0aW9uc1wiXScpO1xuXG4gIGlmICghbWF5YmVUYXhvbm9teUZpZWxkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG9wdGlvbnMgPSB7XG4gICAgaW1hZ2U6IHtcbiAgICAgIGxhYmVsOiBfXygnVHJhbnNwYXJlbnQgU3RhdGUgTG9nbycsICdibG9ja3N5JyksXG4gICAgICB0eXBlOiAnY3QtaW1hZ2UtdXBsb2FkZXInLFxuICAgICAgdmFsdWU6ICcnLFxuICAgICAgYXR0cjoge1xuICAgICAgICAnZGF0YS10eXBlJzogJ2xhcmdlJ1xuICAgICAgfSxcbiAgICAgIGRlc2lnbjogJ25vbmUnLFxuICAgICAgZW1wdHlMYWJlbDogX18oJ1NlbGVjdCBJbWFnZScsICdibG9ja3N5JylcbiAgICB9LFxuICAgIGFjY2VudF9jb2xvcjoge1xuICAgICAgbGFiZWw6IF9fKCdTaXRlIFRpdGxlIENvbG9yJywgJ2Jsb2Nrc3knKSxcbiAgICAgIHR5cGU6ICdjdC1jb2xvci1waWNrZXInLFxuICAgICAgZGVzaWduOiAnbm9uZScsXG4gICAgICB2YWx1ZToge1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29sb3I6ICdDVF9DU1NfU0tJUF9SVUxFJ1xuICAgICAgICB9LFxuICAgICAgICBob3Zlcjoge1xuICAgICAgICAgIGNvbG9yOiAnQ1RfQ1NTX1NLSVBfUlVMRSdcbiAgICAgICAgfSxcbiAgICAgICAgYmFja2dyb3VuZF9pbml0aWFsOiB7XG4gICAgICAgICAgY29sb3I6ICdDVF9DU1NfU0tJUF9SVUxFJ1xuICAgICAgICB9LFxuICAgICAgICBiYWNrZ3JvdW5kX2hvdmVyOiB7XG4gICAgICAgICAgY29sb3I6ICdDVF9DU1NfU0tJUF9SVUxFJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcGlja2VyczogW3tcbiAgICAgICAgdGl0bGU6IF9fKCdUZXh0IEluaXRpYWwnLCAnYmxvY2tzeScpLFxuICAgICAgICBpZDogJ2RlZmF1bHQnXG4gICAgICB9LCB7XG4gICAgICAgIHRpdGxlOiBfXygnVGV4dCBIb3ZlcicsICdibG9ja3N5JyksXG4gICAgICAgIGlkOiAnaG92ZXInXG4gICAgICB9LCB7XG4gICAgICAgIHRpdGxlOiBfXygnQmFja2dyb3VuZCBJbml0aWFsJywgJ2Jsb2Nrc3knKSxcbiAgICAgICAgaWQ6ICdiYWNrZ3JvdW5kX2luaXRpYWwnXG4gICAgICB9LCB7XG4gICAgICAgIHRpdGxlOiBfXygnQmFja2dyb3VuZCBIb3ZlcicsICdibG9ja3N5JyksXG4gICAgICAgIGlkOiAnYmFja2dyb3VuZF9ob3ZlcidcbiAgICAgIH1dXG4gICAgfVxuICB9O1xuICByZW5kZXIoY3JlYXRlRWxlbWVudChUYXhvbm9teVJvb3QsIHtcbiAgICBpbnB1dF9uYW1lOiBtYXliZVRheG9ub215RmllbGQubmFtZSxcbiAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIHZhbHVlOiBnZXRWYWx1ZUZyb21JbnB1dChvcHRpb25zLCBKU09OLnBhcnNlKG1heWJlVGF4b25vbXlGaWVsZC52YWx1ZSksIG51bGwsIGZhbHNlKVxuICB9KSwgbWF5YmVUYXhvbm9teUZpZWxkLnBhcmVudE5vZGUpO1xufTsiLCJpbXBvcnQgJy4vcHVibGljLXBhdGgnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IGluaXRBbGxQYW5lbHMgfSBmcm9tICcuL29wdGlvbnMvaW5pdFBhbmVscyc7XG5pbXBvcnQgeyBpbml0V2lkZ2V0IH0gZnJvbSAnLi9iYWNrZW5kL3dpZGdldHMnO1xuaW1wb3J0IHsgaW5pdEFsbFdvb1ZhcmlhdGlvbnMgfSBmcm9tICcuL2JhY2tlbmQvd29vLXZhcmlhdGlvbic7XG5pbXBvcnQgeyBpbml0VGF4b25vbWllcyB9IGZyb20gJy4vYmFja2VuZC90YXhvbm9taWVzJztcblxuaWYgKCQgJiYgJC5mbikge1xuICAkKGRvY3VtZW50KS5vbignd2lkZ2V0LWFkZGVkJywgKGV2ZW50LCB3aWRnZXQpID0+IHtcbiAgICBpbml0V2lkZ2V0KHdpZGdldFswXSk7XG4gIH0pO1xuICBpbml0QWxsV29vVmFyaWF0aW9ucygpO1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAkKGRvY3VtZW50LmJvZHkpLm9uKCd3b29jb21tZXJjZV92YXJpYXRpb25zX2FkZGVkIHdvb2NvbW1lcmNlX3ZhcmlhdGlvbnNfbG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgaW5pdEFsbFdvb1ZhcmlhdGlvbnMoKTtcbiAgICB9KTtcbiAgfSwgMTAwMCk7XG59XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gIGluaXRBbGxQYW5lbHMoKTtcbiAgaW5pdFRheG9ub21pZXMoKTtcbiAgWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ub3RpY2UtYmxvY2tzeS1wbHVnaW4nKSwgLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZGlzbWlzc10nKV0ubWFwKGVsID0+IGltcG9ydCgnLi9ub3RpZmljYXRpb24vbWFpbicpLnRoZW4oX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIG1vdW50XG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIG1vdW50KGVsKTtcbiAgfSkpO1xuXG4gIGlmICgkKSB7XG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tocmVmKj1cInRlY2huaWNhbF9zdXBwb3J0XCJdW2hyZWYqPVwiY3QtZGFzaGJvYXJkXCJdJywgZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBsb2NhdGlvbi5ocmVmID0gJ2h0dHBzOi8vY3JlYXRpdmV0aGVtZXMuY29tL2Jsb2Nrc3kvc3VwcG9ydCc7XG4gICAgfSk7XG4gIH1cbn0pO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBPdmVybGF5IH0gZnJvbSAnLi9jdXN0b21pemVyL2NvbXBvbmVudHMvT3ZlcmxheSc7XG5leHBvcnQgeyBnZXRWYWx1ZUZyb21JbnB1dCB9IGZyb20gJy4vb3B0aW9ucy9oZWxwZXJzL2dldC12YWx1ZS1mcm9tLWlucHV0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT3B0aW9uc1BhbmVsIH0gZnJvbSAnLi9vcHRpb25zL09wdGlvbnNQYW5lbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBhbmVsLCBQYW5lbE1ldGFXcmFwcGVyIH0gZnJvbSAnLi9vcHRpb25zL29wdGlvbnMvY3QtcGFuZWwnO1xuZXhwb3J0IHsgRGV2aWNlTWFuYWdlclByb3ZpZGVyIH0gZnJvbSAnLi9jdXN0b21pemVyL2NvbXBvbmVudHMvdXNlRGV2aWNlTWFuYWdlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBhbmVsTGV2ZWwgfSBmcm9tICcuL29wdGlvbnMvY29tcG9uZW50cy9QYW5lbExldmVsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3dpdGNoIH0gZnJvbSAnLi9vcHRpb25zL29wdGlvbnMvY3Qtc3dpdGNoJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW1hZ2VVcGxvYWRlciB9IGZyb20gJy4vb3B0aW9ucy9vcHRpb25zL2N0LWltYWdlLXVwbG9hZGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2VsZWN0IH0gZnJvbSAnLi9vcHRpb25zL29wdGlvbnMvY3Qtc2VsZWN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT3V0c2lkZUNsaWNrSGFuZGxlciB9IGZyb20gJy4vb3B0aW9ucy9vcHRpb25zL3JlYWN0LW91dHNpZGUtY2xpY2staGFuZGxlcic7XG5leHBvcnQgeyBUcmFuc2l0aW9uLCBhbmltYXRlZCB9IGZyb20gJ3JlYWN0LXNwcmluZy9yZW5kZXJwcm9wcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGJlemllckVhc2luZyB9IGZyb20gJ2Jlemllci1lYXNpbmcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VQb3BvdmVyTWFrZXIgfSBmcm9tICcuL29wdGlvbnMvaGVscGVycy91c2VQb3BvdmVyTWFrZXInO1xuZXhwb3J0IGNvbnN0IG9uRG9jdW1lbnRMb2FkZWQgPSBjYiA9PiB7XG4gIGlmICgvY29tcHxpbnRlcnxsb2FkZWQvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkpIHtcbiAgICBjYigpO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYiwgZmFsc2UpO1xuICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3654\n")},6095:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ZP\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"fg\": () => (/* binding */ getOptionFor),\n/* harmony export */ \"y1\": () => (/* binding */ optionWithDefault)\n/* harmony export */ });\n/* unused harmony export capitalizeFirstLetter */\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4616);\n/* harmony import */ var deep_equal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(251);\n/* harmony import */ var deep_equal__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(deep_equal__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var match_conditions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7465);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _helpers_get_label__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7493);\n/* harmony import */ var ct_events__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(2243);\n/* harmony import */ var ct_events__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(ct_events__WEBPACK_IMPORTED_MODULE_7__);\nconst _excluded = [\"className\"],\n _excluded2 = [\"wrapperAttr\"],\n _excluded3 = [\"className\"];\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\nconst CORE_OPTIONS_CONTEXT = __webpack_require__(1764);\n\nCORE_OPTIONS_CONTEXT.keys().forEach(CORE_OPTIONS_CONTEXT);\n\nconst hasCoreOptionModifier = type => {\n let index = CORE_OPTIONS_CONTEXT.keys().map(module => module.replace(/^\\.\\//, '').replace(/\\.js$/, '')).indexOf(type);\n return index > -1 && CORE_OPTIONS_CONTEXT.keys()[index];\n};\n\nconst capitalizeFirstLetter = str => {\n str = str == null ? '' : String(str);\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\nconst getOptionFor = option => {\n const dynamicOptionTypes = {};\n ct_events__WEBPACK_IMPORTED_MODULE_7___default().trigger('blocksy:options:register', dynamicOptionTypes);\n\n if (hasCoreOptionModifier(option.type)) {\n return CORE_OPTIONS_CONTEXT(hasCoreOptionModifier(option.type)).default;\n }\n\n if (dynamicOptionTypes[option.type]) {\n return dynamicOptionTypes[option.type];\n }\n\n return null;\n};\nconst optionWithDefault = _ref => {\n let {\n option,\n value\n } = _ref;\n return value === undefined ? option.value : value;\n};\n\nconst GenericOptionType = _ref2 => {\n let {\n option,\n value,\n values,\n onChange,\n onChangeFor,\n hasRevertButton,\n id,\n purpose\n } = _ref2;\n let maybeGutenbergDevice = null;\n\n if (wp.data && wp.data.useSelect) {\n maybeGutenbergDevice = wp.data.useSelect(select => {\n if (!select('core/edit-post')) {\n return null;\n }\n\n return select('core/edit-post').__experimentalGetPreviewDeviceType();\n });\n }\n\n const getInitialDevice = () => {\n if (wp.customize && wp.customize.previewedDevice) {\n return wp.customize.previewedDevice();\n }\n\n if (wp.data && wp.data.select && wp.data.select('core/edit-post') && wp.data.select('core/edit-post').__experimentalGetPreviewDeviceType) {\n return wp.data.select('core/edit-post').__experimentalGetPreviewDeviceType().toLowerCase();\n }\n\n return 'desktop';\n };\n\n const [device, setInnerDevice] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)(getInitialDevice());\n\n const listener = () => {\n setInnerDevice(getInitialDevice());\n };\n\n const ctEventsListener = _ref3 => {\n let {\n device\n } = _ref3;\n setInnerDevice(device);\n };\n\n const setDevice = device => {\n ct_events__WEBPACK_IMPORTED_MODULE_7___default().trigger('ct:options:device:update', {\n device\n });\n setInnerDevice(device);\n wp.customize && wp.customize.previewedDevice.set(device);\n\n if (wp.data && wp.data.dispatch && wp.data.dispatch('core/edit-post') && wp.data.dispatch('core/edit-post').__experimentalSetPreviewDeviceType) {\n wp.data.dispatch('core/edit-post').__experimentalSetPreviewDeviceType(device.replace(/\\w/, c => c.toUpperCase()));\n }\n };\n\n (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (maybeGutenbergDevice) {\n setInnerDevice(maybeGutenbergDevice.toLowerCase());\n }\n }, [maybeGutenbergDevice]);\n (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (option.type !== 'ct-typography') {\n if (!(0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option) && !option.markAsAutoFor) {\n return;\n }\n }\n\n if (wp.customize) {\n setTimeout(() => wp.customize.previewedDevice.bind(listener), 1000);\n }\n\n ct_events__WEBPACK_IMPORTED_MODULE_7___default().on('ct:options:device:update', ctEventsListener);\n setInnerDevice(getInitialDevice());\n return () => {\n if (option.type !== 'ct-typography') {\n if (!(0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option)) {\n return;\n }\n }\n\n if (wp.customize) {\n wp.customize.previewedDevice.unbind(listener);\n }\n\n ct_events__WEBPACK_IMPORTED_MODULE_7___default().off('ct:options:device:update', ctEventsListener);\n };\n }, []);\n let OptionComponent = getOptionFor(option);\n let BeforeOptionContent = {\n content: null,\n option\n };\n ct_events__WEBPACK_IMPORTED_MODULE_7___default().trigger('blocksy:options:before-option', BeforeOptionContent);\n const globalResponsiveValue = (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(optionWithDefault({\n value,\n option\n }), (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option));\n const valueWithResponsive = (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option, {\n ignoreHidden: true\n }) ? (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .getValueForDevice */ .Oi)({\n option,\n value: globalResponsiveValue,\n device\n }) : globalResponsiveValue;\n\n const onChangeWithMobileBridge = value => {\n if (option.triggerRefreshOnChange) {\n wp.customize && wp.customize.previewer && wp.customize.previewer.refresh();\n }\n\n if (option.switchDeviceOnChange && wp.customize && wp.customize.previewedDevice() !== option.switchDeviceOnChange) {\n wp.customize.previewedDevice.set(option.switchDeviceOnChange);\n }\n\n if (option.sync && (Object.keys(option.sync).length > 0 || Array.isArray(option.sync)) && wp.customize && wp.customize.previewer) {\n wp.customize.previewer.send('ct:sync:refresh_partial', {\n id: option.sync.id || option.id,\n option\n });\n }\n\n onChange(value);\n };\n\n const onChangeWithResponsiveBridge = scalarValue => {\n const responsiveValue = (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(optionWithDefault({\n value,\n option\n }), (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option));\n onChangeWithMobileBridge((0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option, {\n ignoreHidden: true\n }) ? _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, responsiveValue), {}, {\n [device === 'tablet' && (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionEnabledFor */ .S0)('tablet', option.responsive) === 'skip' ? 'mobile' : device]: scalarValue\n }, device === 'desktop' ? Object.keys(responsiveValue).reduce((currentValue, key) => _objectSpread(_objectSpread({}, currentValue), key !== 'desktop' && key !== '__changed' && Object.keys((0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(option.value)).reduce((result, key) => result ? (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(option.value)[key] === (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(option.value).desktop : false, true) && (responsiveValue.__changed || []).indexOf('tablet') === -1 ? {\n [key]: scalarValue\n } : {}), {}) : {}), device === 'tablet' && (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionEnabledFor */ .S0)('tablet', option.responsive) !== 'skip' ? Object.keys(responsiveValue).reduce((currentValue, key) => _objectSpread(_objectSpread({}, currentValue), key !== 'desktop' && key !== 'tablet' && key !== '__changed' && Object.keys((0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(option.value)).reduce((result, key) => result ? (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(option.value)[key] === (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(option.value).desktop : false, true) && (responsiveValue.__changed || []).indexOf(key) === -1 ? {\n [key]: scalarValue\n } : {}), {}) : {}), {}, {\n __changed: [...(responsiveValue.__changed || []), ...(device !== 'desktop' ? [device] : [])].filter((value, index, self) => self.indexOf(value) === index)\n }) : scalarValue);\n };\n /**\n * Handle transparent components\n */\n\n\n if (!OptionComponent) {\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", null, \"Unimplemented option: \", option.type);\n }\n\n let renderingConfig = {\n design: true,\n label: true,\n wrapperAttr: {}\n };\n\n let LabelToolbar = () => null;\n\n let OptionMetaWrapper = null;\n\n let ControlEnd = () => null;\n\n let sectionClassName = () => ({});\n\n renderingConfig = _objectSpread(_objectSpread({}, renderingConfig), OptionComponent.renderingConfig || {});\n\n if (option.design) {\n renderingConfig.design = option.design;\n }\n\n if (typeof renderingConfig.design === 'function') {\n renderingConfig.design = renderingConfig.design({\n option,\n value: valueWithResponsive\n });\n }\n\n if (OptionComponent.LabelToolbar) {\n LabelToolbar = OptionComponent.LabelToolbar;\n }\n\n if (OptionComponent.ControlEnd) {\n ControlEnd = OptionComponent.ControlEnd;\n }\n\n if (OptionComponent.MetaWrapper) {\n OptionMetaWrapper = OptionComponent.MetaWrapper;\n }\n\n if (OptionComponent.sectionClassName) {\n sectionClassName = OptionComponent.sectionClassName;\n }\n\n let OptionComponentWithoutDesign = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, BeforeOptionContent && BeforeOptionContent.content, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(OptionComponent, {\n key: id,\n option: _objectSpread(_objectSpread({}, option), {}, {\n value: (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option, {\n ignoreHidden: true\n }) ? (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .getValueForDevice */ .Oi)({\n device,\n option,\n value: (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(option.value || '')\n }) : (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .maybePromoteScalarValueIntoResponsive */ .T)(option.value || '', (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option))\n }),\n value: valueWithResponsive,\n id,\n values,\n onChangeFor,\n device,\n onChange: onChangeWithResponsiveBridge\n }));\n\n if (!renderingConfig.design || renderingConfig.design === 'none') {\n return OptionComponentWithoutDesign;\n }\n\n let maybeLabel = (0,_helpers_get_label__WEBPACK_IMPORTED_MODULE_6__/* .getOptionLabelFor */ .m)({\n id,\n option,\n values,\n renderingConfig\n });\n let maybeDesc = Object.keys(option).indexOf('desc') === -1 ? false : option.desc;\n let maybeLink = Object.keys(option).indexOf('link') === -1 ? false : option.link || ' ';\n const actualDesignType = typeof renderingConfig.design === 'boolean' ? 'block' : renderingConfig.design;\n\n if (renderingConfig.design === 'compact') {\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"section\", option.sectionAttr || {}, maybeLabel && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"label\", null, maybeLabel), ((0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option) && (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionEnabledFor */ .S0)(device, option.responsive) || !(0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option)) && OptionComponentWithoutDesign, maybeLink && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"a\", _extends({\n dangerouslySetInnerHTML: {\n __html: maybeLink\n }\n }, option.linkAttr || {})));\n }\n\n const getActualOption = function () {\n let _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n let {\n wrapperAttr: {\n className\n } = {}\n } = _ref4,\n additionalWrapperAttr = _objectWithoutProperties(_ref4.wrapperAttr, _excluded),\n props = _objectWithoutProperties(_ref4, _excluded2);\n\n const _ref5 = option.wrapperAttr || {},\n {\n className: optionClassName\n } = _ref5,\n optionAdditionalWrapperAttr = _objectWithoutProperties(_ref5, _excluded3);\n\n let computeOptionValue = renderingConfig.computeOptionValue;\n\n if (!computeOptionValue) {\n computeOptionValue = o => o;\n }\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()('ct-control', className, optionClassName, {}),\n \"data-design\": actualDesignType\n }, option.divider ? {\n 'data-divider': option.divider\n } : {}, _objectSpread({}, (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option) && !(0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionEnabledFor */ .S0)(device, option.responsive) || option.state === 'disabled' ? {\n 'data-state': 'disabled'\n } : {}), _objectSpread(_objectSpread({}, optionAdditionalWrapperAttr), additionalWrapperAttr)), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"header\", null, maybeLabel && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"label\", null, maybeLabel), option.type !== 'ct-image-picker' && option.type !== 'ct-layers' && option.type !== 'ct-image-uploader' && option.type !== 'ct-panel' && hasRevertButton && !option.disableRevertButton && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"button\", {\n type: \"button\",\n disabled: deep_equal__WEBPACK_IMPORTED_MODULE_3___default()(computeOptionValue(option.value), renderingConfig.getValueForRevert ? renderingConfig.getValueForRevert({\n value,\n option,\n values,\n device\n }) : optionWithDefault({\n value,\n option\n })),\n className: \"ct-revert\",\n onClick: () => {\n if (renderingConfig.performRevert) {\n renderingConfig.performRevert({\n onChangeFor\n });\n }\n\n onChangeWithMobileBridge(option.value);\n }\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(LabelToolbar, {\n option,\n value: valueWithResponsive,\n id,\n onChange: onChangeWithResponsiveBridge\n }), (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option, {\n ignoreHidden: true\n }) && actualDesignType.indexOf('block') > -1 && !option.skipResponsiveControls && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* [\"default\"] */ .ZP, {\n device: device,\n responsiveDescriptor: option.responsive,\n setDevice: setDevice\n })), (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option) && !(0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionEnabledFor */ .S0)(device, option.responsive) && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"ct-disabled-notification\"\n }, option.disabledDeviceMessage || (0,ct_i18n__WEBPACK_IMPORTED_MODULE_5__.__)(\"Option can't be edited for current device\", 'blocksy')), ((0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option) && (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionEnabledFor */ .S0)(device, option.responsive) || !(0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option)) && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"section\", _extends({}, option.sectionAttr || {}, {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()({\n 'ct-responsive-container': (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option, {\n ignoreHidden: true\n }) && actualDesignType === 'inline'\n }, sectionClassName({\n design: actualDesignType,\n option\n }), (option.sectionAttr || {}).class || '')\n }), (0,_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* .isOptionResponsiveFor */ .W)(option, {\n ignoreHidden: true\n }) && actualDesignType === 'inline' && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_customizer_components_responsive_controls__WEBPACK_IMPORTED_MODULE_2__/* [\"default\"] */ .ZP, {\n device: device,\n responsiveDescriptor: option.responsive,\n setDevice: setDevice\n }), OptionComponentWithoutDesign, maybeLink && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"a\", _extends({\n dangerouslySetInnerHTML: {\n __html: maybeLink\n }\n }, option.linkAttr || {}))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(ControlEnd, null), maybeDesc && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n dangerouslySetInnerHTML: {\n __html: maybeDesc\n },\n className: \"ct-option-description\"\n }))));\n };\n\n return OptionMetaWrapper ? (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(OptionMetaWrapper, {\n id: id,\n option: option,\n value: valueWithResponsive,\n onChangeFor: onChangeFor,\n values: values,\n getActualOption: getActualOption\n }) : getActualOption();\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (GenericOptionType);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA5NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvR2VuZXJpY09wdGlvblR5cGUuanM/ZDYwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIl0sXG4gICAgICBfZXhjbHVkZWQyID0gW1wid3JhcHBlckF0dHJcIl0sXG4gICAgICBfZXhjbHVkZWQzID0gW1wiY2xhc3NOYW1lXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgRnJhZ21lbnQsIENvbXBvbmVudCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNwb25zaXZlQ29udHJvbHMsIHsgbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZSwgaXNPcHRpb25FbmFibGVkRm9yLCBnZXRWYWx1ZUZvckRldmljZSwgaXNPcHRpb25SZXNwb25zaXZlRm9yIH0gZnJvbSAnLi4vY3VzdG9taXplci9jb21wb25lbnRzL3Jlc3BvbnNpdmUtY29udHJvbHMnO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tICdkZWVwLWVxdWFsJztcbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmRpdGlvbiwgbWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uIH0gZnJvbSAnbWF0Y2gtY29uZGl0aW9ucyc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IHsgZ2V0T3B0aW9uTGFiZWxGb3IgfSBmcm9tICcuL2hlbHBlcnMvZ2V0LWxhYmVsJztcbmltcG9ydCBjdEV2ZW50cyBmcm9tICdjdC1ldmVudHMnO1xuXG5jb25zdCBDT1JFX09QVElPTlNfQ09OVEVYVCA9IHJlcXVpcmUuY29udGV4dCgnLi9vcHRpb25zLycsIGZhbHNlLCAvXFwuanMkLyk7XG5cbkNPUkVfT1BUSU9OU19DT05URVhULmtleXMoKS5mb3JFYWNoKENPUkVfT1BUSU9OU19DT05URVhUKTtcblxuY29uc3QgaGFzQ29yZU9wdGlvbk1vZGlmaWVyID0gdHlwZSA9PiB7XG4gIGxldCBpbmRleCA9IENPUkVfT1BUSU9OU19DT05URVhULmtleXMoKS5tYXAobW9kdWxlID0+IG1vZHVsZS5yZXBsYWNlKC9eXFwuXFwvLywgJycpLnJlcGxhY2UoL1xcLmpzJC8sICcnKSkuaW5kZXhPZih0eXBlKTtcbiAgcmV0dXJuIGluZGV4ID4gLTEgJiYgQ09SRV9PUFRJT05TX0NPTlRFWFQua2V5cygpW2luZGV4XTtcbn07XG5cbmV4cG9ydCBjb25zdCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBzdHIgPT4ge1xuICBzdHIgPSBzdHIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHN0cik7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59O1xuZXhwb3J0IGNvbnN0IGdldE9wdGlvbkZvciA9IG9wdGlvbiA9PiB7XG4gIGNvbnN0IGR5bmFtaWNPcHRpb25UeXBlcyA9IHt9O1xuICBjdEV2ZW50cy50cmlnZ2VyKCdibG9ja3N5Om9wdGlvbnM6cmVnaXN0ZXInLCBkeW5hbWljT3B0aW9uVHlwZXMpO1xuXG4gIGlmIChoYXNDb3JlT3B0aW9uTW9kaWZpZXIob3B0aW9uLnR5cGUpKSB7XG4gICAgcmV0dXJuIENPUkVfT1BUSU9OU19DT05URVhUKGhhc0NvcmVPcHRpb25Nb2RpZmllcihvcHRpb24udHlwZSkpLmRlZmF1bHQ7XG4gIH1cblxuICBpZiAoZHluYW1pY09wdGlvblR5cGVzW29wdGlvbi50eXBlXSkge1xuICAgIHJldHVybiBkeW5hbWljT3B0aW9uVHlwZXNbb3B0aW9uLnR5cGVdO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuZXhwb3J0IGNvbnN0IG9wdGlvbldpdGhEZWZhdWx0ID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uLFxuICAgIHZhbHVlXG4gIH0gPSBfcmVmO1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IG9wdGlvbi52YWx1ZSA6IHZhbHVlO1xufTtcblxuY29uc3QgR2VuZXJpY09wdGlvblR5cGUgPSBfcmVmMiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIHZhbHVlcyxcbiAgICBvbkNoYW5nZSxcbiAgICBvbkNoYW5nZUZvcixcbiAgICBoYXNSZXZlcnRCdXR0b24sXG4gICAgaWQsXG4gICAgcHVycG9zZVxuICB9ID0gX3JlZjI7XG4gIGxldCBtYXliZUd1dGVuYmVyZ0RldmljZSA9IG51bGw7XG5cbiAgaWYgKHdwLmRhdGEgJiYgd3AuZGF0YS51c2VTZWxlY3QpIHtcbiAgICBtYXliZUd1dGVuYmVyZ0RldmljZSA9IHdwLmRhdGEudXNlU2VsZWN0KHNlbGVjdCA9PiB7XG4gICAgICBpZiAoIXNlbGVjdCgnY29yZS9lZGl0LXBvc3QnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGVjdCgnY29yZS9lZGl0LXBvc3QnKS5fX2V4cGVyaW1lbnRhbEdldFByZXZpZXdEZXZpY2VUeXBlKCk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBnZXRJbml0aWFsRGV2aWNlID0gKCkgPT4ge1xuICAgIGlmICh3cC5jdXN0b21pemUgJiYgd3AuY3VzdG9taXplLnByZXZpZXdlZERldmljZSkge1xuICAgICAgcmV0dXJuIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZWREZXZpY2UoKTtcbiAgICB9XG5cbiAgICBpZiAod3AuZGF0YSAmJiB3cC5kYXRhLnNlbGVjdCAmJiB3cC5kYXRhLnNlbGVjdCgnY29yZS9lZGl0LXBvc3QnKSAmJiB3cC5kYXRhLnNlbGVjdCgnY29yZS9lZGl0LXBvc3QnKS5fX2V4cGVyaW1lbnRhbEdldFByZXZpZXdEZXZpY2VUeXBlKSB7XG4gICAgICByZXR1cm4gd3AuZGF0YS5zZWxlY3QoJ2NvcmUvZWRpdC1wb3N0JykuX19leHBlcmltZW50YWxHZXRQcmV2aWV3RGV2aWNlVHlwZSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICdkZXNrdG9wJztcbiAgfTtcblxuICBjb25zdCBbZGV2aWNlLCBzZXRJbm5lckRldmljZV0gPSB1c2VTdGF0ZShnZXRJbml0aWFsRGV2aWNlKCkpO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgIHNldElubmVyRGV2aWNlKGdldEluaXRpYWxEZXZpY2UoKSk7XG4gIH07XG5cbiAgY29uc3QgY3RFdmVudHNMaXN0ZW5lciA9IF9yZWYzID0+IHtcbiAgICBsZXQge1xuICAgICAgZGV2aWNlXG4gICAgfSA9IF9yZWYzO1xuICAgIHNldElubmVyRGV2aWNlKGRldmljZSk7XG4gIH07XG5cbiAgY29uc3Qgc2V0RGV2aWNlID0gZGV2aWNlID0+IHtcbiAgICBjdEV2ZW50cy50cmlnZ2VyKCdjdDpvcHRpb25zOmRldmljZTp1cGRhdGUnLCB7XG4gICAgICBkZXZpY2VcbiAgICB9KTtcbiAgICBzZXRJbm5lckRldmljZShkZXZpY2UpO1xuICAgIHdwLmN1c3RvbWl6ZSAmJiB3cC5jdXN0b21pemUucHJldmlld2VkRGV2aWNlLnNldChkZXZpY2UpO1xuXG4gICAgaWYgKHdwLmRhdGEgJiYgd3AuZGF0YS5kaXNwYXRjaCAmJiB3cC5kYXRhLmRpc3BhdGNoKCdjb3JlL2VkaXQtcG9zdCcpICYmIHdwLmRhdGEuZGlzcGF0Y2goJ2NvcmUvZWRpdC1wb3N0JykuX19leHBlcmltZW50YWxTZXRQcmV2aWV3RGV2aWNlVHlwZSkge1xuICAgICAgd3AuZGF0YS5kaXNwYXRjaCgnY29yZS9lZGl0LXBvc3QnKS5fX2V4cGVyaW1lbnRhbFNldFByZXZpZXdEZXZpY2VUeXBlKGRldmljZS5yZXBsYWNlKC9cXHcvLCBjID0+IGMudG9VcHBlckNhc2UoKSkpO1xuICAgIH1cbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChtYXliZUd1dGVuYmVyZ0RldmljZSkge1xuICAgICAgc2V0SW5uZXJEZXZpY2UobWF5YmVHdXRlbmJlcmdEZXZpY2UudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9LCBbbWF5YmVHdXRlbmJlcmdEZXZpY2VdKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAob3B0aW9uLnR5cGUgIT09ICdjdC10eXBvZ3JhcGh5Jykge1xuICAgICAgaWYgKCFpc09wdGlvblJlc3BvbnNpdmVGb3Iob3B0aW9uKSAmJiAhb3B0aW9uLm1hcmtBc0F1dG9Gb3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3cC5jdXN0b21pemUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gd3AuY3VzdG9taXplLnByZXZpZXdlZERldmljZS5iaW5kKGxpc3RlbmVyKSwgMTAwMCk7XG4gICAgfVxuXG4gICAgY3RFdmVudHMub24oJ2N0Om9wdGlvbnM6ZGV2aWNlOnVwZGF0ZScsIGN0RXZlbnRzTGlzdGVuZXIpO1xuICAgIHNldElubmVyRGV2aWNlKGdldEluaXRpYWxEZXZpY2UoKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChvcHRpb24udHlwZSAhPT0gJ2N0LXR5cG9ncmFwaHknKSB7XG4gICAgICAgIGlmICghaXNPcHRpb25SZXNwb25zaXZlRm9yKG9wdGlvbikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHdwLmN1c3RvbWl6ZSkge1xuICAgICAgICB3cC5jdXN0b21pemUucHJldmlld2VkRGV2aWNlLnVuYmluZChsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIGN0RXZlbnRzLm9mZignY3Q6b3B0aW9uczpkZXZpY2U6dXBkYXRlJywgY3RFdmVudHNMaXN0ZW5lcik7XG4gICAgfTtcbiAgfSwgW10pO1xuICBsZXQgT3B0aW9uQ29tcG9uZW50ID0gZ2V0T3B0aW9uRm9yKG9wdGlvbik7XG4gIGxldCBCZWZvcmVPcHRpb25Db250ZW50ID0ge1xuICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgb3B0aW9uXG4gIH07XG4gIGN0RXZlbnRzLnRyaWdnZXIoJ2Jsb2Nrc3k6b3B0aW9uczpiZWZvcmUtb3B0aW9uJywgQmVmb3JlT3B0aW9uQ29udGVudCk7XG4gIGNvbnN0IGdsb2JhbFJlc3BvbnNpdmVWYWx1ZSA9IG1heWJlUHJvbW90ZVNjYWxhclZhbHVlSW50b1Jlc3BvbnNpdmUob3B0aW9uV2l0aERlZmF1bHQoe1xuICAgIHZhbHVlLFxuICAgIG9wdGlvblxuICB9KSwgaXNPcHRpb25SZXNwb25zaXZlRm9yKG9wdGlvbikpO1xuICBjb25zdCB2YWx1ZVdpdGhSZXNwb25zaXZlID0gaXNPcHRpb25SZXNwb25zaXZlRm9yKG9wdGlvbiwge1xuICAgIGlnbm9yZUhpZGRlbjogdHJ1ZVxuICB9KSA/IGdldFZhbHVlRm9yRGV2aWNlKHtcbiAgICBvcHRpb24sXG4gICAgdmFsdWU6IGdsb2JhbFJlc3BvbnNpdmVWYWx1ZSxcbiAgICBkZXZpY2VcbiAgfSkgOiBnbG9iYWxSZXNwb25zaXZlVmFsdWU7XG5cbiAgY29uc3Qgb25DaGFuZ2VXaXRoTW9iaWxlQnJpZGdlID0gdmFsdWUgPT4ge1xuICAgIGlmIChvcHRpb24udHJpZ2dlclJlZnJlc2hPbkNoYW5nZSkge1xuICAgICAgd3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIgJiYgd3AuY3VzdG9taXplLnByZXZpZXdlci5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbi5zd2l0Y2hEZXZpY2VPbkNoYW5nZSAmJiB3cC5jdXN0b21pemUgJiYgd3AuY3VzdG9taXplLnByZXZpZXdlZERldmljZSgpICE9PSBvcHRpb24uc3dpdGNoRGV2aWNlT25DaGFuZ2UpIHtcbiAgICAgIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZWREZXZpY2Uuc2V0KG9wdGlvbi5zd2l0Y2hEZXZpY2VPbkNoYW5nZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbi5zeW5jICYmIChPYmplY3Qua2V5cyhvcHRpb24uc3luYykubGVuZ3RoID4gMCB8fCBBcnJheS5pc0FycmF5KG9wdGlvbi5zeW5jKSkgJiYgd3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIpIHtcbiAgICAgIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIuc2VuZCgnY3Q6c3luYzpyZWZyZXNoX3BhcnRpYWwnLCB7XG4gICAgICAgIGlkOiBvcHRpb24uc3luYy5pZCB8fCBvcHRpb24uaWQsXG4gICAgICAgIG9wdGlvblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25DaGFuZ2UodmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IG9uQ2hhbmdlV2l0aFJlc3BvbnNpdmVCcmlkZ2UgPSBzY2FsYXJWYWx1ZSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2l2ZVZhbHVlID0gbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZShvcHRpb25XaXRoRGVmYXVsdCh7XG4gICAgICB2YWx1ZSxcbiAgICAgIG9wdGlvblxuICAgIH0pLCBpc09wdGlvblJlc3BvbnNpdmVGb3Iob3B0aW9uKSk7XG4gICAgb25DaGFuZ2VXaXRoTW9iaWxlQnJpZGdlKGlzT3B0aW9uUmVzcG9uc2l2ZUZvcihvcHRpb24sIHtcbiAgICAgIGlnbm9yZUhpZGRlbjogdHJ1ZVxuICAgIH0pID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzcG9uc2l2ZVZhbHVlKSwge30sIHtcbiAgICAgIFtkZXZpY2UgPT09ICd0YWJsZXQnICYmIGlzT3B0aW9uRW5hYmxlZEZvcigndGFibGV0Jywgb3B0aW9uLnJlc3BvbnNpdmUpID09PSAnc2tpcCcgPyAnbW9iaWxlJyA6IGRldmljZV06IHNjYWxhclZhbHVlXG4gICAgfSwgZGV2aWNlID09PSAnZGVza3RvcCcgPyBPYmplY3Qua2V5cyhyZXNwb25zaXZlVmFsdWUpLnJlZHVjZSgoY3VycmVudFZhbHVlLCBrZXkpID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudFZhbHVlKSwga2V5ICE9PSAnZGVza3RvcCcgJiYga2V5ICE9PSAnX19jaGFuZ2VkJyAmJiBPYmplY3Qua2V5cyhtYXliZVByb21vdGVTY2FsYXJWYWx1ZUludG9SZXNwb25zaXZlKG9wdGlvbi52YWx1ZSkpLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHJlc3VsdCA/IG1heWJlUHJvbW90ZVNjYWxhclZhbHVlSW50b1Jlc3BvbnNpdmUob3B0aW9uLnZhbHVlKVtrZXldID09PSBtYXliZVByb21vdGVTY2FsYXJWYWx1ZUludG9SZXNwb25zaXZlKG9wdGlvbi52YWx1ZSkuZGVza3RvcCA6IGZhbHNlLCB0cnVlKSAmJiAocmVzcG9uc2l2ZVZhbHVlLl9fY2hhbmdlZCB8fCBbXSkuaW5kZXhPZigndGFibGV0JykgPT09IC0xID8ge1xuICAgICAgW2tleV06IHNjYWxhclZhbHVlXG4gICAgfSA6IHt9KSwge30pIDoge30pLCBkZXZpY2UgPT09ICd0YWJsZXQnICYmIGlzT3B0aW9uRW5hYmxlZEZvcigndGFibGV0Jywgb3B0aW9uLnJlc3BvbnNpdmUpICE9PSAnc2tpcCcgPyBPYmplY3Qua2V5cyhyZXNwb25zaXZlVmFsdWUpLnJlZHVjZSgoY3VycmVudFZhbHVlLCBrZXkpID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudFZhbHVlKSwga2V5ICE9PSAnZGVza3RvcCcgJiYga2V5ICE9PSAndGFibGV0JyAmJiBrZXkgIT09ICdfX2NoYW5nZWQnICYmIE9iamVjdC5rZXlzKG1heWJlUHJvbW90ZVNjYWxhclZhbHVlSW50b1Jlc3BvbnNpdmUob3B0aW9uLnZhbHVlKSkucmVkdWNlKChyZXN1bHQsIGtleSkgPT4gcmVzdWx0ID8gbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZShvcHRpb24udmFsdWUpW2tleV0gPT09IG1heWJlUHJvbW90ZVNjYWxhclZhbHVlSW50b1Jlc3BvbnNpdmUob3B0aW9uLnZhbHVlKS5kZXNrdG9wIDogZmFsc2UsIHRydWUpICYmIChyZXNwb25zaXZlVmFsdWUuX19jaGFuZ2VkIHx8IFtdKS5pbmRleE9mKGtleSkgPT09IC0xID8ge1xuICAgICAgW2tleV06IHNjYWxhclZhbHVlXG4gICAgfSA6IHt9KSwge30pIDoge30pLCB7fSwge1xuICAgICAgX19jaGFuZ2VkOiBbLi4uKHJlc3BvbnNpdmVWYWx1ZS5fX2NoYW5nZWQgfHwgW10pLCAuLi4oZGV2aWNlICE9PSAnZGVza3RvcCcgPyBbZGV2aWNlXSA6IFtdKV0uZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KVxuICAgIH0pIDogc2NhbGFyVmFsdWUpO1xuICB9O1xuICAvKipcbiAgICogSGFuZGxlIHRyYW5zcGFyZW50IGNvbXBvbmVudHNcbiAgICovXG5cblxuICBpZiAoIU9wdGlvbkNvbXBvbmVudCkge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIFwiVW5pbXBsZW1lbnRlZCBvcHRpb246IFwiLCBvcHRpb24udHlwZSk7XG4gIH1cblxuICBsZXQgcmVuZGVyaW5nQ29uZmlnID0ge1xuICAgIGRlc2lnbjogdHJ1ZSxcbiAgICBsYWJlbDogdHJ1ZSxcbiAgICB3cmFwcGVyQXR0cjoge31cbiAgfTtcblxuICBsZXQgTGFiZWxUb29sYmFyID0gKCkgPT4gbnVsbDtcblxuICBsZXQgT3B0aW9uTWV0YVdyYXBwZXIgPSBudWxsO1xuXG4gIGxldCBDb250cm9sRW5kID0gKCkgPT4gbnVsbDtcblxuICBsZXQgc2VjdGlvbkNsYXNzTmFtZSA9ICgpID0+ICh7fSk7XG5cbiAgcmVuZGVyaW5nQ29uZmlnID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZW5kZXJpbmdDb25maWcpLCBPcHRpb25Db21wb25lbnQucmVuZGVyaW5nQ29uZmlnIHx8IHt9KTtcblxuICBpZiAob3B0aW9uLmRlc2lnbikge1xuICAgIHJlbmRlcmluZ0NvbmZpZy5kZXNpZ24gPSBvcHRpb24uZGVzaWduO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZW5kZXJpbmdDb25maWcuZGVzaWduID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVuZGVyaW5nQ29uZmlnLmRlc2lnbiA9IHJlbmRlcmluZ0NvbmZpZy5kZXNpZ24oe1xuICAgICAgb3B0aW9uLFxuICAgICAgdmFsdWU6IHZhbHVlV2l0aFJlc3BvbnNpdmVcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChPcHRpb25Db21wb25lbnQuTGFiZWxUb29sYmFyKSB7XG4gICAgTGFiZWxUb29sYmFyID0gT3B0aW9uQ29tcG9uZW50LkxhYmVsVG9vbGJhcjtcbiAgfVxuXG4gIGlmIChPcHRpb25Db21wb25lbnQuQ29udHJvbEVuZCkge1xuICAgIENvbnRyb2xFbmQgPSBPcHRpb25Db21wb25lbnQuQ29udHJvbEVuZDtcbiAgfVxuXG4gIGlmIChPcHRpb25Db21wb25lbnQuTWV0YVdyYXBwZXIpIHtcbiAgICBPcHRpb25NZXRhV3JhcHBlciA9IE9wdGlvbkNvbXBvbmVudC5NZXRhV3JhcHBlcjtcbiAgfVxuXG4gIGlmIChPcHRpb25Db21wb25lbnQuc2VjdGlvbkNsYXNzTmFtZSkge1xuICAgIHNlY3Rpb25DbGFzc05hbWUgPSBPcHRpb25Db21wb25lbnQuc2VjdGlvbkNsYXNzTmFtZTtcbiAgfVxuXG4gIGxldCBPcHRpb25Db21wb25lbnRXaXRob3V0RGVzaWduID0gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgQmVmb3JlT3B0aW9uQ29udGVudCAmJiBCZWZvcmVPcHRpb25Db250ZW50LmNvbnRlbnQsIGNyZWF0ZUVsZW1lbnQoT3B0aW9uQ29tcG9uZW50LCB7XG4gICAga2V5OiBpZCxcbiAgICBvcHRpb246IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9uKSwge30sIHtcbiAgICAgIHZhbHVlOiBpc09wdGlvblJlc3BvbnNpdmVGb3Iob3B0aW9uLCB7XG4gICAgICAgIGlnbm9yZUhpZGRlbjogdHJ1ZVxuICAgICAgfSkgPyBnZXRWYWx1ZUZvckRldmljZSh7XG4gICAgICAgIGRldmljZSxcbiAgICAgICAgb3B0aW9uLFxuICAgICAgICB2YWx1ZTogbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZShvcHRpb24udmFsdWUgfHwgJycpXG4gICAgICB9KSA6IG1heWJlUHJvbW90ZVNjYWxhclZhbHVlSW50b1Jlc3BvbnNpdmUob3B0aW9uLnZhbHVlIHx8ICcnLCBpc09wdGlvblJlc3BvbnNpdmVGb3Iob3B0aW9uKSlcbiAgICB9KSxcbiAgICB2YWx1ZTogdmFsdWVXaXRoUmVzcG9uc2l2ZSxcbiAgICBpZCxcbiAgICB2YWx1ZXMsXG4gICAgb25DaGFuZ2VGb3IsXG4gICAgZGV2aWNlLFxuICAgIG9uQ2hhbmdlOiBvbkNoYW5nZVdpdGhSZXNwb25zaXZlQnJpZGdlXG4gIH0pKTtcblxuICBpZiAoIXJlbmRlcmluZ0NvbmZpZy5kZXNpZ24gfHwgcmVuZGVyaW5nQ29uZmlnLmRlc2lnbiA9PT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIE9wdGlvbkNvbXBvbmVudFdpdGhvdXREZXNpZ247XG4gIH1cblxuICBsZXQgbWF5YmVMYWJlbCA9IGdldE9wdGlvbkxhYmVsRm9yKHtcbiAgICBpZCxcbiAgICBvcHRpb24sXG4gICAgdmFsdWVzLFxuICAgIHJlbmRlcmluZ0NvbmZpZ1xuICB9KTtcbiAgbGV0IG1heWJlRGVzYyA9IE9iamVjdC5rZXlzKG9wdGlvbikuaW5kZXhPZignZGVzYycpID09PSAtMSA/IGZhbHNlIDogb3B0aW9uLmRlc2M7XG4gIGxldCBtYXliZUxpbmsgPSBPYmplY3Qua2V5cyhvcHRpb24pLmluZGV4T2YoJ2xpbmsnKSA9PT0gLTEgPyBmYWxzZSA6IG9wdGlvbi5saW5rIHx8ICcgJztcbiAgY29uc3QgYWN0dWFsRGVzaWduVHlwZSA9IHR5cGVvZiByZW5kZXJpbmdDb25maWcuZGVzaWduID09PSAnYm9vbGVhbicgPyAnYmxvY2snIDogcmVuZGVyaW5nQ29uZmlnLmRlc2lnbjtcblxuICBpZiAocmVuZGVyaW5nQ29uZmlnLmRlc2lnbiA9PT0gJ2NvbXBhY3QnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIsIG9wdGlvbi5zZWN0aW9uQXR0ciB8fCB7fSwgbWF5YmVMYWJlbCAmJiBjcmVhdGVFbGVtZW50KFwibGFiZWxcIiwgbnVsbCwgbWF5YmVMYWJlbCksIChpc09wdGlvblJlc3BvbnNpdmVGb3Iob3B0aW9uKSAmJiBpc09wdGlvbkVuYWJsZWRGb3IoZGV2aWNlLCBvcHRpb24ucmVzcG9uc2l2ZSkgfHwgIWlzT3B0aW9uUmVzcG9uc2l2ZUZvcihvcHRpb24pKSAmJiBPcHRpb25Db21wb25lbnRXaXRob3V0RGVzaWduLCBtYXliZUxpbmsgJiYgY3JlYXRlRWxlbWVudChcImFcIiwgX2V4dGVuZHMoe1xuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgICAgX19odG1sOiBtYXliZUxpbmtcbiAgICAgIH1cbiAgICB9LCBvcHRpb24ubGlua0F0dHIgfHwge30pKSk7XG4gIH1cblxuICBjb25zdCBnZXRBY3R1YWxPcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGxldCB7XG4gICAgICB3cmFwcGVyQXR0cjoge1xuICAgICAgICBjbGFzc05hbWVcbiAgICAgIH0gPSB7fVxuICAgIH0gPSBfcmVmNCxcbiAgICAgICAgYWRkaXRpb25hbFdyYXBwZXJBdHRyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY0LndyYXBwZXJBdHRyLCBfZXhjbHVkZWQpLFxuICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNCwgX2V4Y2x1ZGVkMik7XG5cbiAgICBjb25zdCBfcmVmNSA9IG9wdGlvbi53cmFwcGVyQXR0ciB8fCB7fSxcbiAgICAgICAgICB7XG4gICAgICBjbGFzc05hbWU6IG9wdGlvbkNsYXNzTmFtZVxuICAgIH0gPSBfcmVmNSxcbiAgICAgICAgICBvcHRpb25BZGRpdGlvbmFsV3JhcHBlckF0dHIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjUsIF9leGNsdWRlZDMpO1xuXG4gICAgbGV0IGNvbXB1dGVPcHRpb25WYWx1ZSA9IHJlbmRlcmluZ0NvbmZpZy5jb21wdXRlT3B0aW9uVmFsdWU7XG5cbiAgICBpZiAoIWNvbXB1dGVPcHRpb25WYWx1ZSkge1xuICAgICAgY29tcHV0ZU9wdGlvblZhbHVlID0gbyA9PiBvO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3QtY29udHJvbCcsIGNsYXNzTmFtZSwgb3B0aW9uQ2xhc3NOYW1lLCB7fSksXG4gICAgICBcImRhdGEtZGVzaWduXCI6IGFjdHVhbERlc2lnblR5cGVcbiAgICB9LCBvcHRpb24uZGl2aWRlciA/IHtcbiAgICAgICdkYXRhLWRpdmlkZXInOiBvcHRpb24uZGl2aWRlclxuICAgIH0gOiB7fSwgX29iamVjdFNwcmVhZCh7fSwgaXNPcHRpb25SZXNwb25zaXZlRm9yKG9wdGlvbikgJiYgIWlzT3B0aW9uRW5hYmxlZEZvcihkZXZpY2UsIG9wdGlvbi5yZXNwb25zaXZlKSB8fCBvcHRpb24uc3RhdGUgPT09ICdkaXNhYmxlZCcgPyB7XG4gICAgICAnZGF0YS1zdGF0ZSc6ICdkaXNhYmxlZCdcbiAgICB9IDoge30pLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbkFkZGl0aW9uYWxXcmFwcGVyQXR0ciksIGFkZGl0aW9uYWxXcmFwcGVyQXR0cikpLCBjcmVhdGVFbGVtZW50KFwiaGVhZGVyXCIsIG51bGwsIG1heWJlTGFiZWwgJiYgY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIG51bGwsIG1heWJlTGFiZWwpLCBvcHRpb24udHlwZSAhPT0gJ2N0LWltYWdlLXBpY2tlcicgJiYgb3B0aW9uLnR5cGUgIT09ICdjdC1sYXllcnMnICYmIG9wdGlvbi50eXBlICE9PSAnY3QtaW1hZ2UtdXBsb2FkZXInICYmIG9wdGlvbi50eXBlICE9PSAnY3QtcGFuZWwnICYmIGhhc1JldmVydEJ1dHRvbiAmJiAhb3B0aW9uLmRpc2FibGVSZXZlcnRCdXR0b24gJiYgY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgZGlzYWJsZWQ6IGRlZXBFcXVhbChjb21wdXRlT3B0aW9uVmFsdWUob3B0aW9uLnZhbHVlKSwgcmVuZGVyaW5nQ29uZmlnLmdldFZhbHVlRm9yUmV2ZXJ0ID8gcmVuZGVyaW5nQ29uZmlnLmdldFZhbHVlRm9yUmV2ZXJ0KHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbixcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICBkZXZpY2VcbiAgICAgIH0pIDogb3B0aW9uV2l0aERlZmF1bHQoe1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3B0aW9uXG4gICAgICB9KSksXG4gICAgICBjbGFzc05hbWU6IFwiY3QtcmV2ZXJ0XCIsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgIGlmIChyZW5kZXJpbmdDb25maWcucGVyZm9ybVJldmVydCkge1xuICAgICAgICAgIHJlbmRlcmluZ0NvbmZpZy5wZXJmb3JtUmV2ZXJ0KHtcbiAgICAgICAgICAgIG9uQ2hhbmdlRm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBvbkNoYW5nZVdpdGhNb2JpbGVCcmlkZ2Uob3B0aW9uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KSwgY3JlYXRlRWxlbWVudChMYWJlbFRvb2xiYXIsIHtcbiAgICAgIG9wdGlvbixcbiAgICAgIHZhbHVlOiB2YWx1ZVdpdGhSZXNwb25zaXZlLFxuICAgICAgaWQsXG4gICAgICBvbkNoYW5nZTogb25DaGFuZ2VXaXRoUmVzcG9uc2l2ZUJyaWRnZVxuICAgIH0pLCBpc09wdGlvblJlc3BvbnNpdmVGb3Iob3B0aW9uLCB7XG4gICAgICBpZ25vcmVIaWRkZW46IHRydWVcbiAgICB9KSAmJiBhY3R1YWxEZXNpZ25UeXBlLmluZGV4T2YoJ2Jsb2NrJykgPiAtMSAmJiAhb3B0aW9uLnNraXBSZXNwb25zaXZlQ29udHJvbHMgJiYgY3JlYXRlRWxlbWVudChSZXNwb25zaXZlQ29udHJvbHMsIHtcbiAgICAgIGRldmljZTogZGV2aWNlLFxuICAgICAgcmVzcG9uc2l2ZURlc2NyaXB0b3I6IG9wdGlvbi5yZXNwb25zaXZlLFxuICAgICAgc2V0RGV2aWNlOiBzZXREZXZpY2VcbiAgICB9KSksIGlzT3B0aW9uUmVzcG9uc2l2ZUZvcihvcHRpb24pICYmICFpc09wdGlvbkVuYWJsZWRGb3IoZGV2aWNlLCBvcHRpb24ucmVzcG9uc2l2ZSkgJiYgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiY3QtZGlzYWJsZWQtbm90aWZpY2F0aW9uXCJcbiAgICB9LCBvcHRpb24uZGlzYWJsZWREZXZpY2VNZXNzYWdlIHx8IF9fKFwiT3B0aW9uIGNhbid0IGJlIGVkaXRlZCBmb3IgY3VycmVudCBkZXZpY2VcIiwgJ2Jsb2Nrc3knKSksIChpc09wdGlvblJlc3BvbnNpdmVGb3Iob3B0aW9uKSAmJiBpc09wdGlvbkVuYWJsZWRGb3IoZGV2aWNlLCBvcHRpb24ucmVzcG9uc2l2ZSkgfHwgIWlzT3B0aW9uUmVzcG9uc2l2ZUZvcihvcHRpb24pKSAmJiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCBfZXh0ZW5kcyh7fSwgb3B0aW9uLnNlY3Rpb25BdHRyIHx8IHt9LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoe1xuICAgICAgICAnY3QtcmVzcG9uc2l2ZS1jb250YWluZXInOiBpc09wdGlvblJlc3BvbnNpdmVGb3Iob3B0aW9uLCB7XG4gICAgICAgICAgaWdub3JlSGlkZGVuOiB0cnVlXG4gICAgICAgIH0pICYmIGFjdHVhbERlc2lnblR5cGUgPT09ICdpbmxpbmUnXG4gICAgICB9LCBzZWN0aW9uQ2xhc3NOYW1lKHtcbiAgICAgICAgZGVzaWduOiBhY3R1YWxEZXNpZ25UeXBlLFxuICAgICAgICBvcHRpb25cbiAgICAgIH0pLCAob3B0aW9uLnNlY3Rpb25BdHRyIHx8IHt9KS5jbGFzcyB8fCAnJylcbiAgICB9KSwgaXNPcHRpb25SZXNwb25zaXZlRm9yKG9wdGlvbiwge1xuICAgICAgaWdub3JlSGlkZGVuOiB0cnVlXG4gICAgfSkgJiYgYWN0dWFsRGVzaWduVHlwZSA9PT0gJ2lubGluZScgJiYgY3JlYXRlRWxlbWVudChSZXNwb25zaXZlQ29udHJvbHMsIHtcbiAgICAgIGRldmljZTogZGV2aWNlLFxuICAgICAgcmVzcG9uc2l2ZURlc2NyaXB0b3I6IG9wdGlvbi5yZXNwb25zaXZlLFxuICAgICAgc2V0RGV2aWNlOiBzZXREZXZpY2VcbiAgICB9KSwgT3B0aW9uQ29tcG9uZW50V2l0aG91dERlc2lnbiwgbWF5YmVMaW5rICYmIGNyZWF0ZUVsZW1lbnQoXCJhXCIsIF9leHRlbmRzKHtcbiAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgIF9faHRtbDogbWF5YmVMaW5rXG4gICAgICB9XG4gICAgfSwgb3B0aW9uLmxpbmtBdHRyIHx8IHt9KSkpLCBjcmVhdGVFbGVtZW50KENvbnRyb2xFbmQsIG51bGwpLCBtYXliZURlc2MgJiYgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICBfX2h0bWw6IG1heWJlRGVzY1xuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogXCJjdC1vcHRpb24tZGVzY3JpcHRpb25cIlxuICAgIH0pKSkpO1xuICB9O1xuXG4gIHJldHVybiBPcHRpb25NZXRhV3JhcHBlciA/IGNyZWF0ZUVsZW1lbnQoT3B0aW9uTWV0YVdyYXBwZXIsIHtcbiAgICBpZDogaWQsXG4gICAgb3B0aW9uOiBvcHRpb24sXG4gICAgdmFsdWU6IHZhbHVlV2l0aFJlc3BvbnNpdmUsXG4gICAgb25DaGFuZ2VGb3I6IG9uQ2hhbmdlRm9yLFxuICAgIHZhbHVlczogdmFsdWVzLFxuICAgIGdldEFjdHVhbE9wdGlvbjogZ2V0QWN0dWFsT3B0aW9uXG4gIH0pIDogZ2V0QWN0dWFsT3B0aW9uKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBHZW5lcmljT3B0aW9uVHlwZTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6095\n")},7429:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": () => (/* binding */ options_OptionsPanel)\n});\n\n// EXTERNAL MODULE: external "window.wp.element"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./static/js/options/GenericOptionType.js\nvar GenericOptionType = __webpack_require__(6095);\n// EXTERNAL MODULE: ./node_modules/match-conditions/dist/index.es.js\nvar index_es = __webpack_require__(7465);\n// EXTERNAL MODULE: ./static/js/customizer/components/useDeviceManager.js\nvar useDeviceManager = __webpack_require__(5458);\n;// CONCATENATED MODULE: ./static/js/options/containers/use-force-update.js\n\n\nconst reducer = (state, _) => !state;\n\nconst useForceUpdate = () => {\n const [, dispatch] = (0,external_window_wp_element_.useReducer)(reducer, true);\n const memoizedDispatch = (0,external_window_wp_element_.useMemo)(() => () => {\n dispatch(null);\n }, [dispatch]);\n return memoizedDispatch;\n};\n\n/* harmony default export */ const use_force_update = (useForceUpdate);\n;// CONCATENATED MODULE: ./static/js/options/containers/Condition.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst Condition = _ref => {\n let {\n renderingChunk,\n value,\n onChange,\n purpose,\n parentValue,\n hasRevertButton\n } = _ref;\n const forceUpdate = use_force_update();\n const {\n currentView\n } = (0,useDeviceManager/* useDeviceManagerState */.$M)();\n (0,external_window_wp_element_.useEffect)(() => {\n renderingChunk.map(conditionOption => conditionOption.global && Object.keys(conditionOption.condition).map(key => wp.customize(key, val => val.bind(to => setTimeout(() => forceUpdate())))));\n }, []);\n return renderingChunk.map(conditionOption => {\n let valueForCondition = null;\n\n if (conditionOption.values_source === \'global\') {\n let allReplaces = Array.isArray(conditionOption.perform_replace) ? conditionOption.perform_replace : [conditionOption.perform_replace];\n\n let conditionToWatch = _objectSpread(_objectSpread({}, conditionOption.condition), conditionOption.perform_replace ? (Array.isArray(conditionOption.perform_replace) ? conditionOption.perform_replace : [conditionOption.perform_replace]).reduce((res, singleReplace) => {\n return _objectSpread(_objectSpread({}, res), conditionOption.perform_replace.condition);\n }, {}) : {});\n\n valueForCondition = Object.keys(conditionToWatch).reduce((current, key) => _objectSpread(_objectSpread({}, current), {}, {\n [key]: wp.customize(key)()\n }), {});\n }\n\n if (conditionOption.values_source === \'parent\') {\n valueForCondition = parentValue;\n }\n\n if (!valueForCondition) {\n valueForCondition = _objectSpread(_objectSpread({}, value), {}, {\n wp_customizer_current_view: currentView\n });\n }\n\n if (conditionOption.perform_replace) {\n let allReplaces = Array.isArray(conditionOption.perform_replace) ? conditionOption.perform_replace : [conditionOption.perform_replace];\n allReplaces.map(singleReplace => {\n let conditionReplaceMatches = (0,index_es/* matchValuesWithCondition */.Nj)((0,index_es/* normalizeCondition */.KY)(singleReplace.condition), valueForCondition);\n\n if (conditionReplaceMatches && valueForCondition[singleReplace.key] && valueForCondition[singleReplace.key] === singleReplace.from) {\n valueForCondition[singleReplace.key] = singleReplace.to;\n }\n });\n }\n\n let conditionMatches = (0,index_es/* matchValuesWithCondition */.Nj)((0,index_es/* normalizeCondition */.KY)(conditionOption.condition), valueForCondition);\n return conditionMatches ? (0,external_window_wp_element_.createElement)(options_OptionsPanel, {\n purpose: purpose,\n key: conditionOption.id,\n onChange: onChange,\n options: conditionOption.options,\n value: value,\n hasRevertButton: hasRevertButton,\n parentValue: parentValue\n }) : [];\n });\n};\n\n/* harmony default export */ const containers_Condition = (Condition);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n;// CONCATENATED MODULE: ./static/js/options/containers/Tabs.js\nfunction Tabs_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\nclass Tabs extends external_window_wp_element_.Component {\n constructor() {\n super(...arguments);\n\n Tabs_defineProperty(this, "state", {\n currentTab: 0\n });\n }\n\n render() {\n const filteredTabs = this.props.renderingChunk.filter(singleTab => !singleTab.condition || (0,index_es/* matchValuesWithCondition */.Nj)((0,index_es/* normalizeCondition */.KY)(singleTab.condition), this.props.value));\n const currentTab = filteredTabs[this.state.currentTab];\n return (0,external_window_wp_element_.createElement)("div", {\n className: "ct-tabs"\n }, (0,external_window_wp_element_.createElement)("ul", null, filteredTabs.map((singleTab, index) => ({\n singleTab,\n index\n })).map(_ref => {\n let {\n singleTab,\n index\n } = _ref;\n return (0,external_window_wp_element_.createElement)("li", {\n key: singleTab.id,\n onClick: () => this.setState({\n currentTab: index\n }),\n className: classnames_default()({\n active: index === this.state.currentTab\n })\n }, singleTab.title ? singleTab.title : singleTab.id);\n })), (0,external_window_wp_element_.createElement)("div", {\n className: "ct-current-tab"\n }, (0,external_window_wp_element_.createElement)(options_OptionsPanel, {\n purpose: this.props.purpose,\n key: currentTab.id,\n onChange: (key, val) => this.props.onChange(key, val),\n options: currentTab.options,\n value: this.props.value\n })));\n }\n\n}\n/*\nconst Condition = ({ renderingChunk, value, onChange }) =>\n\trenderingChunk.map(\n\t\tconditionOption =>\n\t\t\tmatchValuesWithCondition(\n\t\t\t\tnormalizeCondition(conditionOption.condition),\n\t\t\t\tvalue\n\t\t\t) ? (\n\t\t\t\t onChange({ ...value, ...val })}\n\t\t\t\t\toptions={conditionOption.options}\n\t\t\t\t\tvalue={value}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t[]\n\t\t\t)\n\t)\n\nexport default Condition\n\n*/\n// EXTERNAL MODULE: ./static/js/customizer/components/responsive-controls.js\nvar responsive_controls = __webpack_require__(4616);\n;// CONCATENATED MODULE: ./static/js/options/containers/Group.js\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\n\n\n\n\n\n\nconst Group = _ref => {\n let {\n renderingChunk,\n value,\n onChange,\n purpose,\n hasRevertButton\n } = _ref;\n return renderingChunk.map(groupOption => {\n const {\n label,\n options,\n id,\n attr = {},\n wrapperAttr = {},\n responsive = false\n } = groupOption;\n const {\n currentView\n } = (0,useDeviceManager/* useDeviceManagerState */.$M)();\n const {\n setDevice\n } = (0,useDeviceManager/* useDeviceManagerActions */.Id)();\n const groupContents = (0,external_window_wp_element_.createElement)(options_OptionsPanel, {\n purpose: purpose,\n onChange: onChange,\n options: options,\n value: value,\n hasRevertButton: hasRevertButton\n });\n return (0,external_window_wp_element_.createElement)("div", _extends({\n key: id,\n className: "ct-controls-group"\n }, wrapperAttr), label && (0,external_window_wp_element_.createElement)("header", null, (0,external_window_wp_element_.createElement)("label", null, label), responsive && (0,external_window_wp_element_.createElement)(responsive_controls/* default */.ZP, {\n device: currentView,\n responsiveDescriptor: responsive,\n setDevice: setDevice\n })), (0,external_window_wp_element_.createElement)("section", _extends({}, attr, currentView !== \'desktop\' ? {\n \'data-disabled-last\': \'\'\n } : {}), groupContents));\n });\n};\n\n/* harmony default export */ const containers_Group = (Group);\n// EXTERNAL MODULE: ./node_modules/deep-equal/index.js\nvar deep_equal = __webpack_require__(251);\nvar deep_equal_default = /*#__PURE__*/__webpack_require__.n(deep_equal);\n// EXTERNAL MODULE: ./static/js/options/helpers/get-label.js\nvar get_label = __webpack_require__(7493);\n;// CONCATENATED MODULE: ./static/js/options/containers/LabeledGroup.js\nfunction LabeledGroup_extends() { LabeledGroup_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return LabeledGroup_extends.apply(this, arguments); }\n\nfunction LabeledGroup_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction LabeledGroup_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? LabeledGroup_ownKeys(Object(source), !0).forEach(function (key) { LabeledGroup_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : LabeledGroup_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction LabeledGroup_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\nconst SingleChoice = _ref => {\n let {\n singleChoice,\n groupOption,\n purpose,\n onChange,\n value,\n hasRevertButton,\n parentValue\n } = _ref;\n return (0,external_window_wp_element_.createElement)("div", {\n key: singleChoice.id,\n className: "ct-labeled-group-item"\n }, singleChoice.label && (0,external_window_wp_element_.createElement)("label", null, singleChoice.label), (0,external_window_wp_element_.createElement)(options_OptionsPanel, {\n purpose: purpose,\n key: groupOption.id,\n onChange: onChange,\n options: {\n [singleChoice.id]: LabeledGroup_objectSpread(LabeledGroup_objectSpread({}, groupOption.options[singleChoice.id]), {}, {\n design: \'none\'\n })\n },\n value: value,\n hasRevertButton: hasRevertButton,\n parentValue: parentValue\n }));\n};\n\nconst LabeledGroup = _ref2 => {\n let {\n renderingChunk,\n value,\n onChange,\n purpose,\n parentValue,\n hasRevertButton\n } = _ref2;\n const {\n currentView\n } = (0,useDeviceManager/* useDeviceManagerState */.$M)();\n const {\n setDevice\n } = (0,useDeviceManager/* useDeviceManagerActions */.Id)();\n return renderingChunk.map(groupOption => {\n let valueForCondition = null;\n\n if (!valueForCondition) {\n valueForCondition = LabeledGroup_objectSpread(LabeledGroup_objectSpread({}, value), {}, {\n wp_customizer_current_view: currentView\n });\n }\n\n const totalAmountofMatched = groupOption.choices.filter(singleChoice => singleChoice.condition ? (0,index_es/* matchValuesWithCondition */.Nj)((0,index_es/* normalizeCondition */.KY)(singleChoice.condition), valueForCondition) : true);\n let maybeLabel = (0,get_label/* getOptionLabelFor */.m)({\n id: groupOption.id,\n option: groupOption,\n values: value\n });\n\n if (totalAmountofMatched.length === 0) {\n return null;\n }\n\n if (totalAmountofMatched.length === 1) {\n return (0,external_window_wp_element_.createElement)(options_OptionsPanel, {\n purpose: purpose,\n onChange: onChange,\n key: groupOption.id,\n options: {\n [groupOption.choices[0].id]: LabeledGroup_objectSpread(LabeledGroup_objectSpread({}, groupOption.options[groupOption.choices[0].id]), groupOption.divider ? {\n divider: groupOption.divider\n } : {})\n },\n value: value,\n hasRevertButton: hasRevertButton,\n parentValue: parentValue\n });\n }\n\n return (0,external_window_wp_element_.createElement)("div", LabeledGroup_extends({\n className: "ct-control",\n "data-design": "block"\n }, groupOption.divider ? {\n \'data-divider\': groupOption.divider\n } : {}), (0,external_window_wp_element_.createElement)("header", null, maybeLabel && (0,external_window_wp_element_.createElement)("label", null, maybeLabel), (0,external_window_wp_element_.createElement)("button", {\n type: "button",\n disabled: groupOption.choices.every(_ref3 => {\n let {\n id\n } = _ref3;\n return deep_equal_default()(groupOption.options[id].value, (0,GenericOptionType/* optionWithDefault */.y1)({\n value: value[id],\n option: groupOption.options[id]\n }));\n }),\n className: "ct-revert",\n onClick: () => {\n groupOption.choices.reduce((previousPromise, nextChoice) => {\n return previousPromise.then(() => {\n return new Promise(r => {\n setTimeout(() => {\n onChange(nextChoice.id, groupOption.options[nextChoice.id].value);\n r();\n });\n });\n });\n }, Promise.resolve());\n }\n }), groupOption.responsive && (0,external_window_wp_element_.createElement)(responsive_controls/* default */.ZP, {\n device: currentView,\n responsiveDescriptor: groupOption.responsive,\n setDevice: setDevice\n })), (0,external_window_wp_element_.createElement)("section", {\n className: "ct-labeled-group"\n }, totalAmountofMatched.map(singleChoice => (0,external_window_wp_element_.createElement)(SingleChoice, {\n key: singleChoice.id,\n singleChoice: singleChoice,\n groupOption: groupOption,\n purpose: purpose,\n onChange: onChange,\n value: value,\n hasRevertButton: hasRevertButton,\n parentValue: parentValue\n }))));\n });\n};\n\n/* harmony default export */ const containers_LabeledGroup = (LabeledGroup);\n;// CONCATENATED MODULE: ./static/js/options/containers/ct-has-meta-category-button.js\n\n\n\nconst ct_has_meta_category_button_Group = _ref => {\n let {\n renderingChunk,\n value,\n onChange,\n purpose,\n hasRevertButton\n } = _ref;\n return renderingChunk.map(conditionOption => {\n const {\n label,\n options,\n id,\n attr = {},\n responsive = false,\n optionId\n } = conditionOption;\n\n if (value[optionId].find(_ref2 => {\n let {\n id,\n enabled,\n meta_elements\n } = _ref2;\n return enabled && (id === \'post_meta\' || id === \'custom_meta\') && (meta_elements || []).find(_ref3 => {\n let {\n id,\n style\n } = _ref3;\n return (id === \'categories\' || id === \'tags\') && style === \'pill\';\n });\n })) {\n return (0,external_window_wp_element_.createElement)(options_OptionsPanel, {\n purpose: purpose,\n onChange: onChange,\n options: options,\n value: value,\n hasRevertButton: hasRevertButton\n });\n }\n\n return null;\n });\n};\n\n/* harmony default export */ const ct_has_meta_category_button = (ct_has_meta_category_button_Group);\n;// CONCATENATED MODULE: ./static/js/options/GenericContainerType.js\n\n\n\n\n\n\n\nconst GenericContainerType = _ref => {\n let {\n value,\n renderingChunk,\n onChange,\n parentValue,\n purpose,\n hasRevertButton\n } = _ref;\n let Container = null;\n\n if (renderingChunk[0].type === \'ct-has-meta-category-button\') {\n Container = ct_has_meta_category_button;\n }\n\n if (renderingChunk[0].type === \'ct-condition\') {\n Container = containers_Condition;\n }\n\n if (renderingChunk[0].type === \'tab\') {\n Container = Tabs;\n }\n\n if (renderingChunk[0].type === \'ct-group\') {\n Container = containers_Group;\n }\n\n if (renderingChunk[0].type === \'ct-labeled-group\') {\n Container = containers_LabeledGroup;\n }\n\n if (Container) {\n return (0,external_window_wp_element_.createElement)(Container, {\n purpose: purpose,\n onChange: onChange,\n value: value,\n renderingChunk: renderingChunk,\n hasRevertButton: hasRevertButton,\n parentValue: parentValue\n });\n }\n\n return (0,external_window_wp_element_.createElement)("div", null, "Unknown container type.");\n};\n\n/* harmony default export */ const options_GenericContainerType = (GenericContainerType);\n// EXTERNAL MODULE: ./static/js/options/helpers/get-value-from-input.js\nvar get_value_from_input = __webpack_require__(7069);\n;// CONCATENATED MODULE: ./static/js/options/OptionsPanel.js\nfunction OptionsPanel_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction OptionsPanel_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? OptionsPanel_ownKeys(Object(source), !0).forEach(function (key) { OptionsPanel_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : OptionsPanel_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction OptionsPanel_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nconst OptionsPanel = props => {\n let {\n options,\n value,\n onChange,\n // default | customizer\n purpose = \'default\',\n hasRevertButton = true,\n renderOptions = null,\n parentValue\n } = props;\n\n if (renderOptions) {\n return renderOptions({\n value,\n onChange\n });\n }\n\n let SlotFillProvider = null;\n\n if (window.wp.components) {\n SlotFillProvider = window.wp.components.SlotFillProvider;\n }\n\n const renderingChunks = (0,external_window_wp_element_.useMemo)(() => {\n const localOptions = (0,get_value_from_input/* flattenOptions */.UO)(options);\n return [...(localOptions.__CT_KEYS_ORDER__ ? Object.keys(localOptions.__CT_KEYS_ORDER__).map(orderKey => parseInt(orderKey, 10)).sort((a, b) => a - b).map(orderKey => localOptions.__CT_KEYS_ORDER__[orderKey]) : Object.keys(localOptions))].filter(id => id !== \'__CT_KEYS_ORDER__\').map(id => OptionsPanel_objectSpread(OptionsPanel_objectSpread({}, localOptions[id]), {}, {\n id\n })).reduce((chunksHolder, currentOptionDescriptor, index) => {\n if (chunksHolder.length === 0) {\n return [[currentOptionDescriptor]];\n }\n\n let lastChunk = chunksHolder[chunksHolder.length - 1];\n\n if ((lastChunk[0].options && lastChunk[0].type === currentOptionDescriptor.type || currentOptionDescriptor.type === \'ct-tab-group\' || currentOptionDescriptor.type === \'ct-tab-group-sync\') &&\n /**\n * Do not group rendering chunks for boxes\n */\n currentOptionDescriptor.type !== \'box\' &&\n /**\n * Do not group rendering chunks for ct-popup\'s\n */\n currentOptionDescriptor.type !== \'ct-popup\') {\n return [...chunksHolder.slice(0, -1), [...lastChunk, currentOptionDescriptor]];\n }\n\n return [...chunksHolder, [currentOptionDescriptor]];\n }, []);\n }, [options]);\n let finalResult = renderingChunks.map(renderingChunk => {\n /**\n * We are dealing with a container\n */\n if (renderingChunk[0].options || renderingChunk[0].type === \'ct-tab-group-sync\') {\n return (0,external_window_wp_element_.createElement)(options_GenericContainerType, {\n key: renderingChunk[0].id,\n value: value,\n parentValue: parentValue,\n renderingChunk: renderingChunk,\n onChange: onChange,\n purpose: purpose,\n hasRevertButton: hasRevertButton\n });\n }\n /**\n * We have a regular option type here\n */\n\n\n return (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n hasRevertButton: hasRevertButton,\n purpose: purpose,\n key: renderingChunk[0].id,\n id: renderingChunk[0].id,\n value: value[renderingChunk[0].id],\n values: value,\n option: renderingChunk[0],\n onChangeFor: (id, newValue) => onChange(id, newValue),\n onChange: newValue => onChange(renderingChunk[0].id, newValue)\n });\n });\n return window.wp.components ? (0,external_window_wp_element_.createElement)(SlotFillProvider, null, finalResult) : finalResult;\n};\n\n/* harmony default export */ const options_OptionsPanel = (OptionsPanel);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQyOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL2NvbnRhaW5lcnMvdXNlLWZvcmNlLXVwZGF0ZS5qcz8zOWNiIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvY29udGFpbmVycy9Db25kaXRpb24uanM/YzA1MiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL2NvbnRhaW5lcnMvVGFicy5qcz9kYWZjIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvY29udGFpbmVycy9Hcm91cC5qcz9hODdhIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvY29udGFpbmVycy9MYWJlbGVkR3JvdXAuanM/YjAxOSIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL2NvbnRhaW5lcnMvY3QtaGFzLW1ldGEtY2F0ZWdvcnktYnV0dG9uLmpzP2QzMGUiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9HZW5lcmljQ29udGFpbmVyVHlwZS5qcz81Y2M3Iiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvT3B0aW9uc1BhbmVsLmpzPzFlZjAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlTWVtbywgdXNlUmVkdWNlciB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5cbmNvbnN0IHJlZHVjZXIgPSAoc3RhdGUsIF8pID0+ICFzdGF0ZTtcblxuY29uc3QgdXNlRm9yY2VVcGRhdGUgPSAoKSA9PiB7XG4gIGNvbnN0IFssIGRpc3BhdGNoXSA9IHVzZVJlZHVjZXIocmVkdWNlciwgdHJ1ZSk7XG4gIGNvbnN0IG1lbW9pemVkRGlzcGF0Y2ggPSB1c2VNZW1vKCgpID0+ICgpID0+IHtcbiAgICBkaXNwYXRjaChudWxsKTtcbiAgfSwgW2Rpc3BhdGNoXSk7XG4gIHJldHVybiBtZW1vaXplZERpc3BhdGNoO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgdXNlRm9yY2VVcGRhdGU7IiwiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgdXNlTWVtbywgdXNlRWZmZWN0IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vT3B0aW9uc1BhbmVsJztcbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmRpdGlvbiwgbWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uIH0gZnJvbSAnbWF0Y2gtY29uZGl0aW9ucyc7XG5pbXBvcnQgeyB1c2VEZXZpY2VNYW5hZ2VyU3RhdGUgfSBmcm9tICcuLi8uLi9jdXN0b21pemVyL2NvbXBvbmVudHMvdXNlRGV2aWNlTWFuYWdlcic7XG5pbXBvcnQgdXNlRm9yY2VVcGRhdGUgZnJvbSAnLi91c2UtZm9yY2UtdXBkYXRlJztcblxuY29uc3QgQ29uZGl0aW9uID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgcmVuZGVyaW5nQ2h1bmssXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gICAgcHVycG9zZSxcbiAgICBwYXJlbnRWYWx1ZSxcbiAgICBoYXNSZXZlcnRCdXR0b25cbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgY29uc3Qge1xuICAgIGN1cnJlbnRWaWV3XG4gIH0gPSB1c2VEZXZpY2VNYW5hZ2VyU3RhdGUoKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZW5kZXJpbmdDaHVuay5tYXAoY29uZGl0aW9uT3B0aW9uID0+IGNvbmRpdGlvbk9wdGlvbi5nbG9iYWwgJiYgT2JqZWN0LmtleXMoY29uZGl0aW9uT3B0aW9uLmNvbmRpdGlvbikubWFwKGtleSA9PiB3cC5jdXN0b21pemUoa2V5LCB2YWwgPT4gdmFsLmJpbmQodG8gPT4gc2V0VGltZW91dCgoKSA9PiBmb3JjZVVwZGF0ZSgpKSkpKSk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHJlbmRlcmluZ0NodW5rLm1hcChjb25kaXRpb25PcHRpb24gPT4ge1xuICAgIGxldCB2YWx1ZUZvckNvbmRpdGlvbiA9IG51bGw7XG5cbiAgICBpZiAoY29uZGl0aW9uT3B0aW9uLnZhbHVlc19zb3VyY2UgPT09ICdnbG9iYWwnKSB7XG4gICAgICBsZXQgYWxsUmVwbGFjZXMgPSBBcnJheS5pc0FycmF5KGNvbmRpdGlvbk9wdGlvbi5wZXJmb3JtX3JlcGxhY2UpID8gY29uZGl0aW9uT3B0aW9uLnBlcmZvcm1fcmVwbGFjZSA6IFtjb25kaXRpb25PcHRpb24ucGVyZm9ybV9yZXBsYWNlXTtcblxuICAgICAgbGV0IGNvbmRpdGlvblRvV2F0Y2ggPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbmRpdGlvbk9wdGlvbi5jb25kaXRpb24pLCBjb25kaXRpb25PcHRpb24ucGVyZm9ybV9yZXBsYWNlID8gKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uT3B0aW9uLnBlcmZvcm1fcmVwbGFjZSkgPyBjb25kaXRpb25PcHRpb24ucGVyZm9ybV9yZXBsYWNlIDogW2NvbmRpdGlvbk9wdGlvbi5wZXJmb3JtX3JlcGxhY2VdKS5yZWR1Y2UoKHJlcywgc2luZ2xlUmVwbGFjZSkgPT4ge1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXMpLCBjb25kaXRpb25PcHRpb24ucGVyZm9ybV9yZXBsYWNlLmNvbmRpdGlvbik7XG4gICAgICB9LCB7fSkgOiB7fSk7XG5cbiAgICAgIHZhbHVlRm9yQ29uZGl0aW9uID0gT2JqZWN0LmtleXMoY29uZGl0aW9uVG9XYXRjaCkucmVkdWNlKChjdXJyZW50LCBrZXkpID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudCksIHt9LCB7XG4gICAgICAgIFtrZXldOiB3cC5jdXN0b21pemUoa2V5KSgpXG4gICAgICB9KSwge30pO1xuICAgIH1cblxuICAgIGlmIChjb25kaXRpb25PcHRpb24udmFsdWVzX3NvdXJjZSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHZhbHVlRm9yQ29uZGl0aW9uID0gcGFyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKCF2YWx1ZUZvckNvbmRpdGlvbikge1xuICAgICAgdmFsdWVGb3JDb25kaXRpb24gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgd3BfY3VzdG9taXplcl9jdXJyZW50X3ZpZXc6IGN1cnJlbnRWaWV3XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29uZGl0aW9uT3B0aW9uLnBlcmZvcm1fcmVwbGFjZSkge1xuICAgICAgbGV0IGFsbFJlcGxhY2VzID0gQXJyYXkuaXNBcnJheShjb25kaXRpb25PcHRpb24ucGVyZm9ybV9yZXBsYWNlKSA/IGNvbmRpdGlvbk9wdGlvbi5wZXJmb3JtX3JlcGxhY2UgOiBbY29uZGl0aW9uT3B0aW9uLnBlcmZvcm1fcmVwbGFjZV07XG4gICAgICBhbGxSZXBsYWNlcy5tYXAoc2luZ2xlUmVwbGFjZSA9PiB7XG4gICAgICAgIGxldCBjb25kaXRpb25SZXBsYWNlTWF0Y2hlcyA9IG1hdGNoVmFsdWVzV2l0aENvbmRpdGlvbihub3JtYWxpemVDb25kaXRpb24oc2luZ2xlUmVwbGFjZS5jb25kaXRpb24pLCB2YWx1ZUZvckNvbmRpdGlvbik7XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvblJlcGxhY2VNYXRjaGVzICYmIHZhbHVlRm9yQ29uZGl0aW9uW3NpbmdsZVJlcGxhY2Uua2V5XSAmJiB2YWx1ZUZvckNvbmRpdGlvbltzaW5nbGVSZXBsYWNlLmtleV0gPT09IHNpbmdsZVJlcGxhY2UuZnJvbSkge1xuICAgICAgICAgIHZhbHVlRm9yQ29uZGl0aW9uW3NpbmdsZVJlcGxhY2Uua2V5XSA9IHNpbmdsZVJlcGxhY2UudG87XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBjb25kaXRpb25NYXRjaGVzID0gbWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uKG5vcm1hbGl6ZUNvbmRpdGlvbihjb25kaXRpb25PcHRpb24uY29uZGl0aW9uKSwgdmFsdWVGb3JDb25kaXRpb24pO1xuICAgIHJldHVybiBjb25kaXRpb25NYXRjaGVzID8gY3JlYXRlRWxlbWVudChPcHRpb25zUGFuZWwsIHtcbiAgICAgIHB1cnBvc2U6IHB1cnBvc2UsXG4gICAgICBrZXk6IGNvbmRpdGlvbk9wdGlvbi5pZCxcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgIG9wdGlvbnM6IGNvbmRpdGlvbk9wdGlvbi5vcHRpb25zLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgaGFzUmV2ZXJ0QnV0dG9uOiBoYXNSZXZlcnRCdXR0b24sXG4gICAgICBwYXJlbnRWYWx1ZTogcGFyZW50VmFsdWVcbiAgICB9KSA6IFtdO1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbmRpdGlvbjsiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBGcmFnbWVudCwgQ29tcG9uZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vT3B0aW9uc1BhbmVsJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQ29uZGl0aW9uLCBtYXRjaFZhbHVlc1dpdGhDb25kaXRpb24gfSBmcm9tICdtYXRjaC1jb25kaXRpb25zJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRhYnMgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic3RhdGVcIiwge1xuICAgICAgY3VycmVudFRhYjogMFxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGZpbHRlcmVkVGFicyA9IHRoaXMucHJvcHMucmVuZGVyaW5nQ2h1bmsuZmlsdGVyKHNpbmdsZVRhYiA9PiAhc2luZ2xlVGFiLmNvbmRpdGlvbiB8fCBtYXRjaFZhbHVlc1dpdGhDb25kaXRpb24obm9ybWFsaXplQ29uZGl0aW9uKHNpbmdsZVRhYi5jb25kaXRpb24pLCB0aGlzLnByb3BzLnZhbHVlKSk7XG4gICAgY29uc3QgY3VycmVudFRhYiA9IGZpbHRlcmVkVGFic1t0aGlzLnN0YXRlLmN1cnJlbnRUYWJdO1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjdC10YWJzXCJcbiAgICB9LCBjcmVhdGVFbGVtZW50KFwidWxcIiwgbnVsbCwgZmlsdGVyZWRUYWJzLm1hcCgoc2luZ2xlVGFiLCBpbmRleCkgPT4gKHtcbiAgICAgIHNpbmdsZVRhYixcbiAgICAgIGluZGV4XG4gICAgfSkpLm1hcChfcmVmID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIHNpbmdsZVRhYixcbiAgICAgICAgaW5kZXhcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGtleTogc2luZ2xlVGFiLmlkLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjdXJyZW50VGFiOiBpbmRleFxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKHtcbiAgICAgICAgICBhY3RpdmU6IGluZGV4ID09PSB0aGlzLnN0YXRlLmN1cnJlbnRUYWJcbiAgICAgICAgfSlcbiAgICAgIH0sIHNpbmdsZVRhYi50aXRsZSA/IHNpbmdsZVRhYi50aXRsZSA6IHNpbmdsZVRhYi5pZCk7XG4gICAgfSkpLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjdC1jdXJyZW50LXRhYlwiXG4gICAgfSwgY3JlYXRlRWxlbWVudChPcHRpb25zUGFuZWwsIHtcbiAgICAgIHB1cnBvc2U6IHRoaXMucHJvcHMucHVycG9zZSxcbiAgICAgIGtleTogY3VycmVudFRhYi5pZCxcbiAgICAgIG9uQ2hhbmdlOiAoa2V5LCB2YWwpID0+IHRoaXMucHJvcHMub25DaGFuZ2Uoa2V5LCB2YWwpLFxuICAgICAgb3B0aW9uczogY3VycmVudFRhYi5vcHRpb25zLFxuICAgICAgdmFsdWU6IHRoaXMucHJvcHMudmFsdWVcbiAgICB9KSkpO1xuICB9XG5cbn1cbi8qXG5jb25zdCBDb25kaXRpb24gPSAoeyByZW5kZXJpbmdDaHVuaywgdmFsdWUsIG9uQ2hhbmdlIH0pID0+XG5cdHJlbmRlcmluZ0NodW5rLm1hcChcblx0XHRjb25kaXRpb25PcHRpb24gPT5cblx0XHRcdG1hdGNoVmFsdWVzV2l0aENvbmRpdGlvbihcblx0XHRcdFx0bm9ybWFsaXplQ29uZGl0aW9uKGNvbmRpdGlvbk9wdGlvbi5jb25kaXRpb24pLFxuXHRcdFx0XHR2YWx1ZVxuXHRcdFx0KSA/IChcblx0XHRcdFx0PE9wdGlvbnNQYW5lbFxuXHRcdFx0XHRcdGtleT17Y29uZGl0aW9uT3B0aW9uLmlkfVxuXHRcdFx0XHRcdG9uQ2hhbmdlPXt2YWwgPT4gb25DaGFuZ2UoeyAuLi52YWx1ZSwgLi4udmFsIH0pfVxuXHRcdFx0XHRcdG9wdGlvbnM9e2NvbmRpdGlvbk9wdGlvbi5vcHRpb25zfVxuXHRcdFx0XHRcdHZhbHVlPXt2YWx1ZX1cblx0XHRcdFx0Lz5cblx0XHRcdCkgOiAoXG5cdFx0XHRcdFtdXG5cdFx0XHQpXG5cdClcblxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uXG5cbiovIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vT3B0aW9uc1BhbmVsJztcbmltcG9ydCB7IGNhcGl0YWxpemVGaXJzdExldHRlciB9IGZyb20gJy4uL0dlbmVyaWNPcHRpb25UeXBlJztcbmltcG9ydCB7IHVzZURldmljZU1hbmFnZXJTdGF0ZSwgdXNlRGV2aWNlTWFuYWdlckFjdGlvbnMgfSBmcm9tICcuLi8uLi9jdXN0b21pemVyL2NvbXBvbmVudHMvdXNlRGV2aWNlTWFuYWdlcic7XG5pbXBvcnQgUmVzcG9uc2l2ZUNvbnRyb2xzIGZyb20gJy4uLy4uL2N1c3RvbWl6ZXIvY29tcG9uZW50cy9yZXNwb25zaXZlLWNvbnRyb2xzJztcblxuY29uc3QgR3JvdXAgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICByZW5kZXJpbmdDaHVuayxcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgICBwdXJwb3NlLFxuICAgIGhhc1JldmVydEJ1dHRvblxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIHJlbmRlcmluZ0NodW5rLm1hcChncm91cE9wdGlvbiA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgbGFiZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgaWQsXG4gICAgICBhdHRyID0ge30sXG4gICAgICB3cmFwcGVyQXR0ciA9IHt9LFxuICAgICAgcmVzcG9uc2l2ZSA9IGZhbHNlXG4gICAgfSA9IGdyb3VwT3B0aW9uO1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRWaWV3XG4gICAgfSA9IHVzZURldmljZU1hbmFnZXJTdGF0ZSgpO1xuICAgIGNvbnN0IHtcbiAgICAgIHNldERldmljZVxuICAgIH0gPSB1c2VEZXZpY2VNYW5hZ2VyQWN0aW9ucygpO1xuICAgIGNvbnN0IGdyb3VwQ29udGVudHMgPSBjcmVhdGVFbGVtZW50KE9wdGlvbnNQYW5lbCwge1xuICAgICAgcHVycG9zZTogcHVycG9zZSxcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBoYXNSZXZlcnRCdXR0b246IGhhc1JldmVydEJ1dHRvblxuICAgIH0pO1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICAgIGtleTogaWQsXG4gICAgICBjbGFzc05hbWU6IFwiY3QtY29udHJvbHMtZ3JvdXBcIlxuICAgIH0sIHdyYXBwZXJBdHRyKSwgbGFiZWwgJiYgY3JlYXRlRWxlbWVudChcImhlYWRlclwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwibGFiZWxcIiwgbnVsbCwgbGFiZWwpLCByZXNwb25zaXZlICYmIGNyZWF0ZUVsZW1lbnQoUmVzcG9uc2l2ZUNvbnRyb2xzLCB7XG4gICAgICBkZXZpY2U6IGN1cnJlbnRWaWV3LFxuICAgICAgcmVzcG9uc2l2ZURlc2NyaXB0b3I6IHJlc3BvbnNpdmUsXG4gICAgICBzZXREZXZpY2U6IHNldERldmljZVxuICAgIH0pKSwgY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgX2V4dGVuZHMoe30sIGF0dHIsIGN1cnJlbnRWaWV3ICE9PSAnZGVza3RvcCcgPyB7XG4gICAgICAnZGF0YS1kaXNhYmxlZC1sYXN0JzogJydcbiAgICB9IDoge30pLCBncm91cENvbnRlbnRzKSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgR3JvdXA7IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHVzZU1lbW8sIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VDb250ZXh0IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vT3B0aW9uc1BhbmVsJztcbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmRpdGlvbiwgbWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uIH0gZnJvbSAnbWF0Y2gtY29uZGl0aW9ucyc7XG5pbXBvcnQgeyB1c2VEZXZpY2VNYW5hZ2VyU3RhdGUsIHVzZURldmljZU1hbmFnZXJBY3Rpb25zIH0gZnJvbSAnLi4vLi4vY3VzdG9taXplci9jb21wb25lbnRzL3VzZURldmljZU1hbmFnZXInO1xuaW1wb3J0IHsgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBvcHRpb25XaXRoRGVmYXVsdCB9IGZyb20gJy4uL0dlbmVyaWNPcHRpb25UeXBlJztcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCc7XG5pbXBvcnQgUmVzcG9uc2l2ZUNvbnRyb2xzIGZyb20gJy4uLy4uL2N1c3RvbWl6ZXIvY29tcG9uZW50cy9yZXNwb25zaXZlLWNvbnRyb2xzJztcbmltcG9ydCB7IGdldE9wdGlvbkxhYmVsRm9yIH0gZnJvbSAnLi4vaGVscGVycy9nZXQtbGFiZWwnO1xuXG5jb25zdCBTaW5nbGVDaG9pY2UgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBzaW5nbGVDaG9pY2UsXG4gICAgZ3JvdXBPcHRpb24sXG4gICAgcHVycG9zZSxcbiAgICBvbkNoYW5nZSxcbiAgICB2YWx1ZSxcbiAgICBoYXNSZXZlcnRCdXR0b24sXG4gICAgcGFyZW50VmFsdWVcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IHNpbmdsZUNob2ljZS5pZCxcbiAgICBjbGFzc05hbWU6IFwiY3QtbGFiZWxlZC1ncm91cC1pdGVtXCJcbiAgfSwgc2luZ2xlQ2hvaWNlLmxhYmVsICYmIGNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBudWxsLCBzaW5nbGVDaG9pY2UubGFiZWwpLCBjcmVhdGVFbGVtZW50KE9wdGlvbnNQYW5lbCwge1xuICAgIHB1cnBvc2U6IHB1cnBvc2UsXG4gICAga2V5OiBncm91cE9wdGlvbi5pZCxcbiAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgb3B0aW9uczoge1xuICAgICAgW3NpbmdsZUNob2ljZS5pZF06IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ3JvdXBPcHRpb24ub3B0aW9uc1tzaW5nbGVDaG9pY2UuaWRdKSwge30sIHtcbiAgICAgICAgZGVzaWduOiAnbm9uZSdcbiAgICAgIH0pXG4gICAgfSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgaGFzUmV2ZXJ0QnV0dG9uOiBoYXNSZXZlcnRCdXR0b24sXG4gICAgcGFyZW50VmFsdWU6IHBhcmVudFZhbHVlXG4gIH0pKTtcbn07XG5cbmNvbnN0IExhYmVsZWRHcm91cCA9IF9yZWYyID0+IHtcbiAgbGV0IHtcbiAgICByZW5kZXJpbmdDaHVuayxcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgICBwdXJwb3NlLFxuICAgIHBhcmVudFZhbHVlLFxuICAgIGhhc1JldmVydEJ1dHRvblxuICB9ID0gX3JlZjI7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50Vmlld1xuICB9ID0gdXNlRGV2aWNlTWFuYWdlclN0YXRlKCk7XG4gIGNvbnN0IHtcbiAgICBzZXREZXZpY2VcbiAgfSA9IHVzZURldmljZU1hbmFnZXJBY3Rpb25zKCk7XG4gIHJldHVybiByZW5kZXJpbmdDaHVuay5tYXAoZ3JvdXBPcHRpb24gPT4ge1xuICAgIGxldCB2YWx1ZUZvckNvbmRpdGlvbiA9IG51bGw7XG5cbiAgICBpZiAoIXZhbHVlRm9yQ29uZGl0aW9uKSB7XG4gICAgICB2YWx1ZUZvckNvbmRpdGlvbiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgICB3cF9jdXN0b21pemVyX2N1cnJlbnRfdmlldzogY3VycmVudFZpZXdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdGFsQW1vdW50b2ZNYXRjaGVkID0gZ3JvdXBPcHRpb24uY2hvaWNlcy5maWx0ZXIoc2luZ2xlQ2hvaWNlID0+IHNpbmdsZUNob2ljZS5jb25kaXRpb24gPyBtYXRjaFZhbHVlc1dpdGhDb25kaXRpb24obm9ybWFsaXplQ29uZGl0aW9uKHNpbmdsZUNob2ljZS5jb25kaXRpb24pLCB2YWx1ZUZvckNvbmRpdGlvbikgOiB0cnVlKTtcbiAgICBsZXQgbWF5YmVMYWJlbCA9IGdldE9wdGlvbkxhYmVsRm9yKHtcbiAgICAgIGlkOiBncm91cE9wdGlvbi5pZCxcbiAgICAgIG9wdGlvbjogZ3JvdXBPcHRpb24sXG4gICAgICB2YWx1ZXM6IHZhbHVlXG4gICAgfSk7XG5cbiAgICBpZiAodG90YWxBbW91bnRvZk1hdGNoZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodG90YWxBbW91bnRvZk1hdGNoZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChPcHRpb25zUGFuZWwsIHtcbiAgICAgICAgcHVycG9zZTogcHVycG9zZSxcbiAgICAgICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgICAgICBrZXk6IGdyb3VwT3B0aW9uLmlkLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgW2dyb3VwT3B0aW9uLmNob2ljZXNbMF0uaWRdOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdyb3VwT3B0aW9uLm9wdGlvbnNbZ3JvdXBPcHRpb24uY2hvaWNlc1swXS5pZF0pLCBncm91cE9wdGlvbi5kaXZpZGVyID8ge1xuICAgICAgICAgICAgZGl2aWRlcjogZ3JvdXBPcHRpb24uZGl2aWRlclxuICAgICAgICAgIH0gOiB7fSlcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBoYXNSZXZlcnRCdXR0b246IGhhc1JldmVydEJ1dHRvbixcbiAgICAgICAgcGFyZW50VmFsdWU6IHBhcmVudFZhbHVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IFwiY3QtY29udHJvbFwiLFxuICAgICAgXCJkYXRhLWRlc2lnblwiOiBcImJsb2NrXCJcbiAgICB9LCBncm91cE9wdGlvbi5kaXZpZGVyID8ge1xuICAgICAgJ2RhdGEtZGl2aWRlcic6IGdyb3VwT3B0aW9uLmRpdmlkZXJcbiAgICB9IDoge30pLCBjcmVhdGVFbGVtZW50KFwiaGVhZGVyXCIsIG51bGwsIG1heWJlTGFiZWwgJiYgY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIG51bGwsIG1heWJlTGFiZWwpLCBjcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICBkaXNhYmxlZDogZ3JvdXBPcHRpb24uY2hvaWNlcy5ldmVyeShfcmVmMyA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IF9yZWYzO1xuICAgICAgICByZXR1cm4gZGVlcEVxdWFsKGdyb3VwT3B0aW9uLm9wdGlvbnNbaWRdLnZhbHVlLCBvcHRpb25XaXRoRGVmYXVsdCh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlW2lkXSxcbiAgICAgICAgICBvcHRpb246IGdyb3VwT3B0aW9uLm9wdGlvbnNbaWRdXG4gICAgICAgIH0pKTtcbiAgICAgIH0pLFxuICAgICAgY2xhc3NOYW1lOiBcImN0LXJldmVydFwiLFxuICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICBncm91cE9wdGlvbi5jaG9pY2VzLnJlZHVjZSgocHJldmlvdXNQcm9taXNlLCBuZXh0Q2hvaWNlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyID0+IHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgb25DaGFuZ2UobmV4dENob2ljZS5pZCwgZ3JvdXBPcHRpb24ub3B0aW9uc1tuZXh0Q2hvaWNlLmlkXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcigpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSk7XG4gICAgICB9XG4gICAgfSksIGdyb3VwT3B0aW9uLnJlc3BvbnNpdmUgJiYgY3JlYXRlRWxlbWVudChSZXNwb25zaXZlQ29udHJvbHMsIHtcbiAgICAgIGRldmljZTogY3VycmVudFZpZXcsXG4gICAgICByZXNwb25zaXZlRGVzY3JpcHRvcjogZ3JvdXBPcHRpb24ucmVzcG9uc2l2ZSxcbiAgICAgIHNldERldmljZTogc2V0RGV2aWNlXG4gICAgfSkpLCBjcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiY3QtbGFiZWxlZC1ncm91cFwiXG4gICAgfSwgdG90YWxBbW91bnRvZk1hdGNoZWQubWFwKHNpbmdsZUNob2ljZSA9PiBjcmVhdGVFbGVtZW50KFNpbmdsZUNob2ljZSwge1xuICAgICAga2V5OiBzaW5nbGVDaG9pY2UuaWQsXG4gICAgICBzaW5nbGVDaG9pY2U6IHNpbmdsZUNob2ljZSxcbiAgICAgIGdyb3VwT3B0aW9uOiBncm91cE9wdGlvbixcbiAgICAgIHB1cnBvc2U6IHB1cnBvc2UsXG4gICAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBoYXNSZXZlcnRCdXR0b246IGhhc1JldmVydEJ1dHRvbixcbiAgICAgIHBhcmVudFZhbHVlOiBwYXJlbnRWYWx1ZVxuICAgIH0pKSkpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExhYmVsZWRHcm91cDsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgT3B0aW9uc1BhbmVsIGZyb20gJy4uL09wdGlvbnNQYW5lbCc7XG5cbmNvbnN0IEdyb3VwID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgcmVuZGVyaW5nQ2h1bmssXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gICAgcHVycG9zZSxcbiAgICBoYXNSZXZlcnRCdXR0b25cbiAgfSA9IF9yZWY7XG4gIHJldHVybiByZW5kZXJpbmdDaHVuay5tYXAoY29uZGl0aW9uT3B0aW9uID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBsYWJlbCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpZCxcbiAgICAgIGF0dHIgPSB7fSxcbiAgICAgIHJlc3BvbnNpdmUgPSBmYWxzZSxcbiAgICAgIG9wdGlvbklkXG4gICAgfSA9IGNvbmRpdGlvbk9wdGlvbjtcblxuICAgIGlmICh2YWx1ZVtvcHRpb25JZF0uZmluZChfcmVmMiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpZCxcbiAgICAgICAgZW5hYmxlZCxcbiAgICAgICAgbWV0YV9lbGVtZW50c1xuICAgICAgfSA9IF9yZWYyO1xuICAgICAgcmV0dXJuIGVuYWJsZWQgJiYgKGlkID09PSAncG9zdF9tZXRhJyB8fCBpZCA9PT0gJ2N1c3RvbV9tZXRhJykgJiYgKG1ldGFfZWxlbWVudHMgfHwgW10pLmZpbmQoX3JlZjMgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIHN0eWxlXG4gICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2NhdGVnb3JpZXMnIHx8IGlkID09PSAndGFncycpICYmIHN0eWxlID09PSAncGlsbCc7XG4gICAgICB9KTtcbiAgICB9KSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoT3B0aW9uc1BhbmVsLCB7XG4gICAgICAgIHB1cnBvc2U6IHB1cnBvc2UsXG4gICAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBoYXNSZXZlcnRCdXR0b246IGhhc1JldmVydEJ1dHRvblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgR3JvdXA7IiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IENvbmRpdGlvbiBmcm9tICcuL2NvbnRhaW5lcnMvQ29uZGl0aW9uJztcbmltcG9ydCBUYWJzIGZyb20gJy4vY29udGFpbmVycy9UYWJzJztcbmltcG9ydCBHcm91cCBmcm9tICcuL2NvbnRhaW5lcnMvR3JvdXAnO1xuaW1wb3J0IExhYmVsZWRHcm91cCBmcm9tICcuL2NvbnRhaW5lcnMvTGFiZWxlZEdyb3VwJztcbmltcG9ydCBIYXNNZXRhQ2F0ZWdvcnlCdXR0b24gZnJvbSAnLi9jb250YWluZXJzL2N0LWhhcy1tZXRhLWNhdGVnb3J5LWJ1dHRvbic7XG5cbmNvbnN0IEdlbmVyaWNDb250YWluZXJUeXBlID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgcmVuZGVyaW5nQ2h1bmssXG4gICAgb25DaGFuZ2UsXG4gICAgcGFyZW50VmFsdWUsXG4gICAgcHVycG9zZSxcbiAgICBoYXNSZXZlcnRCdXR0b25cbiAgfSA9IF9yZWY7XG4gIGxldCBDb250YWluZXIgPSBudWxsO1xuXG4gIGlmIChyZW5kZXJpbmdDaHVua1swXS50eXBlID09PSAnY3QtaGFzLW1ldGEtY2F0ZWdvcnktYnV0dG9uJykge1xuICAgIENvbnRhaW5lciA9IEhhc01ldGFDYXRlZ29yeUJ1dHRvbjtcbiAgfVxuXG4gIGlmIChyZW5kZXJpbmdDaHVua1swXS50eXBlID09PSAnY3QtY29uZGl0aW9uJykge1xuICAgIENvbnRhaW5lciA9IENvbmRpdGlvbjtcbiAgfVxuXG4gIGlmIChyZW5kZXJpbmdDaHVua1swXS50eXBlID09PSAndGFiJykge1xuICAgIENvbnRhaW5lciA9IFRhYnM7XG4gIH1cblxuICBpZiAocmVuZGVyaW5nQ2h1bmtbMF0udHlwZSA9PT0gJ2N0LWdyb3VwJykge1xuICAgIENvbnRhaW5lciA9IEdyb3VwO1xuICB9XG5cbiAgaWYgKHJlbmRlcmluZ0NodW5rWzBdLnR5cGUgPT09ICdjdC1sYWJlbGVkLWdyb3VwJykge1xuICAgIENvbnRhaW5lciA9IExhYmVsZWRHcm91cDtcbiAgfVxuXG4gIGlmIChDb250YWluZXIpIHtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChDb250YWluZXIsIHtcbiAgICAgIHB1cnBvc2U6IHB1cnBvc2UsXG4gICAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICByZW5kZXJpbmdDaHVuazogcmVuZGVyaW5nQ2h1bmssXG4gICAgICBoYXNSZXZlcnRCdXR0b246IGhhc1JldmVydEJ1dHRvbixcbiAgICAgIHBhcmVudFZhbHVlOiBwYXJlbnRWYWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgXCJVbmtub3duIGNvbnRhaW5lciB0eXBlLlwiKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdlbmVyaWNDb250YWluZXJUeXBlOyIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgRnJhZ21lbnQsIG1lbW8sIHVzZU1lbW8gfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IEdlbmVyaWNPcHRpb25UeXBlIGZyb20gJy4vR2VuZXJpY09wdGlvblR5cGUnO1xuaW1wb3J0IEdlbmVyaWNDb250YWluZXJUeXBlIGZyb20gJy4vR2VuZXJpY0NvbnRhaW5lclR5cGUnO1xuaW1wb3J0IHsgZmxhdHRlbk9wdGlvbnMgfSBmcm9tICcuL2hlbHBlcnMvZ2V0LXZhbHVlLWZyb20taW5wdXQnO1xuXG5jb25zdCBPcHRpb25zUGFuZWwgPSBwcm9wcyA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9ucyxcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgICAvLyBkZWZhdWx0IHwgY3VzdG9taXplclxuICAgIHB1cnBvc2UgPSAnZGVmYXVsdCcsXG4gICAgaGFzUmV2ZXJ0QnV0dG9uID0gdHJ1ZSxcbiAgICByZW5kZXJPcHRpb25zID0gbnVsbCxcbiAgICBwYXJlbnRWYWx1ZVxuICB9ID0gcHJvcHM7XG5cbiAgaWYgKHJlbmRlck9wdGlvbnMpIHtcbiAgICByZXR1cm4gcmVuZGVyT3B0aW9ucyh7XG4gICAgICB2YWx1ZSxcbiAgICAgIG9uQ2hhbmdlXG4gICAgfSk7XG4gIH1cblxuICBsZXQgU2xvdEZpbGxQcm92aWRlciA9IG51bGw7XG5cbiAgaWYgKHdpbmRvdy53cC5jb21wb25lbnRzKSB7XG4gICAgU2xvdEZpbGxQcm92aWRlciA9IHdpbmRvdy53cC5jb21wb25lbnRzLlNsb3RGaWxsUHJvdmlkZXI7XG4gIH1cblxuICBjb25zdCByZW5kZXJpbmdDaHVua3MgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBsb2NhbE9wdGlvbnMgPSBmbGF0dGVuT3B0aW9ucyhvcHRpb25zKTtcbiAgICByZXR1cm4gWy4uLihsb2NhbE9wdGlvbnMuX19DVF9LRVlTX09SREVSX18gPyBPYmplY3Qua2V5cyhsb2NhbE9wdGlvbnMuX19DVF9LRVlTX09SREVSX18pLm1hcChvcmRlcktleSA9PiBwYXJzZUludChvcmRlcktleSwgMTApKS5zb3J0KChhLCBiKSA9PiBhIC0gYikubWFwKG9yZGVyS2V5ID0+IGxvY2FsT3B0aW9ucy5fX0NUX0tFWVNfT1JERVJfX1tvcmRlcktleV0pIDogT2JqZWN0LmtleXMobG9jYWxPcHRpb25zKSldLmZpbHRlcihpZCA9PiBpZCAhPT0gJ19fQ1RfS0VZU19PUkRFUl9fJykubWFwKGlkID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbG9jYWxPcHRpb25zW2lkXSksIHt9LCB7XG4gICAgICBpZFxuICAgIH0pKS5yZWR1Y2UoKGNodW5rc0hvbGRlciwgY3VycmVudE9wdGlvbkRlc2NyaXB0b3IsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2h1bmtzSG9sZGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW1tjdXJyZW50T3B0aW9uRGVzY3JpcHRvcl1dO1xuICAgICAgfVxuXG4gICAgICBsZXQgbGFzdENodW5rID0gY2h1bmtzSG9sZGVyW2NodW5rc0hvbGRlci5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKChsYXN0Q2h1bmtbMF0ub3B0aW9ucyAmJiBsYXN0Q2h1bmtbMF0udHlwZSA9PT0gY3VycmVudE9wdGlvbkRlc2NyaXB0b3IudHlwZSB8fCBjdXJyZW50T3B0aW9uRGVzY3JpcHRvci50eXBlID09PSAnY3QtdGFiLWdyb3VwJyB8fCBjdXJyZW50T3B0aW9uRGVzY3JpcHRvci50eXBlID09PSAnY3QtdGFiLWdyb3VwLXN5bmMnKSAmJlxuICAgICAgLyoqXG4gICAgICAgKiBEbyBub3QgZ3JvdXAgcmVuZGVyaW5nIGNodW5rcyBmb3IgYm94ZXNcbiAgICAgICAqL1xuICAgICAgY3VycmVudE9wdGlvbkRlc2NyaXB0b3IudHlwZSAhPT0gJ2JveCcgJiZcbiAgICAgIC8qKlxuICAgICAgICogRG8gbm90IGdyb3VwIHJlbmRlcmluZyBjaHVua3MgZm9yIGN0LXBvcHVwJ3NcbiAgICAgICAqL1xuICAgICAgY3VycmVudE9wdGlvbkRlc2NyaXB0b3IudHlwZSAhPT0gJ2N0LXBvcHVwJykge1xuICAgICAgICByZXR1cm4gWy4uLmNodW5rc0hvbGRlci5zbGljZSgwLCAtMSksIFsuLi5sYXN0Q2h1bmssIGN1cnJlbnRPcHRpb25EZXNjcmlwdG9yXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbLi4uY2h1bmtzSG9sZGVyLCBbY3VycmVudE9wdGlvbkRlc2NyaXB0b3JdXTtcbiAgICB9LCBbXSk7XG4gIH0sIFtvcHRpb25zXSk7XG4gIGxldCBmaW5hbFJlc3VsdCA9IHJlbmRlcmluZ0NodW5rcy5tYXAocmVuZGVyaW5nQ2h1bmsgPT4ge1xuICAgIC8qKlxuICAgICAqIFdlIGFyZSBkZWFsaW5nIHdpdGggYSBjb250YWluZXJcbiAgICAgKi9cbiAgICBpZiAocmVuZGVyaW5nQ2h1bmtbMF0ub3B0aW9ucyB8fCByZW5kZXJpbmdDaHVua1swXS50eXBlID09PSAnY3QtdGFiLWdyb3VwLXN5bmMnKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChHZW5lcmljQ29udGFpbmVyVHlwZSwge1xuICAgICAgICBrZXk6IHJlbmRlcmluZ0NodW5rWzBdLmlkLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHBhcmVudFZhbHVlOiBwYXJlbnRWYWx1ZSxcbiAgICAgICAgcmVuZGVyaW5nQ2h1bms6IHJlbmRlcmluZ0NodW5rLFxuICAgICAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgICAgIHB1cnBvc2U6IHB1cnBvc2UsXG4gICAgICAgIGhhc1JldmVydEJ1dHRvbjogaGFzUmV2ZXJ0QnV0dG9uXG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2UgaGF2ZSBhIHJlZ3VsYXIgb3B0aW9uIHR5cGUgaGVyZVxuICAgICAqL1xuXG5cbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChHZW5lcmljT3B0aW9uVHlwZSwge1xuICAgICAgaGFzUmV2ZXJ0QnV0dG9uOiBoYXNSZXZlcnRCdXR0b24sXG4gICAgICBwdXJwb3NlOiBwdXJwb3NlLFxuICAgICAga2V5OiByZW5kZXJpbmdDaHVua1swXS5pZCxcbiAgICAgIGlkOiByZW5kZXJpbmdDaHVua1swXS5pZCxcbiAgICAgIHZhbHVlOiB2YWx1ZVtyZW5kZXJpbmdDaHVua1swXS5pZF0sXG4gICAgICB2YWx1ZXM6IHZhbHVlLFxuICAgICAgb3B0aW9uOiByZW5kZXJpbmdDaHVua1swXSxcbiAgICAgIG9uQ2hhbmdlRm9yOiAoaWQsIG5ld1ZhbHVlKSA9PiBvbkNoYW5nZShpZCwgbmV3VmFsdWUpLFxuICAgICAgb25DaGFuZ2U6IG5ld1ZhbHVlID0+IG9uQ2hhbmdlKHJlbmRlcmluZ0NodW5rWzBdLmlkLCBuZXdWYWx1ZSlcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB3aW5kb3cud3AuY29tcG9uZW50cyA/IGNyZWF0ZUVsZW1lbnQoU2xvdEZpbGxQcm92aWRlciwgbnVsbCwgZmluYWxSZXN1bHQpIDogZmluYWxSZXN1bHQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBPcHRpb25zUGFuZWw7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7429\n')},6086:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Z\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6715);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(underscore__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n\nconst InputWithOnlyNumbers = _ref => {\n let {\n disabled,\n className = '',\n value,\n onBlur,\n onChange,\n step = 1,\n placeholder = (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Default', 'blocksy')\n } = _ref;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"input\", {\n type: \"text\",\n value: value,\n onKeyDown: e => {\n // Allow: backspace, delete, tab, escape, enter and.\n if ( // Allow Esc\n [46, 8, 9, 27, 13, 110, 190, 27].indexOf(e.keyCode) > -1 || // Allow: Ctrl+A.\n e.keyCode == 65 && e.ctrlKey === true || // Allow -.\n e.keyCode == 109 || e.keyCode == 189 || e.keyCode == 173 || // Allow: Ctrl+C.\n e.keyCode == 67 && e.ctrlKey === true || // Allow: Ctrl+X.\n e.keyCode == 88 && e.ctrlKey === true || // Allow: home, end, left, right.\n e.keyCode >= 35 && e.keyCode <= 39 && e.keyCode !== 38 && e.keyCode !== 40) {\n // Let it happen, don't do anything.\n return;\n }\n\n let valueForComputation = '__unset__';\n\n if (value.toString().trim().length === 0) {\n valueForComputation = 0;\n } else {\n let maybeValue = parseFloat(value);\n\n if (maybeValue || maybeValue === 0) {\n valueForComputation = maybeValue;\n }\n }\n\n let actualStep = e.shiftKey ? step * 10 : step;\n /**\n * Arrow up\n */\n\n if (e.keyCode === 38 && value !== '__unset__') {\n onChange(valueForComputation + actualStep, true);\n }\n /**\n * Arrow down\n */\n\n\n if (e.keyCode === 40 && value !== '__unset__') {\n onChange(valueForComputation - actualStep, true);\n } // Ensure that it is a number and stop the keypress.\n\n\n if ((e.shiftKey || e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) {\n e.preventDefault();\n }\n },\n onChange: _ref2 => {\n let {\n target: {\n value\n }\n } = _ref2;\n return onChange(value);\n },\n placeholder: placeholder,\n onBlur: () => onBlur && onBlur,\n className: classnames__WEBPACK_IMPORTED_MODULE_3___default()({\n inactive: value === 'auto'\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (InputWithOnlyNumbers);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA4Ni5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9jb21wb25lbnRzL0lucHV0V2l0aE9ubHlOdW1iZXJzLmpzPzliY2MiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBfIGZyb20gJ3VuZGVyc2NvcmUnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmNvbnN0IElucHV0V2l0aE9ubHlOdW1iZXJzID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lID0gJycsXG4gICAgdmFsdWUsXG4gICAgb25CbHVyLFxuICAgIG9uQ2hhbmdlLFxuICAgIHN0ZXAgPSAxLFxuICAgIHBsYWNlaG9sZGVyID0gX18oJ0RlZmF1bHQnLCAnYmxvY2tzeScpXG4gIH0gPSBfcmVmO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICB0eXBlOiBcInRleHRcIixcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgb25LZXlEb3duOiBlID0+IHtcbiAgICAgIC8vIEFsbG93OiBiYWNrc3BhY2UsIGRlbGV0ZSwgdGFiLCBlc2NhcGUsIGVudGVyIGFuZC5cbiAgICAgIGlmICggLy8gQWxsb3cgRXNjXG4gICAgICBbNDYsIDgsIDksIDI3LCAxMywgMTEwLCAxOTAsIDI3XS5pbmRleE9mKGUua2V5Q29kZSkgPiAtMSB8fCAvLyBBbGxvdzogQ3RybCtBLlxuICAgICAgZS5rZXlDb2RlID09IDY1ICYmIGUuY3RybEtleSA9PT0gdHJ1ZSB8fCAvLyBBbGxvdyAtLlxuICAgICAgZS5rZXlDb2RlID09IDEwOSB8fCBlLmtleUNvZGUgPT0gMTg5IHx8IGUua2V5Q29kZSA9PSAxNzMgfHwgLy8gQWxsb3c6IEN0cmwrQy5cbiAgICAgIGUua2V5Q29kZSA9PSA2NyAmJiBlLmN0cmxLZXkgPT09IHRydWUgfHwgLy8gQWxsb3c6IEN0cmwrWC5cbiAgICAgIGUua2V5Q29kZSA9PSA4OCAmJiBlLmN0cmxLZXkgPT09IHRydWUgfHwgLy8gQWxsb3c6IGhvbWUsIGVuZCwgbGVmdCwgcmlnaHQuXG4gICAgICBlLmtleUNvZGUgPj0gMzUgJiYgZS5rZXlDb2RlIDw9IDM5ICYmIGUua2V5Q29kZSAhPT0gMzggJiYgZS5rZXlDb2RlICE9PSA0MCkge1xuICAgICAgICAvLyBMZXQgaXQgaGFwcGVuLCBkb24ndCBkbyBhbnl0aGluZy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgdmFsdWVGb3JDb21wdXRhdGlvbiA9ICdfX3Vuc2V0X18nO1xuXG4gICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhbHVlRm9yQ29tcHV0YXRpb24gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1heWJlVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgICAgICBpZiAobWF5YmVWYWx1ZSB8fCBtYXliZVZhbHVlID09PSAwKSB7XG4gICAgICAgICAgdmFsdWVGb3JDb21wdXRhdGlvbiA9IG1heWJlVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGFjdHVhbFN0ZXAgPSBlLnNoaWZ0S2V5ID8gc3RlcCAqIDEwIDogc3RlcDtcbiAgICAgIC8qKlxuICAgICAgICogQXJyb3cgdXBcbiAgICAgICAqL1xuXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAzOCAmJiB2YWx1ZSAhPT0gJ19fdW5zZXRfXycpIHtcbiAgICAgICAgb25DaGFuZ2UodmFsdWVGb3JDb21wdXRhdGlvbiArIGFjdHVhbFN0ZXAsIHRydWUpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBBcnJvdyBkb3duXG4gICAgICAgKi9cblxuXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSA0MCAmJiB2YWx1ZSAhPT0gJ19fdW5zZXRfXycpIHtcbiAgICAgICAgb25DaGFuZ2UodmFsdWVGb3JDb21wdXRhdGlvbiAtIGFjdHVhbFN0ZXAsIHRydWUpO1xuICAgICAgfSAvLyBFbnN1cmUgdGhhdCBpdCBpcyBhIG51bWJlciBhbmQgc3RvcCB0aGUga2V5cHJlc3MuXG5cblxuICAgICAgaWYgKChlLnNoaWZ0S2V5IHx8IGUua2V5Q29kZSA8IDQ4IHx8IGUua2V5Q29kZSA+IDU3KSAmJiAoZS5rZXlDb2RlIDwgOTYgfHwgZS5rZXlDb2RlID4gMTA1KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNoYW5nZTogX3JlZjIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSA9IF9yZWYyO1xuICAgICAgcmV0dXJuIG9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9LFxuICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlcixcbiAgICBvbkJsdXI6ICgpID0+IG9uQmx1ciAmJiBvbkJsdXIsXG4gICAgY2xhc3NOYW1lOiBjbHMoe1xuICAgICAgaW5hY3RpdmU6IHZhbHVlID09PSAnYXV0bydcbiAgICB9KVxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IElucHV0V2l0aE9ubHlOdW1iZXJzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6086\n")},956:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Q\": () => (/* binding */ PanelContext),\n \"Z\": () => (/* binding */ components_PanelLevel)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: external \"ctEvents\"\nvar external_ctEvents_ = __webpack_require__(2243);\nvar external_ctEvents_default = /*#__PURE__*/__webpack_require__.n(external_ctEvents_);\n;// CONCATENATED MODULE: ./static/js/customizer/preview-events.js\n\nlet deepLinkLocation = null;\nconst getDeepLinkPanel = () => deepLinkLocation ? deepLinkLocation.split(':')[1] : false;\nconst removeDeepLink = () => deepLinkLocation = null;\n\nif (wp.customize) {\n wp.customize.bind('ready', () => {\n wp.customize.previewer.bind('ct-initiate-deep-link', location => {\n const [section, panel] = location.split(':');\n const expanded = Object.values(wp.customize.section._value).find(e => e.expanded());\n\n if (!expanded || expanded.id !== section) {\n deepLinkLocation = location;\n wp.customize.section(section).expand();\n return;\n }\n\n external_ctEvents_default().trigger('ct-deep-link-start', location);\n });\n });\n}\n;// CONCATENATED MODULE: ./static/js/options/components/PanelLevel.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nconst PanelContext = (0,external_window_wp_element_.createContext)({\n titlePrefix: '',\n isOpen: false,\n isTransitioning: false,\n previousPanel: false,\n currentLevel: 1,\n secondLevelTitlePrefix: '',\n secondLevelTitleLabel: ''\n});\n\nconst panelsReducer = (state, action) => {\n if (action.type === 'PANEL_OPEN') {\n const {\n panelId\n } = action.payload;\n\n if (state.isOpen && state.isOpen === panelId) {\n return state;\n }\n\n if (state.isTransitioning) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n isOpen: panelId,\n isTransitioning: panelId,\n currentLevel: 1\n }, state.isOpen ? {\n previousPanel: state.isOpen\n } : {});\n }\n\n if (action.type === 'PANEL_RECEIVE_TITLE') {\n const {\n titlePrefix\n } = action.payload;\n return _objectSpread(_objectSpread({}, state), {}, {\n titlePrefix\n });\n }\n\n if (action.type === 'PANEL_RECEIVE_META') {\n return _objectSpread(_objectSpread({}, state), action.payload);\n }\n\n if (action.type === 'PANEL_OPEN_SECOND_LEVEL') {\n // const { titlePrefix } = action.payload\n return _objectSpread(_objectSpread({}, state), {}, {\n currentLevel: 2\n });\n }\n\n if (action.type === 'PANEL_CLOSE') {\n return _objectSpread(_objectSpread({}, state), state.currentLevel === 2 ? {\n currentLevel: 1\n } : {\n isTransitioning: state.isOpen,\n isOpen: false,\n currentLevel: 1\n });\n }\n\n if (action.type === 'PANEL_FINISH_TRANSITIONING') {\n return _objectSpread(_objectSpread({}, state), {}, {\n isTransitioning: false\n }, state.isOpen && state.isOpen !== state.previousPanel ? {\n previousPanel: false\n } : {});\n }\n\n return state;\n};\n\nconst PanelLevel = _ref => {\n let {\n id,\n children,\n containerRef,\n parentContainerRef,\n useRefsAsWrappers\n } = _ref;\n const [panelsState, panelsDispatch] = (0,external_window_wp_element_.useReducer)(panelsReducer, {\n isOpen: false,\n isTransitioning: false\n });\n (0,external_window_wp_element_.useEffect)(() => {\n external_ctEvents_default().on('ct-deep-link-start', location => {\n const [_, panelId] = location.split(':');\n\n if (!panelId) {\n panelsDispatch({\n type: 'PANEL_CLOSE'\n });\n return;\n }\n\n panelsDispatch({\n type: 'PANEL_OPEN',\n payload: {\n panelId\n }\n });\n });\n\n if (getDeepLinkPanel()) {\n setTimeout(() => {\n panelsDispatch({\n type: 'PANEL_OPEN',\n payload: {\n panelId: getDeepLinkPanel()\n }\n });\n removeDeepLink();\n }, 300);\n }\n }, []);\n return (0,external_window_wp_element_.createElement)(PanelContext.Provider, {\n value: {\n id,\n containerRef,\n panelsState,\n panelsDispatch,\n panelsHelpers: {\n isOpenFor: panelId => panelsState.isOpen && panelId === panelsState.isOpen,\n isTransitioningFor: panelId => panelsState.previousPanel && panelId === panelsState.previousPanel || panelsState.isTransitioning && panelId === panelsState.isTransitioning,\n open: panelId => panelsDispatch({\n type: 'PANEL_OPEN',\n payload: {\n panelId\n }\n }),\n close: () => {\n panelsDispatch({\n type: 'PANEL_CLOSE'\n });\n },\n stopTransitioning: () => {\n panelsDispatch({\n type: 'PANEL_FINISH_TRANSITIONING'\n });\n },\n getWrapperParent: () => useRefsAsWrappers ? parentContainerRef.current : containerRef.current.closest('[id=\"customize-theme-controls\"]'),\n openSecondLevel: () => {\n panelsDispatch({\n type: 'PANEL_OPEN_SECOND_LEVEL'\n });\n },\n getParentOptionsWrapper: () => useRefsAsWrappers ? containerRef.current : containerRef.current.closest('.accordion-section-content')\n }\n }\n }, children);\n};\n\n/* harmony default export */ const components_PanelLevel = (PanelLevel);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTU2LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3ByZXZpZXctZXZlbnRzLmpzPzQyNzciLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9jb21wb25lbnRzL1BhbmVsTGV2ZWwuanM/NTUyNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3RFdmVudHMgZnJvbSAnY3QtZXZlbnRzJztcbmxldCBkZWVwTGlua0xvY2F0aW9uID0gbnVsbDtcbmV4cG9ydCBjb25zdCBnZXREZWVwTGlua1BhbmVsID0gKCkgPT4gZGVlcExpbmtMb2NhdGlvbiA/IGRlZXBMaW5rTG9jYXRpb24uc3BsaXQoJzonKVsxXSA6IGZhbHNlO1xuZXhwb3J0IGNvbnN0IHJlbW92ZURlZXBMaW5rID0gKCkgPT4gZGVlcExpbmtMb2NhdGlvbiA9IG51bGw7XG5cbmlmICh3cC5jdXN0b21pemUpIHtcbiAgd3AuY3VzdG9taXplLmJpbmQoJ3JlYWR5JywgKCkgPT4ge1xuICAgIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIuYmluZCgnY3QtaW5pdGlhdGUtZGVlcC1saW5rJywgbG9jYXRpb24gPT4ge1xuICAgICAgY29uc3QgW3NlY3Rpb24sIHBhbmVsXSA9IGxvY2F0aW9uLnNwbGl0KCc6Jyk7XG4gICAgICBjb25zdCBleHBhbmRlZCA9IE9iamVjdC52YWx1ZXMod3AuY3VzdG9taXplLnNlY3Rpb24uX3ZhbHVlKS5maW5kKGUgPT4gZS5leHBhbmRlZCgpKTtcblxuICAgICAgaWYgKCFleHBhbmRlZCB8fCBleHBhbmRlZC5pZCAhPT0gc2VjdGlvbikge1xuICAgICAgICBkZWVwTGlua0xvY2F0aW9uID0gbG9jYXRpb247XG4gICAgICAgIHdwLmN1c3RvbWl6ZS5zZWN0aW9uKHNlY3Rpb24pLmV4cGFuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGN0RXZlbnRzLnRyaWdnZXIoJ2N0LWRlZXAtbGluay1zdGFydCcsIGxvY2F0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG59IiwiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgRnJhZ21lbnQsIGNyZWF0ZUVsZW1lbnQsIGNyZWF0ZUNvbnRleHQsIHVzZUVmZmVjdCwgY3JlYXRlUG9ydGFsLCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VSZWR1Y2VyLCB1c2VDYWxsYmFjayB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBnZXREZWVwTGlua1BhbmVsLCByZW1vdmVEZWVwTGluayB9IGZyb20gJy4uLy4uL2N1c3RvbWl6ZXIvcHJldmlldy1ldmVudHMnO1xuaW1wb3J0IGN0RXZlbnRzIGZyb20gJ2N0LWV2ZW50cyc7XG5leHBvcnQgY29uc3QgUGFuZWxDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh7XG4gIHRpdGxlUHJlZml4OiAnJyxcbiAgaXNPcGVuOiBmYWxzZSxcbiAgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZSxcbiAgcHJldmlvdXNQYW5lbDogZmFsc2UsXG4gIGN1cnJlbnRMZXZlbDogMSxcbiAgc2Vjb25kTGV2ZWxUaXRsZVByZWZpeDogJycsXG4gIHNlY29uZExldmVsVGl0bGVMYWJlbDogJydcbn0pO1xuXG5jb25zdCBwYW5lbHNSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAgaWYgKGFjdGlvbi50eXBlID09PSAnUEFORUxfT1BFTicpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYW5lbElkXG4gICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gICAgaWYgKHN0YXRlLmlzT3BlbiAmJiBzdGF0ZS5pc09wZW4gPT09IHBhbmVsSWQpIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgaXNPcGVuOiBwYW5lbElkLFxuICAgICAgaXNUcmFuc2l0aW9uaW5nOiBwYW5lbElkLFxuICAgICAgY3VycmVudExldmVsOiAxXG4gICAgfSwgc3RhdGUuaXNPcGVuID8ge1xuICAgICAgcHJldmlvdXNQYW5lbDogc3RhdGUuaXNPcGVuXG4gICAgfSA6IHt9KTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ1BBTkVMX1JFQ0VJVkVfVElUTEUnKSB7XG4gICAgY29uc3Qge1xuICAgICAgdGl0bGVQcmVmaXhcbiAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgdGl0bGVQcmVmaXhcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ1BBTkVMX1JFQ0VJVkVfTUVUQScpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSksIGFjdGlvbi5wYXlsb2FkKTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ1BBTkVMX09QRU5fU0VDT05EX0xFVkVMJykge1xuICAgIC8vIGNvbnN0IHsgdGl0bGVQcmVmaXggfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgY3VycmVudExldmVsOiAyXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdQQU5FTF9DTE9TRScpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSksIHN0YXRlLmN1cnJlbnRMZXZlbCA9PT0gMiA/IHtcbiAgICAgIGN1cnJlbnRMZXZlbDogMVxuICAgIH0gOiB7XG4gICAgICBpc1RyYW5zaXRpb25pbmc6IHN0YXRlLmlzT3BlbixcbiAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICBjdXJyZW50TGV2ZWw6IDFcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ1BBTkVMX0ZJTklTSF9UUkFOU0lUSU9OSU5HJykge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgIGlzVHJhbnNpdGlvbmluZzogZmFsc2VcbiAgICB9LCBzdGF0ZS5pc09wZW4gJiYgc3RhdGUuaXNPcGVuICE9PSBzdGF0ZS5wcmV2aW91c1BhbmVsID8ge1xuICAgICAgcHJldmlvdXNQYW5lbDogZmFsc2VcbiAgICB9IDoge30pO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxuY29uc3QgUGFuZWxMZXZlbCA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGlkLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbnRhaW5lclJlZixcbiAgICBwYXJlbnRDb250YWluZXJSZWYsXG4gICAgdXNlUmVmc0FzV3JhcHBlcnNcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IFtwYW5lbHNTdGF0ZSwgcGFuZWxzRGlzcGF0Y2hdID0gdXNlUmVkdWNlcihwYW5lbHNSZWR1Y2VyLCB7XG4gICAgaXNPcGVuOiBmYWxzZSxcbiAgICBpc1RyYW5zaXRpb25pbmc6IGZhbHNlXG4gIH0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGN0RXZlbnRzLm9uKCdjdC1kZWVwLWxpbmstc3RhcnQnLCBsb2NhdGlvbiA9PiB7XG4gICAgICBjb25zdCBbXywgcGFuZWxJZF0gPSBsb2NhdGlvbi5zcGxpdCgnOicpO1xuXG4gICAgICBpZiAoIXBhbmVsSWQpIHtcbiAgICAgICAgcGFuZWxzRGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6ICdQQU5FTF9DTE9TRSdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFuZWxzRGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnUEFORUxfT1BFTicsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBwYW5lbElkXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGdldERlZXBMaW5rUGFuZWwoKSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHBhbmVsc0Rpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiAnUEFORUxfT1BFTicsXG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgcGFuZWxJZDogZ2V0RGVlcExpbmtQYW5lbCgpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVtb3ZlRGVlcExpbmsoKTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9LCBbXSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFBhbmVsQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB7XG4gICAgICBpZCxcbiAgICAgIGNvbnRhaW5lclJlZixcbiAgICAgIHBhbmVsc1N0YXRlLFxuICAgICAgcGFuZWxzRGlzcGF0Y2gsXG4gICAgICBwYW5lbHNIZWxwZXJzOiB7XG4gICAgICAgIGlzT3BlbkZvcjogcGFuZWxJZCA9PiBwYW5lbHNTdGF0ZS5pc09wZW4gJiYgcGFuZWxJZCA9PT0gcGFuZWxzU3RhdGUuaXNPcGVuLFxuICAgICAgICBpc1RyYW5zaXRpb25pbmdGb3I6IHBhbmVsSWQgPT4gcGFuZWxzU3RhdGUucHJldmlvdXNQYW5lbCAmJiBwYW5lbElkID09PSBwYW5lbHNTdGF0ZS5wcmV2aW91c1BhbmVsIHx8IHBhbmVsc1N0YXRlLmlzVHJhbnNpdGlvbmluZyAmJiBwYW5lbElkID09PSBwYW5lbHNTdGF0ZS5pc1RyYW5zaXRpb25pbmcsXG4gICAgICAgIG9wZW46IHBhbmVsSWQgPT4gcGFuZWxzRGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6ICdQQU5FTF9PUEVOJyxcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBwYW5lbElkXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICBwYW5lbHNEaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnUEFORUxfQ0xPU0UnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BUcmFuc2l0aW9uaW5nOiAoKSA9PiB7XG4gICAgICAgICAgcGFuZWxzRGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1BBTkVMX0ZJTklTSF9UUkFOU0lUSU9OSU5HJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBnZXRXcmFwcGVyUGFyZW50OiAoKSA9PiB1c2VSZWZzQXNXcmFwcGVycyA/IHBhcmVudENvbnRhaW5lclJlZi5jdXJyZW50IDogY29udGFpbmVyUmVmLmN1cnJlbnQuY2xvc2VzdCgnW2lkPVwiY3VzdG9taXplLXRoZW1lLWNvbnRyb2xzXCJdJyksXG4gICAgICAgIG9wZW5TZWNvbmRMZXZlbDogKCkgPT4ge1xuICAgICAgICAgIHBhbmVsc0Rpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdQQU5FTF9PUEVOX1NFQ09ORF9MRVZFTCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0UGFyZW50T3B0aW9uc1dyYXBwZXI6ICgpID0+IHVzZVJlZnNBc1dyYXBwZXJzID8gY29udGFpbmVyUmVmLmN1cnJlbnQgOiBjb250YWluZXJSZWYuY3VycmVudC5jbG9zZXN0KCcuYWNjb3JkaW9uLXNlY3Rpb24tY29udGVudCcpXG4gICAgICB9XG4gICAgfVxuICB9LCBjaGlsZHJlbik7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQYW5lbExldmVsOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///956\n")},7493:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"f\": () => (/* binding */ capitalizeFirstLetter),\n/* harmony export */ \"m\": () => (/* binding */ getOptionLabelFor)\n/* harmony export */ });\n/* harmony import */ var match_conditions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7465);\n\nconst capitalizeFirstLetter = str => {\n str = str == null ? '' : String(str);\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\nconst getOptionLabelFor = _ref => {\n let {\n id,\n option,\n values,\n renderingConfig\n } = _ref;\n let maybeLabel = Object.keys(option).indexOf('label') === -1 ? capitalizeFirstLetter(id).replace(/\\_|\\-/g, ' ') : option.label;\n\n if (maybeLabel !== maybeLabel.toString()) {\n maybeLabel = Object.keys(maybeLabel).reduce((approvedLabel, currentLabel) => {\n if (approvedLabel) {\n return approvedLabel;\n }\n\n if ((0,match_conditions__WEBPACK_IMPORTED_MODULE_0__/* .matchValuesWithCondition */ .Nj)((0,match_conditions__WEBPACK_IMPORTED_MODULE_0__/* .normalizeCondition */ .KY)(maybeLabel[currentLabel]), values)) {\n return currentLabel;\n }\n\n return approvedLabel;\n }, null) || Object.keys(maybeLabel)[0];\n }\n /**\n * Fuck JS\n */\n\n\n if (maybeLabel === '') {\n maybeLabel = true;\n }\n\n if (renderingConfig && !renderingConfig.label) {\n maybeLabel = false;\n }\n\n return maybeLabel;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQ5My5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvaGVscGVycy9nZXQtbGFiZWwuanM/YTc2OCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub3JtYWxpemVDb25kaXRpb24sIG1hdGNoVmFsdWVzV2l0aENvbmRpdGlvbiB9IGZyb20gJ21hdGNoLWNvbmRpdGlvbnMnO1xuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVGaXJzdExldHRlciA9IHN0ciA9PiB7XG4gIHN0ciA9IHN0ciA9PSBudWxsID8gJycgOiBTdHJpbmcoc3RyKTtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0T3B0aW9uTGFiZWxGb3IgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBpZCxcbiAgICBvcHRpb24sXG4gICAgdmFsdWVzLFxuICAgIHJlbmRlcmluZ0NvbmZpZ1xuICB9ID0gX3JlZjtcbiAgbGV0IG1heWJlTGFiZWwgPSBPYmplY3Qua2V5cyhvcHRpb24pLmluZGV4T2YoJ2xhYmVsJykgPT09IC0xID8gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGlkKS5yZXBsYWNlKC9cXF98XFwtL2csICcgJykgOiBvcHRpb24ubGFiZWw7XG5cbiAgaWYgKG1heWJlTGFiZWwgIT09IG1heWJlTGFiZWwudG9TdHJpbmcoKSkge1xuICAgIG1heWJlTGFiZWwgPSBPYmplY3Qua2V5cyhtYXliZUxhYmVsKS5yZWR1Y2UoKGFwcHJvdmVkTGFiZWwsIGN1cnJlbnRMYWJlbCkgPT4ge1xuICAgICAgaWYgKGFwcHJvdmVkTGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIGFwcHJvdmVkTGFiZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaFZhbHVlc1dpdGhDb25kaXRpb24obm9ybWFsaXplQ29uZGl0aW9uKG1heWJlTGFiZWxbY3VycmVudExhYmVsXSksIHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRMYWJlbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFwcHJvdmVkTGFiZWw7XG4gICAgfSwgbnVsbCkgfHwgT2JqZWN0LmtleXMobWF5YmVMYWJlbClbMF07XG4gIH1cbiAgLyoqXG4gICAqIEZ1Y2sgSlNcbiAgICovXG5cblxuICBpZiAobWF5YmVMYWJlbCA9PT0gJycpIHtcbiAgICBtYXliZUxhYmVsID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChyZW5kZXJpbmdDb25maWcgJiYgIXJlbmRlcmluZ0NvbmZpZy5sYWJlbCkge1xuICAgIG1heWJlTGFiZWwgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBtYXliZUxhYmVsO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7493\n")},7069:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UO\": () => (/* binding */ flattenOptions),\n/* harmony export */ \"n6\": () => (/* binding */ getValueFromInput)\n/* harmony export */ });\n/* unused harmony export getFirstLevelOptions */\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6715);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(underscore__WEBPACK_IMPORTED_MODULE_0__);\nconst _excluded = [\"__CT_KEYS_ORDER__\"];\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\nconst getFirstLevelOptions = function (options) {\n let hasInnerOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n const {\n __CT_KEYS_ORDER__\n } = options,\n rest = _objectWithoutProperties(options, _excluded);\n\n return Object.keys(rest).reduce((currentOptions, currentOptionId) => {\n if (!options[currentOptionId].type) {\n return _objectSpread(_objectSpread({}, currentOptions), getFirstLevelOptions(options[currentOptionId], hasInnerOptions));\n }\n\n if (options[currentOptionId].options) {\n return _objectSpread(_objectSpread({}, currentOptions), getFirstLevelOptions(options[currentOptionId].options, hasInnerOptions));\n }\n\n if (options[currentOptionId]['inner-options'] && hasInnerOptions) {\n return _objectSpread(_objectSpread({}, currentOptions), {}, {\n [currentOptionId]: options[currentOptionId]\n }, getFirstLevelOptions(options[currentOptionId]['inner-options'], hasInnerOptions));\n }\n\n return _objectSpread(_objectSpread({}, currentOptions), {}, {\n [currentOptionId]: options[currentOptionId]\n });\n }, {});\n};\nconst flattenOptions = options => Object.keys(options).reduce((result, currentId) => _objectSpread(_objectSpread({}, result), options[currentId].type ? {\n [currentId]: options[currentId]\n} : currentId === '__CT_KEYS_ORDER__' ? {\n [currentId]: options[currentId]\n} : flattenOptions(options[currentId])), {});\nconst getValueFromInput = function (options, values) {\n let valueGetter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n let hasInnerOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n let firstLevelOptions = getFirstLevelOptions(options, hasInnerOptions);\n return _objectSpread(_objectSpread({}, values), Object.keys(firstLevelOptions).reduce((currentValues, currentOptionId) => {\n let actualValue = null;\n\n if (Object.keys(values).indexOf(currentOptionId) > -1) {\n if (underscore__WEBPACK_IMPORTED_MODULE_0___default().isString(values[currentOptionId]) || underscore__WEBPACK_IMPORTED_MODULE_0___default().isNumber(values[currentOptionId])) {\n actualValue = values[currentOptionId];\n }\n\n if (underscore__WEBPACK_IMPORTED_MODULE_0___default().isObject(values[currentOptionId])) {\n actualValue = _objectSpread(_objectSpread({}, firstLevelOptions[currentOptionId].value || {}), values[currentOptionId]);\n }\n\n if (underscore__WEBPACK_IMPORTED_MODULE_0___default().isArray(values[currentOptionId])) {\n actualValue = values[currentOptionId] ? values[currentOptionId] : [...(firstLevelOptions[currentOptionId].value || []) // ...values[currentOptionId],\n ];\n }\n } else if (valueGetter) {\n return _objectSpread(_objectSpread({}, currentValues), valueGetter(currentOptionId, firstLevelOptions[currentOptionId]));\n } else {\n if (Object.keys(firstLevelOptions[currentOptionId]).indexOf('value') > -1) {\n actualValue = firstLevelOptions[currentOptionId].value;\n } else {\n actualValue = '';\n }\n }\n\n return _objectSpread(_objectSpread({}, currentValues), {}, {\n [currentOptionId]: actualValue\n });\n }, {}));\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA2OS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9oZWxwZXJzL2dldC12YWx1ZS1mcm9tLWlucHV0LmpzPzBjZTgiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgX2V4Y2x1ZGVkID0gW1wiX19DVF9LRVlTX09SREVSX19cIl07XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBfIGZyb20gJ3VuZGVyc2NvcmUnO1xuZXhwb3J0IGNvbnN0IGdldEZpcnN0TGV2ZWxPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgbGV0IGhhc0lubmVyT3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICBjb25zdCB7XG4gICAgX19DVF9LRVlTX09SREVSX19cbiAgfSA9IG9wdGlvbnMsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob3B0aW9ucywgX2V4Y2x1ZGVkKTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMocmVzdCkucmVkdWNlKChjdXJyZW50T3B0aW9ucywgY3VycmVudE9wdGlvbklkKSA9PiB7XG4gICAgaWYgKCFvcHRpb25zW2N1cnJlbnRPcHRpb25JZF0udHlwZSkge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudE9wdGlvbnMpLCBnZXRGaXJzdExldmVsT3B0aW9ucyhvcHRpb25zW2N1cnJlbnRPcHRpb25JZF0sIGhhc0lubmVyT3B0aW9ucykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zW2N1cnJlbnRPcHRpb25JZF0ub3B0aW9ucykge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudE9wdGlvbnMpLCBnZXRGaXJzdExldmVsT3B0aW9ucyhvcHRpb25zW2N1cnJlbnRPcHRpb25JZF0ub3B0aW9ucywgaGFzSW5uZXJPcHRpb25zKSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnNbY3VycmVudE9wdGlvbklkXVsnaW5uZXItb3B0aW9ucyddICYmIGhhc0lubmVyT3B0aW9ucykge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudE9wdGlvbnMpLCB7fSwge1xuICAgICAgICBbY3VycmVudE9wdGlvbklkXTogb3B0aW9uc1tjdXJyZW50T3B0aW9uSWRdXG4gICAgICB9LCBnZXRGaXJzdExldmVsT3B0aW9ucyhvcHRpb25zW2N1cnJlbnRPcHRpb25JZF1bJ2lubmVyLW9wdGlvbnMnXSwgaGFzSW5uZXJPcHRpb25zKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudE9wdGlvbnMpLCB7fSwge1xuICAgICAgW2N1cnJlbnRPcHRpb25JZF06IG9wdGlvbnNbY3VycmVudE9wdGlvbklkXVxuICAgIH0pO1xuICB9LCB7fSk7XG59O1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW5PcHRpb25zID0gb3B0aW9ucyA9PiBPYmplY3Qua2V5cyhvcHRpb25zKS5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudElkKSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3VsdCksIG9wdGlvbnNbY3VycmVudElkXS50eXBlID8ge1xuICBbY3VycmVudElkXTogb3B0aW9uc1tjdXJyZW50SWRdXG59IDogY3VycmVudElkID09PSAnX19DVF9LRVlTX09SREVSX18nID8ge1xuICBbY3VycmVudElkXTogb3B0aW9uc1tjdXJyZW50SWRdXG59IDogZmxhdHRlbk9wdGlvbnMob3B0aW9uc1tjdXJyZW50SWRdKSksIHt9KTtcbmV4cG9ydCBjb25zdCBnZXRWYWx1ZUZyb21JbnB1dCA9IGZ1bmN0aW9uIChvcHRpb25zLCB2YWx1ZXMpIHtcbiAgbGV0IHZhbHVlR2V0dGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICBsZXQgaGFzSW5uZXJPcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICBsZXQgZmlyc3RMZXZlbE9wdGlvbnMgPSBnZXRGaXJzdExldmVsT3B0aW9ucyhvcHRpb25zLCBoYXNJbm5lck9wdGlvbnMpO1xuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZXMpLCBPYmplY3Qua2V5cyhmaXJzdExldmVsT3B0aW9ucykucmVkdWNlKChjdXJyZW50VmFsdWVzLCBjdXJyZW50T3B0aW9uSWQpID0+IHtcbiAgICBsZXQgYWN0dWFsVmFsdWUgPSBudWxsO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlcykuaW5kZXhPZihjdXJyZW50T3B0aW9uSWQpID4gLTEpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHZhbHVlc1tjdXJyZW50T3B0aW9uSWRdKSB8fCBfLmlzTnVtYmVyKHZhbHVlc1tjdXJyZW50T3B0aW9uSWRdKSkge1xuICAgICAgICBhY3R1YWxWYWx1ZSA9IHZhbHVlc1tjdXJyZW50T3B0aW9uSWRdO1xuICAgICAgfVxuXG4gICAgICBpZiAoXy5pc09iamVjdCh2YWx1ZXNbY3VycmVudE9wdGlvbklkXSkpIHtcbiAgICAgICAgYWN0dWFsVmFsdWUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZpcnN0TGV2ZWxPcHRpb25zW2N1cnJlbnRPcHRpb25JZF0udmFsdWUgfHwge30pLCB2YWx1ZXNbY3VycmVudE9wdGlvbklkXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfLmlzQXJyYXkodmFsdWVzW2N1cnJlbnRPcHRpb25JZF0pKSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gdmFsdWVzW2N1cnJlbnRPcHRpb25JZF0gPyB2YWx1ZXNbY3VycmVudE9wdGlvbklkXSA6IFsuLi4oZmlyc3RMZXZlbE9wdGlvbnNbY3VycmVudE9wdGlvbklkXS52YWx1ZSB8fCBbXSkgLy8gLi4udmFsdWVzW2N1cnJlbnRPcHRpb25JZF0sXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZUdldHRlcikge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudFZhbHVlcyksIHZhbHVlR2V0dGVyKGN1cnJlbnRPcHRpb25JZCwgZmlyc3RMZXZlbE9wdGlvbnNbY3VycmVudE9wdGlvbklkXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoZmlyc3RMZXZlbE9wdGlvbnNbY3VycmVudE9wdGlvbklkXSkuaW5kZXhPZigndmFsdWUnKSA+IC0xKSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gZmlyc3RMZXZlbE9wdGlvbnNbY3VycmVudE9wdGlvbklkXS52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudFZhbHVlcyksIHt9LCB7XG4gICAgICBbY3VycmVudE9wdGlvbklkXTogYWN0dWFsVmFsdWVcbiAgICB9KTtcbiAgfSwge30pKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7069\n")},9287:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"u\": () => (/* binding */ normalizeColor)\n/* harmony export */ });\n/* harmony import */ var colord__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6765);\n\nconst normalizeColor = color => {\n const parsedColor = (0,colord__WEBPACK_IMPORTED_MODULE_0__/* .colord */ .Vi)(color);\n\n if (!parsedColor.parsed) {\n return color;\n }\n\n if (color[0] === '#' && color.length <= 7) {\n return color;\n }\n\n if (parsedColor.rgba.a === 1) {\n return color;\n }\n\n return parsedColor.toRgbString();\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTI4Ny5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9oZWxwZXJzL25vcm1hbGl6ZS1jb2xvci5qcz83YThkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbG9yZCB9IGZyb20gJ2NvbG9yZCc7XG5leHBvcnQgY29uc3Qgbm9ybWFsaXplQ29sb3IgPSBjb2xvciA9PiB7XG4gIGNvbnN0IHBhcnNlZENvbG9yID0gY29sb3JkKGNvbG9yKTtcblxuICBpZiAoIXBhcnNlZENvbG9yLnBhcnNlZCkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIGlmIChjb2xvclswXSA9PT0gJyMnICYmIGNvbG9yLmxlbmd0aCA8PSA3KSB7XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9XG5cbiAgaWYgKHBhcnNlZENvbG9yLnJnYmEuYSA9PT0gMSkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHJldHVybiBwYXJzZWRDb2xvci50b1JnYlN0cmluZygpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9287\n")},4592:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "N": () => (/* binding */ maybeTransformUnorderedChoices)\n/* harmony export */ });\nconst maybeTransformUnorderedChoices = choices => Array.isArray(choices) ? choices : Object.keys(choices).reduce((current, choice) => [...current, {\n key: choice,\n value: choices[choice]\n}], []);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU5Mi5qcyIsIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvaGVscGVycy9wYXJzZS1jaG9pY2VzLmpzP2RmMTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IG1heWJlVHJhbnNmb3JtVW5vcmRlcmVkQ2hvaWNlcyA9IGNob2ljZXMgPT4gQXJyYXkuaXNBcnJheShjaG9pY2VzKSA/IGNob2ljZXMgOiBPYmplY3Qua2V5cyhjaG9pY2VzKS5yZWR1Y2UoKGN1cnJlbnQsIGNob2ljZSkgPT4gWy4uLmN1cnJlbnQsIHtcbiAga2V5OiBjaG9pY2UsXG4gIHZhbHVlOiBjaG9pY2VzW2Nob2ljZV1cbn1dLCBbXSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4592\n')},9144:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Z\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* unused harmony export nullifyTransforms */\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_2__);\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nfunction nullifyTransforms(el) {\n const parseTransform = el => window.getComputedStyle(el).transform.split(/\\(|,|\\)/).slice(1, -1).map(v => parseFloat(v)); // 1\n\n\n let {\n top,\n left,\n width,\n height\n } = el.getBoundingClientRect();\n let transformArr = parseTransform(el);\n\n if (transformArr.length == 6) {\n // 2D matrix\n const t = transformArr; // 2\n\n let det = t[0] * t[3] - t[1] * t[2]; // 3\n\n return {\n width: width / t[0],\n height: height / t[3],\n left: (left * t[3] - top * t[2] + t[2] * t[5] - t[4] * t[3]) / det,\n top: (-left * t[1] + top * t[0] + t[4] * t[1] - t[0] * t[5]) / det\n };\n } else {\n // This case is not handled because it's very rarely needed anyway.\n // We just return the tranformed metrics, as they are, for consistency.\n return {\n top,\n left,\n width,\n height\n };\n }\n}\n\nconst usePopoverMaker = function () {\n let {\n contentRef: contentRefProp,\n shouldCalculate = true,\n ref,\n defaultHeight = 0\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const contentRef = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const [s, setState] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n const refresh = () => {\n if (!shouldCalculate) {\n return;\n }\n\n setState(Math.random());\n };\n\n const refreshOnScroll = e => {\n let modalRef = contentRefProp || contentRef;\n\n if (modalRef && modalRef.current && !modalRef.current.contains(e.target)) {\n refresh();\n }\n };\n\n (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setTimeout(() => {\n refresh();\n }, 500);\n window.addEventListener('resize', refresh);\n window.addEventListener('scroll', refreshOnScroll, true);\n let observer;\n\n if (ref.current) {\n observer = new window.ResizeObserver(refresh);\n observer.observe(ref.current, {\n attributes: true\n });\n\n if (ref.current.closest('.ct-tabs-scroll')) {\n observer.observe(ref.current.closest('.ct-tabs-scroll'), {\n attributes: true\n });\n }\n\n if (ref.current.closest('.ct-modal-scroll')) {\n observer.observe(ref.current.closest('.ct-modal-scroll'), {\n attributes: true\n });\n }\n\n if (ref.current.closest('.customize-pane-child')) {\n observer.observe(ref.current.closest('.customize-pane-child'), {\n attributes: true\n });\n }\n }\n\n if (contentRefProp ? contentRefProp.current : contentRef.current) {\n if (!observer) {\n observer = new window.ResizeObserver(refresh);\n }\n\n observer.observe(contentRefProp ? contentRefProp.current : contentRef.current, {\n attributes: true\n });\n }\n\n return () => {\n window.removeEventListener('resize', refresh);\n window.removeEventListener('scroll', refreshOnScroll, true);\n\n if (observer) {\n observer.disconnect();\n }\n };\n }, [shouldCalculate, contentRef.current, contentRefProp, ref.current]);\n let {\n right,\n yOffset,\n position,\n otherStyles\n } = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n let right = 0;\n let yOffset = 0;\n let position = 'bottom';\n let otherStyles = {};\n\n if (!shouldCalculate) {\n return {\n yOffset,\n right,\n position\n };\n }\n\n if (ref.current) {\n let rect = ref.current.getBoundingClientRect();\n let el = ref.current.closest('.ct-select-input') ? ref.current.closest('.ct-select-input') : ref.current;\n let maybeWidthFlag = getComputedStyle(el, ':before').content;\n yOffset = rect.top + rect.height;\n right = window.innerWidth - rect.right;\n\n if (document.body.classList.contains('rtl')) {\n right = rect.left;\n }\n\n if (maybeWidthFlag.indexOf('ref-width') > -1) {\n let width = rect.width;\n\n if (maybeWidthFlag.indexOf('left') > -1 && el.previousElementSibling) {\n if (document.body.classList.contains('rtl')) {\n width = el.previousElementSibling.getBoundingClientRect().right - rect.left;\n } else {\n width = rect.right - el.previousElementSibling.getBoundingClientRect().left;\n }\n }\n\n if (maybeWidthFlag.indexOf('right') > -1) {\n let nextRect = el.parentNode // el.nextElementSibling || el.parentNode\n .getBoundingClientRect();\n\n if (document.body.classList.contains('rtl')) {\n right = nextRect.left;\n width = rect.right - nextRect.left;\n } else {\n right = window.innerWidth - nextRect.right;\n width = nextRect.right - rect.left;\n }\n }\n\n otherStyles['--x-select-dropdown-width'] = `${width}px`;\n }\n\n let popoverRect = contentRefProp && contentRefProp.current || contentRef.current ? nullifyTransforms(contentRefProp ? contentRefProp.current : contentRef.current) : {\n height: defaultHeight\n };\n\n if (yOffset + popoverRect.height > window.innerHeight && rect.top - 15 > popoverRect.height) {\n position = 'top';\n yOffset = window.innerHeight - rect.bottom + rect.height;\n }\n\n if (yOffset + popoverRect.height > window.innerHeight && position === 'bottom') {\n position = 'top';\n yOffset = 0;\n }\n }\n\n return {\n yOffset,\n right,\n position,\n otherStyles\n };\n }, [s, shouldCalculate, ref, ref.current, contentRefProp, contentRef.current, defaultHeight]);\n return {\n refreshPopover: refresh,\n styles: _objectSpread({\n '--modal-y-offset': `${yOffset}px`,\n '--modal-x-offset': `${right}px`\n }, otherStyles),\n position,\n popoverProps: _objectSpread({\n ref: contentRefProp || contentRef\n }, position ? {\n 'data-position': position\n } : {})\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (usePopoverMaker);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTE0NC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvaGVscGVycy91c2VQb3BvdmVyTWFrZXIuanM/NzU1YyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuZXhwb3J0IGZ1bmN0aW9uIG51bGxpZnlUcmFuc2Zvcm1zKGVsKSB7XG4gIGNvbnN0IHBhcnNlVHJhbnNmb3JtID0gZWwgPT4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLnRyYW5zZm9ybS5zcGxpdCgvXFwofCx8XFwpLykuc2xpY2UoMSwgLTEpLm1hcCh2ID0+IHBhcnNlRmxvYXQodikpOyAvLyAxXG5cblxuICBsZXQge1xuICAgIHRvcCxcbiAgICBsZWZ0LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGxldCB0cmFuc2Zvcm1BcnIgPSBwYXJzZVRyYW5zZm9ybShlbCk7XG5cbiAgaWYgKHRyYW5zZm9ybUFyci5sZW5ndGggPT0gNikge1xuICAgIC8vIDJEIG1hdHJpeFxuICAgIGNvbnN0IHQgPSB0cmFuc2Zvcm1BcnI7IC8vIDJcblxuICAgIGxldCBkZXQgPSB0WzBdICogdFszXSAtIHRbMV0gKiB0WzJdOyAvLyAzXG5cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHdpZHRoIC8gdFswXSxcbiAgICAgIGhlaWdodDogaGVpZ2h0IC8gdFszXSxcbiAgICAgIGxlZnQ6IChsZWZ0ICogdFszXSAtIHRvcCAqIHRbMl0gKyB0WzJdICogdFs1XSAtIHRbNF0gKiB0WzNdKSAvIGRldCxcbiAgICAgIHRvcDogKC1sZWZ0ICogdFsxXSArIHRvcCAqIHRbMF0gKyB0WzRdICogdFsxXSAtIHRbMF0gKiB0WzVdKSAvIGRldFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBjYXNlIGlzIG5vdCBoYW5kbGVkIGJlY2F1c2UgaXQncyB2ZXJ5IHJhcmVseSBuZWVkZWQgYW55d2F5LlxuICAgIC8vIFdlIGp1c3QgcmV0dXJuIHRoZSB0cmFuZm9ybWVkIG1ldHJpY3MsIGFzIHRoZXkgYXJlLCBmb3IgY29uc2lzdGVuY3kuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcCxcbiAgICAgIGxlZnQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH07XG4gIH1cbn1cblxuY29uc3QgdXNlUG9wb3Zlck1ha2VyID0gZnVuY3Rpb24gKCkge1xuICBsZXQge1xuICAgIGNvbnRlbnRSZWY6IGNvbnRlbnRSZWZQcm9wLFxuICAgIHNob3VsZENhbGN1bGF0ZSA9IHRydWUsXG4gICAgcmVmLFxuICAgIGRlZmF1bHRIZWlnaHQgPSAwXG4gIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICBjb25zdCBjb250ZW50UmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IFtzLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZShudWxsKTtcblxuICBjb25zdCByZWZyZXNoID0gKCkgPT4ge1xuICAgIGlmICghc2hvdWxkQ2FsY3VsYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0U3RhdGUoTWF0aC5yYW5kb20oKSk7XG4gIH07XG5cbiAgY29uc3QgcmVmcmVzaE9uU2Nyb2xsID0gZSA9PiB7XG4gICAgbGV0IG1vZGFsUmVmID0gY29udGVudFJlZlByb3AgfHwgY29udGVudFJlZjtcblxuICAgIGlmIChtb2RhbFJlZiAmJiBtb2RhbFJlZi5jdXJyZW50ICYmICFtb2RhbFJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgcmVmcmVzaCgpO1xuICAgIH1cbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVmcmVzaCgpO1xuICAgIH0sIDUwMCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlZnJlc2gpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCByZWZyZXNoT25TY3JvbGwsIHRydWUpO1xuICAgIGxldCBvYnNlcnZlcjtcblxuICAgIGlmIChyZWYuY3VycmVudCkge1xuICAgICAgb2JzZXJ2ZXIgPSBuZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKHJlZnJlc2gpO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShyZWYuY3VycmVudCwge1xuICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlZi5jdXJyZW50LmNsb3Nlc3QoJy5jdC10YWJzLXNjcm9sbCcpKSB7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUocmVmLmN1cnJlbnQuY2xvc2VzdCgnLmN0LXRhYnMtc2Nyb2xsJyksIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmLmN1cnJlbnQuY2xvc2VzdCgnLmN0LW1vZGFsLXNjcm9sbCcpKSB7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUocmVmLmN1cnJlbnQuY2xvc2VzdCgnLmN0LW1vZGFsLXNjcm9sbCcpLCB7XG4gICAgICAgICAgYXR0cmlidXRlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZi5jdXJyZW50LmNsb3Nlc3QoJy5jdXN0b21pemUtcGFuZS1jaGlsZCcpKSB7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUocmVmLmN1cnJlbnQuY2xvc2VzdCgnLmN1c3RvbWl6ZS1wYW5lLWNoaWxkJyksIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb250ZW50UmVmUHJvcCA/IGNvbnRlbnRSZWZQcm9wLmN1cnJlbnQgOiBjb250ZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgIGlmICghb2JzZXJ2ZXIpIHtcbiAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKHJlZnJlc2gpO1xuICAgICAgfVxuXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGNvbnRlbnRSZWZQcm9wID8gY29udGVudFJlZlByb3AuY3VycmVudCA6IGNvbnRlbnRSZWYuY3VycmVudCwge1xuICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlZnJlc2gpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHJlZnJlc2hPblNjcm9sbCwgdHJ1ZSk7XG5cbiAgICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3Nob3VsZENhbGN1bGF0ZSwgY29udGVudFJlZi5jdXJyZW50LCBjb250ZW50UmVmUHJvcCwgcmVmLmN1cnJlbnRdKTtcbiAgbGV0IHtcbiAgICByaWdodCxcbiAgICB5T2Zmc2V0LFxuICAgIHBvc2l0aW9uLFxuICAgIG90aGVyU3R5bGVzXG4gIH0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgcmlnaHQgPSAwO1xuICAgIGxldCB5T2Zmc2V0ID0gMDtcbiAgICBsZXQgcG9zaXRpb24gPSAnYm90dG9tJztcbiAgICBsZXQgb3RoZXJTdHlsZXMgPSB7fTtcblxuICAgIGlmICghc2hvdWxkQ2FsY3VsYXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB5T2Zmc2V0LFxuICAgICAgICByaWdodCxcbiAgICAgICAgcG9zaXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHJlZi5jdXJyZW50KSB7XG4gICAgICBsZXQgcmVjdCA9IHJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbGV0IGVsID0gcmVmLmN1cnJlbnQuY2xvc2VzdCgnLmN0LXNlbGVjdC1pbnB1dCcpID8gcmVmLmN1cnJlbnQuY2xvc2VzdCgnLmN0LXNlbGVjdC1pbnB1dCcpIDogcmVmLmN1cnJlbnQ7XG4gICAgICBsZXQgbWF5YmVXaWR0aEZsYWcgPSBnZXRDb21wdXRlZFN0eWxlKGVsLCAnOmJlZm9yZScpLmNvbnRlbnQ7XG4gICAgICB5T2Zmc2V0ID0gcmVjdC50b3AgKyByZWN0LmhlaWdodDtcbiAgICAgIHJpZ2h0ID0gd2luZG93LmlubmVyV2lkdGggLSByZWN0LnJpZ2h0O1xuXG4gICAgICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3J0bCcpKSB7XG4gICAgICAgIHJpZ2h0ID0gcmVjdC5sZWZ0O1xuICAgICAgfVxuXG4gICAgICBpZiAobWF5YmVXaWR0aEZsYWcuaW5kZXhPZigncmVmLXdpZHRoJykgPiAtMSkge1xuICAgICAgICBsZXQgd2lkdGggPSByZWN0LndpZHRoO1xuXG4gICAgICAgIGlmIChtYXliZVdpZHRoRmxhZy5pbmRleE9mKCdsZWZ0JykgPiAtMSAmJiBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdydGwnKSkge1xuICAgICAgICAgICAgd2lkdGggPSBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IHJlY3QucmlnaHQgLSBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heWJlV2lkdGhGbGFnLmluZGV4T2YoJ3JpZ2h0JykgPiAtMSkge1xuICAgICAgICAgIGxldCBuZXh0UmVjdCA9IGVsLnBhcmVudE5vZGUgLy8gZWwubmV4dEVsZW1lbnRTaWJsaW5nIHx8IGVsLnBhcmVudE5vZGVcbiAgICAgICAgICAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3J0bCcpKSB7XG4gICAgICAgICAgICByaWdodCA9IG5leHRSZWN0LmxlZnQ7XG4gICAgICAgICAgICB3aWR0aCA9IHJlY3QucmlnaHQgLSBuZXh0UmVjdC5sZWZ0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByaWdodCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gbmV4dFJlY3QucmlnaHQ7XG4gICAgICAgICAgICB3aWR0aCA9IG5leHRSZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyU3R5bGVzWyctLXgtc2VsZWN0LWRyb3Bkb3duLXdpZHRoJ10gPSBgJHt3aWR0aH1weGA7XG4gICAgICB9XG5cbiAgICAgIGxldCBwb3BvdmVyUmVjdCA9IGNvbnRlbnRSZWZQcm9wICYmIGNvbnRlbnRSZWZQcm9wLmN1cnJlbnQgfHwgY29udGVudFJlZi5jdXJyZW50ID8gbnVsbGlmeVRyYW5zZm9ybXMoY29udGVudFJlZlByb3AgPyBjb250ZW50UmVmUHJvcC5jdXJyZW50IDogY29udGVudFJlZi5jdXJyZW50KSA6IHtcbiAgICAgICAgaGVpZ2h0OiBkZWZhdWx0SGVpZ2h0XG4gICAgICB9O1xuXG4gICAgICBpZiAoeU9mZnNldCArIHBvcG92ZXJSZWN0LmhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAmJiByZWN0LnRvcCAtIDE1ID4gcG9wb3ZlclJlY3QuaGVpZ2h0KSB7XG4gICAgICAgIHBvc2l0aW9uID0gJ3RvcCc7XG4gICAgICAgIHlPZmZzZXQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbSArIHJlY3QuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBpZiAoeU9mZnNldCArIHBvcG92ZXJSZWN0LmhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAmJiBwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgcG9zaXRpb24gPSAndG9wJztcbiAgICAgICAgeU9mZnNldCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHlPZmZzZXQsXG4gICAgICByaWdodCxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgb3RoZXJTdHlsZXNcbiAgICB9O1xuICB9LCBbcywgc2hvdWxkQ2FsY3VsYXRlLCByZWYsIHJlZi5jdXJyZW50LCBjb250ZW50UmVmUHJvcCwgY29udGVudFJlZi5jdXJyZW50LCBkZWZhdWx0SGVpZ2h0XSk7XG4gIHJldHVybiB7XG4gICAgcmVmcmVzaFBvcG92ZXI6IHJlZnJlc2gsXG4gICAgc3R5bGVzOiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICctLW1vZGFsLXktb2Zmc2V0JzogYCR7eU9mZnNldH1weGAsXG4gICAgICAnLS1tb2RhbC14LW9mZnNldCc6IGAke3JpZ2h0fXB4YFxuICAgIH0sIG90aGVyU3R5bGVzKSxcbiAgICBwb3NpdGlvbixcbiAgICBwb3BvdmVyUHJvcHM6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgcmVmOiBjb250ZW50UmVmUHJvcCB8fCBjb250ZW50UmVmXG4gICAgfSwgcG9zaXRpb24gPyB7XG4gICAgICAnZGF0YS1wb3NpdGlvbic6IHBvc2l0aW9uXG4gICAgfSA6IHt9KVxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgdXNlUG9wb3Zlck1ha2VyOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9144\n")},694:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": () => (/* binding */ single_picker)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: external \"window.wp.components\"\nvar external_window_wp_components_ = __webpack_require__(8441);\n// EXTERNAL MODULE: external \"window._\"\nvar external_window_ = __webpack_require__(6715);\n// EXTERNAL MODULE: external \"jQuery\"\nvar external_jQuery_ = __webpack_require__(5311);\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./static/js/options/helpers/normalize-color.js\nvar normalize_color = __webpack_require__(9287);\n;// CONCATENATED MODULE: ./static/js/options/options/color-picker/color-picker-iris.js\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\nconst ColorPickerIris = _ref => {\n let {\n onChange,\n value,\n value: {\n color\n }\n } = _ref;\n const isNew = wp.components.GradientPicker;\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: isNew ? 'ct-gutenberg-color-picker-new' : 'ct-gutenberg-color-picker'\n }, (0,external_window_wp_element_.createElement)(external_window_wp_components_.ColorPicker, _extends({\n color: color,\n enableAlpha: true\n }, isNew ? {\n onChange: color => {\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n color: (0,normalize_color/* normalizeColor */.u)(color)\n }));\n }\n } : {\n onChangeComplete: result => {\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n color: result.rgb.a === 1 ? result.hex : `rgba(${result.rgb.r}, ${result.rgb.g}, ${result.rgb.b}, ${result.rgb.a})`\n }));\n }\n })), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-color-picker-value\"\n }, (0,external_window_wp_element_.createElement)(\"input\", {\n onChange: _ref2 => {\n let {\n target: {\n value: color\n }\n } = _ref2;\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n color: (0,normalize_color/* normalizeColor */.u)(color)\n }));\n },\n value: (0,normalize_color/* normalizeColor */.u)(color),\n type: \"text\"\n })));\n};\n\n/* harmony default export */ const color_picker_iris = (ColorPickerIris);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: ./static/js/options/helpers/usePopoverMaker.js\nvar usePopoverMaker = __webpack_require__(9144);\n;// CONCATENATED MODULE: ./static/js/options/options/color-picker/picker-modal.js\nfunction picker_modal_extends() { picker_modal_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return picker_modal_extends.apply(this, arguments); }\n\nfunction picker_modal_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction picker_modal_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? picker_modal_ownKeys(Object(source), !0).forEach(function (key) { picker_modal_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : picker_modal_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction picker_modal_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nconst getNoColorPropFor = option => option.noColorTransparent ? 'transparent' : `CT_CSS_SKIP_RULE`;\n\nconst focusOrOpenCustomizerSectionProps = section => picker_modal_objectSpread({\n target: '_blank',\n href: `${window.ct_localizations ? window.ct_localizations.customizer_url : ''}${encodeURIComponent(`[section]=${section}`)}`\n}, wp && wp.customize && wp.customize.section ? {\n onClick: e => {\n e.preventDefault();\n wp.customize.section(section).expand();\n }\n} : {});\n\nconst getLeftForEl = (modal, el) => {\n if (!modal) return;\n if (!el) return;\n let style = getComputedStyle(modal);\n let wrapperLeft = parseFloat(style.left);\n el = el.firstElementChild.getBoundingClientRect();\n return {\n '--option-modal-arrow-position': `${el.left + el.width / 2 - wrapperLeft - 6}px`\n };\n};\n\nconst PickerModal = _ref => {\n let {\n containerRef,\n el,\n value,\n picker,\n onChange,\n option,\n style,\n wrapperProps = {},\n inline_modal,\n appendToBody,\n inheritValue\n } = _ref;\n const getValueForPicker = (0,external_window_wp_element_.useMemo)(() => {\n if (value.color === getNoColorPropFor(option)) {\n return {\n color: '',\n key: 'empty'\n };\n }\n\n if ((value.color || '').indexOf(getNoColorPropFor(option)) > -1) {\n return {\n key: '',\n color: ''\n };\n }\n\n if ((value.color || '').indexOf(getNoColorPropFor(option)) > -1 && picker.inherit) {\n return {\n key: 'picker' + inheritValue,\n color: getComputedStyle(document.documentElement).getPropertyValue(inheritValue.replace(/var\\(/, '').replace(/\\)/, '')).trim().replace(/\\s/g, '')\n };\n }\n\n if ((value.color || '').indexOf('var') > -1) {\n return {\n key: 'var' + value.color,\n color: getComputedStyle(document.documentElement).getPropertyValue(value.color.replace(/var\\(/, '').replace(/\\)/, '')).trim().replace(/\\s/g, '')\n };\n }\n\n return {\n key: 'color',\n color: value.color\n };\n }, [value, option, picker, inheritValue]);\n let valueToCheck = value.color;\n\n if ((value.color || '').indexOf(getNoColorPropFor(option)) > -1 && picker.inherit) {\n valueToCheck = inheritValue;\n }\n\n const arrowLeft = (0,external_window_wp_element_.useMemo)(() => wrapperProps.ref && wrapperProps.ref.current && el && getLeftForEl(wrapperProps.ref.current, el.current), [wrapperProps.ref && wrapperProps.ref.current, el && el.current]);\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(\"div\", picker_modal_extends({\n tabIndex: \"0\",\n className: classnames_default()(`ct-color-picker-modal`, {\n 'ct-option-modal': !inline_modal && appendToBody\n }, option.modalClassName),\n style: picker_modal_objectSpread(picker_modal_objectSpread({}, arrowLeft), style ? style : {})\n }, wrapperProps), !option.predefined && (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-color-picker-top\"\n }, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-color-picker-skins\"\n }, ['paletteColor1', 'paletteColor2', 'paletteColor3', 'paletteColor4', 'paletteColor5', 'paletteColor6', 'paletteColor7', 'paletteColor8'].map(color => (0,external_window_wp_element_.createElement)(\"li\", {\n key: color,\n style: {\n background: `var(--${color})`\n },\n className: classnames_default()({\n active: valueToCheck === `var(--${color})`\n }),\n onClick: () => onChange(picker_modal_objectSpread(picker_modal_objectSpread({}, value), {}, {\n color: `var(--${color})`\n }))\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-tooltip-top\"\n }, {\n paletteColor1: (0,external_window_wp_i18n_.__)('Color 1', 'blocksy'),\n paletteColor2: (0,external_window_wp_i18n_.__)('Color 2', 'blocksy'),\n paletteColor3: (0,external_window_wp_i18n_.__)('Color 3', 'blocksy'),\n paletteColor4: (0,external_window_wp_i18n_.__)('Color 4', 'blocksy'),\n paletteColor5: (0,external_window_wp_i18n_.__)('Color 5', 'blocksy'),\n paletteColor6: (0,external_window_wp_i18n_.__)('Color 6', 'blocksy'),\n paletteColor7: (0,external_window_wp_i18n_.__)('Color 7', 'blocksy'),\n paletteColor8: (0,external_window_wp_i18n_.__)('Color 8', 'blocksy')\n }[color]))), !option.skipNoColorPill && false && 0)), (0,external_window_wp_element_.createElement)(color_picker_iris, {\n onChange: v => onChange(v),\n value: picker_modal_objectSpread(picker_modal_objectSpread({}, value), {}, {\n color: getValueForPicker.color\n })\n })));\n};\n\n/* harmony default export */ const picker_modal = (PickerModal);\n// EXTERNAL MODULE: ./node_modules/react-spring/renderprops.js\nvar renderprops = __webpack_require__(4823);\n// EXTERNAL MODULE: ./node_modules/bezier-easing/src/index.js\nvar src = __webpack_require__(3431);\nvar src_default = /*#__PURE__*/__webpack_require__.n(src);\n// EXTERNAL MODULE: ./node_modules/match-conditions/dist/index.es.js\nvar index_es = __webpack_require__(7465);\n;// CONCATENATED MODULE: ./static/js/options/options/color-picker/single-picker.js\nfunction single_picker_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction single_picker_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? single_picker_ownKeys(Object(source), !0).forEach(function (key) { single_picker_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : single_picker_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction single_picker_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\nconst resolveInherit = (picker, option, values) => {\n if (typeof picker.inherit === 'string') {\n if (picker.inherit.indexOf('self') > -1) {\n const currentValue = values[option.id] || option.value;\n const pickerToInheritFrom = picker.inherit.split(':')[1];\n let maybeNextValue = currentValue[pickerToInheritFrom].color;\n\n if (maybeNextValue.indexOf('CT_CSS_SKIP_RULE') > -1) {\n maybeNextValue = option.pickers.find(_ref => {\n let {\n id\n } = _ref;\n return id === pickerToInheritFrom;\n }).inherit;\n }\n\n return {\n background: maybeNextValue || ''\n };\n }\n\n return {\n background: picker.inherit\n };\n }\n\n let background = Object.keys(picker.inherit).reduce((maybeResult, currentVar) => {\n if (maybeResult) {\n return maybeResult;\n }\n\n if ((0,index_es/* matchValuesWithCondition */.Nj)((0,index_es/* normalizeCondition */.KY)(picker.inherit[currentVar]), picker.inherit_source === 'global' ? Object.keys(picker.inherit[currentVar]).reduce((current, key) => single_picker_objectSpread(single_picker_objectSpread({}, current), {}, {\n [key]: wp.customize(key)()\n }), {}) : values)) {\n return currentVar;\n }\n\n return maybeResult;\n }, null);\n\n if (!background) {\n return {};\n }\n\n return {\n background\n };\n};\n\nconst SinglePicker = _ref2 => {\n let {\n option,\n value,\n onChange,\n picker,\n onPickingChange,\n stopTransitioning,\n innerRef,\n containerRef,\n modalRef,\n isTransitioning,\n isPicking,\n values\n } = _ref2;\n const el = (0,external_window_wp_element_.useRef)();\n const {\n appendToBody = true\n } = option;\n const {\n refreshPopover,\n styles,\n popoverProps\n } = (0,usePopoverMaker/* default */.Z)({\n contentRef: modalRef,\n ref: containerRef || {},\n defaultHeight: 379,\n shouldCalculate: !option.inline_modal || appendToBody\n });\n\n if (option.inline_modal) {\n return (0,external_window_wp_element_.createElement)(picker_modal, {\n containerRef: containerRef,\n option: option,\n onChange: onChange,\n picker: picker,\n value: value,\n inline_modal: !!option.inline_modal\n });\n }\n\n let modal = null;\n\n if (isTransitioning === picker.id || (isPicking || '').split(':')[0] === picker.id) {\n modal = (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(renderprops/* Transition */.uT, {\n items: isPicking,\n onRest: () => stopTransitioning(),\n config: {\n duration: 100,\n easing: src_default()(0.25, 0.1, 0.25, 1.0)\n },\n from: (isPicking || '').indexOf(':') === -1 ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n },\n enter: (isPicking || '').indexOf(':') === -1 ? {\n transform: 'scale3d(1, 1, 1)',\n opacity: 1\n } : {\n opacity: 1\n },\n leave: (isPicking || '').indexOf(':') === -1 ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n }\n }, isPicking => (isPicking || '').split(':')[0] === picker.id && (props => (0,external_window_wp_element_.createElement)(picker_modal, {\n style: single_picker_objectSpread(single_picker_objectSpread({}, props), appendToBody ? styles : {}),\n option: option,\n onChange: onChange,\n picker: picker,\n value: value,\n el: el,\n inheritValue: picker.inherit ? resolveInherit(picker, option, values).background : '',\n wrapperProps: appendToBody ? popoverProps : {\n ref: modalRef\n },\n appendToBody: appendToBody\n }))), appendToBody ? document.body : el.current.closest('section').parentNode);\n }\n\n return (0,external_window_wp_element_.createElement)(\"div\", {\n ref: instance => {\n el.current = instance;\n\n if (innerRef) {\n innerRef.current = instance;\n }\n },\n className: classnames_default()('ct-color-picker-single', {})\n }, (0,external_window_wp_element_.createElement)(\"span\", {\n tabIndex: \"0\"\n }, (0,external_window_wp_element_.createElement)(\"span\", {\n tabIndex: \"0\",\n className: classnames_default()({\n [`ct-no-color`]: (value || {}).color === getNoColorPropFor(option),\n [`ct-color-inherit`]: (value || {\n color: ''\n }).color.indexOf('INHERIT') > -1\n }),\n onClick: e => {\n if (option.skipModal) {\n return;\n }\n\n e.stopPropagation();\n refreshPopover();\n let futureIsPicking = isPicking ? isPicking.split(':')[0] === picker.id ? null : `${picker.id}:${isPicking.split(':')[0]}` : picker.id;\n onPickingChange(futureIsPicking);\n },\n style: ((value || {}).color || '').indexOf(getNoColorPropFor(option)) === -1 ? {\n background: (value || {}).color\n } : single_picker_objectSpread({}, picker.inherit && (value || {}).color !== getNoColorPropFor(option) ? resolveInherit(picker, option, values) : {})\n }, (0,external_window_wp_element_.createElement)(\"i\", {\n className: \"ct-tooltip-top\"\n }, (value || {\n color: ''\n }).color.indexOf('INHERIT') > -1 ? (0,external_window_wp_i18n_.__)('Inherited', 'blocksy') : picker.title), (value || {\n color: ''\n }).color.indexOf('INHERIT') > -1 && (0,external_window_wp_element_.createElement)(\"svg\", {\n width: \"25\",\n height: \"25\",\n viewBox: \"0 0 30 30\"\n }, (0,external_window_wp_element_.createElement)(\"path\", {\n d: \"M15 3c-3 0-5.7 1.1-7.8 2.9-.4.3-.5.9-.2 1.4.3.4 1 .5 1.4.2h.1C10.3 5.9 12.5 5 15 5c5.2 0 9.5 3.9 10 9h-3l4 6 4-6h-3.1C26.4 7.9 21.3 3 15 3zM4 10l-4 6h3.1c.5 6.1 5.6 11 11.9 11 3 0 5.7-1.1 7.8-2.9.4-.3.5-1 .2-1.4-.3-.4-1-.5-1.4-.2h-.1c-1.7 1.5-4 2.4-6.5 2.4-5.2 0-9.5-3.9-10-9h3L4 10z\"\n })))), modal);\n};\n\n/* harmony default export */ const single_picker = (SinglePicker);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjk0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUM1SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY29sb3ItcGlja2VyL2NvbG9yLXBpY2tlci1pcmlzLmpzPzI1MGMiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2NvbG9yLXBpY2tlci9waWNrZXItbW9kYWwuanM/OGM4NCIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY29sb3ItcGlja2VyL3NpbmdsZS1waWNrZXIuanM/ZDNmZCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCBjcmVhdGVSZWYgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXIgfSBmcm9tICdAd29yZHByZXNzL2NvbXBvbmVudHMnO1xuaW1wb3J0IF8gZnJvbSAnXyc7XG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCB7IG5vcm1hbGl6ZUNvbG9yIH0gZnJvbSAnLi4vLi4vaGVscGVycy9ub3JtYWxpemUtY29sb3InO1xuXG5jb25zdCBDb2xvclBpY2tlcklyaXMgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvbkNoYW5nZSxcbiAgICB2YWx1ZSxcbiAgICB2YWx1ZToge1xuICAgICAgY29sb3JcbiAgICB9XG4gIH0gPSBfcmVmO1xuICBjb25zdCBpc05ldyA9IHdwLmNvbXBvbmVudHMuR3JhZGllbnRQaWNrZXI7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGlzTmV3ID8gJ2N0LWd1dGVuYmVyZy1jb2xvci1waWNrZXItbmV3JyA6ICdjdC1ndXRlbmJlcmctY29sb3ItcGlja2VyJ1xuICB9LCBjcmVhdGVFbGVtZW50KENvbG9yUGlja2VyLCBfZXh0ZW5kcyh7XG4gICAgY29sb3I6IGNvbG9yLFxuICAgIGVuYWJsZUFscGhhOiB0cnVlXG4gIH0sIGlzTmV3ID8ge1xuICAgIG9uQ2hhbmdlOiBjb2xvciA9PiB7XG4gICAgICBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgY29sb3I6IG5vcm1hbGl6ZUNvbG9yKGNvbG9yKVxuICAgICAgfSkpO1xuICAgIH1cbiAgfSA6IHtcbiAgICBvbkNoYW5nZUNvbXBsZXRlOiByZXN1bHQgPT4ge1xuICAgICAgb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICAgIGNvbG9yOiByZXN1bHQucmdiLmEgPT09IDEgPyByZXN1bHQuaGV4IDogYHJnYmEoJHtyZXN1bHQucmdiLnJ9LCAke3Jlc3VsdC5yZ2IuZ30sICR7cmVzdWx0LnJnYi5ifSwgJHtyZXN1bHQucmdiLmF9KWBcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWNvbG9yLXBpY2tlci12YWx1ZVwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG4gICAgb25DaGFuZ2U6IF9yZWYyID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHZhbHVlOiBjb2xvclxuICAgICAgICB9XG4gICAgICB9ID0gX3JlZjI7XG4gICAgICBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgY29sb3I6IG5vcm1hbGl6ZUNvbG9yKGNvbG9yKVxuICAgICAgfSkpO1xuICAgIH0sXG4gICAgdmFsdWU6IG5vcm1hbGl6ZUNvbG9yKGNvbG9yKSxcbiAgICB0eXBlOiBcInRleHRcIlxuICB9KSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29sb3JQaWNrZXJJcmlzOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZVJlZiwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIGNyZWF0ZVJlZiwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IENvbG9yUGlja2VySXJpcyBmcm9tICcuL2NvbG9yLXBpY2tlci1pcmlzLmpzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCB7IG51bGxpZnlUcmFuc2Zvcm1zIH0gZnJvbSAnLi4vLi4vaGVscGVycy91c2VQb3BvdmVyTWFrZXInO1xuZXhwb3J0IGNvbnN0IGdldE5vQ29sb3JQcm9wRm9yID0gb3B0aW9uID0+IG9wdGlvbi5ub0NvbG9yVHJhbnNwYXJlbnQgPyAndHJhbnNwYXJlbnQnIDogYENUX0NTU19TS0lQX1JVTEVgO1xuXG5jb25zdCBmb2N1c09yT3BlbkN1c3RvbWl6ZXJTZWN0aW9uUHJvcHMgPSBzZWN0aW9uID0+IF9vYmplY3RTcHJlYWQoe1xuICB0YXJnZXQ6ICdfYmxhbmsnLFxuICBocmVmOiBgJHt3aW5kb3cuY3RfbG9jYWxpemF0aW9ucyA/IHdpbmRvdy5jdF9sb2NhbGl6YXRpb25zLmN1c3RvbWl6ZXJfdXJsIDogJyd9JHtlbmNvZGVVUklDb21wb25lbnQoYFtzZWN0aW9uXT0ke3NlY3Rpb259YCl9YFxufSwgd3AgJiYgd3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZS5zZWN0aW9uID8ge1xuICBvbkNsaWNrOiBlID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgd3AuY3VzdG9taXplLnNlY3Rpb24oc2VjdGlvbikuZXhwYW5kKCk7XG4gIH1cbn0gOiB7fSk7XG5cbmNvbnN0IGdldExlZnRGb3JFbCA9IChtb2RhbCwgZWwpID0+IHtcbiAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGxldCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobW9kYWwpO1xuICBsZXQgd3JhcHBlckxlZnQgPSBwYXJzZUZsb2F0KHN0eWxlLmxlZnQpO1xuICBlbCA9IGVsLmZpcnN0RWxlbWVudENoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4ge1xuICAgICctLW9wdGlvbi1tb2RhbC1hcnJvdy1wb3NpdGlvbic6IGAke2VsLmxlZnQgKyBlbC53aWR0aCAvIDIgLSB3cmFwcGVyTGVmdCAtIDZ9cHhgXG4gIH07XG59O1xuXG5jb25zdCBQaWNrZXJNb2RhbCA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGNvbnRhaW5lclJlZixcbiAgICBlbCxcbiAgICB2YWx1ZSxcbiAgICBwaWNrZXIsXG4gICAgb25DaGFuZ2UsXG4gICAgb3B0aW9uLFxuICAgIHN0eWxlLFxuICAgIHdyYXBwZXJQcm9wcyA9IHt9LFxuICAgIGlubGluZV9tb2RhbCxcbiAgICBhcHBlbmRUb0JvZHksXG4gICAgaW5oZXJpdFZhbHVlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBnZXRWYWx1ZUZvclBpY2tlciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICh2YWx1ZS5jb2xvciA9PT0gZ2V0Tm9Db2xvclByb3BGb3Iob3B0aW9uKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sb3I6ICcnLFxuICAgICAgICBrZXk6ICdlbXB0eSdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCh2YWx1ZS5jb2xvciB8fCAnJykuaW5kZXhPZihnZXROb0NvbG9yUHJvcEZvcihvcHRpb24pKSA+IC0xKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6ICcnLFxuICAgICAgICBjb2xvcjogJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCh2YWx1ZS5jb2xvciB8fCAnJykuaW5kZXhPZihnZXROb0NvbG9yUHJvcEZvcihvcHRpb24pKSA+IC0xICYmIHBpY2tlci5pbmhlcml0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6ICdwaWNrZXInICsgaW5oZXJpdFZhbHVlLFxuICAgICAgICBjb2xvcjogZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoaW5oZXJpdFZhbHVlLnJlcGxhY2UoL3ZhclxcKC8sICcnKS5yZXBsYWNlKC9cXCkvLCAnJykpLnRyaW0oKS5yZXBsYWNlKC9cXHMvZywgJycpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgodmFsdWUuY29sb3IgfHwgJycpLmluZGV4T2YoJ3ZhcicpID4gLTEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3ZhcicgKyB2YWx1ZS5jb2xvcixcbiAgICAgICAgY29sb3I6IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHZhbHVlLmNvbG9yLnJlcGxhY2UoL3ZhclxcKC8sICcnKS5yZXBsYWNlKC9cXCkvLCAnJykpLnRyaW0oKS5yZXBsYWNlKC9cXHMvZywgJycpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICdjb2xvcicsXG4gICAgICBjb2xvcjogdmFsdWUuY29sb3JcbiAgICB9O1xuICB9LCBbdmFsdWUsIG9wdGlvbiwgcGlja2VyLCBpbmhlcml0VmFsdWVdKTtcbiAgbGV0IHZhbHVlVG9DaGVjayA9IHZhbHVlLmNvbG9yO1xuXG4gIGlmICgodmFsdWUuY29sb3IgfHwgJycpLmluZGV4T2YoZ2V0Tm9Db2xvclByb3BGb3Iob3B0aW9uKSkgPiAtMSAmJiBwaWNrZXIuaW5oZXJpdCkge1xuICAgIHZhbHVlVG9DaGVjayA9IGluaGVyaXRWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGFycm93TGVmdCA9IHVzZU1lbW8oKCkgPT4gd3JhcHBlclByb3BzLnJlZiAmJiB3cmFwcGVyUHJvcHMucmVmLmN1cnJlbnQgJiYgZWwgJiYgZ2V0TGVmdEZvckVsKHdyYXBwZXJQcm9wcy5yZWYuY3VycmVudCwgZWwuY3VycmVudCksIFt3cmFwcGVyUHJvcHMucmVmICYmIHdyYXBwZXJQcm9wcy5yZWYuY3VycmVudCwgZWwgJiYgZWwuY3VycmVudF0pO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgdGFiSW5kZXg6IFwiMFwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyhgY3QtY29sb3ItcGlja2VyLW1vZGFsYCwge1xuICAgICAgJ2N0LW9wdGlvbi1tb2RhbCc6ICFpbmxpbmVfbW9kYWwgJiYgYXBwZW5kVG9Cb2R5XG4gICAgfSwgb3B0aW9uLm1vZGFsQ2xhc3NOYW1lKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhcnJvd0xlZnQpLCBzdHlsZSA/IHN0eWxlIDoge30pXG4gIH0sIHdyYXBwZXJQcm9wcyksICFvcHRpb24ucHJlZGVmaW5lZCAmJiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtY29sb3ItcGlja2VyLXRvcFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWNvbG9yLXBpY2tlci1za2luc1wiXG4gIH0sIFsncGFsZXR0ZUNvbG9yMScsICdwYWxldHRlQ29sb3IyJywgJ3BhbGV0dGVDb2xvcjMnLCAncGFsZXR0ZUNvbG9yNCcsICdwYWxldHRlQ29sb3I1JywgJ3BhbGV0dGVDb2xvcjYnLCAncGFsZXR0ZUNvbG9yNycsICdwYWxldHRlQ29sb3I4J10ubWFwKGNvbG9yID0+IGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiBjb2xvcixcbiAgICBzdHlsZToge1xuICAgICAgYmFja2dyb3VuZDogYHZhcigtLSR7Y29sb3J9KWBcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBhY3RpdmU6IHZhbHVlVG9DaGVjayA9PT0gYHZhcigtLSR7Y29sb3J9KWBcbiAgICB9KSxcbiAgICBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGNvbG9yOiBgdmFyKC0tJHtjb2xvcn0pYFxuICAgIH0pKVxuICB9LCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdG9vbHRpcC10b3BcIlxuICB9LCB7XG4gICAgcGFsZXR0ZUNvbG9yMTogX18oJ0NvbG9yIDEnLCAnYmxvY2tzeScpLFxuICAgIHBhbGV0dGVDb2xvcjI6IF9fKCdDb2xvciAyJywgJ2Jsb2Nrc3knKSxcbiAgICBwYWxldHRlQ29sb3IzOiBfXygnQ29sb3IgMycsICdibG9ja3N5JyksXG4gICAgcGFsZXR0ZUNvbG9yNDogX18oJ0NvbG9yIDQnLCAnYmxvY2tzeScpLFxuICAgIHBhbGV0dGVDb2xvcjU6IF9fKCdDb2xvciA1JywgJ2Jsb2Nrc3knKSxcbiAgICBwYWxldHRlQ29sb3I2OiBfXygnQ29sb3IgNicsICdibG9ja3N5JyksXG4gICAgcGFsZXR0ZUNvbG9yNzogX18oJ0NvbG9yIDcnLCAnYmxvY2tzeScpLFxuICAgIHBhbGV0dGVDb2xvcjg6IF9fKCdDb2xvciA4JywgJ2Jsb2Nrc3knKVxuICB9W2NvbG9yXSkpKSwgIW9wdGlvbi5za2lwTm9Db2xvclBpbGwgJiYgZmFsc2UgJiYgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGNvbG9yOiBnZXROb0NvbG9yUHJvcEZvcihvcHRpb24pXG4gICAgfSkpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3Qtbm8tY29sb3ItcGlsbCcsIHtcbiAgICAgIGFjdGl2ZTogdmFsdWUuY29sb3IgPT09IGdldE5vQ29sb3JQcm9wRm9yKG9wdGlvbilcbiAgICB9KVxuICB9LCBjcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXRvb2x0aXAtdG9wXCJcbiAgfSwgX18oJ05vIENvbG9yJywgJ2Jsb2Nrc3knKSkpKSksIGNyZWF0ZUVsZW1lbnQoQ29sb3JQaWNrZXJJcmlzLCB7XG4gICAgb25DaGFuZ2U6IHYgPT4gb25DaGFuZ2UodiksXG4gICAgdmFsdWU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgY29sb3I6IGdldFZhbHVlRm9yUGlja2VyLmNvbG9yXG4gICAgfSlcbiAgfSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFBpY2tlck1vZGFsOyIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgY3JlYXRlUG9ydGFsLCB1c2VSZWYsIGNyZWF0ZVJlZiB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgUGlja2VyTW9kYWwsIHsgZ2V0Tm9Db2xvclByb3BGb3IgfSBmcm9tICcuL3BpY2tlci1tb2RhbCc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uIH0gZnJvbSAncmVhY3Qtc3ByaW5nL3JlbmRlcnByb3BzJztcbmltcG9ydCBiZXppZXJFYXNpbmcgZnJvbSAnYmV6aWVyLWVhc2luZyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgeyBub3JtYWxpemVDb25kaXRpb24sIG1hdGNoVmFsdWVzV2l0aENvbmRpdGlvbiB9IGZyb20gJ21hdGNoLWNvbmRpdGlvbnMnO1xuaW1wb3J0IHVzZVBvcG92ZXJNYWtlciBmcm9tICcuLi8uLi9oZWxwZXJzL3VzZVBvcG92ZXJNYWtlcic7XG5cbmNvbnN0IHJlc29sdmVJbmhlcml0ID0gKHBpY2tlciwgb3B0aW9uLCB2YWx1ZXMpID0+IHtcbiAgaWYgKHR5cGVvZiBwaWNrZXIuaW5oZXJpdCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAocGlja2VyLmluaGVyaXQuaW5kZXhPZignc2VsZicpID4gLTEpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlc1tvcHRpb24uaWRdIHx8IG9wdGlvbi52YWx1ZTtcbiAgICAgIGNvbnN0IHBpY2tlclRvSW5oZXJpdEZyb20gPSBwaWNrZXIuaW5oZXJpdC5zcGxpdCgnOicpWzFdO1xuICAgICAgbGV0IG1heWJlTmV4dFZhbHVlID0gY3VycmVudFZhbHVlW3BpY2tlclRvSW5oZXJpdEZyb21dLmNvbG9yO1xuXG4gICAgICBpZiAobWF5YmVOZXh0VmFsdWUuaW5kZXhPZignQ1RfQ1NTX1NLSVBfUlVMRScpID4gLTEpIHtcbiAgICAgICAgbWF5YmVOZXh0VmFsdWUgPSBvcHRpb24ucGlja2Vycy5maW5kKF9yZWYgPT4ge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0gPSBfcmVmO1xuICAgICAgICAgIHJldHVybiBpZCA9PT0gcGlja2VyVG9Jbmhlcml0RnJvbTtcbiAgICAgICAgfSkuaW5oZXJpdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmFja2dyb3VuZDogbWF5YmVOZXh0VmFsdWUgfHwgJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJhY2tncm91bmQ6IHBpY2tlci5pbmhlcml0XG4gICAgfTtcbiAgfVxuXG4gIGxldCBiYWNrZ3JvdW5kID0gT2JqZWN0LmtleXMocGlja2VyLmluaGVyaXQpLnJlZHVjZSgobWF5YmVSZXN1bHQsIGN1cnJlbnRWYXIpID0+IHtcbiAgICBpZiAobWF5YmVSZXN1bHQpIHtcbiAgICAgIHJldHVybiBtYXliZVJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uKG5vcm1hbGl6ZUNvbmRpdGlvbihwaWNrZXIuaW5oZXJpdFtjdXJyZW50VmFyXSksIHBpY2tlci5pbmhlcml0X3NvdXJjZSA9PT0gJ2dsb2JhbCcgPyBPYmplY3Qua2V5cyhwaWNrZXIuaW5oZXJpdFtjdXJyZW50VmFyXSkucmVkdWNlKChjdXJyZW50LCBrZXkpID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudCksIHt9LCB7XG4gICAgICBba2V5XTogd3AuY3VzdG9taXplKGtleSkoKVxuICAgIH0pLCB7fSkgOiB2YWx1ZXMpKSB7XG4gICAgICByZXR1cm4gY3VycmVudFZhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVSZXN1bHQ7XG4gIH0sIG51bGwpO1xuXG4gIGlmICghYmFja2dyb3VuZCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmFja2dyb3VuZFxuICB9O1xufTtcblxuY29uc3QgU2luZ2xlUGlja2VyID0gX3JlZjIgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbixcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgICBwaWNrZXIsXG4gICAgb25QaWNraW5nQ2hhbmdlLFxuICAgIHN0b3BUcmFuc2l0aW9uaW5nLFxuICAgIGlubmVyUmVmLFxuICAgIGNvbnRhaW5lclJlZixcbiAgICBtb2RhbFJlZixcbiAgICBpc1RyYW5zaXRpb25pbmcsXG4gICAgaXNQaWNraW5nLFxuICAgIHZhbHVlc1xuICB9ID0gX3JlZjI7XG4gIGNvbnN0IGVsID0gdXNlUmVmKCk7XG4gIGNvbnN0IHtcbiAgICBhcHBlbmRUb0JvZHkgPSB0cnVlXG4gIH0gPSBvcHRpb247XG4gIGNvbnN0IHtcbiAgICByZWZyZXNoUG9wb3ZlcixcbiAgICBzdHlsZXMsXG4gICAgcG9wb3ZlclByb3BzXG4gIH0gPSB1c2VQb3BvdmVyTWFrZXIoe1xuICAgIGNvbnRlbnRSZWY6IG1vZGFsUmVmLFxuICAgIHJlZjogY29udGFpbmVyUmVmIHx8IHt9LFxuICAgIGRlZmF1bHRIZWlnaHQ6IDM3OSxcbiAgICBzaG91bGRDYWxjdWxhdGU6ICFvcHRpb24uaW5saW5lX21vZGFsIHx8IGFwcGVuZFRvQm9keVxuICB9KTtcblxuICBpZiAob3B0aW9uLmlubGluZV9tb2RhbCkge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFBpY2tlck1vZGFsLCB7XG4gICAgICBjb250YWluZXJSZWY6IGNvbnRhaW5lclJlZixcbiAgICAgIG9wdGlvbjogb3B0aW9uLFxuICAgICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgICAgcGlja2VyOiBwaWNrZXIsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBpbmxpbmVfbW9kYWw6ICEhb3B0aW9uLmlubGluZV9tb2RhbFxuICAgIH0pO1xuICB9XG5cbiAgbGV0IG1vZGFsID0gbnVsbDtcblxuICBpZiAoaXNUcmFuc2l0aW9uaW5nID09PSBwaWNrZXIuaWQgfHwgKGlzUGlja2luZyB8fCAnJykuc3BsaXQoJzonKVswXSA9PT0gcGlja2VyLmlkKSB7XG4gICAgbW9kYWwgPSBjcmVhdGVQb3J0YWwoY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCB7XG4gICAgICBpdGVtczogaXNQaWNraW5nLFxuICAgICAgb25SZXN0OiAoKSA9PiBzdG9wVHJhbnNpdGlvbmluZygpLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGR1cmF0aW9uOiAxMDAsXG4gICAgICAgIGVhc2luZzogYmV6aWVyRWFzaW5nKDAuMjUsIDAuMSwgMC4yNSwgMS4wKVxuICAgICAgfSxcbiAgICAgIGZyb206IChpc1BpY2tpbmcgfHwgJycpLmluZGV4T2YoJzonKSA9PT0gLTEgPyB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMC45NSwgMC45NSwgMSknLFxuICAgICAgICBvcGFjaXR5OiAwXG4gICAgICB9IDoge1xuICAgICAgICBvcGFjaXR5OiAxXG4gICAgICB9LFxuICAgICAgZW50ZXI6IChpc1BpY2tpbmcgfHwgJycpLmluZGV4T2YoJzonKSA9PT0gLTEgPyB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMSwgMSwgMSknLFxuICAgICAgICBvcGFjaXR5OiAxXG4gICAgICB9IDoge1xuICAgICAgICBvcGFjaXR5OiAxXG4gICAgICB9LFxuICAgICAgbGVhdmU6IChpc1BpY2tpbmcgfHwgJycpLmluZGV4T2YoJzonKSA9PT0gLTEgPyB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMC45NSwgMC45NSwgMSknLFxuICAgICAgICBvcGFjaXR5OiAwXG4gICAgICB9IDoge1xuICAgICAgICBvcGFjaXR5OiAxXG4gICAgICB9XG4gICAgfSwgaXNQaWNraW5nID0+IChpc1BpY2tpbmcgfHwgJycpLnNwbGl0KCc6JylbMF0gPT09IHBpY2tlci5pZCAmJiAocHJvcHMgPT4gY3JlYXRlRWxlbWVudChQaWNrZXJNb2RhbCwge1xuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCBhcHBlbmRUb0JvZHkgPyBzdHlsZXMgOiB7fSksXG4gICAgICBvcHRpb246IG9wdGlvbixcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgIHBpY2tlcjogcGlja2VyLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZWw6IGVsLFxuICAgICAgaW5oZXJpdFZhbHVlOiBwaWNrZXIuaW5oZXJpdCA/IHJlc29sdmVJbmhlcml0KHBpY2tlciwgb3B0aW9uLCB2YWx1ZXMpLmJhY2tncm91bmQgOiAnJyxcbiAgICAgIHdyYXBwZXJQcm9wczogYXBwZW5kVG9Cb2R5ID8gcG9wb3ZlclByb3BzIDoge1xuICAgICAgICByZWY6IG1vZGFsUmVmXG4gICAgICB9LFxuICAgICAgYXBwZW5kVG9Cb2R5OiBhcHBlbmRUb0JvZHlcbiAgICB9KSkpLCBhcHBlbmRUb0JvZHkgPyBkb2N1bWVudC5ib2R5IDogZWwuY3VycmVudC5jbG9zZXN0KCdzZWN0aW9uJykucGFyZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBpbnN0YW5jZSA9PiB7XG4gICAgICBlbC5jdXJyZW50ID0gaW5zdGFuY2U7XG5cbiAgICAgIGlmIChpbm5lclJlZikge1xuICAgICAgICBpbm5lclJlZi5jdXJyZW50ID0gaW5zdGFuY2U7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LWNvbG9yLXBpY2tlci1zaW5nbGUnLCB7fSlcbiAgfSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHRhYkluZGV4OiBcIjBcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgdGFiSW5kZXg6IFwiMFwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBbYGN0LW5vLWNvbG9yYF06ICh2YWx1ZSB8fCB7fSkuY29sb3IgPT09IGdldE5vQ29sb3JQcm9wRm9yKG9wdGlvbiksXG4gICAgICBbYGN0LWNvbG9yLWluaGVyaXRgXTogKHZhbHVlIHx8IHtcbiAgICAgICAgY29sb3I6ICcnXG4gICAgICB9KS5jb2xvci5pbmRleE9mKCdJTkhFUklUJykgPiAtMVxuICAgIH0pLFxuICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgaWYgKG9wdGlvbi5za2lwTW9kYWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmVmcmVzaFBvcG92ZXIoKTtcbiAgICAgIGxldCBmdXR1cmVJc1BpY2tpbmcgPSBpc1BpY2tpbmcgPyBpc1BpY2tpbmcuc3BsaXQoJzonKVswXSA9PT0gcGlja2VyLmlkID8gbnVsbCA6IGAke3BpY2tlci5pZH06JHtpc1BpY2tpbmcuc3BsaXQoJzonKVswXX1gIDogcGlja2VyLmlkO1xuICAgICAgb25QaWNraW5nQ2hhbmdlKGZ1dHVyZUlzUGlja2luZyk7XG4gICAgfSxcbiAgICBzdHlsZTogKCh2YWx1ZSB8fCB7fSkuY29sb3IgfHwgJycpLmluZGV4T2YoZ2V0Tm9Db2xvclByb3BGb3Iob3B0aW9uKSkgPT09IC0xID8ge1xuICAgICAgYmFja2dyb3VuZDogKHZhbHVlIHx8IHt9KS5jb2xvclxuICAgIH0gOiBfb2JqZWN0U3ByZWFkKHt9LCBwaWNrZXIuaW5oZXJpdCAmJiAodmFsdWUgfHwge30pLmNvbG9yICE9PSBnZXROb0NvbG9yUHJvcEZvcihvcHRpb24pID8gcmVzb2x2ZUluaGVyaXQocGlja2VyLCBvcHRpb24sIHZhbHVlcykgOiB7fSlcbiAgfSwgY3JlYXRlRWxlbWVudChcImlcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC10b29sdGlwLXRvcFwiXG4gIH0sICh2YWx1ZSB8fCB7XG4gICAgY29sb3I6ICcnXG4gIH0pLmNvbG9yLmluZGV4T2YoJ0lOSEVSSVQnKSA+IC0xID8gX18oJ0luaGVyaXRlZCcsICdibG9ja3N5JykgOiBwaWNrZXIudGl0bGUpLCAodmFsdWUgfHwge1xuICAgIGNvbG9yOiAnJ1xuICB9KS5jb2xvci5pbmRleE9mKCdJTkhFUklUJykgPiAtMSAmJiBjcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogXCIyNVwiLFxuICAgIGhlaWdodDogXCIyNVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDMwIDMwXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE1IDNjLTMgMC01LjcgMS4xLTcuOCAyLjktLjQuMy0uNS45LS4yIDEuNC4zLjQgMSAuNSAxLjQuMmguMUMxMC4zIDUuOSAxMi41IDUgMTUgNWM1LjIgMCA5LjUgMy45IDEwIDloLTNsNCA2IDQtNmgtMy4xQzI2LjQgNy45IDIxLjMgMyAxNSAzek00IDEwbC00IDZoMy4xYy41IDYuMSA1LjYgMTEgMTEuOSAxMSAzIDAgNS43LTEuMSA3LjgtMi45LjQtLjMuNS0xIC4yLTEuNC0uMy0uNC0xLS41LTEuNC0uMmgtLjFjLTEuNyAxLjUtNCAyLjQtNi41IDIuNC01LjIgMC05LjUtMy45LTEwLTloM0w0IDEwelwiXG4gIH0pKSkpLCBtb2RhbCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTaW5nbGVQaWNrZXI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///694\n")},9285:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "LayersContext": () => (/* binding */ LayersContext),\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_sortable_hoc__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6362);\n/* harmony import */ var array_move__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(454);\n/* harmony import */ var array_move__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(array_move__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _OptionsPanel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7429);\n/* harmony import */ var _helpers_get_value_from_input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7069);\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1496);\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(nanoid__WEBPACK_IMPORTED_MODULE_7__);\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\nconst LayerControls = (0,react_sortable_hoc__WEBPACK_IMPORTED_MODULE_2__/* .SortableHandle */ .W6)(_ref => {\n let {\n items,\n onChange,\n value\n } = _ref;\n const {\n removeForId,\n addForId,\n option,\n toggleOptionsPanel\n } = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useContext)(LayersContext);\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-layer-controls"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n type: "button",\n className: "ct-visibility",\n onClick: e => {\n e.stopPropagation();\n onChange(items.map(l => l.__id === value.__id ? _objectSpread(_objectSpread({}, l), {}, {\n enabled: !_objectSpread({\n enabled: true\n }, l).enabled\n }) : l));\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("svg", {\n width: "13px",\n height: "13px",\n viewBox: "0 0 24 24"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("path", {\n d: "M12,4C4.1,4,0,12,0,12s3.1,8,12,8c8.1,0,12-8,12-8S20.1,4,12,4z M12,17c-2.9,0-5-2.2-5-5c0-2.8,2.1-5,5-5s5,2.2,5,5C17,14.8,14.9,17,12,17z M12,9c-1.7,0-3,1.4-3,3c0,1.6,1.3,3,3,3s3-1.4,3-3C15,10.4,13.7,9,12,9z"\n }))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-layer-label"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, window._.template(option[\'preview-template\'])(value))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n type: "button",\n className: "ct-clone",\n onClick: () => addForId(value)\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("svg", {\n width: "11px",\n height: "11px",\n viewBox: "0 0 24 24"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("path", {\n d: "M23,24H7.7c-0.6,0-1-0.4-1-1V7.7c0-0.6,0.4-1,1-1H23c0.6,0,1,0.4,1,1V23C24,23.6,23.6,24,23,24z M8.7,22H22V8.7 H8.7V22z"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("path", {\n d: "M17.3,16.3c0,0.6-0.4,1-1,1H1c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1h15.3c0.6,0,1,0.4,1,1V16.3z"\n })), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("i", {\n className: "ct-tooltip-top"\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_4__.__)(\'Clone Item\', \'blocksy\'))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n type: "button",\n className: "ct-remove",\n onClick: () => removeForId(value.__id)\n }), option[\'inner-options\'] && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n type: "button",\n className: "ct-toggle",\n onMouseDown: e => {\n e.stopPropagation();\n },\n onClick: e => {\n e.stopPropagation();\n toggleOptionsPanel(value.__id);\n }\n }));\n});\n\nconst valueWithUniqueIds = value => value.map(singleItem => _objectSpread(_objectSpread({}, singleItem), singleItem.__id ? {} : {\n __id: nanoid__WEBPACK_IMPORTED_MODULE_7___default()()\n}));\n\nconst getDefaultState = () => ({\n currentlyPickedItem: null,\n isDragging: false,\n isOpen: false\n});\n\nconst LayersContext = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createContext)(getDefaultState());\nconst {\n Provider,\n Consumer\n} = LayersContext;\n\nclass SingleItem extends _wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n\n _defineProperty(this, "state", {\n isOpen: false\n });\n }\n\n render() {\n const {\n value,\n items,\n onChange\n } = this.props;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(Consumer, null, _ref2 => {\n let {\n option,\n isDragging,\n isOpen,\n parentValue\n } = _ref2;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(\'ct-layer\', option.itemClass, {\n [`ct-disabled`]: !_objectSpread({\n enabled: true\n }, value).enabled\n })\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(LayerControls, {\n items: items,\n onChange: onChange,\n value: value\n }), isOpen === value.__id && (!isDragging || isDragging && isDragging !== isOpen) && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-layer-content"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_OptionsPanel__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .Z, {\n hasRevertButton: false,\n parentValue: parentValue,\n onChange: (key, newValue) => {\n onChange(items.map(l => l.__id === value.__id ? _objectSpread(_objectSpread({}, l), {}, {\n [key]: newValue\n }) : l));\n },\n value: (0,_helpers_get_value_from_input__WEBPACK_IMPORTED_MODULE_6__/* .getValueFromInput */ .n6)(option[\'inner-options\'], _objectSpread(_objectSpread({}, option.value.filter(_ref3 => {\n let {\n id\n } = _ref3;\n return id === value.id;\n }).length > 1 ? option.value.filter(_ref4 => {\n let {\n id\n } = _ref4;\n return value.id === id;\n })[items.filter(_ref5 => {\n let {\n id\n } = _ref5;\n return id === value.id;\n }).map(_ref6 => {\n let {\n __id\n } = _ref6;\n return __id;\n }).indexOf(value.__id)] : {}), value)),\n options: option[\'inner-options\']\n })));\n });\n }\n\n}\n\nconst SortableItem = (0,react_sortable_hoc__WEBPACK_IMPORTED_MODULE_2__/* .SortableElement */ .W8)(SingleItem);\nconst SortableList = (0,react_sortable_hoc__WEBPACK_IMPORTED_MODULE_2__/* .SortableContainer */ .JN)(_ref7 => {\n let {\n items,\n onChange\n } = _ref7;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(Consumer, null, _ref8 => {\n let {\n option\n } = _ref8;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", {\n className: "ct-layers"\n }, items.map((value, index) => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(SortableItem, {\n key: value.__id,\n index: index,\n onChange: onChange,\n value: value,\n items: items,\n disabled: !!option.disableDrag\n })));\n });\n});\n\nconst Layers = _ref9 => {\n let {\n value,\n option,\n onChange,\n values\n } = _ref9;\n const [state, setState] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)(getDefaultState());\n\n const localOnChange = v => {\n onChange(v);\n };\n\n const addForId = function () {\n let val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n localOnChange([...(value || []), _objectSpread(_objectSpread(_objectSpread({\n enabled: true\n }, (0,_helpers_get_value_from_input__WEBPACK_IMPORTED_MODULE_6__/* .getValueFromInput */ .n6)(option[\'inner-options\'] || {}, {})), val), {}, {\n __id: nanoid__WEBPACK_IMPORTED_MODULE_7___default()()\n })]);\n };\n\n const computedValue = valueWithUniqueIds(value);\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(Provider, {\n value: _objectSpread(_objectSpread({}, state), {}, {\n parentValue: values,\n addForId,\n option,\n removeForId: idToRemove => localOnChange(valueWithUniqueIds(value).filter(_ref10 => {\n let {\n __id: id\n } = _ref10;\n return id !== idToRemove;\n })),\n toggleOptionsPanel: idToAdd => {\n if (value.length > 0 && !value[0].__id) {\n localOnChange(computedValue);\n }\n\n setState(state => _objectSpread(_objectSpread({}, state), {}, {\n isOpen: state.isOpen === idToAdd ? false : idToAdd\n }));\n }\n })\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(SortableList, {\n useDragHandle: true,\n distance: 3,\n lockAxis: "y",\n items: computedValue,\n onChange: v => {\n localOnChange(v);\n },\n helperContainer: () => document.querySelector(\'#customize-theme-controls\') || document.body,\n onSortEnd: _ref11 => {\n let {\n oldIndex,\n newIndex\n } = _ref11;\n localOnChange(array_move__WEBPACK_IMPORTED_MODULE_3___default()(computedValue, oldIndex, newIndex));\n setState(state => _objectSpread(_objectSpread({}, state), {}, {\n isDragging: false\n }));\n },\n updateBeforeSortStart: _ref12 => {\n let {\n index\n } = _ref12;\n new Promise(resolve => {\n if (value.length > 0 && !value[0].__id) {\n wp.customize && wp.customize.previewer && wp.customize.previewer.send(\'ct:sync:refresh_partial\', {\n shouldSkip: true\n });\n localOnChange(computedValue);\n }\n\n setState(state => _objectSpread(_objectSpread({}, state), {}, {\n isDragging: computedValue[index].__id\n }));\n resolve();\n });\n }\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n className: "button",\n onClick: e => {\n e.preventDefault();\n addForId();\n }\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_4__.__)(\'Add New Item\', \'blocksy\')));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Layers);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTI4NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LWFkZGFibGUtYm94LmpzPzg5MWQiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VDb250ZXh0LCBjcmVhdGVDb250ZXh0LCB1c2VTdGF0ZSwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBTb3J0YWJsZUNvbnRhaW5lciwgU29ydGFibGVFbGVtZW50LCBTb3J0YWJsZUhhbmRsZSB9IGZyb20gJ3JlYWN0LXNvcnRhYmxlLWhvYyc7XG5pbXBvcnQgYXJyYXlNb3ZlIGZyb20gJ2FycmF5LW1vdmUnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vT3B0aW9uc1BhbmVsJztcbmltcG9ydCB7IGdldFZhbHVlRnJvbUlucHV0IH0gZnJvbSAnLi4vaGVscGVycy9nZXQtdmFsdWUtZnJvbS1pbnB1dCc7XG5pbXBvcnQgbmFub2lkIGZyb20gJ25hbm9pZCc7XG5jb25zdCBMYXllckNvbnRyb2xzID0gU29ydGFibGVIYW5kbGUoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaXRlbXMsXG4gICAgb25DaGFuZ2UsXG4gICAgdmFsdWVcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHtcbiAgICByZW1vdmVGb3JJZCxcbiAgICBhZGRGb3JJZCxcbiAgICBvcHRpb24sXG4gICAgdG9nZ2xlT3B0aW9uc1BhbmVsXG4gIH0gPSB1c2VDb250ZXh0KExheWVyc0NvbnRleHQpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWxheWVyLWNvbnRyb2xzXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBjbGFzc05hbWU6IFwiY3QtdmlzaWJpbGl0eVwiLFxuICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG9uQ2hhbmdlKGl0ZW1zLm1hcChsID0+IGwuX19pZCA9PT0gdmFsdWUuX19pZCA/IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbCksIHt9LCB7XG4gICAgICAgIGVuYWJsZWQ6ICFfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlXG4gICAgICAgIH0sIGwpLmVuYWJsZWRcbiAgICAgIH0pIDogbCkpO1xuICAgIH1cbiAgfSwgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiMTNweFwiLFxuICAgIGhlaWdodDogXCIxM3B4XCIsXG4gICAgdmlld0JveDogXCIwIDAgMjQgMjRcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTIsNEM0LjEsNCwwLDEyLDAsMTJzMy4xLDgsMTIsOGM4LjEsMCwxMi04LDEyLThTMjAuMSw0LDEyLDR6IE0xMiwxN2MtMi45LDAtNS0yLjItNS01YzAtMi44LDIuMS01LDUtNXM1LDIuMiw1LDVDMTcsMTQuOCwxNC45LDE3LDEyLDE3eiBNMTIsOWMtMS43LDAtMywxLjQtMywzYzAsMS42LDEuMywzLDMsM3MzLTEuNCwzLTNDMTUsMTAuNCwxMy43LDksMTIsOXpcIlxuICB9KSkpLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtbGF5ZXItbGFiZWxcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCB3aW5kb3cuXy50ZW1wbGF0ZShvcHRpb25bJ3ByZXZpZXctdGVtcGxhdGUnXSkodmFsdWUpKSksIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcImN0LWNsb25lXCIsXG4gICAgb25DbGljazogKCkgPT4gYWRkRm9ySWQodmFsdWUpXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjExcHhcIixcbiAgICBoZWlnaHQ6IFwiMTFweFwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIzLDI0SDcuN2MtMC42LDAtMS0wLjQtMS0xVjcuN2MwLTAuNiwwLjQtMSwxLTFIMjNjMC42LDAsMSwwLjQsMSwxVjIzQzI0LDIzLjYsMjMuNiwyNCwyMywyNHogTTguNywyMkgyMlY4LjcgSDguN1YyMnpcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3LjMsMTYuM2MwLDAuNi0wLjQsMS0xLDFIMWMtMC42LDAtMS0wLjQtMS0xVjFjMC0wLjYsMC40LTEsMS0xaDE1LjNjMC42LDAsMSwwLjQsMSwxVjE2LjN6XCJcbiAgfSkpLCBjcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXRvb2x0aXAtdG9wXCJcbiAgfSwgX18oJ0Nsb25lIEl0ZW0nLCAnYmxvY2tzeScpKSksIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcImN0LXJlbW92ZVwiLFxuICAgIG9uQ2xpY2s6ICgpID0+IHJlbW92ZUZvcklkKHZhbHVlLl9faWQpXG4gIH0pLCBvcHRpb25bJ2lubmVyLW9wdGlvbnMnXSAmJiBjcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGNsYXNzTmFtZTogXCJjdC10b2dnbGVcIixcbiAgICBvbk1vdXNlRG93bjogZSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG4gICAgb25DbGljazogZSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdG9nZ2xlT3B0aW9uc1BhbmVsKHZhbHVlLl9faWQpO1xuICAgIH1cbiAgfSkpO1xufSk7XG5cbmNvbnN0IHZhbHVlV2l0aFVuaXF1ZUlkcyA9IHZhbHVlID0+IHZhbHVlLm1hcChzaW5nbGVJdGVtID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2luZ2xlSXRlbSksIHNpbmdsZUl0ZW0uX19pZCA/IHt9IDoge1xuICBfX2lkOiBuYW5vaWQoKVxufSkpO1xuXG5jb25zdCBnZXREZWZhdWx0U3RhdGUgPSAoKSA9PiAoe1xuICBjdXJyZW50bHlQaWNrZWRJdGVtOiBudWxsLFxuICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgaXNPcGVuOiBmYWxzZVxufSk7XG5cbmV4cG9ydCBjb25zdCBMYXllcnNDb250ZXh0ID0gY3JlYXRlQ29udGV4dChnZXREZWZhdWx0U3RhdGUoKSk7XG5jb25zdCB7XG4gIFByb3ZpZGVyLFxuICBDb25zdW1lclxufSA9IExheWVyc0NvbnRleHQ7XG5cbmNsYXNzIFNpbmdsZUl0ZW0gZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic3RhdGVcIiwge1xuICAgICAgaXNPcGVuOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHZhbHVlLFxuICAgICAgaXRlbXMsXG4gICAgICBvbkNoYW5nZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KENvbnN1bWVyLCBudWxsLCBfcmVmMiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBvcHRpb24sXG4gICAgICAgIGlzRHJhZ2dpbmcsXG4gICAgICAgIGlzT3BlbixcbiAgICAgICAgcGFyZW50VmFsdWVcbiAgICAgIH0gPSBfcmVmMjtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LWxheWVyJywgb3B0aW9uLml0ZW1DbGFzcywge1xuICAgICAgICAgIFtgY3QtZGlzYWJsZWRgXTogIV9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgICAgIH0sIHZhbHVlKS5lbmFibGVkXG4gICAgICAgIH0pXG4gICAgICB9LCBjcmVhdGVFbGVtZW50KExheWVyQ29udHJvbHMsIHtcbiAgICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSksIGlzT3BlbiA9PT0gdmFsdWUuX19pZCAmJiAoIWlzRHJhZ2dpbmcgfHwgaXNEcmFnZ2luZyAmJiBpc0RyYWdnaW5nICE9PSBpc09wZW4pICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiY3QtbGF5ZXItY29udGVudFwiXG4gICAgICB9LCBjcmVhdGVFbGVtZW50KE9wdGlvbnNQYW5lbCwge1xuICAgICAgICBoYXNSZXZlcnRCdXR0b246IGZhbHNlLFxuICAgICAgICBwYXJlbnRWYWx1ZTogcGFyZW50VmFsdWUsXG4gICAgICAgIG9uQ2hhbmdlOiAoa2V5LCBuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgIG9uQ2hhbmdlKGl0ZW1zLm1hcChsID0+IGwuX19pZCA9PT0gdmFsdWUuX19pZCA/IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbCksIHt9LCB7XG4gICAgICAgICAgICBba2V5XTogbmV3VmFsdWVcbiAgICAgICAgICB9KSA6IGwpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IGdldFZhbHVlRnJvbUlucHV0KG9wdGlvblsnaW5uZXItb3B0aW9ucyddLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbi52YWx1ZS5maWx0ZXIoX3JlZjMgPT4ge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgICByZXR1cm4gaWQgPT09IHZhbHVlLmlkO1xuICAgICAgICB9KS5sZW5ndGggPiAxID8gb3B0aW9uLnZhbHVlLmZpbHRlcihfcmVmNCA9PiB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlkXG4gICAgICAgICAgfSA9IF9yZWY0O1xuICAgICAgICAgIHJldHVybiB2YWx1ZS5pZCA9PT0gaWQ7XG4gICAgICAgIH0pW2l0ZW1zLmZpbHRlcihfcmVmNSA9PiB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlkXG4gICAgICAgICAgfSA9IF9yZWY1O1xuICAgICAgICAgIHJldHVybiBpZCA9PT0gdmFsdWUuaWQ7XG4gICAgICAgIH0pLm1hcChfcmVmNiA9PiB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIF9faWRcbiAgICAgICAgICB9ID0gX3JlZjY7XG4gICAgICAgICAgcmV0dXJuIF9faWQ7XG4gICAgICAgIH0pLmluZGV4T2YodmFsdWUuX19pZCldIDoge30pLCB2YWx1ZSkpLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25bJ2lubmVyLW9wdGlvbnMnXVxuICAgICAgfSkpKTtcbiAgICB9KTtcbiAgfVxuXG59XG5cbmNvbnN0IFNvcnRhYmxlSXRlbSA9IFNvcnRhYmxlRWxlbWVudChTaW5nbGVJdGVtKTtcbmNvbnN0IFNvcnRhYmxlTGlzdCA9IFNvcnRhYmxlQ29udGFpbmVyKF9yZWY3ID0+IHtcbiAgbGV0IHtcbiAgICBpdGVtcyxcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjc7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KENvbnN1bWVyLCBudWxsLCBfcmVmOCA9PiB7XG4gICAgbGV0IHtcbiAgICAgIG9wdGlvblxuICAgIH0gPSBfcmVmODtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjdC1sYXllcnNcIlxuICAgIH0sIGl0ZW1zLm1hcCgodmFsdWUsIGluZGV4KSA9PiBjcmVhdGVFbGVtZW50KFNvcnRhYmxlSXRlbSwge1xuICAgICAga2V5OiB2YWx1ZS5fX2lkLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgZGlzYWJsZWQ6ICEhb3B0aW9uLmRpc2FibGVEcmFnXG4gICAgfSkpKTtcbiAgfSk7XG59KTtcblxuY29uc3QgTGF5ZXJzID0gX3JlZjkgPT4ge1xuICBsZXQge1xuICAgIHZhbHVlLFxuICAgIG9wdGlvbixcbiAgICBvbkNoYW5nZSxcbiAgICB2YWx1ZXNcbiAgfSA9IF9yZWY5O1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlKGdldERlZmF1bHRTdGF0ZSgpKTtcblxuICBjb25zdCBsb2NhbE9uQ2hhbmdlID0gdiA9PiB7XG4gICAgb25DaGFuZ2Uodik7XG4gIH07XG5cbiAgY29uc3QgYWRkRm9ySWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHZhbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgbG9jYWxPbkNoYW5nZShbLi4uKHZhbHVlIHx8IFtdKSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgIH0sIGdldFZhbHVlRnJvbUlucHV0KG9wdGlvblsnaW5uZXItb3B0aW9ucyddIHx8IHt9LCB7fSkpLCB2YWwpLCB7fSwge1xuICAgICAgX19pZDogbmFub2lkKClcbiAgICB9KV0pO1xuICB9O1xuXG4gIGNvbnN0IGNvbXB1dGVkVmFsdWUgPSB2YWx1ZVdpdGhVbmlxdWVJZHModmFsdWUpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChQcm92aWRlciwge1xuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgIHBhcmVudFZhbHVlOiB2YWx1ZXMsXG4gICAgICBhZGRGb3JJZCxcbiAgICAgIG9wdGlvbixcbiAgICAgIHJlbW92ZUZvcklkOiBpZFRvUmVtb3ZlID0+IGxvY2FsT25DaGFuZ2UodmFsdWVXaXRoVW5pcXVlSWRzKHZhbHVlKS5maWx0ZXIoX3JlZjEwID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBfX2lkOiBpZFxuICAgICAgICB9ID0gX3JlZjEwO1xuICAgICAgICByZXR1cm4gaWQgIT09IGlkVG9SZW1vdmU7XG4gICAgICB9KSksXG4gICAgICB0b2dnbGVPcHRpb25zUGFuZWw6IGlkVG9BZGQgPT4ge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCAmJiAhdmFsdWVbMF0uX19pZCkge1xuICAgICAgICAgIGxvY2FsT25DaGFuZ2UoY29tcHV0ZWRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRTdGF0ZShzdGF0ZSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgICAgICBpc09wZW46IHN0YXRlLmlzT3BlbiA9PT0gaWRUb0FkZCA/IGZhbHNlIDogaWRUb0FkZFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSlcbiAgfSwgY3JlYXRlRWxlbWVudChTb3J0YWJsZUxpc3QsIHtcbiAgICB1c2VEcmFnSGFuZGxlOiB0cnVlLFxuICAgIGRpc3RhbmNlOiAzLFxuICAgIGxvY2tBeGlzOiBcInlcIixcbiAgICBpdGVtczogY29tcHV0ZWRWYWx1ZSxcbiAgICBvbkNoYW5nZTogdiA9PiB7XG4gICAgICBsb2NhbE9uQ2hhbmdlKHYpO1xuICAgIH0sXG4gICAgaGVscGVyQ29udGFpbmVyOiAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY3VzdG9taXplLXRoZW1lLWNvbnRyb2xzJykgfHwgZG9jdW1lbnQuYm9keSxcbiAgICBvblNvcnRFbmQ6IF9yZWYxMSA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBvbGRJbmRleCxcbiAgICAgICAgbmV3SW5kZXhcbiAgICAgIH0gPSBfcmVmMTE7XG4gICAgICBsb2NhbE9uQ2hhbmdlKGFycmF5TW92ZShjb21wdXRlZFZhbHVlLCBvbGRJbmRleCwgbmV3SW5kZXgpKTtcbiAgICAgIHNldFN0YXRlKHN0YXRlID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICBpc0RyYWdnaW5nOiBmYWxzZVxuICAgICAgfSkpO1xuICAgIH0sXG4gICAgdXBkYXRlQmVmb3JlU29ydFN0YXJ0OiBfcmVmMTIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgaW5kZXhcbiAgICAgIH0gPSBfcmVmMTI7XG4gICAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDAgJiYgIXZhbHVlWzBdLl9faWQpIHtcbiAgICAgICAgICB3cC5jdXN0b21pemUgJiYgd3AuY3VzdG9taXplLnByZXZpZXdlciAmJiB3cC5jdXN0b21pemUucHJldmlld2VyLnNlbmQoJ2N0OnN5bmM6cmVmcmVzaF9wYXJ0aWFsJywge1xuICAgICAgICAgICAgc2hvdWxkU2tpcDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxvY2FsT25DaGFuZ2UoY29tcHV0ZWRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRTdGF0ZShzdGF0ZSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgICAgICBpc0RyYWdnaW5nOiBjb21wdXRlZFZhbHVlW2luZGV4XS5fX2lkXG4gICAgICAgIH0pKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KSwgY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgYWRkRm9ySWQoKTtcbiAgICB9XG4gIH0sIF9fKCdBZGQgTmV3IEl0ZW0nLCAnYmxvY2tzeScpKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBMYXllcnM7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9285\n')},8601:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ ct_background)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./static/js/options/GenericOptionType.js\nvar GenericOptionType = __webpack_require__(6095);\n;// CONCATENATED MODULE: ./static/js/options/options/background/PatternPicker.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\nconst patternsList = [{\n id: 'type-1',\n title: (0,external_window_wp_i18n_.__)('Hideout', 'blocksy'),\n src: 'patterns/hideout.svg'\n}, {\n id: 'type-2',\n title: (0,external_window_wp_i18n_.__)('Triangles', 'blocksy'),\n src: 'patterns/triangles.svg'\n}, {\n id: 'type-3',\n title: (0,external_window_wp_i18n_.__)('Bubbles', 'blocksy'),\n src: 'patterns/bubbles.svg'\n}, {\n id: 'type-4',\n title: (0,external_window_wp_i18n_.__)('Wiggle', 'blocksy'),\n src: 'patterns/wiggle.svg'\n}, {\n id: 'type-5',\n title: (0,external_window_wp_i18n_.__)('Polka Dots', 'blocksy'),\n src: 'patterns/polka-dots.svg'\n}, {\n id: 'type-6',\n title: (0,external_window_wp_i18n_.__)('Overlaping Circles', 'blocksy'),\n src: 'patterns/overlaping-circles.svg'\n}, {\n id: 'type-7',\n title: (0,external_window_wp_i18n_.__)('Texture', 'blocksy'),\n src: 'patterns/texture.svg'\n}, {\n id: 'type-8',\n title: (0,external_window_wp_i18n_.__)('Diagonal Lines', 'blocksy'),\n src: 'patterns/diagonal-lines.svg'\n}, {\n id: 'type-9',\n title: (0,external_window_wp_i18n_.__)('Rain', 'blocksy'),\n src: 'patterns/rain.svg'\n}, {\n id: 'type-10',\n title: (0,external_window_wp_i18n_.__)('Stripes', 'blocksy'),\n src: 'patterns/stripes.svg'\n}, {\n id: 'type-11',\n title: (0,external_window_wp_i18n_.__)('Diagonal Stripes', 'blocksy'),\n src: 'patterns/diagonal-stripes.svg'\n}, {\n id: 'type-12',\n title: (0,external_window_wp_i18n_.__)('Intersecting Circles', 'blocksy'),\n src: 'patterns/intersecting-circles.svg'\n}, {\n id: 'type-13',\n title: (0,external_window_wp_i18n_.__)('Bank Note', 'blocksy'),\n src: 'patterns/bank-note.svg'\n}, {\n id: 'type-14',\n title: (0,external_window_wp_i18n_.__)('Zig Zag', 'blocksy'),\n src: 'patterns/zig-zag.svg'\n}, {\n id: 'type-15',\n title: (0,external_window_wp_i18n_.__)('Endless Clouds', 'blocksy'),\n src: 'patterns/endless-clouds.svg'\n}, {\n id: 'type-16',\n title: (0,external_window_wp_i18n_.__)('Honey Comb', 'blocksy'),\n src: 'patterns/honey-comb.svg'\n}, {\n id: 'type-17',\n title: (0,external_window_wp_i18n_.__)('Cross Stripes', 'blocksy'),\n src: 'patterns/cross-stripes.svg'\n}, {\n id: 'type-18',\n title: (0,external_window_wp_i18n_.__)('Autumn', 'blocksy'),\n src: 'patterns/autumn.svg'\n}];\nconst getUrlForPattern = id => (window.ct_localizations || ct_customizer_localizations).static_public_url + `images/${patternsList.find(p => p.id === id).src}`;\n\nconst PatternPicker = _ref => {\n let {\n option,\n value,\n onChange\n } = _ref;\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-patterns-list\"\n }, patternsList.map(singlePattern => (0,external_window_wp_element_.createElement)(\"li\", {\n onClick: () => onChange(_objectSpread(_objectSpread({}, value), {}, {\n background_pattern: singlePattern.id\n })),\n className: classnames_default()({\n active: singlePattern.id === value.background_pattern\n }),\n key: singlePattern.id,\n title: singlePattern.title\n }, (0,external_window_wp_element_.createElement)(\"img\", {\n src: (window.ct_localizations || ct_customizer_localizations).static_public_url + `images/${singlePattern.src}`\n })))), (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['patternColor'],\n values: value,\n option: {\n id: 'patternColor',\n label: (0,external_window_wp_i18n_.__)('Pattern Color', 'blocksy'),\n type: 'ct-color-picker',\n design: 'inline',\n value: option.value['patternColor'],\n pickers: [{\n title: (0,external_window_wp_i18n_.__)('Initial', 'blocksy'),\n id: 'default'\n }],\n skipNoColorPill: true,\n skipArrow: true,\n appendToBody: false\n },\n hasRevertButton: false,\n onChange: newValue => onChange(_objectSpread(_objectSpread({}, value), {}, {\n patternColor: newValue\n }))\n }));\n};\n\n/* harmony default export */ const background_PatternPicker = (PatternPicker);\n;// CONCATENATED MODULE: ./static/js/options/options/background/ImagePicker.js\nfunction ImagePicker_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction ImagePicker_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ImagePicker_ownKeys(Object(source), !0).forEach(function (key) { ImagePicker_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ImagePicker_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction ImagePicker_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nconst ImagePicker = _ref => {\n let {\n option,\n value,\n onChange,\n setOutsideClickFreezed\n } = _ref;\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['background_image'],\n values: value,\n option: {\n id: 'background_image',\n label: false,\n type: 'ct-image-uploader',\n value: option.value['background_image'],\n has_position_picker: true,\n emptyLabel: (0,external_window_wp_i18n_.__)('Select Image', 'blocksy'),\n filledLabel: (0,external_window_wp_i18n_.__)('Change Image', 'blocksy'),\n onFrameOpen: () => {\n setOutsideClickFreezed(true);\n },\n onFrameClose: () => {\n setOutsideClickFreezed(false);\n }\n },\n hasRevertButton: false,\n onChange: newValue => onChange(ImagePicker_objectSpread(ImagePicker_objectSpread({}, value), {}, {\n background_image: newValue\n }))\n }), (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['background_repeat'],\n values: value,\n option: {\n id: 'background_repeat',\n label: (0,external_window_wp_i18n_.__)('Background Repeat', 'blocksy'),\n attr: {\n 'data-type': 'repeat'\n },\n type: 'ct-radio',\n view: 'text',\n design: 'block',\n value: option.value['background_repeat'],\n choices: {\n repeat: `\n\t\t\t\t\t\t\t${(0,external_window_wp_i18n_.__)('Repeat', 'blocksy')}`,\n 'repeat-y': `\n\t\t\t\t\t\t\t${(0,external_window_wp_i18n_.__)('Repeat Y', 'blocksy')}`,\n 'repeat-x': `\n\t\t\t\t\t\t\t${(0,external_window_wp_i18n_.__)('Repeat X', 'blocksy')}`,\n 'no-repeat': `\n\t\t\t\t\t\t\t${(0,external_window_wp_i18n_.__)('No Repeat', 'blocksy')}`\n }\n },\n hasRevertButton: false,\n onChange: newValue => onChange(ImagePicker_objectSpread(ImagePicker_objectSpread({}, value), {}, {\n background_repeat: newValue\n }))\n }), (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['background_size'],\n values: value,\n option: {\n id: 'background_size',\n label: (0,external_window_wp_i18n_.__)('Background Size', 'blocksy'),\n type: 'ct-radio',\n view: 'text',\n design: 'block',\n value: option.value['background_size'],\n choices: {\n auto: (0,external_window_wp_i18n_.__)('Auto', 'blocksy'),\n cover: (0,external_window_wp_i18n_.__)('Cover', 'blocksy'),\n contain: (0,external_window_wp_i18n_.__)('Contain', 'blocksy')\n }\n },\n hasRevertButton: false,\n onChange: newValue => onChange(ImagePicker_objectSpread(ImagePicker_objectSpread({}, value), {}, {\n background_size: newValue\n }))\n }), (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['background_attachment'],\n values: value,\n option: {\n id: 'background_size',\n label: (0,external_window_wp_i18n_.__)('Background Attachment', 'blocksy'),\n type: 'ct-radio',\n view: 'text',\n design: 'block',\n value: option.value['background_attachment'],\n choices: {\n scroll: (0,external_window_wp_i18n_.__)('Scroll', 'blocksy'),\n fixed: (0,external_window_wp_i18n_.__)('Fixed', 'blocksy'),\n inherit: (0,external_window_wp_i18n_.__)('Inherit', 'blocksy')\n }\n },\n hasRevertButton: false,\n onChange: newValue => onChange(ImagePicker_objectSpread(ImagePicker_objectSpread({}, value), {}, {\n background_attachment: newValue\n }))\n }), value.background_image.url && (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value.overlayColor && value.overlayColor.default.color.indexOf('CT_CSS_SKIP_RULE') === -1 ? 'yes' : 'no',\n values: {},\n option: {\n id: 'has_overlay',\n label: (0,external_window_wp_i18n_.__)('Image Overlay', 'blocksy'),\n type: 'ct-radio',\n view: 'text',\n design: 'block',\n value: 'no',\n choices: {\n no: (0,external_window_wp_i18n_.__)('Disabled', 'blocksy'),\n yes: (0,external_window_wp_i18n_.__)('Enabled', 'blocksy')\n }\n },\n hasRevertButton: false,\n onChange: newValue => {\n let hasOverlay = value.overlayColor.default.color.indexOf('CT_CSS_SKIP_RULE') === -1;\n onChange(ImagePicker_objectSpread(ImagePicker_objectSpread({}, value), {}, {\n overlayColor: {\n default: {\n color: hasOverlay ? 'CT_CSS_SKIP_RULE' : 'rgba(0, 0, 0, 0.2)'\n }\n }\n }));\n }\n }), value.overlayColor && value.overlayColor.default.color.indexOf('CT_CSS_SKIP_RULE') === -1 && (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['overlayColor'],\n values: value,\n option: {\n id: 'overlayColor',\n label: (0,external_window_wp_i18n_.__)('Image Overlay Color', 'blocksy'),\n type: 'ct-color-picker',\n design: 'inline',\n value: option.value['overlayColor'],\n pickers: [{\n title: (0,external_window_wp_i18n_.__)('Initial', 'blocksy'),\n id: 'default'\n }],\n skipArrow: true,\n appendToBody: false\n },\n hasRevertButton: false,\n onChange: newValue => onChange(ImagePicker_objectSpread(ImagePicker_objectSpread({}, value), {}, {\n overlayColor: newValue\n }))\n })));\n};\n\n/* harmony default export */ const background_ImagePicker = (ImagePicker);\n;// CONCATENATED MODULE: ./static/js/options/options/background/GradientPicker.js\nfunction GradientPicker_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction GradientPicker_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? GradientPicker_ownKeys(Object(source), !0).forEach(function (key) { GradientPicker_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : GradientPicker_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction GradientPicker_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nlet GradientPickerComponent = () => null;\n\nsetTimeout(() => {\n if (window.wp.components) {\n Promise.all(/* import() */[__webpack_require__.e(904), __webpack_require__.e(188)]).then(__webpack_require__.bind(__webpack_require__, 1188)).then(res => {\n GradientPickerComponent = res.default;\n });\n }\n}, 1000);\n\nconst GradientPicker = _ref => {\n let {\n value,\n onChange\n } = _ref;\n const allGradients = (window.ct_customizer_localizations || window.ct_localizations)['gradients']; // let GradientPickerComponent =\n // StableGradientPicker || ExperimentalGradientPicker\n\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(GradientPickerComponent, {\n value: value.gradient || '',\n onChange: val => {\n onChange(GradientPicker_objectSpread(GradientPicker_objectSpread({}, value), {}, {\n gradient: val\n }));\n }\n }), (0,external_window_wp_element_.createElement)(\"ul\", {\n className: 'ct-gradient-swatches'\n }, allGradients.map(_ref2 => {\n let {\n gradient,\n slug\n } = _ref2;\n return (0,external_window_wp_element_.createElement)(\"li\", {\n onClick: () => {\n onChange(GradientPicker_objectSpread(GradientPicker_objectSpread({}, value), {}, {\n gradient: value.gradient === gradient ? '' : gradient\n }));\n },\n className: classnames_default()({\n active: gradient === value.gradient\n }),\n style: {\n '--background-image': gradient\n },\n key: slug\n });\n })));\n};\n\n/* harmony default export */ const background_GradientPicker = (GradientPicker);\n;// CONCATENATED MODULE: ./static/js/options/options/background/BackgroundModal.js\nfunction BackgroundModal_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction BackgroundModal_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? BackgroundModal_ownKeys(Object(source), !0).forEach(function (key) { BackgroundModal_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : BackgroundModal_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction BackgroundModal_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\nconst BackgroundModal = _ref => {\n let {\n option,\n option: {\n activeTabs = ['color', 'gradient', 'image']\n },\n value,\n isOpen,\n onChange,\n setOutsideClickFreezed\n } = _ref;\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-modal-tabs\",\n onMouseUp: e => {\n e.preventDefault();\n }\n }, activeTabs.map(type => (0,external_window_wp_element_.createElement)(\"li\", {\n \"data-type\": type,\n key: type,\n className: classnames_default()({\n active: type === value.background_type || type === 'image' && (value.background_type === 'pattern' || value.background_type === 'image')\n }),\n onClick: () => onChange(BackgroundModal_objectSpread(BackgroundModal_objectSpread({}, value), {}, {\n background_type: type\n }, type === 'gradient' ? {\n gradient: 'linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)'\n } : {}))\n }, {\n color: (0,external_window_wp_i18n_.__)('Color', 'blocksy'),\n gradient: (0,external_window_wp_i18n_.__)('Gradient', 'blocksy'),\n // pattern: __('Pattern', 'blocksy'),\n image: (0,external_window_wp_i18n_.__)('Image', 'blocksy')\n }[type]))), (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()({\n 'ct-image-tab ct-options-container': value.background_type === 'image' || value.background_type === 'pattern',\n 'ct-color-picker-modal': value.background_type === 'gradient',\n 'ct-gradient-tab': value.background_type === 'gradient' && window.wp.components.__experimentalGradientPicker,\n 'ct-gradient-tab-new': value.background_type === 'gradient' && !window.wp.components.__experimentalGradientPicker,\n 'ct-color-tab': value.background_type === 'color'\n }, 'ct-modal-tabs-content')\n }, (value.background_type === 'image' || value.background_type === 'pattern') && (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-radio-option ct-buttons-group\",\n onMouseUp: e => {\n e.preventDefault();\n }\n }, ['image', 'pattern'].map(type => (0,external_window_wp_element_.createElement)(\"li\", {\n \"data-type\": type,\n key: type,\n className: classnames_default()({\n active: type === value.background_type\n }),\n onClick: () => onChange(BackgroundModal_objectSpread(BackgroundModal_objectSpread({}, value), {}, {\n background_type: type\n }))\n }, {\n pattern: (0,external_window_wp_i18n_.__)('Pattern', 'blocksy'),\n image: (0,external_window_wp_i18n_.__)('Image', 'blocksy')\n }[type]))), value.background_type === 'pattern' && (0,external_window_wp_element_.createElement)(background_PatternPicker, {\n option: option,\n onChange: onChange,\n value: value\n }), value.background_type === 'image' && (0,external_window_wp_element_.createElement)(background_ImagePicker, {\n setOutsideClickFreezed: setOutsideClickFreezed,\n option: option,\n onChange: onChange,\n value: value\n }), value.background_type === 'gradient' && (0,external_window_wp_element_.createElement)(background_GradientPicker, {\n value: value,\n onChange: onChange\n }), value.background_type !== 'gradient' && (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['backgroundColor'],\n values: value,\n option: {\n id: 'backgroundColor',\n label: value.background_type === 'color' ? false : (0,external_window_wp_i18n_.__)('Background Color', 'blocksy'),\n type: 'ct-color-picker',\n skipNoColorPill: true,\n design: value.background_type === 'color' ? 'none' : 'inline',\n value: option.value['backgroundColor'],\n pickers: [{\n title: (0,external_window_wp_i18n_.__)('Initial', 'blocksy'),\n id: 'default'\n }],\n inline_modal: value.background_type === 'color',\n skipArrow: true,\n appendToBody: false\n },\n hasRevertButton: false,\n onChange: newValue => onChange(BackgroundModal_objectSpread(BackgroundModal_objectSpread({}, value), {}, {\n backgroundColor: newValue\n }))\n })));\n};\n\n/* harmony default export */ const background_BackgroundModal = (BackgroundModal);\n// EXTERNAL MODULE: ./static/js/options/options/react-outside-click-handler.js\nvar react_outside_click_handler = __webpack_require__(8204);\n// EXTERNAL MODULE: ./static/js/options/helpers/usePopoverMaker.js\nvar usePopoverMaker = __webpack_require__(9144);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-background.js\nfunction ct_background_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction ct_background_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ct_background_ownKeys(Object(source), !0).forEach(function (key) { ct_background_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ct_background_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction ct_background_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n/**\n * Support color picker values inside the background picker.\n * Which means transitions from ct-color-picker are made possible thanks to\n * this logic.\n */\n\nconst maybeConvertFromColorPickerTo = value => {\n if (!value.background_type) {\n if (value[Object.keys(value)[0]].color) {\n return {\n background_type: 'color',\n background_pattern: 'type-1',\n background_image: {\n attachment_id: null,\n x: 0,\n y: 0\n },\n background_repeat: 'no-repeat',\n background_size: 'auto',\n background_attachment: 'scroll',\n patternColor: {\n default: {\n color: '#e5e7ea'\n }\n },\n backgroundColor: {\n default: value[Object.keys(value)[0]]\n }\n };\n }\n }\n\n return value;\n};\n\nconst Background = _ref => {\n let {\n option,\n value,\n onChange\n } = _ref;\n const [isOpen, setIsOpen] = (0,external_window_wp_element_.useState)(false);\n const [outsideClickFreezed, setOutsideClickFreezed] = (0,external_window_wp_element_.useState)(false);\n const backgroundWrapper = (0,external_window_wp_element_.useRef)();\n value = maybeConvertFromColorPickerTo(value);\n const isInherit = !option.has_no_color && value.background_type === 'color' && (value.backgroundColor.default.color === 'CT_CSS_SKIP_RULE' || value.backgroundColor.default.color === 'transparent');\n const isNoColor = option.has_no_color && value.background_type === 'color' && (value.backgroundColor.default.color === 'CT_CSS_SKIP_RULE' || value.backgroundColor.default.color === 'transparent');\n const {\n styles,\n popoverProps\n } = (0,usePopoverMaker/* default */.Z)({\n ref: backgroundWrapper,\n defaultHeight: 434,\n shouldCalculate: backgroundWrapper && backgroundWrapper.current\n });\n return (0,external_window_wp_element_.createElement)(\"div\", {\n ref: backgroundWrapper,\n className: classnames_default()('ct-background', {\n active: isOpen\n })\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()('ct-background-preview', {\n 'ct-color-inherit': isInherit,\n 'ct-no-color': isNoColor\n }),\n onClick: e => {\n e.preventDefault();\n setIsOpen(!isOpen);\n\n if (value.background_type === 'color') {\n if (value.backgroundColor.default.color === 'CT_CSS_SKIP_RULE' || value.backgroundColor.default.color === 'transparent') {\n onChange(ct_background_objectSpread(ct_background_objectSpread({}, value), {}, {\n backgroundColor: {\n default: {\n color: option.default_inherit_color || '#ffffff'\n }\n }\n }));\n }\n }\n },\n \"data-background-type\": value.background_type,\n style: ct_background_objectSpread(ct_background_objectSpread({}, value.backgroundColor.default.color.indexOf('CT_CSS_SKIP_RULE') > -1 ? {} : {\n backgroundColor: value.backgroundColor.default.color\n }), {}, {\n '--background-position': `${Math.round(parseFloat(value.background_image.x) * 100)}% ${Math.round(parseFloat(value.background_image.y) * 100)}%`,\n '--pattern-mask': value.background_type === 'pattern' ? `url(${getUrlForPattern(value.background_pattern)})` : '',\n '--background-image': value.background_type === 'gradient' ? value.gradient : value.background_image.url ? `${value.overlayColor && value.overlayColor.default.color.indexOf('CT_CSS_SKIP_RULE') === -1 ? `linear-gradient(${value.overlayColor.default.color}, ${value.overlayColor.default.color}), ` : ''}url(${value.background_image.url})` : 'none',\n '--pattern-color': value.patternColor.default.color\n })\n }, (0,external_window_wp_element_.createElement)(\"i\", {\n className: \"ct-tooltip-top\"\n }, {\n inherit: (0,external_window_wp_i18n_.__)('Inherited', 'blocksy'),\n no_color: (0,external_window_wp_i18n_.__)('No Color', 'blocksy'),\n pattern: (0,external_window_wp_i18n_.__)('Pattern', 'blocksy'),\n gradient: (0,external_window_wp_i18n_.__)('Gradient', 'blocksy'),\n color: (0,external_window_wp_i18n_.__)('Color', 'blocksy'),\n image: (0,external_window_wp_i18n_.__)('Image', 'blocksy')\n }[isNoColor ? 'no_color' : isInherit ? 'inherit' : value.background_type]), isInherit && (0,external_window_wp_element_.createElement)(\"svg\", {\n width: \"25\",\n height: \"25\",\n viewBox: \"0 0 30 30\"\n }, (0,external_window_wp_element_.createElement)(\"path\", {\n d: \"M15 3c-3 0-5.7 1.1-7.8 2.9-.4.3-.5.9-.2 1.4.3.4 1 .5 1.4.2h.1C10.3 5.9 12.5 5 15 5c5.2 0 9.5 3.9 10 9h-3l4 6 4-6h-3.1C26.4 7.9 21.3 3 15 3zM4 10l-4 6h3.1c.5 6.1 5.6 11 11.9 11 3 0 5.7-1.1 7.8-2.9.4-.3.5-1 .2-1.4-.3-.4-1-.5-1.4-.2h-.1c-1.7 1.5-4 2.4-6.5 2.4-5.2 0-9.5-3.9-10-9h3L4 10z\"\n }))), backgroundWrapper && backgroundWrapper.current && (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(react_outside_click_handler[\"default\"], {\n useCapture: false,\n display: \"block\",\n disabled: !isOpen || outsideClickFreezed,\n onOutsideClick: () => {\n setTimeout(() => setIsOpen(false));\n },\n wrapperProps: ct_background_objectSpread(ct_background_objectSpread({\n style: styles\n }, popoverProps), {}, {\n className: classnames_default()('ct-option-modal ct-background-modal', {\n active: isOpen\n })\n })\n }, (0,external_window_wp_element_.createElement)(background_BackgroundModal, {\n onChange: onChange,\n value: value,\n option: option,\n isOpen: isOpen,\n setOutsideClickFreezed: setOutsideClickFreezed\n })), document.body));\n};\n\n/* harmony default export */ const ct_background = (Background);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYwMS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUM1R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvYmFja2dyb3VuZC9QYXR0ZXJuUGlja2VyLmpzPzVlMmUiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2JhY2tncm91bmQvSW1hZ2VQaWNrZXIuanM/YTkzMSIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvYmFja2dyb3VuZC9HcmFkaWVudFBpY2tlci5qcz9jYTA0Iiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9iYWNrZ3JvdW5kL0JhY2tncm91bmRNb2RhbC5qcz83ZWVkIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1iYWNrZ3JvdW5kLmpzPzM4NmMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgRnJhZ21lbnQsIGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZUNhbGxiYWNrLCB1c2VTdGF0ZSB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgR2VuZXJpY09wdGlvblR5cGUgZnJvbSAnLi4vLi4vR2VuZXJpY09wdGlvblR5cGUnO1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5zTGlzdCA9IFt7XG4gIGlkOiAndHlwZS0xJyxcbiAgdGl0bGU6IF9fKCdIaWRlb3V0JywgJ2Jsb2Nrc3knKSxcbiAgc3JjOiAncGF0dGVybnMvaGlkZW91dC5zdmcnXG59LCB7XG4gIGlkOiAndHlwZS0yJyxcbiAgdGl0bGU6IF9fKCdUcmlhbmdsZXMnLCAnYmxvY2tzeScpLFxuICBzcmM6ICdwYXR0ZXJucy90cmlhbmdsZXMuc3ZnJ1xufSwge1xuICBpZDogJ3R5cGUtMycsXG4gIHRpdGxlOiBfXygnQnViYmxlcycsICdibG9ja3N5JyksXG4gIHNyYzogJ3BhdHRlcm5zL2J1YmJsZXMuc3ZnJ1xufSwge1xuICBpZDogJ3R5cGUtNCcsXG4gIHRpdGxlOiBfXygnV2lnZ2xlJywgJ2Jsb2Nrc3knKSxcbiAgc3JjOiAncGF0dGVybnMvd2lnZ2xlLnN2Zydcbn0sIHtcbiAgaWQ6ICd0eXBlLTUnLFxuICB0aXRsZTogX18oJ1BvbGthIERvdHMnLCAnYmxvY2tzeScpLFxuICBzcmM6ICdwYXR0ZXJucy9wb2xrYS1kb3RzLnN2Zydcbn0sIHtcbiAgaWQ6ICd0eXBlLTYnLFxuICB0aXRsZTogX18oJ092ZXJsYXBpbmcgQ2lyY2xlcycsICdibG9ja3N5JyksXG4gIHNyYzogJ3BhdHRlcm5zL292ZXJsYXBpbmctY2lyY2xlcy5zdmcnXG59LCB7XG4gIGlkOiAndHlwZS03JyxcbiAgdGl0bGU6IF9fKCdUZXh0dXJlJywgJ2Jsb2Nrc3knKSxcbiAgc3JjOiAncGF0dGVybnMvdGV4dHVyZS5zdmcnXG59LCB7XG4gIGlkOiAndHlwZS04JyxcbiAgdGl0bGU6IF9fKCdEaWFnb25hbCBMaW5lcycsICdibG9ja3N5JyksXG4gIHNyYzogJ3BhdHRlcm5zL2RpYWdvbmFsLWxpbmVzLnN2Zydcbn0sIHtcbiAgaWQ6ICd0eXBlLTknLFxuICB0aXRsZTogX18oJ1JhaW4nLCAnYmxvY2tzeScpLFxuICBzcmM6ICdwYXR0ZXJucy9yYWluLnN2Zydcbn0sIHtcbiAgaWQ6ICd0eXBlLTEwJyxcbiAgdGl0bGU6IF9fKCdTdHJpcGVzJywgJ2Jsb2Nrc3knKSxcbiAgc3JjOiAncGF0dGVybnMvc3RyaXBlcy5zdmcnXG59LCB7XG4gIGlkOiAndHlwZS0xMScsXG4gIHRpdGxlOiBfXygnRGlhZ29uYWwgU3RyaXBlcycsICdibG9ja3N5JyksXG4gIHNyYzogJ3BhdHRlcm5zL2RpYWdvbmFsLXN0cmlwZXMuc3ZnJ1xufSwge1xuICBpZDogJ3R5cGUtMTInLFxuICB0aXRsZTogX18oJ0ludGVyc2VjdGluZyBDaXJjbGVzJywgJ2Jsb2Nrc3knKSxcbiAgc3JjOiAncGF0dGVybnMvaW50ZXJzZWN0aW5nLWNpcmNsZXMuc3ZnJ1xufSwge1xuICBpZDogJ3R5cGUtMTMnLFxuICB0aXRsZTogX18oJ0JhbmsgTm90ZScsICdibG9ja3N5JyksXG4gIHNyYzogJ3BhdHRlcm5zL2Jhbmstbm90ZS5zdmcnXG59LCB7XG4gIGlkOiAndHlwZS0xNCcsXG4gIHRpdGxlOiBfXygnWmlnIFphZycsICdibG9ja3N5JyksXG4gIHNyYzogJ3BhdHRlcm5zL3ppZy16YWcuc3ZnJ1xufSwge1xuICBpZDogJ3R5cGUtMTUnLFxuICB0aXRsZTogX18oJ0VuZGxlc3MgQ2xvdWRzJywgJ2Jsb2Nrc3knKSxcbiAgc3JjOiAncGF0dGVybnMvZW5kbGVzcy1jbG91ZHMuc3ZnJ1xufSwge1xuICBpZDogJ3R5cGUtMTYnLFxuICB0aXRsZTogX18oJ0hvbmV5IENvbWInLCAnYmxvY2tzeScpLFxuICBzcmM6ICdwYXR0ZXJucy9ob25leS1jb21iLnN2Zydcbn0sIHtcbiAgaWQ6ICd0eXBlLTE3JyxcbiAgdGl0bGU6IF9fKCdDcm9zcyBTdHJpcGVzJywgJ2Jsb2Nrc3knKSxcbiAgc3JjOiAncGF0dGVybnMvY3Jvc3Mtc3RyaXBlcy5zdmcnXG59LCB7XG4gIGlkOiAndHlwZS0xOCcsXG4gIHRpdGxlOiBfXygnQXV0dW1uJywgJ2Jsb2Nrc3knKSxcbiAgc3JjOiAncGF0dGVybnMvYXV0dW1uLnN2Zydcbn1dO1xuZXhwb3J0IGNvbnN0IGdldFVybEZvclBhdHRlcm4gPSBpZCA9PiAod2luZG93LmN0X2xvY2FsaXphdGlvbnMgfHwgY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zKS5zdGF0aWNfcHVibGljX3VybCArIGBpbWFnZXMvJHtwYXR0ZXJuc0xpc3QuZmluZChwID0+IHAuaWQgPT09IGlkKS5zcmN9YDtcblxuY29uc3QgUGF0dGVyblBpY2tlciA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbixcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXBhdHRlcm5zLWxpc3RcIlxuICB9LCBwYXR0ZXJuc0xpc3QubWFwKHNpbmdsZVBhdHRlcm4gPT4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGJhY2tncm91bmRfcGF0dGVybjogc2luZ2xlUGF0dGVybi5pZFxuICAgIH0pKSxcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoe1xuICAgICAgYWN0aXZlOiBzaW5nbGVQYXR0ZXJuLmlkID09PSB2YWx1ZS5iYWNrZ3JvdW5kX3BhdHRlcm5cbiAgICB9KSxcbiAgICBrZXk6IHNpbmdsZVBhdHRlcm4uaWQsXG4gICAgdGl0bGU6IHNpbmdsZVBhdHRlcm4udGl0bGVcbiAgfSwgY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgc3JjOiAod2luZG93LmN0X2xvY2FsaXphdGlvbnMgfHwgY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zKS5zdGF0aWNfcHVibGljX3VybCArIGBpbWFnZXMvJHtzaW5nbGVQYXR0ZXJuLnNyY31gXG4gIH0pKSkpLCBjcmVhdGVFbGVtZW50KEdlbmVyaWNPcHRpb25UeXBlLCB7XG4gICAgdmFsdWU6IHZhbHVlWydwYXR0ZXJuQ29sb3InXSxcbiAgICB2YWx1ZXM6IHZhbHVlLFxuICAgIG9wdGlvbjoge1xuICAgICAgaWQ6ICdwYXR0ZXJuQ29sb3InLFxuICAgICAgbGFiZWw6IF9fKCdQYXR0ZXJuIENvbG9yJywgJ2Jsb2Nrc3knKSxcbiAgICAgIHR5cGU6ICdjdC1jb2xvci1waWNrZXInLFxuICAgICAgZGVzaWduOiAnaW5saW5lJyxcbiAgICAgIHZhbHVlOiBvcHRpb24udmFsdWVbJ3BhdHRlcm5Db2xvciddLFxuICAgICAgcGlja2VyczogW3tcbiAgICAgICAgdGl0bGU6IF9fKCdJbml0aWFsJywgJ2Jsb2Nrc3knKSxcbiAgICAgICAgaWQ6ICdkZWZhdWx0J1xuICAgICAgfV0sXG4gICAgICBza2lwTm9Db2xvclBpbGw6IHRydWUsXG4gICAgICBza2lwQXJyb3c6IHRydWUsXG4gICAgICBhcHBlbmRUb0JvZHk6IGZhbHNlXG4gICAgfSxcbiAgICBoYXNSZXZlcnRCdXR0b246IGZhbHNlLFxuICAgIG9uQ2hhbmdlOiBuZXdWYWx1ZSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIHBhdHRlcm5Db2xvcjogbmV3VmFsdWVcbiAgICB9KSlcbiAgfSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGF0dGVyblBpY2tlcjsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCBHZW5lcmljT3B0aW9uVHlwZSBmcm9tICcuLi8uLi9HZW5lcmljT3B0aW9uVHlwZSc7XG5cbmNvbnN0IEltYWdlUGlja2VyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICAgIHNldE91dHNpZGVDbGlja0ZyZWV6ZWRcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KEdlbmVyaWNPcHRpb25UeXBlLCB7XG4gICAgdmFsdWU6IHZhbHVlWydiYWNrZ3JvdW5kX2ltYWdlJ10sXG4gICAgdmFsdWVzOiB2YWx1ZSxcbiAgICBvcHRpb246IHtcbiAgICAgIGlkOiAnYmFja2dyb3VuZF9pbWFnZScsXG4gICAgICBsYWJlbDogZmFsc2UsXG4gICAgICB0eXBlOiAnY3QtaW1hZ2UtdXBsb2FkZXInLFxuICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZVsnYmFja2dyb3VuZF9pbWFnZSddLFxuICAgICAgaGFzX3Bvc2l0aW9uX3BpY2tlcjogdHJ1ZSxcbiAgICAgIGVtcHR5TGFiZWw6IF9fKCdTZWxlY3QgSW1hZ2UnLCAnYmxvY2tzeScpLFxuICAgICAgZmlsbGVkTGFiZWw6IF9fKCdDaGFuZ2UgSW1hZ2UnLCAnYmxvY2tzeScpLFxuICAgICAgb25GcmFtZU9wZW46ICgpID0+IHtcbiAgICAgICAgc2V0T3V0c2lkZUNsaWNrRnJlZXplZCh0cnVlKTtcbiAgICAgIH0sXG4gICAgICBvbkZyYW1lQ2xvc2U6ICgpID0+IHtcbiAgICAgICAgc2V0T3V0c2lkZUNsaWNrRnJlZXplZChmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYXNSZXZlcnRCdXR0b246IGZhbHNlLFxuICAgIG9uQ2hhbmdlOiBuZXdWYWx1ZSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGJhY2tncm91bmRfaW1hZ2U6IG5ld1ZhbHVlXG4gICAgfSkpXG4gIH0pLCBjcmVhdGVFbGVtZW50KEdlbmVyaWNPcHRpb25UeXBlLCB7XG4gICAgdmFsdWU6IHZhbHVlWydiYWNrZ3JvdW5kX3JlcGVhdCddLFxuICAgIHZhbHVlczogdmFsdWUsXG4gICAgb3B0aW9uOiB7XG4gICAgICBpZDogJ2JhY2tncm91bmRfcmVwZWF0JyxcbiAgICAgIGxhYmVsOiBfXygnQmFja2dyb3VuZCBSZXBlYXQnLCAnYmxvY2tzeScpLFxuICAgICAgYXR0cjoge1xuICAgICAgICAnZGF0YS10eXBlJzogJ3JlcGVhdCdcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnY3QtcmFkaW8nLFxuICAgICAgdmlldzogJ3RleHQnLFxuICAgICAgZGVzaWduOiAnYmxvY2snLFxuICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZVsnYmFja2dyb3VuZF9yZXBlYXQnXSxcbiAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgcmVwZWF0OiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+PHBhdGggZD1cIk0wLDBoNHY0SDBWMHogTTYsMGg0djRINlYweiBNMTIsMGg0djRoLTRWMHogTTAsNmg0djRIMFY2eiBNNiw2aDR2NEg2VjZ6IE0xMiw2aDR2NGgtNFY2eiBNMCwxMmg0djRIMFYxMnogTTYsMTJoNHY0SDZWMTJ6TTEyLDEyaDR2NGgtNFYxMnpcIi8+PC9zdmc+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiY3QtdG9vbHRpcC10b3BcIj4ke19fKCdSZXBlYXQnLCAnYmxvY2tzeScpfTwvc3Bhbj5gLFxuICAgICAgICAncmVwZWF0LXknOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+PHJlY3QgeD1cIjZcIiB3aWR0aD1cIjRcIiBoZWlnaHQ9XCI0XCIvPjxyZWN0IHg9XCI2XCIgeT1cIjZcIiB3aWR0aD1cIjRcIiBoZWlnaHQ9XCI0XCIvPjxyZWN0IHg9XCI2XCIgeT1cIjEyXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiNFwiLz48L3N2Zz5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJjdC10b29sdGlwLXRvcFwiPiR7X18oJ1JlcGVhdCBZJywgJ2Jsb2Nrc3knKX08L3NwYW4+YCxcbiAgICAgICAgJ3JlcGVhdC14JzogYDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiPjxyZWN0IHk9XCI2XCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiNFwiLz48cmVjdCB4PVwiNlwiIHk9XCI2XCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiNFwiLz48cmVjdCB4PVwiMTJcIiB5PVwiNlwiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjRcIi8+PC9zdmc+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiY3QtdG9vbHRpcC10b3BcIj4ke19fKCdSZXBlYXQgWCcsICdibG9ja3N5Jyl9PC9zcGFuPmAsXG4gICAgICAgICduby1yZXBlYXQnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+PHJlY3QgeD1cIjZcIiB5PVwiNlwiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjRcIi8+PC9zdmc+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiY3QtdG9vbHRpcC10b3BcIj4ke19fKCdObyBSZXBlYXQnLCAnYmxvY2tzeScpfTwvc3Bhbj5gXG4gICAgICB9XG4gICAgfSxcbiAgICBoYXNSZXZlcnRCdXR0b246IGZhbHNlLFxuICAgIG9uQ2hhbmdlOiBuZXdWYWx1ZSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGJhY2tncm91bmRfcmVwZWF0OiBuZXdWYWx1ZVxuICAgIH0pKVxuICB9KSwgY3JlYXRlRWxlbWVudChHZW5lcmljT3B0aW9uVHlwZSwge1xuICAgIHZhbHVlOiB2YWx1ZVsnYmFja2dyb3VuZF9zaXplJ10sXG4gICAgdmFsdWVzOiB2YWx1ZSxcbiAgICBvcHRpb246IHtcbiAgICAgIGlkOiAnYmFja2dyb3VuZF9zaXplJyxcbiAgICAgIGxhYmVsOiBfXygnQmFja2dyb3VuZCBTaXplJywgJ2Jsb2Nrc3knKSxcbiAgICAgIHR5cGU6ICdjdC1yYWRpbycsXG4gICAgICB2aWV3OiAndGV4dCcsXG4gICAgICBkZXNpZ246ICdibG9jaycsXG4gICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlWydiYWNrZ3JvdW5kX3NpemUnXSxcbiAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgYXV0bzogX18oJ0F1dG8nLCAnYmxvY2tzeScpLFxuICAgICAgICBjb3ZlcjogX18oJ0NvdmVyJywgJ2Jsb2Nrc3knKSxcbiAgICAgICAgY29udGFpbjogX18oJ0NvbnRhaW4nLCAnYmxvY2tzeScpXG4gICAgICB9XG4gICAgfSxcbiAgICBoYXNSZXZlcnRCdXR0b246IGZhbHNlLFxuICAgIG9uQ2hhbmdlOiBuZXdWYWx1ZSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGJhY2tncm91bmRfc2l6ZTogbmV3VmFsdWVcbiAgICB9KSlcbiAgfSksIGNyZWF0ZUVsZW1lbnQoR2VuZXJpY09wdGlvblR5cGUsIHtcbiAgICB2YWx1ZTogdmFsdWVbJ2JhY2tncm91bmRfYXR0YWNobWVudCddLFxuICAgIHZhbHVlczogdmFsdWUsXG4gICAgb3B0aW9uOiB7XG4gICAgICBpZDogJ2JhY2tncm91bmRfc2l6ZScsXG4gICAgICBsYWJlbDogX18oJ0JhY2tncm91bmQgQXR0YWNobWVudCcsICdibG9ja3N5JyksXG4gICAgICB0eXBlOiAnY3QtcmFkaW8nLFxuICAgICAgdmlldzogJ3RleHQnLFxuICAgICAgZGVzaWduOiAnYmxvY2snLFxuICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZVsnYmFja2dyb3VuZF9hdHRhY2htZW50J10sXG4gICAgICBjaG9pY2VzOiB7XG4gICAgICAgIHNjcm9sbDogX18oJ1Njcm9sbCcsICdibG9ja3N5JyksXG4gICAgICAgIGZpeGVkOiBfXygnRml4ZWQnLCAnYmxvY2tzeScpLFxuICAgICAgICBpbmhlcml0OiBfXygnSW5oZXJpdCcsICdibG9ja3N5JylcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhc1JldmVydEJ1dHRvbjogZmFsc2UsXG4gICAgb25DaGFuZ2U6IG5ld1ZhbHVlID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgYmFja2dyb3VuZF9hdHRhY2htZW50OiBuZXdWYWx1ZVxuICAgIH0pKVxuICB9KSwgdmFsdWUuYmFja2dyb3VuZF9pbWFnZS51cmwgJiYgY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgY3JlYXRlRWxlbWVudChHZW5lcmljT3B0aW9uVHlwZSwge1xuICAgIHZhbHVlOiB2YWx1ZS5vdmVybGF5Q29sb3IgJiYgdmFsdWUub3ZlcmxheUNvbG9yLmRlZmF1bHQuY29sb3IuaW5kZXhPZignQ1RfQ1NTX1NLSVBfUlVMRScpID09PSAtMSA/ICd5ZXMnIDogJ25vJyxcbiAgICB2YWx1ZXM6IHt9LFxuICAgIG9wdGlvbjoge1xuICAgICAgaWQ6ICdoYXNfb3ZlcmxheScsXG4gICAgICBsYWJlbDogX18oJ0ltYWdlIE92ZXJsYXknLCAnYmxvY2tzeScpLFxuICAgICAgdHlwZTogJ2N0LXJhZGlvJyxcbiAgICAgIHZpZXc6ICd0ZXh0JyxcbiAgICAgIGRlc2lnbjogJ2Jsb2NrJyxcbiAgICAgIHZhbHVlOiAnbm8nLFxuICAgICAgY2hvaWNlczoge1xuICAgICAgICBubzogX18oJ0Rpc2FibGVkJywgJ2Jsb2Nrc3knKSxcbiAgICAgICAgeWVzOiBfXygnRW5hYmxlZCcsICdibG9ja3N5JylcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhc1JldmVydEJ1dHRvbjogZmFsc2UsXG4gICAgb25DaGFuZ2U6IG5ld1ZhbHVlID0+IHtcbiAgICAgIGxldCBoYXNPdmVybGF5ID0gdmFsdWUub3ZlcmxheUNvbG9yLmRlZmF1bHQuY29sb3IuaW5kZXhPZignQ1RfQ1NTX1NLSVBfUlVMRScpID09PSAtMTtcbiAgICAgIG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgICBvdmVybGF5Q29sb3I6IHtcbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb2xvcjogaGFzT3ZlcmxheSA/ICdDVF9DU1NfU0tJUF9SVUxFJyA6ICdyZ2JhKDAsIDAsIDAsIDAuMiknXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfVxuICB9KSwgdmFsdWUub3ZlcmxheUNvbG9yICYmIHZhbHVlLm92ZXJsYXlDb2xvci5kZWZhdWx0LmNvbG9yLmluZGV4T2YoJ0NUX0NTU19TS0lQX1JVTEUnKSA9PT0gLTEgJiYgY3JlYXRlRWxlbWVudChHZW5lcmljT3B0aW9uVHlwZSwge1xuICAgIHZhbHVlOiB2YWx1ZVsnb3ZlcmxheUNvbG9yJ10sXG4gICAgdmFsdWVzOiB2YWx1ZSxcbiAgICBvcHRpb246IHtcbiAgICAgIGlkOiAnb3ZlcmxheUNvbG9yJyxcbiAgICAgIGxhYmVsOiBfXygnSW1hZ2UgT3ZlcmxheSBDb2xvcicsICdibG9ja3N5JyksXG4gICAgICB0eXBlOiAnY3QtY29sb3ItcGlja2VyJyxcbiAgICAgIGRlc2lnbjogJ2lubGluZScsXG4gICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlWydvdmVybGF5Q29sb3InXSxcbiAgICAgIHBpY2tlcnM6IFt7XG4gICAgICAgIHRpdGxlOiBfXygnSW5pdGlhbCcsICdibG9ja3N5JyksXG4gICAgICAgIGlkOiAnZGVmYXVsdCdcbiAgICAgIH1dLFxuICAgICAgc2tpcEFycm93OiB0cnVlLFxuICAgICAgYXBwZW5kVG9Cb2R5OiBmYWxzZVxuICAgIH0sXG4gICAgaGFzUmV2ZXJ0QnV0dG9uOiBmYWxzZSxcbiAgICBvbkNoYW5nZTogbmV3VmFsdWUgPT4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICBvdmVybGF5Q29sb3I6IG5ld1ZhbHVlXG4gICAgfSkpXG4gIH0pKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbWFnZVBpY2tlcjsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZUNhbGxiYWNrLCB1c2VTdGF0ZSB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxubGV0IEdyYWRpZW50UGlja2VyQ29tcG9uZW50ID0gKCkgPT4gbnVsbDtcblxuc2V0VGltZW91dCgoKSA9PiB7XG4gIGlmICh3aW5kb3cud3AuY29tcG9uZW50cykge1xuICAgIGltcG9ydCgnLi9ncmFkaWVudC9pbmRleCcpLnRoZW4ocmVzID0+IHtcbiAgICAgIEdyYWRpZW50UGlja2VyQ29tcG9uZW50ID0gcmVzLmRlZmF1bHQ7XG4gICAgfSk7XG4gIH1cbn0sIDEwMDApO1xuXG5jb25zdCBHcmFkaWVudFBpY2tlciA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBhbGxHcmFkaWVudHMgPSAod2luZG93LmN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucyB8fCB3aW5kb3cuY3RfbG9jYWxpemF0aW9ucylbJ2dyYWRpZW50cyddOyAvLyBsZXQgR3JhZGllbnRQaWNrZXJDb21wb25lbnQgPVxuICAvLyBTdGFibGVHcmFkaWVudFBpY2tlciB8fCBFeHBlcmltZW50YWxHcmFkaWVudFBpY2tlclxuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KEdyYWRpZW50UGlja2VyQ29tcG9uZW50LCB7XG4gICAgdmFsdWU6IHZhbHVlLmdyYWRpZW50IHx8ICcnLFxuICAgIG9uQ2hhbmdlOiB2YWwgPT4ge1xuICAgICAgb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICAgIGdyYWRpZW50OiB2YWxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pLCBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogJ2N0LWdyYWRpZW50LXN3YXRjaGVzJ1xuICB9LCBhbGxHcmFkaWVudHMubWFwKF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAgZ3JhZGllbnQsXG4gICAgICBzbHVnXG4gICAgfSA9IF9yZWYyO1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgICBncmFkaWVudDogdmFsdWUuZ3JhZGllbnQgPT09IGdyYWRpZW50ID8gJycgOiBncmFkaWVudFxuICAgICAgICB9KSk7XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKHtcbiAgICAgICAgYWN0aXZlOiBncmFkaWVudCA9PT0gdmFsdWUuZ3JhZGllbnRcbiAgICAgIH0pLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgJy0tYmFja2dyb3VuZC1pbWFnZSc6IGdyYWRpZW50XG4gICAgICB9LFxuICAgICAga2V5OiBzbHVnXG4gICAgfSk7XG4gIH0pKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBHcmFkaWVudFBpY2tlcjsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCBHZW5lcmljT3B0aW9uVHlwZSBmcm9tICcuLi8uLi9HZW5lcmljT3B0aW9uVHlwZSc7XG5pbXBvcnQgUGF0dGVyblBpY2tlciBmcm9tICcuL1BhdHRlcm5QaWNrZXInO1xuaW1wb3J0IEltYWdlUGlja2VyIGZyb20gJy4vSW1hZ2VQaWNrZXInO1xuaW1wb3J0IEdyYWRpZW50UGlja2VyIGZyb20gJy4vR3JhZGllbnRQaWNrZXInO1xuXG5jb25zdCBCYWNrZ3JvdW5kTW9kYWwgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgb3B0aW9uOiB7XG4gICAgICBhY3RpdmVUYWJzID0gWydjb2xvcicsICdncmFkaWVudCcsICdpbWFnZSddXG4gICAgfSxcbiAgICB2YWx1ZSxcbiAgICBpc09wZW4sXG4gICAgb25DaGFuZ2UsXG4gICAgc2V0T3V0c2lkZUNsaWNrRnJlZXplZFxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LW1vZGFsLXRhYnNcIixcbiAgICBvbk1vdXNlVXA6IGUgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgYWN0aXZlVGFicy5tYXAodHlwZSA9PiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIFwiZGF0YS10eXBlXCI6IHR5cGUsXG4gICAga2V5OiB0eXBlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBhY3RpdmU6IHR5cGUgPT09IHZhbHVlLmJhY2tncm91bmRfdHlwZSB8fCB0eXBlID09PSAnaW1hZ2UnICYmICh2YWx1ZS5iYWNrZ3JvdW5kX3R5cGUgPT09ICdwYXR0ZXJuJyB8fCB2YWx1ZS5iYWNrZ3JvdW5kX3R5cGUgPT09ICdpbWFnZScpXG4gICAgfSksXG4gICAgb25DbGljazogKCkgPT4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICBiYWNrZ3JvdW5kX3R5cGU6IHR5cGVcbiAgICB9LCB0eXBlID09PSAnZ3JhZGllbnQnID8ge1xuICAgICAgZ3JhZGllbnQ6ICdsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLHJnYmEoNiwxNDcsMjI3LDEpIDAlLHJnYigxNTUsODEsMjI0KSAxMDAlKSdcbiAgICB9IDoge30pKVxuICB9LCB7XG4gICAgY29sb3I6IF9fKCdDb2xvcicsICdibG9ja3N5JyksXG4gICAgZ3JhZGllbnQ6IF9fKCdHcmFkaWVudCcsICdibG9ja3N5JyksXG4gICAgLy8gcGF0dGVybjogX18oJ1BhdHRlcm4nLCAnYmxvY2tzeScpLFxuICAgIGltYWdlOiBfXygnSW1hZ2UnLCAnYmxvY2tzeScpXG4gIH1bdHlwZV0pKSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICAnY3QtaW1hZ2UtdGFiIGN0LW9wdGlvbnMtY29udGFpbmVyJzogdmFsdWUuYmFja2dyb3VuZF90eXBlID09PSAnaW1hZ2UnIHx8IHZhbHVlLmJhY2tncm91bmRfdHlwZSA9PT0gJ3BhdHRlcm4nLFxuICAgICAgJ2N0LWNvbG9yLXBpY2tlci1tb2RhbCc6IHZhbHVlLmJhY2tncm91bmRfdHlwZSA9PT0gJ2dyYWRpZW50JyxcbiAgICAgICdjdC1ncmFkaWVudC10YWInOiB2YWx1ZS5iYWNrZ3JvdW5kX3R5cGUgPT09ICdncmFkaWVudCcgJiYgd2luZG93LndwLmNvbXBvbmVudHMuX19leHBlcmltZW50YWxHcmFkaWVudFBpY2tlcixcbiAgICAgICdjdC1ncmFkaWVudC10YWItbmV3JzogdmFsdWUuYmFja2dyb3VuZF90eXBlID09PSAnZ3JhZGllbnQnICYmICF3aW5kb3cud3AuY29tcG9uZW50cy5fX2V4cGVyaW1lbnRhbEdyYWRpZW50UGlja2VyLFxuICAgICAgJ2N0LWNvbG9yLXRhYic6IHZhbHVlLmJhY2tncm91bmRfdHlwZSA9PT0gJ2NvbG9yJ1xuICAgIH0sICdjdC1tb2RhbC10YWJzLWNvbnRlbnQnKVxuICB9LCAodmFsdWUuYmFja2dyb3VuZF90eXBlID09PSAnaW1hZ2UnIHx8IHZhbHVlLmJhY2tncm91bmRfdHlwZSA9PT0gJ3BhdHRlcm4nKSAmJiBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1yYWRpby1vcHRpb24gY3QtYnV0dG9ucy1ncm91cFwiLFxuICAgIG9uTW91c2VVcDogZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCBbJ2ltYWdlJywgJ3BhdHRlcm4nXS5tYXAodHlwZSA9PiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIFwiZGF0YS10eXBlXCI6IHR5cGUsXG4gICAga2V5OiB0eXBlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBhY3RpdmU6IHR5cGUgPT09IHZhbHVlLmJhY2tncm91bmRfdHlwZVxuICAgIH0pLFxuICAgIG9uQ2xpY2s6ICgpID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgYmFja2dyb3VuZF90eXBlOiB0eXBlXG4gICAgfSkpXG4gIH0sIHtcbiAgICBwYXR0ZXJuOiBfXygnUGF0dGVybicsICdibG9ja3N5JyksXG4gICAgaW1hZ2U6IF9fKCdJbWFnZScsICdibG9ja3N5JylcbiAgfVt0eXBlXSkpKSwgdmFsdWUuYmFja2dyb3VuZF90eXBlID09PSAncGF0dGVybicgJiYgY3JlYXRlRWxlbWVudChQYXR0ZXJuUGlja2VyLCB7XG4gICAgb3B0aW9uOiBvcHRpb24sXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9KSwgdmFsdWUuYmFja2dyb3VuZF90eXBlID09PSAnaW1hZ2UnICYmIGNyZWF0ZUVsZW1lbnQoSW1hZ2VQaWNrZXIsIHtcbiAgICBzZXRPdXRzaWRlQ2xpY2tGcmVlemVkOiBzZXRPdXRzaWRlQ2xpY2tGcmVlemVkLFxuICAgIG9wdGlvbjogb3B0aW9uLFxuICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSksIHZhbHVlLmJhY2tncm91bmRfdHlwZSA9PT0gJ2dyYWRpZW50JyAmJiBjcmVhdGVFbGVtZW50KEdyYWRpZW50UGlja2VyLCB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIG9uQ2hhbmdlOiBvbkNoYW5nZVxuICB9KSwgdmFsdWUuYmFja2dyb3VuZF90eXBlICE9PSAnZ3JhZGllbnQnICYmIGNyZWF0ZUVsZW1lbnQoR2VuZXJpY09wdGlvblR5cGUsIHtcbiAgICB2YWx1ZTogdmFsdWVbJ2JhY2tncm91bmRDb2xvciddLFxuICAgIHZhbHVlczogdmFsdWUsXG4gICAgb3B0aW9uOiB7XG4gICAgICBpZDogJ2JhY2tncm91bmRDb2xvcicsXG4gICAgICBsYWJlbDogdmFsdWUuYmFja2dyb3VuZF90eXBlID09PSAnY29sb3InID8gZmFsc2UgOiBfXygnQmFja2dyb3VuZCBDb2xvcicsICdibG9ja3N5JyksXG4gICAgICB0eXBlOiAnY3QtY29sb3ItcGlja2VyJyxcbiAgICAgIHNraXBOb0NvbG9yUGlsbDogdHJ1ZSxcbiAgICAgIGRlc2lnbjogdmFsdWUuYmFja2dyb3VuZF90eXBlID09PSAnY29sb3InID8gJ25vbmUnIDogJ2lubGluZScsXG4gICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlWydiYWNrZ3JvdW5kQ29sb3InXSxcbiAgICAgIHBpY2tlcnM6IFt7XG4gICAgICAgIHRpdGxlOiBfXygnSW5pdGlhbCcsICdibG9ja3N5JyksXG4gICAgICAgIGlkOiAnZGVmYXVsdCdcbiAgICAgIH1dLFxuICAgICAgaW5saW5lX21vZGFsOiB2YWx1ZS5iYWNrZ3JvdW5kX3R5cGUgPT09ICdjb2xvcicsXG4gICAgICBza2lwQXJyb3c6IHRydWUsXG4gICAgICBhcHBlbmRUb0JvZHk6IGZhbHNlXG4gICAgfSxcbiAgICBoYXNSZXZlcnRCdXR0b246IGZhbHNlLFxuICAgIG9uQ2hhbmdlOiBuZXdWYWx1ZSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogbmV3VmFsdWVcbiAgICB9KSlcbiAgfSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tncm91bmRNb2RhbDsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlQ2FsbGJhY2ssIGNyZWF0ZVBvcnRhbCwgdXNlU3RhdGUgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBCYWNrZ3JvdW5kTW9kYWwgZnJvbSAnLi9iYWNrZ3JvdW5kL0JhY2tncm91bmRNb2RhbCc7XG5pbXBvcnQgT3V0c2lkZUNsaWNrSGFuZGxlciBmcm9tICcuL3JlYWN0LW91dHNpZGUtY2xpY2staGFuZGxlcic7XG5pbXBvcnQgeyBnZXRVcmxGb3JQYXR0ZXJuIH0gZnJvbSAnLi9iYWNrZ3JvdW5kL1BhdHRlcm5QaWNrZXInO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCB1c2VQb3BvdmVyTWFrZXIgZnJvbSAnLi4vaGVscGVycy91c2VQb3BvdmVyTWFrZXInO1xuLyoqXG4gKiBTdXBwb3J0IGNvbG9yIHBpY2tlciB2YWx1ZXMgaW5zaWRlIHRoZSBiYWNrZ3JvdW5kIHBpY2tlci5cbiAqIFdoaWNoIG1lYW5zIHRyYW5zaXRpb25zIGZyb20gY3QtY29sb3ItcGlja2VyIGFyZSBtYWRlIHBvc3NpYmxlIHRoYW5rcyB0b1xuICogdGhpcyBsb2dpYy5cbiAqL1xuXG5jb25zdCBtYXliZUNvbnZlcnRGcm9tQ29sb3JQaWNrZXJUbyA9IHZhbHVlID0+IHtcbiAgaWYgKCF2YWx1ZS5iYWNrZ3JvdW5kX3R5cGUpIHtcbiAgICBpZiAodmFsdWVbT2JqZWN0LmtleXModmFsdWUpWzBdXS5jb2xvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmFja2dyb3VuZF90eXBlOiAnY29sb3InLFxuICAgICAgICBiYWNrZ3JvdW5kX3BhdHRlcm46ICd0eXBlLTEnLFxuICAgICAgICBiYWNrZ3JvdW5kX2ltYWdlOiB7XG4gICAgICAgICAgYXR0YWNobWVudF9pZDogbnVsbCxcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgYmFja2dyb3VuZF9yZXBlYXQ6ICduby1yZXBlYXQnLFxuICAgICAgICBiYWNrZ3JvdW5kX3NpemU6ICdhdXRvJyxcbiAgICAgICAgYmFja2dyb3VuZF9hdHRhY2htZW50OiAnc2Nyb2xsJyxcbiAgICAgICAgcGF0dGVybkNvbG9yOiB7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29sb3I6ICcjZTVlN2VhJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB7XG4gICAgICAgICAgZGVmYXVsdDogdmFsdWVbT2JqZWN0LmtleXModmFsdWUpWzBdXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmNvbnN0IEJhY2tncm91bmQgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IFtpc09wZW4sIHNldElzT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtvdXRzaWRlQ2xpY2tGcmVlemVkLCBzZXRPdXRzaWRlQ2xpY2tGcmVlemVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgYmFja2dyb3VuZFdyYXBwZXIgPSB1c2VSZWYoKTtcbiAgdmFsdWUgPSBtYXliZUNvbnZlcnRGcm9tQ29sb3JQaWNrZXJUbyh2YWx1ZSk7XG4gIGNvbnN0IGlzSW5oZXJpdCA9ICFvcHRpb24uaGFzX25vX2NvbG9yICYmIHZhbHVlLmJhY2tncm91bmRfdHlwZSA9PT0gJ2NvbG9yJyAmJiAodmFsdWUuYmFja2dyb3VuZENvbG9yLmRlZmF1bHQuY29sb3IgPT09ICdDVF9DU1NfU0tJUF9SVUxFJyB8fCB2YWx1ZS5iYWNrZ3JvdW5kQ29sb3IuZGVmYXVsdC5jb2xvciA9PT0gJ3RyYW5zcGFyZW50Jyk7XG4gIGNvbnN0IGlzTm9Db2xvciA9IG9wdGlvbi5oYXNfbm9fY29sb3IgJiYgdmFsdWUuYmFja2dyb3VuZF90eXBlID09PSAnY29sb3InICYmICh2YWx1ZS5iYWNrZ3JvdW5kQ29sb3IuZGVmYXVsdC5jb2xvciA9PT0gJ0NUX0NTU19TS0lQX1JVTEUnIHx8IHZhbHVlLmJhY2tncm91bmRDb2xvci5kZWZhdWx0LmNvbG9yID09PSAndHJhbnNwYXJlbnQnKTtcbiAgY29uc3Qge1xuICAgIHN0eWxlcyxcbiAgICBwb3BvdmVyUHJvcHNcbiAgfSA9IHVzZVBvcG92ZXJNYWtlcih7XG4gICAgcmVmOiBiYWNrZ3JvdW5kV3JhcHBlcixcbiAgICBkZWZhdWx0SGVpZ2h0OiA0MzQsXG4gICAgc2hvdWxkQ2FsY3VsYXRlOiBiYWNrZ3JvdW5kV3JhcHBlciAmJiBiYWNrZ3JvdW5kV3JhcHBlci5jdXJyZW50XG4gIH0pO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBiYWNrZ3JvdW5kV3JhcHBlcixcbiAgICBjbGFzc05hbWU6IGNscygnY3QtYmFja2dyb3VuZCcsIHtcbiAgICAgIGFjdGl2ZTogaXNPcGVuXG4gICAgfSlcbiAgfSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMoJ2N0LWJhY2tncm91bmQtcHJldmlldycsIHtcbiAgICAgICdjdC1jb2xvci1pbmhlcml0JzogaXNJbmhlcml0LFxuICAgICAgJ2N0LW5vLWNvbG9yJzogaXNOb0NvbG9yXG4gICAgfSksXG4gICAgb25DbGljazogZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRJc09wZW4oIWlzT3Blbik7XG5cbiAgICAgIGlmICh2YWx1ZS5iYWNrZ3JvdW5kX3R5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgaWYgKHZhbHVlLmJhY2tncm91bmRDb2xvci5kZWZhdWx0LmNvbG9yID09PSAnQ1RfQ1NTX1NLSVBfUlVMRScgfHwgdmFsdWUuYmFja2dyb3VuZENvbG9yLmRlZmF1bHQuY29sb3IgPT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgICAgICBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjoge1xuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29sb3I6IG9wdGlvbi5kZWZhdWx0X2luaGVyaXRfY29sb3IgfHwgJyNmZmZmZmYnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFwiZGF0YS1iYWNrZ3JvdW5kLXR5cGVcIjogdmFsdWUuYmFja2dyb3VuZF90eXBlLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlLmJhY2tncm91bmRDb2xvci5kZWZhdWx0LmNvbG9yLmluZGV4T2YoJ0NUX0NTU19TS0lQX1JVTEUnKSA+IC0xID8ge30gOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHZhbHVlLmJhY2tncm91bmRDb2xvci5kZWZhdWx0LmNvbG9yXG4gICAgfSksIHt9LCB7XG4gICAgICAnLS1iYWNrZ3JvdW5kLXBvc2l0aW9uJzogYCR7TWF0aC5yb3VuZChwYXJzZUZsb2F0KHZhbHVlLmJhY2tncm91bmRfaW1hZ2UueCkgKiAxMDApfSUgJHtNYXRoLnJvdW5kKHBhcnNlRmxvYXQodmFsdWUuYmFja2dyb3VuZF9pbWFnZS55KSAqIDEwMCl9JWAsXG4gICAgICAnLS1wYXR0ZXJuLW1hc2snOiB2YWx1ZS5iYWNrZ3JvdW5kX3R5cGUgPT09ICdwYXR0ZXJuJyA/IGB1cmwoJHtnZXRVcmxGb3JQYXR0ZXJuKHZhbHVlLmJhY2tncm91bmRfcGF0dGVybil9KWAgOiAnJyxcbiAgICAgICctLWJhY2tncm91bmQtaW1hZ2UnOiB2YWx1ZS5iYWNrZ3JvdW5kX3R5cGUgPT09ICdncmFkaWVudCcgPyB2YWx1ZS5ncmFkaWVudCA6IHZhbHVlLmJhY2tncm91bmRfaW1hZ2UudXJsID8gYCR7dmFsdWUub3ZlcmxheUNvbG9yICYmIHZhbHVlLm92ZXJsYXlDb2xvci5kZWZhdWx0LmNvbG9yLmluZGV4T2YoJ0NUX0NTU19TS0lQX1JVTEUnKSA9PT0gLTEgPyBgbGluZWFyLWdyYWRpZW50KCR7dmFsdWUub3ZlcmxheUNvbG9yLmRlZmF1bHQuY29sb3J9LCAke3ZhbHVlLm92ZXJsYXlDb2xvci5kZWZhdWx0LmNvbG9yfSksIGAgOiAnJ311cmwoJHt2YWx1ZS5iYWNrZ3JvdW5kX2ltYWdlLnVybH0pYCA6ICdub25lJyxcbiAgICAgICctLXBhdHRlcm4tY29sb3InOiB2YWx1ZS5wYXR0ZXJuQ29sb3IuZGVmYXVsdC5jb2xvclxuICAgIH0pXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdG9vbHRpcC10b3BcIlxuICB9LCB7XG4gICAgaW5oZXJpdDogX18oJ0luaGVyaXRlZCcsICdibG9ja3N5JyksXG4gICAgbm9fY29sb3I6IF9fKCdObyBDb2xvcicsICdibG9ja3N5JyksXG4gICAgcGF0dGVybjogX18oJ1BhdHRlcm4nLCAnYmxvY2tzeScpLFxuICAgIGdyYWRpZW50OiBfXygnR3JhZGllbnQnLCAnYmxvY2tzeScpLFxuICAgIGNvbG9yOiBfXygnQ29sb3InLCAnYmxvY2tzeScpLFxuICAgIGltYWdlOiBfXygnSW1hZ2UnLCAnYmxvY2tzeScpXG4gIH1baXNOb0NvbG9yID8gJ25vX2NvbG9yJyA6IGlzSW5oZXJpdCA/ICdpbmhlcml0JyA6IHZhbHVlLmJhY2tncm91bmRfdHlwZV0pLCBpc0luaGVyaXQgJiYgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiMjVcIixcbiAgICBoZWlnaHQ6IFwiMjVcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAzMCAzMFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNSAzYy0zIDAtNS43IDEuMS03LjggMi45LS40LjMtLjUuOS0uMiAxLjQuMy40IDEgLjUgMS40LjJoLjFDMTAuMyA1LjkgMTIuNSA1IDE1IDVjNS4yIDAgOS41IDMuOSAxMCA5aC0zbDQgNiA0LTZoLTMuMUMyNi40IDcuOSAyMS4zIDMgMTUgM3pNNCAxMGwtNCA2aDMuMWMuNSA2LjEgNS42IDExIDExLjkgMTEgMyAwIDUuNy0xLjEgNy44LTIuOS40LS4zLjUtMSAuMi0xLjQtLjMtLjQtMS0uNS0xLjQtLjJoLS4xYy0xLjcgMS41LTQgMi40LTYuNSAyLjQtNS4yIDAtOS41LTMuOS0xMC05aDNMNCAxMHpcIlxuICB9KSkpLCBiYWNrZ3JvdW5kV3JhcHBlciAmJiBiYWNrZ3JvdW5kV3JhcHBlci5jdXJyZW50ICYmIGNyZWF0ZVBvcnRhbChjcmVhdGVFbGVtZW50KE91dHNpZGVDbGlja0hhbmRsZXIsIHtcbiAgICB1c2VDYXB0dXJlOiBmYWxzZSxcbiAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgZGlzYWJsZWQ6ICFpc09wZW4gfHwgb3V0c2lkZUNsaWNrRnJlZXplZCxcbiAgICBvbk91dHNpZGVDbGljazogKCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBzZXRJc09wZW4oZmFsc2UpKTtcbiAgICB9LFxuICAgIHdyYXBwZXJQcm9wczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHN0eWxlOiBzdHlsZXNcbiAgICB9LCBwb3BvdmVyUHJvcHMpLCB7fSwge1xuICAgICAgY2xhc3NOYW1lOiBjbHMoJ2N0LW9wdGlvbi1tb2RhbCBjdC1iYWNrZ3JvdW5kLW1vZGFsJywge1xuICAgICAgICBhY3RpdmU6IGlzT3BlblxuICAgICAgfSlcbiAgICB9KVxuICB9LCBjcmVhdGVFbGVtZW50KEJhY2tncm91bmRNb2RhbCwge1xuICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgb3B0aW9uOiBvcHRpb24sXG4gICAgaXNPcGVuOiBpc09wZW4sXG4gICAgc2V0T3V0c2lkZUNsaWNrRnJlZXplZDogc2V0T3V0c2lkZUNsaWNrRnJlZXplZFxuICB9KSksIGRvY3VtZW50LmJvZHkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tncm91bmQ7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8601\n")},9218:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _react_outside_click_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8204);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _ct_color_picker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2495);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_4__);\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst clamp = (min, max, value) => Math.max(min, Math.min(max, value));\n\nconst Border = _ref => {\n let {\n value,\n option,\n onChange\n } = _ref;\n const [isOpen, setIsOpen] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()('ct-option-border')\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()('ct-value-changer', {\n ['active']: isOpen,\n ['ct-disabled']: value.style === 'none' || value.inherit\n })\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"input\", {\n type: \"number\",\n value: value.width // disabled={value.style === 'none'}\n ,\n onChange: _ref2 => {\n let {\n target: {\n value: width\n }\n } = _ref2;\n return onChange(_objectSpread(_objectSpread({}, value), {}, {\n width: clamp(1, 5, parseInt(width, 10) || 1)\n }));\n }\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", {\n className: \"ct-value-divider\"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", {\n className: \"ct-current-value\",\n \"data-style\": value.inherit ? 'none' : value.style,\n onClick: () => setIsOpen(!isOpen)\n }, value.inherit ? (0,ct_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Inherit', 'blocksy') : value.style === 'none' ? (0,ct_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('none', 'blocksy') : null), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_react_outside_click_handler__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n disabled: !isOpen,\n onOutsideClick: () => {\n if (!isOpen) return;\n setIsOpen(false);\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"ul\", {\n className: \"ct-styles-list\"\n }, ['solid', 'dashed', 'dotted', 'none'].reduce((current, el, index) => [...current.slice(0, index % 2 === 0 ? undefined : -1), ...(index % 2 === 0 ? [[el]] : [[current[current.length - 1][0], el]])], []).map(group => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"li\", {\n key: group[0]\n }, group.map(style => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()({\n active: style === value.style\n }),\n \"data-style\": style,\n key: style,\n onClick: () => {\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n style\n }, Object.keys(option.value).indexOf('inherit') > -1 ? {\n inherit: false\n } : {}));\n setIsOpen(false);\n },\n \"data-style\": style\n }, style === 'none' ? (0,ct_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('None', 'blocksy') : null))))))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_ct_color_picker__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onChange: colorValue => onChange(_objectSpread(_objectSpread({}, value), {}, {\n color: colorValue.default\n })),\n option: {\n pickers: [{\n id: 'default',\n title: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Initial', 'blocksy')\n }]\n },\n value: {\n default: value.color\n }\n }), option.secondColor && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_ct_color_picker__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onChange: colorValue => onChange(_objectSpread(_objectSpread({}, value), {}, {\n secondColor: colorValue.default\n })),\n option: {\n pickers: [{\n id: 'default',\n title: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Hover', 'blocksy')\n }]\n },\n value: {\n default: value.secondColor || option.value.secondColor\n }\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Border);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIxOC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1ib3JkZXIuanM/MGNjMCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZVN0YXRlLCB1c2VSZWYsIHVzZUNvbnRleHQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IE91dHNpZGVDbGlja0hhbmRsZXIgZnJvbSAnLi9yZWFjdC1vdXRzaWRlLWNsaWNrLWhhbmRsZXInO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAnLi9jdC1jb2xvci1waWNrZXInO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcblxuY29uc3QgY2xhbXAgPSAobWluLCBtYXgsIHZhbHVlKSA9PiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcblxuY29uc3QgQm9yZGVyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgb3B0aW9uLFxuICAgIG9uQ2hhbmdlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC1vcHRpb24tYm9yZGVyJylcbiAgfSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC12YWx1ZS1jaGFuZ2VyJywge1xuICAgICAgWydhY3RpdmUnXTogaXNPcGVuLFxuICAgICAgWydjdC1kaXNhYmxlZCddOiB2YWx1ZS5zdHlsZSA9PT0gJ25vbmUnIHx8IHZhbHVlLmluaGVyaXRcbiAgICB9KVxuICB9LCBjcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge1xuICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgdmFsdWU6IHZhbHVlLndpZHRoIC8vIGRpc2FibGVkPXt2YWx1ZS5zdHlsZSA9PT0gJ25vbmUnfVxuICAgICxcbiAgICBvbkNoYW5nZTogX3JlZjIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgdmFsdWU6IHdpZHRoXG4gICAgICAgIH1cbiAgICAgIH0gPSBfcmVmMjtcbiAgICAgIHJldHVybiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgd2lkdGg6IGNsYW1wKDEsIDUsIHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgMSlcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXZhbHVlLWRpdmlkZXJcIlxuICB9KSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1jdXJyZW50LXZhbHVlXCIsXG4gICAgXCJkYXRhLXN0eWxlXCI6IHZhbHVlLmluaGVyaXQgPyAnbm9uZScgOiB2YWx1ZS5zdHlsZSxcbiAgICBvbkNsaWNrOiAoKSA9PiBzZXRJc09wZW4oIWlzT3BlbilcbiAgfSwgdmFsdWUuaW5oZXJpdCA/IF9fKCdJbmhlcml0JywgJ2Jsb2Nrc3knKSA6IHZhbHVlLnN0eWxlID09PSAnbm9uZScgPyBfXygnbm9uZScsICdibG9ja3N5JykgOiBudWxsKSwgY3JlYXRlRWxlbWVudChPdXRzaWRlQ2xpY2tIYW5kbGVyLCB7XG4gICAgZGlzYWJsZWQ6ICFpc09wZW4sXG4gICAgb25PdXRzaWRlQ2xpY2s6ICgpID0+IHtcbiAgICAgIGlmICghaXNPcGVuKSByZXR1cm47XG4gICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgIH1cbiAgfSwgY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtc3R5bGVzLWxpc3RcIlxuICB9LCBbJ3NvbGlkJywgJ2Rhc2hlZCcsICdkb3R0ZWQnLCAnbm9uZSddLnJlZHVjZSgoY3VycmVudCwgZWwsIGluZGV4KSA9PiBbLi4uY3VycmVudC5zbGljZSgwLCBpbmRleCAlIDIgPT09IDAgPyB1bmRlZmluZWQgOiAtMSksIC4uLihpbmRleCAlIDIgPT09IDAgPyBbW2VsXV0gOiBbW2N1cnJlbnRbY3VycmVudC5sZW5ndGggLSAxXVswXSwgZWxdXSldLCBbXSkubWFwKGdyb3VwID0+IGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiBncm91cFswXVxuICB9LCBncm91cC5tYXAoc3R5bGUgPT4gY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBhY3RpdmU6IHN0eWxlID09PSB2YWx1ZS5zdHlsZVxuICAgIH0pLFxuICAgIFwiZGF0YS1zdHlsZVwiOiBzdHlsZSxcbiAgICBrZXk6IHN0eWxlLFxuICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgIG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgICBzdHlsZVxuICAgICAgfSwgT2JqZWN0LmtleXMob3B0aW9uLnZhbHVlKS5pbmRleE9mKCdpbmhlcml0JykgPiAtMSA/IHtcbiAgICAgICAgaW5oZXJpdDogZmFsc2VcbiAgICAgIH0gOiB7fSkpO1xuICAgICAgc2V0SXNPcGVuKGZhbHNlKTtcbiAgICB9LFxuICAgIFwiZGF0YS1zdHlsZVwiOiBzdHlsZVxuICB9LCBzdHlsZSA9PT0gJ25vbmUnID8gX18oJ05vbmUnLCAnYmxvY2tzeScpIDogbnVsbCkpKSkpKSksIGNyZWF0ZUVsZW1lbnQoQ29sb3JQaWNrZXIsIHtcbiAgICBvbkNoYW5nZTogY29sb3JWYWx1ZSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGNvbG9yOiBjb2xvclZhbHVlLmRlZmF1bHRcbiAgICB9KSksXG4gICAgb3B0aW9uOiB7XG4gICAgICBwaWNrZXJzOiBbe1xuICAgICAgICBpZDogJ2RlZmF1bHQnLFxuICAgICAgICB0aXRsZTogX18oJ0luaXRpYWwnLCAnYmxvY2tzeScpXG4gICAgICB9XVxuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIGRlZmF1bHQ6IHZhbHVlLmNvbG9yXG4gICAgfVxuICB9KSwgb3B0aW9uLnNlY29uZENvbG9yICYmIGNyZWF0ZUVsZW1lbnQoQ29sb3JQaWNrZXIsIHtcbiAgICBvbkNoYW5nZTogY29sb3JWYWx1ZSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIHNlY29uZENvbG9yOiBjb2xvclZhbHVlLmRlZmF1bHRcbiAgICB9KSksXG4gICAgb3B0aW9uOiB7XG4gICAgICBwaWNrZXJzOiBbe1xuICAgICAgICBpZDogJ2RlZmF1bHQnLFxuICAgICAgICB0aXRsZTogX18oJ0hvdmVyJywgJ2Jsb2Nrc3knKVxuICAgICAgfV1cbiAgICB9LFxuICAgIHZhbHVlOiB7XG4gICAgICBkZWZhdWx0OiB2YWx1ZS5zZWNvbmRDb2xvciB8fCBvcHRpb24udmFsdWUuc2Vjb25kQ29sb3JcbiAgICB9XG4gIH0pKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJvcmRlcjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9218\n")},9795:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ ct_box_shadow)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./static/js/options/options/react-outside-click-handler.js\nvar react_outside_click_handler = __webpack_require__(8204);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: ./static/js/options/options/color-picker/single-picker.js + 2 modules\nvar single_picker = __webpack_require__(694);\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./node_modules/react-spring/renderprops.js\nvar renderprops = __webpack_require__(4823);\n// EXTERNAL MODULE: ./node_modules/bezier-easing/src/index.js\nvar src = __webpack_require__(3431);\nvar src_default = /*#__PURE__*/__webpack_require__.n(src);\n// EXTERNAL MODULE: ./static/js/options/GenericOptionType.js\nvar GenericOptionType = __webpack_require__(6095);\n// EXTERNAL MODULE: ./static/js/options/options/ct-switch.js\nvar ct_switch = __webpack_require__(9497);\n// EXTERNAL MODULE: ./static/js/options/helpers/usePopoverMaker.js\nvar usePopoverMaker = __webpack_require__(9144);\n;// CONCATENATED MODULE: ./static/js/options/options/box-shadow/box-shadow-modal.js\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\nconst BoxShadowModal = _ref => {\n let {\n option,\n value,\n onChange,\n picker,\n onPickingChange,\n stopTransitioning,\n el,\n hOffsetRef,\n vOffsetRef,\n blurRef,\n spreadRef,\n isTransitioning,\n isPicking\n } = _ref;\n const {\n styles,\n popoverProps\n } = (0,usePopoverMaker/* default */.Z)({\n ref: el,\n defaultHeight: !option.hide_shadow_placement ? 507 : 437,\n shouldCalculate: isTransitioning === picker.id || (isPicking || '').split(':')[0] === picker.id\n });\n return (isTransitioning === picker.id || (isPicking || '').split(':')[0] === picker.id) && (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(renderprops/* Transition */.uT, {\n items: isPicking,\n onRest: isOpen => {\n stopTransitioning();\n },\n config: {\n duration: 100,\n easing: src_default()(0.25, 0.1, 0.25, 1.0)\n },\n from: (isPicking || '').indexOf(':') === -1 ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n },\n enter: (isPicking || '').indexOf(':') === -1 ? {\n transform: 'scale3d(1, 1, 1)',\n opacity: 1\n } : {\n opacity: 1\n },\n leave: (isPicking || '').indexOf(':') === -1 ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n }\n }, isPicking => (isPicking || '').split(':')[0] === picker.id && (props => (0,external_window_wp_element_.createElement)(\"div\", _extends({\n style: _objectSpread(_objectSpread({}, props), styles)\n }, popoverProps, {\n className: \"ct-option-modal ct-box-shadow-modal\",\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n },\n onMouseDownCapture: e => {\n e.nativeEvent.stopImmediatePropagation();\n e.nativeEvent.stopPropagation();\n },\n onMouseUpCapture: e => {\n e.nativeEvent.stopImmediatePropagation();\n e.nativeEvent.stopPropagation();\n }\n }), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-shadow-trigger\"\n }, (0,external_window_wp_element_.createElement)(\"label\", null, (0,external_window_wp_i18n_.__)('Enable/Disable', 'blocksy')), (0,external_window_wp_element_.createElement)(ct_switch[\"default\"], {\n value: value.enable ? 'yes' : 'no',\n onChange: () => {\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n enable: !value.enable\n }));\n }\n })), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"shadow-sliders\"\n }, (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value.h_offset,\n values: value,\n id: \"h_offset\",\n option: {\n id: 'h_offset',\n label: (0,external_window_wp_i18n_.__)('Horizontal Offset', 'blocksy'),\n type: 'ct-slider',\n steps: 'half',\n value: option.value.h_offset,\n min: -100,\n max: 100,\n design: 'compact',\n ref: hOffsetRef // skipInput: true\n\n },\n hasRevertButton: false,\n onChange: newValue => onChange(_objectSpread(_objectSpread({}, value), {}, {\n h_offset: newValue\n }))\n }), (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value.v_offset,\n values: value,\n id: \"v_offset\",\n option: {\n steps: 'half',\n id: 'v_offset',\n label: (0,external_window_wp_i18n_.__)('Vertical Offset', 'blocksy'),\n type: 'ct-slider',\n value: option.value.v_offset,\n min: -100,\n max: 100,\n design: 'compact',\n ref: vOffsetRef // skipInput: true\n\n },\n hasRevertButton: false,\n onChange: newValue => onChange(_objectSpread(_objectSpread({}, value), {}, {\n v_offset: newValue\n }))\n }), (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value.blur,\n values: value,\n id: \"blur\",\n option: {\n steps: 'positive',\n id: 'blur',\n label: (0,external_window_wp_i18n_.__)('Blur', 'blocksy'),\n type: 'ct-slider',\n value: option.value.blur,\n min: 0,\n max: 100,\n design: 'compact',\n ref: blurRef // skipInput: true\n\n },\n hasRevertButton: false,\n onChange: newValue => {\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n blur: newValue\n }));\n }\n }), (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value.spread,\n values: value,\n id: \"spread\",\n option: {\n steps: 'half',\n id: 'spread',\n label: (0,external_window_wp_i18n_.__)('Spread', 'blocksy'),\n type: 'ct-slider',\n value: option.value.spread,\n min: -100,\n max: 100,\n design: 'compact',\n ref: spreadRef // skipInput: true\n\n },\n hasRevertButton: false,\n onChange: newValue => onChange(_objectSpread(_objectSpread({}, value), {}, {\n spread: newValue\n }))\n })), !option.hide_shadow_placement && (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-shadow-style\"\n }, (0,external_window_wp_element_.createElement)(\"li\", {\n onClick: () => onChange(_objectSpread(_objectSpread({}, value), {}, {\n inset: false\n })),\n className: classnames_default()({\n active: !value.inset\n })\n }, (0,external_window_wp_i18n_.__)('Outline', 'blocksy')), (0,external_window_wp_element_.createElement)(\"li\", {\n onClick: () => onChange(_objectSpread(_objectSpread({}, value), {}, {\n inset: true\n })),\n className: classnames_default()({\n active: value.inset\n })\n }, (0,external_window_wp_i18n_.__)('Inset', 'blocksy')))))), document.body);\n};\n\n/* harmony default export */ const box_shadow_modal = (BoxShadowModal);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-box-shadow.js\nfunction ct_box_shadow_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction ct_box_shadow_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ct_box_shadow_ownKeys(Object(source), !0).forEach(function (key) { ct_box_shadow_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ct_box_shadow_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction ct_box_shadow_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\nconst clamp = (min, max, value) => Math.max(min, Math.min(max, value));\n\nconst BoxShadow = _ref => {\n let {\n value,\n option,\n onChange\n } = _ref;\n const [{\n isPicking,\n isTransitioning\n }, setAnimationState] = (0,external_window_wp_element_.useState)({\n isPicking: null,\n isTransitioning: null\n });\n const [focusedComponent, setFocusedComponent] = (0,external_window_wp_element_.useState)(null);\n const el = (0,external_window_wp_element_.useRef)();\n const colorPicker = (0,external_window_wp_element_.useRef)();\n const hOffsetRef = (0,external_window_wp_element_.useRef)();\n const vOffsetRef = (0,external_window_wp_element_.useRef)();\n const blurRef = (0,external_window_wp_element_.useRef)();\n const spreadRef = (0,external_window_wp_element_.useRef)();\n const containerRef = (0,external_window_wp_element_.useRef)();\n const modalRef = (0,external_window_wp_element_.useRef)();\n return (0,external_window_wp_element_.createElement)(\"div\", {\n ref: el,\n className: classnames_default()('ct-box-shadow', {\n 'ct-disabled': !value.enable || value.inherit\n })\n }, (0,external_window_wp_element_.createElement)(single_picker/* default */.Z, {\n innerRef: colorPicker,\n picker: {\n id: 'default',\n title: 'Initial'\n },\n option: {\n pickers: [{\n id: 'default',\n title: 'Initial'\n }]\n },\n isPicking: isPicking,\n isTransitioning: isTransitioning,\n modalRef: modalRef,\n containerRef: containerRef,\n onPickingChange: isPicking => {\n if (!value.enable) {\n return;\n }\n\n setAnimationState({\n isTransitioning: 'default',\n isPicking\n });\n },\n stopTransitioning: () => setAnimationState({\n isPicking,\n isTransitioning: false\n }),\n onChange: colorValue => onChange(ct_box_shadow_objectSpread(ct_box_shadow_objectSpread({}, value), {}, {\n color: colorValue\n })),\n value: value.color\n }), (0,external_window_wp_element_.createElement)(react_outside_click_handler[\"default\"], {\n useCapture: false,\n disabled: !isPicking,\n className: \"ct-box-shadow-values\",\n additionalRefs: [colorPicker, modalRef],\n onOutsideClick: () => {\n if (!isPicking) {\n return;\n }\n\n setAnimationState({\n isTransitioning: isPicking.split(':')[0],\n isPicking: null\n });\n },\n wrapperProps: {\n ref: containerRef,\n onClick: e => {\n e.preventDefault();\n let futureIsPicking = isPicking ? isPicking.split(':')[0] === 'opts' ? null : `opts:${isPicking.split(':')[0]}` : 'opts';\n setAnimationState({\n isTransitioning: 'opts',\n isPicking: futureIsPicking\n });\n }\n }\n }, (0,external_window_wp_element_.createElement)(\"span\", null, value.inherit ? (0,external_window_wp_i18n_.__)('Inherit', 'blocksy') : value.enable ? (0,external_window_wp_i18n_.__)('Adjust', 'blocksy') : (0,external_window_wp_i18n_.__)('None', 'blocksy'))), (0,external_window_wp_element_.createElement)(box_shadow_modal, {\n el: el,\n value: value,\n onChange: value => onChange(ct_box_shadow_objectSpread(ct_box_shadow_objectSpread({}, value), {}, {\n inherit: false\n })),\n option: option,\n isPicking: isPicking,\n isTransitioning: isTransitioning,\n hOffsetRef: hOffsetRef,\n vOffsetRef: vOffsetRef,\n blurRef: blurRef,\n spreadRef: spreadRef,\n picker: {\n id: 'opts'\n },\n onPickingChange: isPicking => {\n if (!value.enable) {\n return;\n }\n\n setAnimationState({\n isTransitioning: 'opts',\n isPicking\n });\n },\n stopTransitioning: () => setAnimationState({\n isPicking,\n isTransitioning: false\n })\n }));\n};\n\n/* harmony default export */ const ct_box_shadow = (BoxShadow);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTc5NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvYm94LXNoYWRvdy9ib3gtc2hhZG93LW1vZGFsLmpzP2ZmNGIiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LWJveC1zaGFkb3cuanM/OGY0MiJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgY3JlYXRlUG9ydGFsIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IFRyYW5zaXRpb24gfSBmcm9tICdyZWFjdC1zcHJpbmcvcmVuZGVycHJvcHMnO1xuaW1wb3J0IGJlemllckVhc2luZyBmcm9tICdiZXppZXItZWFzaW5nJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEdlbmVyaWNPcHRpb25UeXBlIGZyb20gJy4uLy4uL0dlbmVyaWNPcHRpb25UeXBlJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgU3dpdGNoIGZyb20gJy4uL2N0LXN3aXRjaCc7XG5pbXBvcnQgdXNlUG9wb3Zlck1ha2VyIGZyb20gJy4uLy4uL2hlbHBlcnMvdXNlUG9wb3Zlck1ha2VyJztcblxuY29uc3QgQm94U2hhZG93TW9kYWwgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gICAgcGlja2VyLFxuICAgIG9uUGlja2luZ0NoYW5nZSxcbiAgICBzdG9wVHJhbnNpdGlvbmluZyxcbiAgICBlbCxcbiAgICBoT2Zmc2V0UmVmLFxuICAgIHZPZmZzZXRSZWYsXG4gICAgYmx1clJlZixcbiAgICBzcHJlYWRSZWYsXG4gICAgaXNUcmFuc2l0aW9uaW5nLFxuICAgIGlzUGlja2luZ1xuICB9ID0gX3JlZjtcbiAgY29uc3Qge1xuICAgIHN0eWxlcyxcbiAgICBwb3BvdmVyUHJvcHNcbiAgfSA9IHVzZVBvcG92ZXJNYWtlcih7XG4gICAgcmVmOiBlbCxcbiAgICBkZWZhdWx0SGVpZ2h0OiAhb3B0aW9uLmhpZGVfc2hhZG93X3BsYWNlbWVudCA/IDUwNyA6IDQzNyxcbiAgICBzaG91bGRDYWxjdWxhdGU6IGlzVHJhbnNpdGlvbmluZyA9PT0gcGlja2VyLmlkIHx8IChpc1BpY2tpbmcgfHwgJycpLnNwbGl0KCc6JylbMF0gPT09IHBpY2tlci5pZFxuICB9KTtcbiAgcmV0dXJuIChpc1RyYW5zaXRpb25pbmcgPT09IHBpY2tlci5pZCB8fCAoaXNQaWNraW5nIHx8ICcnKS5zcGxpdCgnOicpWzBdID09PSBwaWNrZXIuaWQpICYmIGNyZWF0ZVBvcnRhbChjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHtcbiAgICBpdGVtczogaXNQaWNraW5nLFxuICAgIG9uUmVzdDogaXNPcGVuID0+IHtcbiAgICAgIHN0b3BUcmFuc2l0aW9uaW5nKCk7XG4gICAgfSxcbiAgICBjb25maWc6IHtcbiAgICAgIGR1cmF0aW9uOiAxMDAsXG4gICAgICBlYXNpbmc6IGJlemllckVhc2luZygwLjI1LCAwLjEsIDAuMjUsIDEuMClcbiAgICB9LFxuICAgIGZyb206IChpc1BpY2tpbmcgfHwgJycpLmluZGV4T2YoJzonKSA9PT0gLTEgPyB7XG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDAuOTUsIDAuOTUsIDEpJyxcbiAgICAgIG9wYWNpdHk6IDBcbiAgICB9IDoge1xuICAgICAgb3BhY2l0eTogMVxuICAgIH0sXG4gICAgZW50ZXI6IChpc1BpY2tpbmcgfHwgJycpLmluZGV4T2YoJzonKSA9PT0gLTEgPyB7XG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDEsIDEsIDEpJyxcbiAgICAgIG9wYWNpdHk6IDFcbiAgICB9IDoge1xuICAgICAgb3BhY2l0eTogMVxuICAgIH0sXG4gICAgbGVhdmU6IChpc1BpY2tpbmcgfHwgJycpLmluZGV4T2YoJzonKSA9PT0gLTEgPyB7XG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDAuOTUsIDAuOTUsIDEpJyxcbiAgICAgIG9wYWNpdHk6IDBcbiAgICB9IDoge1xuICAgICAgb3BhY2l0eTogMVxuICAgIH1cbiAgfSwgaXNQaWNraW5nID0+IChpc1BpY2tpbmcgfHwgJycpLnNwbGl0KCc6JylbMF0gPT09IHBpY2tlci5pZCAmJiAocHJvcHMgPT4gY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCBzdHlsZXMpXG4gIH0sIHBvcG92ZXJQcm9wcywge1xuICAgIGNsYXNzTmFtZTogXCJjdC1vcHRpb24tbW9kYWwgY3QtYm94LXNoYWRvdy1tb2RhbFwiLFxuICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LFxuICAgIG9uTW91c2VEb3duQ2FwdHVyZTogZSA9PiB7XG4gICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgZS5uYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LFxuICAgIG9uTW91c2VVcENhcHR1cmU6IGUgPT4ge1xuICAgICAgZS5uYXRpdmVFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGUubmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9KSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXNoYWRvdy10cmlnZ2VyXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIG51bGwsIF9fKCdFbmFibGUvRGlzYWJsZScsICdibG9ja3N5JykpLCBjcmVhdGVFbGVtZW50KFN3aXRjaCwge1xuICAgIHZhbHVlOiB2YWx1ZS5lbmFibGUgPyAneWVzJyA6ICdubycsXG4gICAgb25DaGFuZ2U6ICgpID0+IHtcbiAgICAgIG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgICBlbmFibGU6ICF2YWx1ZS5lbmFibGVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcInNoYWRvdy1zbGlkZXJzXCJcbiAgfSwgY3JlYXRlRWxlbWVudChHZW5lcmljT3B0aW9uVHlwZSwge1xuICAgIHZhbHVlOiB2YWx1ZS5oX29mZnNldCxcbiAgICB2YWx1ZXM6IHZhbHVlLFxuICAgIGlkOiBcImhfb2Zmc2V0XCIsXG4gICAgb3B0aW9uOiB7XG4gICAgICBpZDogJ2hfb2Zmc2V0JyxcbiAgICAgIGxhYmVsOiBfXygnSG9yaXpvbnRhbCBPZmZzZXQnLCAnYmxvY2tzeScpLFxuICAgICAgdHlwZTogJ2N0LXNsaWRlcicsXG4gICAgICBzdGVwczogJ2hhbGYnLFxuICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZS5oX29mZnNldCxcbiAgICAgIG1pbjogLTEwMCxcbiAgICAgIG1heDogMTAwLFxuICAgICAgZGVzaWduOiAnY29tcGFjdCcsXG4gICAgICByZWY6IGhPZmZzZXRSZWYgLy8gc2tpcElucHV0OiB0cnVlXG5cbiAgICB9LFxuICAgIGhhc1JldmVydEJ1dHRvbjogZmFsc2UsXG4gICAgb25DaGFuZ2U6IG5ld1ZhbHVlID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgaF9vZmZzZXQ6IG5ld1ZhbHVlXG4gICAgfSkpXG4gIH0pLCBjcmVhdGVFbGVtZW50KEdlbmVyaWNPcHRpb25UeXBlLCB7XG4gICAgdmFsdWU6IHZhbHVlLnZfb2Zmc2V0LFxuICAgIHZhbHVlczogdmFsdWUsXG4gICAgaWQ6IFwidl9vZmZzZXRcIixcbiAgICBvcHRpb246IHtcbiAgICAgIHN0ZXBzOiAnaGFsZicsXG4gICAgICBpZDogJ3Zfb2Zmc2V0JyxcbiAgICAgIGxhYmVsOiBfXygnVmVydGljYWwgT2Zmc2V0JywgJ2Jsb2Nrc3knKSxcbiAgICAgIHR5cGU6ICdjdC1zbGlkZXInLFxuICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZS52X29mZnNldCxcbiAgICAgIG1pbjogLTEwMCxcbiAgICAgIG1heDogMTAwLFxuICAgICAgZGVzaWduOiAnY29tcGFjdCcsXG4gICAgICByZWY6IHZPZmZzZXRSZWYgLy8gc2tpcElucHV0OiB0cnVlXG5cbiAgICB9LFxuICAgIGhhc1JldmVydEJ1dHRvbjogZmFsc2UsXG4gICAgb25DaGFuZ2U6IG5ld1ZhbHVlID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgdl9vZmZzZXQ6IG5ld1ZhbHVlXG4gICAgfSkpXG4gIH0pLCBjcmVhdGVFbGVtZW50KEdlbmVyaWNPcHRpb25UeXBlLCB7XG4gICAgdmFsdWU6IHZhbHVlLmJsdXIsXG4gICAgdmFsdWVzOiB2YWx1ZSxcbiAgICBpZDogXCJibHVyXCIsXG4gICAgb3B0aW9uOiB7XG4gICAgICBzdGVwczogJ3Bvc2l0aXZlJyxcbiAgICAgIGlkOiAnYmx1cicsXG4gICAgICBsYWJlbDogX18oJ0JsdXInLCAnYmxvY2tzeScpLFxuICAgICAgdHlwZTogJ2N0LXNsaWRlcicsXG4gICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLmJsdXIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIGRlc2lnbjogJ2NvbXBhY3QnLFxuICAgICAgcmVmOiBibHVyUmVmIC8vIHNraXBJbnB1dDogdHJ1ZVxuXG4gICAgfSxcbiAgICBoYXNSZXZlcnRCdXR0b246IGZhbHNlLFxuICAgIG9uQ2hhbmdlOiBuZXdWYWx1ZSA9PiB7XG4gICAgICBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgYmx1cjogbmV3VmFsdWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pLCBjcmVhdGVFbGVtZW50KEdlbmVyaWNPcHRpb25UeXBlLCB7XG4gICAgdmFsdWU6IHZhbHVlLnNwcmVhZCxcbiAgICB2YWx1ZXM6IHZhbHVlLFxuICAgIGlkOiBcInNwcmVhZFwiLFxuICAgIG9wdGlvbjoge1xuICAgICAgc3RlcHM6ICdoYWxmJyxcbiAgICAgIGlkOiAnc3ByZWFkJyxcbiAgICAgIGxhYmVsOiBfXygnU3ByZWFkJywgJ2Jsb2Nrc3knKSxcbiAgICAgIHR5cGU6ICdjdC1zbGlkZXInLFxuICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZS5zcHJlYWQsXG4gICAgICBtaW46IC0xMDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIGRlc2lnbjogJ2NvbXBhY3QnLFxuICAgICAgcmVmOiBzcHJlYWRSZWYgLy8gc2tpcElucHV0OiB0cnVlXG5cbiAgICB9LFxuICAgIGhhc1JldmVydEJ1dHRvbjogZmFsc2UsXG4gICAgb25DaGFuZ2U6IG5ld1ZhbHVlID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgc3ByZWFkOiBuZXdWYWx1ZVxuICAgIH0pKVxuICB9KSksICFvcHRpb24uaGlkZV9zaGFkb3dfcGxhY2VtZW50ICYmIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXNoYWRvdy1zdHlsZVwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgb25DbGljazogKCkgPT4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICBpbnNldDogZmFsc2VcbiAgICB9KSksXG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKHtcbiAgICAgIGFjdGl2ZTogIXZhbHVlLmluc2V0XG4gICAgfSlcbiAgfSwgX18oJ091dGxpbmUnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgIGluc2V0OiB0cnVlXG4gICAgfSkpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBhY3RpdmU6IHZhbHVlLmluc2V0XG4gICAgfSlcbiAgfSwgX18oJ0luc2V0JywgJ2Jsb2Nrc3knKSkpKSkpLCBkb2N1bWVudC5ib2R5KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJveFNoYWRvd01vZGFsOyIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHVzZVN0YXRlLCB1c2VSZWYsIHVzZUNvbnRleHQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IE91dHNpZGVDbGlja0hhbmRsZXIgZnJvbSAnLi9yZWFjdC1vdXRzaWRlLWNsaWNrLWhhbmRsZXInO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgU2luZ2xlQ29sb3JQaWNrZXIgZnJvbSAnLi9jb2xvci1waWNrZXIvc2luZ2xlLXBpY2tlcic7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IEJveFNoYWRvd01vZGFsIGZyb20gJy4vYm94LXNoYWRvdy9ib3gtc2hhZG93LW1vZGFsJztcblxuY29uc3QgY2xhbXAgPSAobWluLCBtYXgsIHZhbHVlKSA9PiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcblxuY29uc3QgQm94U2hhZG93ID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgb3B0aW9uLFxuICAgIG9uQ2hhbmdlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBbe1xuICAgIGlzUGlja2luZyxcbiAgICBpc1RyYW5zaXRpb25pbmdcbiAgfSwgc2V0QW5pbWF0aW9uU3RhdGVdID0gdXNlU3RhdGUoe1xuICAgIGlzUGlja2luZzogbnVsbCxcbiAgICBpc1RyYW5zaXRpb25pbmc6IG51bGxcbiAgfSk7XG4gIGNvbnN0IFtmb2N1c2VkQ29tcG9uZW50LCBzZXRGb2N1c2VkQ29tcG9uZW50XSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBlbCA9IHVzZVJlZigpO1xuICBjb25zdCBjb2xvclBpY2tlciA9IHVzZVJlZigpO1xuICBjb25zdCBoT2Zmc2V0UmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IHZPZmZzZXRSZWYgPSB1c2VSZWYoKTtcbiAgY29uc3QgYmx1clJlZiA9IHVzZVJlZigpO1xuICBjb25zdCBzcHJlYWRSZWYgPSB1c2VSZWYoKTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IG1vZGFsUmVmID0gdXNlUmVmKCk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGVsLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3QtYm94LXNoYWRvdycsIHtcbiAgICAgICdjdC1kaXNhYmxlZCc6ICF2YWx1ZS5lbmFibGUgfHwgdmFsdWUuaW5oZXJpdFxuICAgIH0pXG4gIH0sIGNyZWF0ZUVsZW1lbnQoU2luZ2xlQ29sb3JQaWNrZXIsIHtcbiAgICBpbm5lclJlZjogY29sb3JQaWNrZXIsXG4gICAgcGlja2VyOiB7XG4gICAgICBpZDogJ2RlZmF1bHQnLFxuICAgICAgdGl0bGU6ICdJbml0aWFsJ1xuICAgIH0sXG4gICAgb3B0aW9uOiB7XG4gICAgICBwaWNrZXJzOiBbe1xuICAgICAgICBpZDogJ2RlZmF1bHQnLFxuICAgICAgICB0aXRsZTogJ0luaXRpYWwnXG4gICAgICB9XVxuICAgIH0sXG4gICAgaXNQaWNraW5nOiBpc1BpY2tpbmcsXG4gICAgaXNUcmFuc2l0aW9uaW5nOiBpc1RyYW5zaXRpb25pbmcsXG4gICAgbW9kYWxSZWY6IG1vZGFsUmVmLFxuICAgIGNvbnRhaW5lclJlZjogY29udGFpbmVyUmVmLFxuICAgIG9uUGlja2luZ0NoYW5nZTogaXNQaWNraW5nID0+IHtcbiAgICAgIGlmICghdmFsdWUuZW5hYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0QW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICBpc1RyYW5zaXRpb25pbmc6ICdkZWZhdWx0JyxcbiAgICAgICAgaXNQaWNraW5nXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHN0b3BUcmFuc2l0aW9uaW5nOiAoKSA9PiBzZXRBbmltYXRpb25TdGF0ZSh7XG4gICAgICBpc1BpY2tpbmcsXG4gICAgICBpc1RyYW5zaXRpb25pbmc6IGZhbHNlXG4gICAgfSksXG4gICAgb25DaGFuZ2U6IGNvbG9yVmFsdWUgPT4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICBjb2xvcjogY29sb3JWYWx1ZVxuICAgIH0pKSxcbiAgICB2YWx1ZTogdmFsdWUuY29sb3JcbiAgfSksIGNyZWF0ZUVsZW1lbnQoT3V0c2lkZUNsaWNrSGFuZGxlciwge1xuICAgIHVzZUNhcHR1cmU6IGZhbHNlLFxuICAgIGRpc2FibGVkOiAhaXNQaWNraW5nLFxuICAgIGNsYXNzTmFtZTogXCJjdC1ib3gtc2hhZG93LXZhbHVlc1wiLFxuICAgIGFkZGl0aW9uYWxSZWZzOiBbY29sb3JQaWNrZXIsIG1vZGFsUmVmXSxcbiAgICBvbk91dHNpZGVDbGljazogKCkgPT4ge1xuICAgICAgaWYgKCFpc1BpY2tpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgIGlzVHJhbnNpdGlvbmluZzogaXNQaWNraW5nLnNwbGl0KCc6JylbMF0sXG4gICAgICAgIGlzUGlja2luZzogbnVsbFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB3cmFwcGVyUHJvcHM6IHtcbiAgICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgICAgb25DbGljazogZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGZ1dHVyZUlzUGlja2luZyA9IGlzUGlja2luZyA/IGlzUGlja2luZy5zcGxpdCgnOicpWzBdID09PSAnb3B0cycgPyBudWxsIDogYG9wdHM6JHtpc1BpY2tpbmcuc3BsaXQoJzonKVswXX1gIDogJ29wdHMnO1xuICAgICAgICBzZXRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiAnb3B0cycsXG4gICAgICAgICAgaXNQaWNraW5nOiBmdXR1cmVJc1BpY2tpbmdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCB2YWx1ZS5pbmhlcml0ID8gX18oJ0luaGVyaXQnLCAnYmxvY2tzeScpIDogdmFsdWUuZW5hYmxlID8gX18oJ0FkanVzdCcsICdibG9ja3N5JykgOiBfXygnTm9uZScsICdibG9ja3N5JykpKSwgY3JlYXRlRWxlbWVudChCb3hTaGFkb3dNb2RhbCwge1xuICAgIGVsOiBlbCxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgb25DaGFuZ2U6IHZhbHVlID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgaW5oZXJpdDogZmFsc2VcbiAgICB9KSksXG4gICAgb3B0aW9uOiBvcHRpb24sXG4gICAgaXNQaWNraW5nOiBpc1BpY2tpbmcsXG4gICAgaXNUcmFuc2l0aW9uaW5nOiBpc1RyYW5zaXRpb25pbmcsXG4gICAgaE9mZnNldFJlZjogaE9mZnNldFJlZixcbiAgICB2T2Zmc2V0UmVmOiB2T2Zmc2V0UmVmLFxuICAgIGJsdXJSZWY6IGJsdXJSZWYsXG4gICAgc3ByZWFkUmVmOiBzcHJlYWRSZWYsXG4gICAgcGlja2VyOiB7XG4gICAgICBpZDogJ29wdHMnXG4gICAgfSxcbiAgICBvblBpY2tpbmdDaGFuZ2U6IGlzUGlja2luZyA9PiB7XG4gICAgICBpZiAoIXZhbHVlLmVuYWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiAnb3B0cycsXG4gICAgICAgIGlzUGlja2luZ1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBzdG9wVHJhbnNpdGlvbmluZzogKCkgPT4gc2V0QW5pbWF0aW9uU3RhdGUoe1xuICAgICAgaXNQaWNraW5nLFxuICAgICAgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZVxuICAgIH0pXG4gIH0pKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJveFNoYWRvdzsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9795\n")},9838:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nconst Button = _ref => {\n let {\n option: {\n text = \'\',\n attr = {},\n panel,\n url\n }\n } = _ref;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("a", _extends({}, _objectSpread({}, attr || {}), {\n href: url,\n target: "_blank",\n onClick: e => {\n return;\n e.preventDefault();\n\n if (panel && wp.customize && wp.customize.panel(panel)) {\n wp.customize.panel(panel).expand();\n return;\n }\n\n url && location.assign(url);\n }\n }), text);\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Button);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTgzOC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1idXR0b24uanM/MTg4ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgRnJhZ21lbnQsIGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5cbmNvbnN0IEJ1dHRvbiA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbjoge1xuICAgICAgdGV4dCA9ICcnLFxuICAgICAgYXR0ciA9IHt9LFxuICAgICAgcGFuZWwsXG4gICAgICB1cmxcbiAgICB9XG4gIH0gPSBfcmVmO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImFcIiwgX2V4dGVuZHMoe30sIF9vYmplY3RTcHJlYWQoe30sIGF0dHIgfHwge30pLCB7XG4gICAgaHJlZjogdXJsLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKHBhbmVsICYmIHdwLmN1c3RvbWl6ZSAmJiB3cC5jdXN0b21pemUucGFuZWwocGFuZWwpKSB7XG4gICAgICAgIHdwLmN1c3RvbWl6ZS5wYW5lbChwYW5lbCkuZXhwYW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdXJsICYmIGxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgIH1cbiAgfSksIHRleHQpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQnV0dG9uOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9838\n')},3413:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _helpers_parse_choices_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4592);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6715);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(underscore__WEBPACK_IMPORTED_MODULE_2__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nconst Checkboxes = _ref => {\n let {\n option,\n value,\n onChange,\n option: {\n view = \'checkboxes\'\n }\n } = _ref;\n const orderedChoices = (0,_helpers_parse_choices_js__WEBPACK_IMPORTED_MODULE_3__/* .maybeTransformUnorderedChoices */ .N)(option.choices);\n const {\n inline = false\n } = option;\n\n if (view === \'checkboxes\') {\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n className: "ct-option-checkbox"\n }, inline ? {\n [\'data-inline\']: \'\'\n } : {}, option.attr || {}), orderedChoices.map(_ref2 => {\n let {\n key,\n value: choiceValue\n } = _ref2;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("label", {\n key: key\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("input", {\n type: "checkbox",\n checked: typeof value[key] === \'boolean\' ? value[key] : value[key] === \'true\',\n "data-id": key,\n onChange: _ref3 => {\n let {\n target: {\n checked\n }\n } = _ref3;\n return onChange(_objectSpread(_objectSpread({}, value), {}, {\n [key]: value[key] ? Object.values(value).filter(v => v).length === 1 && !option.allow_empty ? true : false : true\n }));\n }\n }), choiceValue);\n }));\n }\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", _extends({\n className: "ct-option-checkbox ct-buttons-group"\n }, inline ? {\n [\'data-inline\']: \'\'\n } : {}, option.attr || {}), orderedChoices.map(_ref4 => {\n let {\n key,\n value: choiceValue\n } = _ref4;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()({\n active: typeof value[key] === \'boolean\' ? value[key] : value[key] === \'true\'\n }),\n "data-id": key,\n key: key,\n onClick: _ref5 => {\n let {\n target: {\n checked\n }\n } = _ref5;\n return onChange(_objectSpread(_objectSpread({}, value), {}, {\n [key]: value[key] ? Object.values(value).filter(v => v).length === 1 && !option.allow_empty ? true : false : true\n }));\n }\n }, choiceValue);\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Checkboxes);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQxMy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1jaGVja2JveGVzLmpzP2NlYzgiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgY3JlYXRlQ29udGV4dCwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgbWF5YmVUcmFuc2Zvcm1Vbm9yZGVyZWRDaG9pY2VzIH0gZnJvbSAnLi4vaGVscGVycy9wYXJzZS1jaG9pY2VzLmpzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IF8gZnJvbSAndW5kZXJzY29yZSc7XG5cbmNvbnN0IENoZWNrYm94ZXMgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gICAgb3B0aW9uOiB7XG4gICAgICB2aWV3ID0gJ2NoZWNrYm94ZXMnXG4gICAgfVxuICB9ID0gX3JlZjtcbiAgY29uc3Qgb3JkZXJlZENob2ljZXMgPSBtYXliZVRyYW5zZm9ybVVub3JkZXJlZENob2ljZXMob3B0aW9uLmNob2ljZXMpO1xuICBjb25zdCB7XG4gICAgaW5saW5lID0gZmFsc2VcbiAgfSA9IG9wdGlvbjtcblxuICBpZiAodmlldyA9PT0gJ2NoZWNrYm94ZXMnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBcImN0LW9wdGlvbi1jaGVja2JveFwiXG4gICAgfSwgaW5saW5lID8ge1xuICAgICAgWydkYXRhLWlubGluZSddOiAnJ1xuICAgIH0gOiB7fSwgb3B0aW9uLmF0dHIgfHwge30pLCBvcmRlcmVkQ2hvaWNlcy5tYXAoX3JlZjIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogY2hvaWNlVmFsdWVcbiAgICAgIH0gPSBfcmVmMjtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwibGFiZWxcIiwge1xuICAgICAgICBrZXk6IGtleVxuICAgICAgfSwgY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICBjaGVja2VkOiB0eXBlb2YgdmFsdWVba2V5XSA9PT0gJ2Jvb2xlYW4nID8gdmFsdWVba2V5XSA6IHZhbHVlW2tleV0gPT09ICd0cnVlJyxcbiAgICAgICAgXCJkYXRhLWlkXCI6IGtleSxcbiAgICAgICAgb25DaGFuZ2U6IF9yZWYzID0+IHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9ID0gX3JlZjM7XG4gICAgICAgICAgcmV0dXJuIG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgICAgICAgW2tleV06IHZhbHVlW2tleV0gPyBPYmplY3QudmFsdWVzKHZhbHVlKS5maWx0ZXIodiA9PiB2KS5sZW5ndGggPT09IDEgJiYgIW9wdGlvbi5hbGxvd19lbXB0eSA/IHRydWUgOiBmYWxzZSA6IHRydWVcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pLCBjaG9pY2VWYWx1ZSk7XG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBcImN0LW9wdGlvbi1jaGVja2JveCBjdC1idXR0b25zLWdyb3VwXCJcbiAgfSwgaW5saW5lID8ge1xuICAgIFsnZGF0YS1pbmxpbmUnXTogJydcbiAgfSA6IHt9LCBvcHRpb24uYXR0ciB8fCB7fSksIG9yZGVyZWRDaG9pY2VzLm1hcChfcmVmNCA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlOiBjaG9pY2VWYWx1ZVxuICAgIH0gPSBfcmVmNDtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICAgIGFjdGl2ZTogdHlwZW9mIHZhbHVlW2tleV0gPT09ICdib29sZWFuJyA/IHZhbHVlW2tleV0gOiB2YWx1ZVtrZXldID09PSAndHJ1ZSdcbiAgICAgIH0pLFxuICAgICAgXCJkYXRhLWlkXCI6IGtleSxcbiAgICAgIGtleToga2V5LFxuICAgICAgb25DbGljazogX3JlZjUgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgY2hlY2tlZFxuICAgICAgICAgIH1cbiAgICAgICAgfSA9IF9yZWY1O1xuICAgICAgICByZXR1cm4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICAgICAgW2tleV06IHZhbHVlW2tleV0gPyBPYmplY3QudmFsdWVzKHZhbHVlKS5maWx0ZXIodiA9PiB2KS5sZW5ndGggPT09IDEgJiYgIW9wdGlvbi5hbGxvd19lbXB0eSA/IHRydWUgOiBmYWxzZSA6IHRydWVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0sIGNob2ljZVZhbHVlKTtcbiAgfSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3hlczsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3413\n')},2757:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ ct_color_palettes_picker)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./static/js/options/OptionsPanel.js + 7 modules\nvar OptionsPanel = __webpack_require__(7429);\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n;// CONCATENATED MODULE: ./static/js/options/options/color-palettes/PalettePreview.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nconst PalettePreview = _ref => {\n let {\n renderBefore = () => null,\n value,\n onChange,\n onClick,\n currentPalette = null,\n className\n } = _ref;\n\n if (!currentPalette) {\n currentPalette = value;\n\n if (value.palettes) {\n currentPalette = value.palettes.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id === value.current_palette;\n });\n }\n }\n\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()('ct-single-palette', className),\n onClick: e => {\n if (e.target.closest('.ct-color-picker-modal') || e.target.classList.contains('ct-color-picker-modal')) {\n return;\n }\n\n onClick();\n }\n }, renderBefore(), (0,external_window_wp_element_.createElement)(OptionsPanel/* default */.Z, {\n hasRevertButton: false,\n onChange: (optionId, optionValue) => {\n if (optionId !== 'color') {\n return;\n }\n\n onChange(optionId, Object.keys(optionValue).reduce((finalValue, currentId) => _objectSpread(_objectSpread({}, finalValue), currentId.indexOf('color') === 0 ? {\n [currentId]: optionValue[currentId]\n } : {}), {}));\n },\n value: {\n color: currentPalette\n },\n options: {\n color: _objectSpread(_objectSpread({\n type: 'ct-color-picker',\n predefined: true,\n design: 'none',\n label: false,\n modalClassName: 'ct-color-palette-modal',\n value: currentPalette\n }, onChange ? {} : {\n skipModal: true\n }), {}, {\n pickers: Object.keys(currentPalette).filter(k => k.indexOf('color') === 0).map((key, index) => ({\n title: (0,external_window_wp_i18n_.sprintf)((0,external_window_wp_i18n_.__)('Color %s', 'blocksy'), index + 1),\n id: key\n }))\n })\n }\n }));\n};\n\n/* harmony default export */ const color_palettes_PalettePreview = (PalettePreview);\n// EXTERNAL MODULE: ./node_modules/@react-spring/web/dist/react-spring-web.esm.js\nvar react_spring_web_esm = __webpack_require__(1472);\n;// CONCATENATED MODULE: ./static/js/options/options/color-palettes/ColorPalettesModal.js\nconst _excluded = [\"id\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ColorPalettesModal_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction ColorPalettesModal_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ColorPalettesModal_ownKeys(Object(source), !0).forEach(function (key) { ColorPalettesModal_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ColorPalettesModal_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction ColorPalettesModal_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\nconst ColorPalettesModal = _ref => {\n let {\n option,\n value,\n onChange,\n wrapperProps = {}\n } = _ref;\n return (0,external_window_wp_element_.createElement)(react_spring_web_esm.animated.div, _extends({\n className: \"ct-option-modal ct-palettes-modal\"\n }, wrapperProps), value.palettes.map((palette, index) => (0,external_window_wp_element_.createElement)(color_palettes_PalettePreview, {\n currentPalette: palette,\n className: value.current_palette === palette.id ? 'ct-active' : '',\n renderBefore: () => (0,external_window_wp_element_.createElement)(\"label\", null, (0,external_window_wp_i18n_.sprintf)((0,external_window_wp_i18n_.__)('Palette #%s', 'blocksy'), index + 1)),\n onClick: () => {\n const {\n id\n } = palette,\n colors = _objectWithoutProperties(palette, _excluded);\n\n onChange(ColorPalettesModal_objectSpread(ColorPalettesModal_objectSpread({}, value), {}, {\n current_palette: id\n }, colors));\n }\n })));\n};\n\n/* harmony default export */ const color_palettes_ColorPalettesModal = (ColorPalettesModal);\n// EXTERNAL MODULE: ./static/js/options/helpers/usePopoverMaker.js\nvar usePopoverMaker = __webpack_require__(9144);\n// EXTERNAL MODULE: ./static/js/options/options/react-outside-click-handler.js\nvar react_outside_click_handler = __webpack_require__(8204);\n// EXTERNAL MODULE: ./node_modules/bezier-easing/src/index.js\nvar src = __webpack_require__(3431);\nvar src_default = /*#__PURE__*/__webpack_require__.n(src);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-color-palettes-picker.js\nfunction ct_color_palettes_picker_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction ct_color_palettes_picker_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ct_color_palettes_picker_ownKeys(Object(source), !0).forEach(function (key) { ct_color_palettes_picker_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ct_color_palettes_picker_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction ct_color_palettes_picker_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\n\nconst ColorPalettes = _ref => {\n let {\n option,\n value,\n onChange\n } = _ref;\n const colorPalettesWrapper = (0,external_window_wp_element_.useRef)();\n const [{\n isOpen,\n isTransitioning\n }, setModalState] = (0,external_window_wp_element_.useState)({\n isOpen: false,\n isTransitioning: false\n });\n const {\n styles,\n popoverProps\n } = (0,usePopoverMaker/* default */.Z)({\n ref: colorPalettesWrapper,\n defaultHeight: 430,\n shouldCalculate: isTransitioning || isOpen\n });\n\n const setIsOpen = isOpen => {\n setModalState(state => ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, state), {}, {\n isOpen,\n isTransitioning: true\n }));\n };\n\n const stopTransitioning = () => setModalState(state => ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, state), {}, {\n isTransitioning: false\n }));\n\n const properValue = ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, option.value), Object.keys(value).reduce((all, currentKey) => ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, all), value[currentKey] ? {\n [currentKey]: value[currentKey]\n } : {}), {})), option.value.palettes ? {\n palettes: option.value.palettes.map((p, index) => {\n let maybeCurrentlyInValue = value.palettes.find(_ref2 => {\n let {\n id\n } = _ref2;\n return p.id === id;\n });\n let maybeCurrentValue = {};\n\n if (p.id === value.current_palette) {\n Object.keys(p).map(maybeColor => {\n if (maybeColor.indexOf('color') === 0 && value[maybeColor]) {\n maybeCurrentValue[maybeColor] = value[maybeColor];\n }\n });\n }\n\n const result = ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, Object.keys(p).reduce((all, currentKey) => ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, all), p[currentKey] ? {\n [currentKey]: p[currentKey]\n } : {}), {})), Object.keys(maybeCurrentlyInValue || {}).reduce((all, currentKey) => ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, all), maybeCurrentlyInValue[currentKey] ? {\n [currentKey]: maybeCurrentlyInValue[currentKey]\n } : {}), {})), maybeCurrentValue);\n\n return result;\n })\n } : {});\n\n return (0,external_window_wp_element_.createElement)(\"div\", null, (0,external_window_wp_element_.createElement)(react_outside_click_handler[\"default\"], {\n disabled: !isOpen,\n useCapture: false,\n className: \"ct-palettes-preview\",\n additionalRefs: [popoverProps.ref],\n onOutsideClick: () => {\n setIsOpen(false);\n },\n wrapperProps: {\n ref: colorPalettesWrapper,\n onClick: e => {\n e.preventDefault();\n\n if (e.target.closest('.ct-color-picker-modal') || e.target.classList.contains('ct-color-picker-modal')) {\n return;\n }\n\n if (!properValue.palettes) {\n return;\n }\n\n setIsOpen(true);\n }\n }\n }, (0,external_window_wp_element_.createElement)(color_palettes_PalettePreview, {\n onClick: () => {\n if (!properValue.palettes) {\n return;\n }\n\n setIsOpen(true);\n },\n value: properValue,\n onChange: (optionId, optionValue) => {\n onChange(ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, properValue), optionValue), properValue.palettes ? {\n palettes: properValue.palettes.map(p => p.id === properValue.current_palette ? ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, p), optionValue) : p)\n } : {}));\n }\n })), (isTransitioning || isOpen) && (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(react_spring_web_esm.Transition, {\n items: isOpen,\n onRest: isOpen => {\n stopTransitioning();\n },\n config: {\n duration: 100,\n easing: src_default()(0.25, 0.1, 0.25, 1.0)\n },\n from: isOpen ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n },\n enter: isOpen ? {\n transform: 'scale3d(1, 1, 1)',\n opacity: 1\n } : {\n opacity: 1\n },\n leave: !isOpen ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n }\n }, (style, item) => {\n if (!item) {\n return null;\n }\n\n return (0,external_window_wp_element_.createElement)(color_palettes_ColorPalettesModal, {\n wrapperProps: ct_color_palettes_picker_objectSpread({\n style: ct_color_palettes_picker_objectSpread(ct_color_palettes_picker_objectSpread({}, style), styles)\n }, popoverProps),\n onChange: value => {\n setIsOpen(false);\n onChange(value);\n },\n value: properValue,\n option: option\n });\n }), document.body));\n};\n\n/* harmony default export */ const ct_color_palettes_picker = (ColorPalettes);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc1Ny5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2NvbG9yLXBhbGV0dGVzL1BhbGV0dGVQcmV2aWV3LmpzPzgzYzgiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2NvbG9yLXBhbGV0dGVzL0NvbG9yUGFsZXR0ZXNNb2RhbC5qcz8wMzVjIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1jb2xvci1wYWxldHRlcy1waWNrZXIuanM/ZWNkZiJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCB1c2VSZWYsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vLi4vT3B0aW9uc1BhbmVsJztcbmltcG9ydCB7IF9fLCBzcHJpbnRmIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuY29uc3QgUGFsZXR0ZVByZXZpZXcgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICByZW5kZXJCZWZvcmUgPSAoKSA9PiBudWxsLFxuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uQ2xpY2ssXG4gICAgY3VycmVudFBhbGV0dGUgPSBudWxsLFxuICAgIGNsYXNzTmFtZVxuICB9ID0gX3JlZjtcblxuICBpZiAoIWN1cnJlbnRQYWxldHRlKSB7XG4gICAgY3VycmVudFBhbGV0dGUgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZS5wYWxldHRlcykge1xuICAgICAgY3VycmVudFBhbGV0dGUgPSB2YWx1ZS5wYWxldHRlcy5maW5kKF9yZWYyID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpZFxuICAgICAgICB9ID0gX3JlZjI7XG4gICAgICAgIHJldHVybiBpZCA9PT0gdmFsdWUuY3VycmVudF9wYWxldHRlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3Qtc2luZ2xlLXBhbGV0dGUnLCBjbGFzc05hbWUpLFxuICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoJy5jdC1jb2xvci1waWNrZXItbW9kYWwnKSB8fCBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2N0LWNvbG9yLXBpY2tlci1tb2RhbCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb25DbGljaygpO1xuICAgIH1cbiAgfSwgcmVuZGVyQmVmb3JlKCksIGNyZWF0ZUVsZW1lbnQoT3B0aW9uc1BhbmVsLCB7XG4gICAgaGFzUmV2ZXJ0QnV0dG9uOiBmYWxzZSxcbiAgICBvbkNoYW5nZTogKG9wdGlvbklkLCBvcHRpb25WYWx1ZSkgPT4ge1xuICAgICAgaWYgKG9wdGlvbklkICE9PSAnY29sb3InKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb25DaGFuZ2Uob3B0aW9uSWQsIE9iamVjdC5rZXlzKG9wdGlvblZhbHVlKS5yZWR1Y2UoKGZpbmFsVmFsdWUsIGN1cnJlbnRJZCkgPT4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmaW5hbFZhbHVlKSwgY3VycmVudElkLmluZGV4T2YoJ2NvbG9yJykgPT09IDAgPyB7XG4gICAgICAgIFtjdXJyZW50SWRdOiBvcHRpb25WYWx1ZVtjdXJyZW50SWRdXG4gICAgICB9IDoge30pLCB7fSkpO1xuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIGNvbG9yOiBjdXJyZW50UGFsZXR0ZVxuICAgIH0sXG4gICAgb3B0aW9uczoge1xuICAgICAgY29sb3I6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIHR5cGU6ICdjdC1jb2xvci1waWNrZXInLFxuICAgICAgICBwcmVkZWZpbmVkOiB0cnVlLFxuICAgICAgICBkZXNpZ246ICdub25lJyxcbiAgICAgICAgbGFiZWw6IGZhbHNlLFxuICAgICAgICBtb2RhbENsYXNzTmFtZTogJ2N0LWNvbG9yLXBhbGV0dGUtbW9kYWwnLFxuICAgICAgICB2YWx1ZTogY3VycmVudFBhbGV0dGVcbiAgICAgIH0sIG9uQ2hhbmdlID8ge30gOiB7XG4gICAgICAgIHNraXBNb2RhbDogdHJ1ZVxuICAgICAgfSksIHt9LCB7XG4gICAgICAgIHBpY2tlcnM6IE9iamVjdC5rZXlzKGN1cnJlbnRQYWxldHRlKS5maWx0ZXIoayA9PiBrLmluZGV4T2YoJ2NvbG9yJykgPT09IDApLm1hcCgoa2V5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICB0aXRsZTogc3ByaW50ZihfXygnQ29sb3IgJXMnLCAnYmxvY2tzeScpLCBpbmRleCArIDEpLFxuICAgICAgICAgIGlkOiBrZXlcbiAgICAgICAgfSkpXG4gICAgICB9KVxuICAgIH1cbiAgfSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFsZXR0ZVByZXZpZXc7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiaWRcIl07XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgX18sIHNwcmludGYgfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCB7IFRyYW5zaXRpb24sIGFuaW1hdGVkIH0gZnJvbSAnQHJlYWN0LXNwcmluZy93ZWInO1xuaW1wb3J0IFBhbGV0dGVQcmV2aWV3IGZyb20gJy4vUGFsZXR0ZVByZXZpZXcnO1xuXG5jb25zdCBDb2xvclBhbGV0dGVzTW9kYWwgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gICAgd3JhcHBlclByb3BzID0ge31cbiAgfSA9IF9yZWY7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KGFuaW1hdGVkLmRpdiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogXCJjdC1vcHRpb24tbW9kYWwgY3QtcGFsZXR0ZXMtbW9kYWxcIlxuICB9LCB3cmFwcGVyUHJvcHMpLCB2YWx1ZS5wYWxldHRlcy5tYXAoKHBhbGV0dGUsIGluZGV4KSA9PiBjcmVhdGVFbGVtZW50KFBhbGV0dGVQcmV2aWV3LCB7XG4gICAgY3VycmVudFBhbGV0dGU6IHBhbGV0dGUsXG4gICAgY2xhc3NOYW1lOiB2YWx1ZS5jdXJyZW50X3BhbGV0dGUgPT09IHBhbGV0dGUuaWQgPyAnY3QtYWN0aXZlJyA6ICcnLFxuICAgIHJlbmRlckJlZm9yZTogKCkgPT4gY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIG51bGwsIHNwcmludGYoX18oJ1BhbGV0dGUgIyVzJywgJ2Jsb2Nrc3knKSwgaW5kZXggKyAxKSksXG4gICAgb25DbGljazogKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpZFxuICAgICAgfSA9IHBhbGV0dGUsXG4gICAgICAgICAgICBjb2xvcnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocGFsZXR0ZSwgX2V4Y2x1ZGVkKTtcblxuICAgICAgb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICAgIGN1cnJlbnRfcGFsZXR0ZTogaWRcbiAgICAgIH0sIGNvbG9ycykpO1xuICAgIH1cbiAgfSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbG9yUGFsZXR0ZXNNb2RhbDsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBjcmVhdGVQb3J0YWwsIHVzZVJlZiwgRnJhZ21lbnQsIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vT3B0aW9uc1BhbmVsJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFBhbGV0dGVQcmV2aWV3IGZyb20gJy4vY29sb3ItcGFsZXR0ZXMvUGFsZXR0ZVByZXZpZXcnO1xuaW1wb3J0IENvbG9yUGFsZXR0ZXNNb2RhbCBmcm9tICcuL2NvbG9yLXBhbGV0dGVzL0NvbG9yUGFsZXR0ZXNNb2RhbCc7XG5pbXBvcnQgdXNlUG9wb3Zlck1ha2VyIGZyb20gJy4uL2hlbHBlcnMvdXNlUG9wb3Zlck1ha2VyJztcbmltcG9ydCBPdXRzaWRlQ2xpY2tIYW5kbGVyIGZyb20gJy4vcmVhY3Qtb3V0c2lkZS1jbGljay1oYW5kbGVyJztcbmltcG9ydCB7IFRyYW5zaXRpb24gfSBmcm9tICdAcmVhY3Qtc3ByaW5nL3dlYic7XG5pbXBvcnQgYmV6aWVyRWFzaW5nIGZyb20gJ2Jlemllci1lYXNpbmcnO1xuXG5jb25zdCBDb2xvclBhbGV0dGVzID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBjb2xvclBhbGV0dGVzV3JhcHBlciA9IHVzZVJlZigpO1xuICBjb25zdCBbe1xuICAgIGlzT3BlbixcbiAgICBpc1RyYW5zaXRpb25pbmdcbiAgfSwgc2V0TW9kYWxTdGF0ZV0gPSB1c2VTdGF0ZSh7XG4gICAgaXNPcGVuOiBmYWxzZSxcbiAgICBpc1RyYW5zaXRpb25pbmc6IGZhbHNlXG4gIH0pO1xuICBjb25zdCB7XG4gICAgc3R5bGVzLFxuICAgIHBvcG92ZXJQcm9wc1xuICB9ID0gdXNlUG9wb3Zlck1ha2VyKHtcbiAgICByZWY6IGNvbG9yUGFsZXR0ZXNXcmFwcGVyLFxuICAgIGRlZmF1bHRIZWlnaHQ6IDQzMCxcbiAgICBzaG91bGRDYWxjdWxhdGU6IGlzVHJhbnNpdGlvbmluZyB8fCBpc09wZW5cbiAgfSk7XG5cbiAgY29uc3Qgc2V0SXNPcGVuID0gaXNPcGVuID0+IHtcbiAgICBzZXRNb2RhbFN0YXRlKHN0YXRlID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgaXNPcGVuLFxuICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlXG4gICAgfSkpO1xuICB9O1xuXG4gIGNvbnN0IHN0b3BUcmFuc2l0aW9uaW5nID0gKCkgPT4gc2V0TW9kYWxTdGF0ZShzdGF0ZSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICBpc1RyYW5zaXRpb25pbmc6IGZhbHNlXG4gIH0pKTtcblxuICBjb25zdCBwcm9wZXJWYWx1ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb24udmFsdWUpLCBPYmplY3Qua2V5cyh2YWx1ZSkucmVkdWNlKChhbGwsIGN1cnJlbnRLZXkpID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYWxsKSwgdmFsdWVbY3VycmVudEtleV0gPyB7XG4gICAgW2N1cnJlbnRLZXldOiB2YWx1ZVtjdXJyZW50S2V5XVxuICB9IDoge30pLCB7fSkpLCBvcHRpb24udmFsdWUucGFsZXR0ZXMgPyB7XG4gICAgcGFsZXR0ZXM6IG9wdGlvbi52YWx1ZS5wYWxldHRlcy5tYXAoKHAsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgbWF5YmVDdXJyZW50bHlJblZhbHVlID0gdmFsdWUucGFsZXR0ZXMuZmluZChfcmVmMiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gcC5pZCA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGxldCBtYXliZUN1cnJlbnRWYWx1ZSA9IHt9O1xuXG4gICAgICBpZiAocC5pZCA9PT0gdmFsdWUuY3VycmVudF9wYWxldHRlKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHApLm1hcChtYXliZUNvbG9yID0+IHtcbiAgICAgICAgICBpZiAobWF5YmVDb2xvci5pbmRleE9mKCdjb2xvcicpID09PSAwICYmIHZhbHVlW21heWJlQ29sb3JdKSB7XG4gICAgICAgICAgICBtYXliZUN1cnJlbnRWYWx1ZVttYXliZUNvbG9yXSA9IHZhbHVlW21heWJlQ29sb3JdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBPYmplY3Qua2V5cyhwKS5yZWR1Y2UoKGFsbCwgY3VycmVudEtleSkgPT4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhbGwpLCBwW2N1cnJlbnRLZXldID8ge1xuICAgICAgICBbY3VycmVudEtleV06IHBbY3VycmVudEtleV1cbiAgICAgIH0gOiB7fSksIHt9KSksIE9iamVjdC5rZXlzKG1heWJlQ3VycmVudGx5SW5WYWx1ZSB8fCB7fSkucmVkdWNlKChhbGwsIGN1cnJlbnRLZXkpID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYWxsKSwgbWF5YmVDdXJyZW50bHlJblZhbHVlW2N1cnJlbnRLZXldID8ge1xuICAgICAgICBbY3VycmVudEtleV06IG1heWJlQ3VycmVudGx5SW5WYWx1ZVtjdXJyZW50S2V5XVxuICAgICAgfSA6IHt9KSwge30pKSwgbWF5YmVDdXJyZW50VmFsdWUpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pXG4gIH0gOiB7fSk7XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgY3JlYXRlRWxlbWVudChPdXRzaWRlQ2xpY2tIYW5kbGVyLCB7XG4gICAgZGlzYWJsZWQ6ICFpc09wZW4sXG4gICAgdXNlQ2FwdHVyZTogZmFsc2UsXG4gICAgY2xhc3NOYW1lOiBcImN0LXBhbGV0dGVzLXByZXZpZXdcIixcbiAgICBhZGRpdGlvbmFsUmVmczogW3BvcG92ZXJQcm9wcy5yZWZdLFxuICAgIG9uT3V0c2lkZUNsaWNrOiAoKSA9PiB7XG4gICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgIH0sXG4gICAgd3JhcHBlclByb3BzOiB7XG4gICAgICByZWY6IGNvbG9yUGFsZXR0ZXNXcmFwcGVyLFxuICAgICAgb25DbGljazogZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgnLmN0LWNvbG9yLXBpY2tlci1tb2RhbCcpIHx8IGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnY3QtY29sb3ItcGlja2VyLW1vZGFsJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb3BlclZhbHVlLnBhbGV0dGVzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0SXNPcGVuKHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgY3JlYXRlRWxlbWVudChQYWxldHRlUHJldmlldywge1xuICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgIGlmICghcHJvcGVyVmFsdWUucGFsZXR0ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRJc09wZW4odHJ1ZSk7XG4gICAgfSxcbiAgICB2YWx1ZTogcHJvcGVyVmFsdWUsXG4gICAgb25DaGFuZ2U6IChvcHRpb25JZCwgb3B0aW9uVmFsdWUpID0+IHtcbiAgICAgIG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wZXJWYWx1ZSksIG9wdGlvblZhbHVlKSwgcHJvcGVyVmFsdWUucGFsZXR0ZXMgPyB7XG4gICAgICAgIHBhbGV0dGVzOiBwcm9wZXJWYWx1ZS5wYWxldHRlcy5tYXAocCA9PiBwLmlkID09PSBwcm9wZXJWYWx1ZS5jdXJyZW50X3BhbGV0dGUgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHApLCBvcHRpb25WYWx1ZSkgOiBwKVxuICAgICAgfSA6IHt9KSk7XG4gICAgfVxuICB9KSksIChpc1RyYW5zaXRpb25pbmcgfHwgaXNPcGVuKSAmJiBjcmVhdGVQb3J0YWwoY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCB7XG4gICAgaXRlbXM6IGlzT3BlbixcbiAgICBvblJlc3Q6IGlzT3BlbiA9PiB7XG4gICAgICBzdG9wVHJhbnNpdGlvbmluZygpO1xuICAgIH0sXG4gICAgY29uZmlnOiB7XG4gICAgICBkdXJhdGlvbjogMTAwLFxuICAgICAgZWFzaW5nOiBiZXppZXJFYXNpbmcoMC4yNSwgMC4xLCAwLjI1LCAxLjApXG4gICAgfSxcbiAgICBmcm9tOiBpc09wZW4gPyB7XG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDAuOTUsIDAuOTUsIDEpJyxcbiAgICAgIG9wYWNpdHk6IDBcbiAgICB9IDoge1xuICAgICAgb3BhY2l0eTogMVxuICAgIH0sXG4gICAgZW50ZXI6IGlzT3BlbiA/IHtcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMSwgMSwgMSknLFxuICAgICAgb3BhY2l0eTogMVxuICAgIH0gOiB7XG4gICAgICBvcGFjaXR5OiAxXG4gICAgfSxcbiAgICBsZWF2ZTogIWlzT3BlbiA/IHtcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMC45NSwgMC45NSwgMSknLFxuICAgICAgb3BhY2l0eTogMFxuICAgIH0gOiB7XG4gICAgICBvcGFjaXR5OiAxXG4gICAgfVxuICB9LCAoc3R5bGUsIGl0ZW0pID0+IHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KENvbG9yUGFsZXR0ZXNNb2RhbCwge1xuICAgICAgd3JhcHBlclByb3BzOiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBzdHlsZXMpXG4gICAgICB9LCBwb3BvdmVyUHJvcHMpLFxuICAgICAgb25DaGFuZ2U6IHZhbHVlID0+IHtcbiAgICAgICAgc2V0SXNPcGVuKGZhbHNlKTtcbiAgICAgICAgb25DaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIHZhbHVlOiBwcm9wZXJWYWx1ZSxcbiAgICAgIG9wdGlvbjogb3B0aW9uXG4gICAgfSk7XG4gIH0pLCBkb2N1bWVudC5ib2R5KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb2xvclBhbGV0dGVzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2757\n")},2495:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _color_picker_single_picker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(694);\n/* harmony import */ var _react_outside_click_handler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8204);\n/* harmony import */ var match_conditions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7465);\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nconst ColorPicker = _ref => {\n let {\n option,\n values,\n value,\n onChange\n } = _ref;\n const [{\n isPicking,\n isTransitioning\n }, setState] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)({\n isPicking: null,\n isTransitioning: null\n });\n const containerRef = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const modalRef = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_react_outside_click_handler__WEBPACK_IMPORTED_MODULE_2__["default"], {\n useCapture: false,\n display: "inline-block",\n disabled: !isPicking,\n wrapperProps: {\n ref: containerRef\n },\n className: "ct-color-picker-container",\n additionalRefs: [modalRef],\n onOutsideClick: () => {\n setState(_ref2 => {\n let {\n isPicking\n } = _ref2;\n return {\n isPicking: null,\n isTransitioning: isPicking\n };\n });\n }\n }, option.pickers.filter(picker => !picker.condition || (0,match_conditions__WEBPACK_IMPORTED_MODULE_3__/* .matchValuesWithCondition */ .Nj)((0,match_conditions__WEBPACK_IMPORTED_MODULE_3__/* .normalizeCondition */ .KY)(picker.condition), picker.condition_source === \'global\' ? Object.keys(picker.condition).reduce((current, key) => _objectSpread(_objectSpread({}, current), {}, {\n [key]: wp.customize(key)()\n }), {}) : values)).map(picker => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_color_picker_single_picker__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .Z, {\n containerRef: containerRef,\n picker: picker,\n key: picker.id,\n option: option,\n isPicking: isPicking,\n modalRef: modalRef,\n isTransitioning: isTransitioning,\n values: values,\n onPickingChange: isPicking => setState({\n isTransitioning: picker.id,\n isPicking\n }),\n stopTransitioning: () => setState(state => _objectSpread(_objectSpread({}, state), {}, {\n isTransitioning: false\n })),\n onChange: newPicker => onChange(_objectSpread(_objectSpread({}, value), {}, {\n [picker.id]: newPicker\n })),\n value: value[picker.id] || option.value[picker.id]\n })));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ColorPicker);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ5NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1jb2xvci1waWNrZXIuanM/NDIwYiJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIEZyYWdtZW50LCBjcmVhdGVDb250ZXh0LCB1c2VSZWYsIHVzZUNvbnRleHQsIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBTaW5nbGVQaWNrZXIgZnJvbSAnLi9jb2xvci1waWNrZXIvc2luZ2xlLXBpY2tlcic7XG5pbXBvcnQgT3V0c2lkZUNsaWNrSGFuZGxlciBmcm9tICcuL3JlYWN0LW91dHNpZGUtY2xpY2staGFuZGxlcic7XG5pbXBvcnQgeyBub3JtYWxpemVDb25kaXRpb24sIG1hdGNoVmFsdWVzV2l0aENvbmRpdGlvbiB9IGZyb20gJ21hdGNoLWNvbmRpdGlvbnMnO1xuXG5jb25zdCBDb2xvclBpY2tlciA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbixcbiAgICB2YWx1ZXMsXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IFt7XG4gICAgaXNQaWNraW5nLFxuICAgIGlzVHJhbnNpdGlvbmluZ1xuICB9LCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZSh7XG4gICAgaXNQaWNraW5nOiBudWxsLFxuICAgIGlzVHJhbnNpdGlvbmluZzogbnVsbFxuICB9KTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IG1vZGFsUmVmID0gdXNlUmVmKCk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KE91dHNpZGVDbGlja0hhbmRsZXIsIHtcbiAgICB1c2VDYXB0dXJlOiBmYWxzZSxcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIGRpc2FibGVkOiAhaXNQaWNraW5nLFxuICAgIHdyYXBwZXJQcm9wczoge1xuICAgICAgcmVmOiBjb250YWluZXJSZWZcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogXCJjdC1jb2xvci1waWNrZXItY29udGFpbmVyXCIsXG4gICAgYWRkaXRpb25hbFJlZnM6IFttb2RhbFJlZl0sXG4gICAgb25PdXRzaWRlQ2xpY2s6ICgpID0+IHtcbiAgICAgIHNldFN0YXRlKF9yZWYyID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpc1BpY2tpbmdcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzUGlja2luZzogbnVsbCxcbiAgICAgICAgICBpc1RyYW5zaXRpb25pbmc6IGlzUGlja2luZ1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBvcHRpb24ucGlja2Vycy5maWx0ZXIocGlja2VyID0+ICFwaWNrZXIuY29uZGl0aW9uIHx8IG1hdGNoVmFsdWVzV2l0aENvbmRpdGlvbihub3JtYWxpemVDb25kaXRpb24ocGlja2VyLmNvbmRpdGlvbiksIHBpY2tlci5jb25kaXRpb25fc291cmNlID09PSAnZ2xvYmFsJyA/IE9iamVjdC5rZXlzKHBpY2tlci5jb25kaXRpb24pLnJlZHVjZSgoY3VycmVudCwga2V5KSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGN1cnJlbnQpLCB7fSwge1xuICAgIFtrZXldOiB3cC5jdXN0b21pemUoa2V5KSgpXG4gIH0pLCB7fSkgOiB2YWx1ZXMpKS5tYXAocGlja2VyID0+IGNyZWF0ZUVsZW1lbnQoU2luZ2xlUGlja2VyLCB7XG4gICAgY29udGFpbmVyUmVmOiBjb250YWluZXJSZWYsXG4gICAgcGlja2VyOiBwaWNrZXIsXG4gICAga2V5OiBwaWNrZXIuaWQsXG4gICAgb3B0aW9uOiBvcHRpb24sXG4gICAgaXNQaWNraW5nOiBpc1BpY2tpbmcsXG4gICAgbW9kYWxSZWY6IG1vZGFsUmVmLFxuICAgIGlzVHJhbnNpdGlvbmluZzogaXNUcmFuc2l0aW9uaW5nLFxuICAgIHZhbHVlczogdmFsdWVzLFxuICAgIG9uUGlja2luZ0NoYW5nZTogaXNQaWNraW5nID0+IHNldFN0YXRlKHtcbiAgICAgIGlzVHJhbnNpdGlvbmluZzogcGlja2VyLmlkLFxuICAgICAgaXNQaWNraW5nXG4gICAgfSksXG4gICAgc3RvcFRyYW5zaXRpb25pbmc6ICgpID0+IHNldFN0YXRlKHN0YXRlID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZVxuICAgIH0pKSxcbiAgICBvbkNoYW5nZTogbmV3UGlja2VyID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgW3BpY2tlci5pZF06IG5ld1BpY2tlclxuICAgIH0pKSxcbiAgICB2YWx1ZTogdmFsdWVbcGlja2VyLmlkXSB8fCBvcHRpb24udmFsdWVbcGlja2VyLmlkXVxuICB9KSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29sb3JQaWNrZXI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2495\n')},9158:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _customizer_components_Overlay__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7136);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n\nconst CustomizerResetOptions = _ref => {\n let {\n value,\n option,\n onChange\n } = _ref;\n const [isShowing, setIsShowing] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n className: "button",\n style: {\n width: \'100%\'\n },\n onClick: e => {\n e.preventDefault();\n setIsShowing(true);\n }\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)(\'Reset Options\', \'blocksy\')), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_customizer_components_Overlay__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .Z, {\n items: isShowing,\n className: "ct-admin-modal ct-reset-options",\n onDismiss: () => setIsShowing(false),\n render: () => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-modal-content"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("h2", {\n className: "ct-modal-title"\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)(\'Reset Settings\', \'blocksy\')), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)(\'You are about to reset all settings to their default values, are you sure you want to continue?\', \'blocksy\')), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-modal-actions has-divider",\n "data-buttons": "2"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n setIsShowing(false);\n },\n className: "button"\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)(\'Cancel\', \'blocksy\')), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n className: "button button-primary",\n onClick: e => {\n e.preventDefault();\n jQuery.post(ajaxurl, {\n wp_customize: \'on\',\n action: \'ct_customizer_reset\',\n nonce: ct_customizer_localizations.customizer_reset_none\n }, () => {\n wp.customize.state(\'saved\').set(true);\n location.reload();\n });\n }\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)(\'Confirm\', \'blocksy\'))))\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CustomizerResetOptions);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTE1OC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LWN1c3RvbWl6ZXItcmVzZXQtb3B0aW9ucy5qcz9kN2IyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZyYWdtZW50LCBjcmVhdGVFbGVtZW50LCB1c2VTdGF0ZSB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgT3ZlcmxheSBmcm9tICcuLi8uLi9jdXN0b21pemVyL2NvbXBvbmVudHMvT3ZlcmxheSc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuXG5jb25zdCBDdXN0b21pemVyUmVzZXRPcHRpb25zID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgb3B0aW9uLFxuICAgIG9uQ2hhbmdlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBbaXNTaG93aW5nLCBzZXRJc1Nob3dpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImJ1dHRvblwiLFxuICAgIHN0eWxlOiB7XG4gICAgICB3aWR0aDogJzEwMCUnXG4gICAgfSxcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldElzU2hvd2luZyh0cnVlKTtcbiAgICB9XG4gIH0sIF9fKCdSZXNldCBPcHRpb25zJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoT3ZlcmxheSwge1xuICAgIGl0ZW1zOiBpc1Nob3dpbmcsXG4gICAgY2xhc3NOYW1lOiBcImN0LWFkbWluLW1vZGFsIGN0LXJlc2V0LW9wdGlvbnNcIixcbiAgICBvbkRpc21pc3M6ICgpID0+IHNldElzU2hvd2luZyhmYWxzZSksXG4gICAgcmVuZGVyOiAoKSA9PiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjdC1tb2RhbC1jb250ZW50XCJcbiAgICB9LCBjcmVhdGVFbGVtZW50KFwiaDJcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImN0LW1vZGFsLXRpdGxlXCJcbiAgICB9LCBfXygnUmVzZXQgU2V0dGluZ3MnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcInBcIiwgbnVsbCwgX18oJ1lvdSBhcmUgYWJvdXQgdG8gcmVzZXQgYWxsIHNldHRpbmdzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLCBhcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/JywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImN0LW1vZGFsLWFjdGlvbnMgaGFzLWRpdmlkZXJcIixcbiAgICAgIFwiZGF0YS1idXR0b25zXCI6IFwiMlwiXG4gICAgfSwgY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBzZXRJc1Nob3dpbmcoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogXCJidXR0b25cIlxuICAgIH0sIF9fKCdDYW5jZWwnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiYnV0dG9uIGJ1dHRvbi1wcmltYXJ5XCIsXG4gICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBqUXVlcnkucG9zdChhamF4dXJsLCB7XG4gICAgICAgICAgd3BfY3VzdG9taXplOiAnb24nLFxuICAgICAgICAgIGFjdGlvbjogJ2N0X2N1c3RvbWl6ZXJfcmVzZXQnLFxuICAgICAgICAgIG5vbmNlOiBjdF9jdXN0b21pemVyX2xvY2FsaXphdGlvbnMuY3VzdG9taXplcl9yZXNldF9ub25lXG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICB3cC5jdXN0b21pemUuc3RhdGUoJ3NhdmVkJykuc2V0KHRydWUpO1xuICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBfXygnQ29uZmlybScsICdibG9ja3N5JykpKSlcbiAgfSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ3VzdG9taXplclJlc2V0T3B0aW9uczsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9158\n')},8163:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\nconst _excluded = ["class"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\nconst Divider = _ref => {\n let {\n option: {\n attr: {\n class: className\n } = {}\n }\n } = _ref,\n attr = _objectWithoutProperties(_ref.option.attr, _excluded);\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(\'ct-divider\', className)\n }, attr));\n};\n\nDivider.renderingConfig = {\n design: \'none\'\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Divider);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODE2My5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1kaXZpZGVyLmpzPzk1MDAiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgX2V4Y2x1ZGVkID0gW1wiY2xhc3NcIl07XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5jb25zdCBEaXZpZGVyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uOiB7XG4gICAgICBhdHRyOiB7XG4gICAgICAgIGNsYXNzOiBjbGFzc05hbWVcbiAgICAgIH0gPSB7fVxuICAgIH1cbiAgfSA9IF9yZWYsXG4gICAgICBhdHRyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYub3B0aW9uLmF0dHIsIF9leGNsdWRlZCk7XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3QtZGl2aWRlcicsIGNsYXNzTmFtZSlcbiAgfSwgYXR0cikpO1xufTtcblxuRGl2aWRlci5yZW5kZXJpbmdDb25maWcgPSB7XG4gIGRlc2lnbjogJ25vbmUnXG59O1xuZXhwb3J0IGRlZmF1bHQgRGl2aWRlcjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8163\n')},5821:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"DragDropContext\": () => (/* binding */ DragDropContext),\n \"default\": () => (/* binding */ ct_footer_builder),\n \"fetchCurrentFooter\": () => (/* binding */ fetchCurrentFooter)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: ./static/js/customizer/panels-builder/placements/Sortable.js\nvar Sortable = __webpack_require__(7229);\n// EXTERNAL MODULE: ./static/js/options/components/PanelLevel.js + 1 modules\nvar PanelLevel = __webpack_require__(956);\n// EXTERNAL MODULE: ./static/js/customizer/panels-builder/placements/helpers.js\nvar helpers = __webpack_require__(8382);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/columns/DraggableItems.js\nconst _excluded = [\"items\", \"draggableId\", \"hasPointers\", \"className\", \"tagName\", \"direction\", \"group\", \"options\", \"propsForItem\", \"panelType\", \"displayWrapper\"];\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\nconst shallowCompare = (prev, next) => {\n for (let key in next) {\n if (next[key] !== prev[key]) return false;\n }\n\n return true;\n};\n\nfunction memo(Component) {\n let areEqual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : shallowCompare;\n let prevProps = {};\n let prevResult;\n return nextProps => {\n if (prevResult !== undefined && areEqual(prevProps, nextProps)) {\n return prevResult;\n }\n\n prevProps = nextProps;\n prevResult = createElement(Component, Object.assign({}, nextProps));\n return prevResult;\n };\n}\n\nconst DraggableItem = _ref => {\n let {\n item,\n index,\n panelType,\n onRemove,\n renderItem,\n onClick,\n className\n } = _ref;\n const itemData = ct_customizer_localizations.header_builder_data[panelType].find(_ref2 => {\n let {\n id\n } = _ref2;\n return id === (0,helpers/* getOriginalId */.t_)(item);\n });\n const {\n builderValue\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n\n if (renderItem) {\n return renderItem({\n item,\n itemData,\n index\n });\n }\n /**\n * Dynamic items have a : in their ID\n */\n\n\n const allDynamicItems = Object.keys(builderValue.items).filter(id => id.indexOf((0,helpers/* customItemsSeparator */.SU)()) > -1);\n const allClonesAndOriginal = [(0,helpers/* getOriginalId */.t_)(item), ...allDynamicItems.filter(id => (0,helpers/* getOriginalId */.t_)(id) === (0,helpers/* getOriginalId */.t_)(item))];\n return (0,external_window_wp_element_.createElement)(\"div\", {\n \"data-id\": item,\n className: classnames_default()('ct-builder-item', className, {// 'ct-is-dragging': snapshot.isDragging\n }),\n onClick: onClick\n }, itemData && itemData.config ? allClonesAndOriginal.length > 1 ? `${itemData.config.name} ${allClonesAndOriginal.indexOf(item) + 1}` : itemData.config.name : item, (0,external_window_wp_element_.createElement)(\"button\", {\n className: \"ct-btn-remove\",\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n onRemove();\n }\n }));\n};\n\nconst DraggableItems = _ref3 => {\n let {\n items,\n draggableId,\n hasPointers = true,\n className,\n tagName = 'div',\n direction = 'horizontal',\n group = 'header_sortables',\n options = {},\n propsForItem = item => ({}),\n panelType = 'footer',\n displayWrapper = true\n } = _ref3,\n props = _objectWithoutProperties(_ref3, _excluded);\n\n const {\n isDragging,\n setIsDragging,\n onChange,\n setList\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const {\n panelsHelpers\n } = (0,external_window_wp_element_.useContext)(PanelLevel/* PanelContext */.Q);\n const itemsOutput = items.map((item, index) => (0,external_window_wp_element_.createElement)(DraggableItem, _extends({\n key: item,\n index: index,\n panelType: panelType,\n item: item,\n className: panelsHelpers.isOpenFor(`builder_panel_${item}`) ? 'ct-customizing' : '',\n onClick: e => {\n e.stopPropagation();\n e.preventDefault();\n panelsHelpers.open(`builder_panel_${item}`);\n },\n onRemove: () => {\n panelsHelpers.close();\n setList({\n [draggableId]: items.filter(id => id !== item)\n });\n }\n }, propsForItem(item))));\n\n if (!displayWrapper) {\n return itemsOutput;\n }\n\n return (0,external_window_wp_element_.createElement)(Sortable/* default */.Z, _extends({\n options: _objectSpread({\n delay: 0,\n group,\n fallbackOnBody: true,\n forceFallback: true,\n fallbackTolerance: 5,\n filter: '.ct-pointer',\n direction: direction,\n touchStartThreshold: 5,\n onStart: event => {\n setIsDragging(event.item.dataset.id);\n document.body.classList.add('ct-builder-dragging');\n\n if (event.from && group && group.pull !== 'clone') {\n event.to.classList.add('ct-is-over');\n }\n },\n onEnd: () => {\n setIsDragging(false);\n document.body.classList.remove('ct-builder-dragging');\n [...document.querySelectorAll('.ct-panel-builder .ct-is-over')].map(el => el.classList.remove('ct-is-over'));\n },\n onMove: (event, originalEvent) => {\n if (event.from.closest('#ct-option-header-builder-items')) {\n Promise.resolve().then(() => [...event.from.querySelectorAll(`[data-id=\"${event.dragged.dataset.id}\"]`)].map(el => {\n el.classList.remove('ct-builder-item');\n el.classList.add('ct-item-in-builder');\n }));\n }\n\n if (event.to) {\n if (event.to.children && Array.from(event.to.children).filter(e => e.dataset.id !== '__pointer__' && e.dataset.id !== '__filler__').length > 0) {\n return false;\n }\n\n ;\n [...document.querySelectorAll('.ct-panel-builder .ct-is-over')].map(el => el.classList.remove('ct-is-over'));\n event.to.classList.add('ct-is-over');\n }\n }\n }, options),\n onChange: (order, sortable, evt) => {\n if (draggableId === 'available-items') {\n return;\n }\n\n onChange({\n id: draggableId,\n value: order.filter(i => i !== '__pointer__' && i !== '__filler__')\n });\n },\n tag: tagName,\n className: classnames_default()('ct-builder-items', className)\n }, props, {\n \"data-id\": draggableId\n }), draggableId !== 'available-items' && isDragging && (0,external_window_wp_element_.createElement)(\"div\", {\n \"data-id\": \"__filler__\",\n className: \"ct-filler\"\n }), hasPointers && isDragging && (0,external_window_wp_element_.createElement)(\"div\", {\n \"data-id\": \"__pointer__\",\n className: \"ct-pointer\"\n }), itemsOutput);\n};\n\n/* harmony default export */ const columns_DraggableItems = (DraggableItems);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/columns/ColumnsBuilder.js\n\n\n\n\n\n\nconst Bar = _ref => {\n let {\n bar,\n builderValue,\n direction = 'horizontal'\n } = _ref;\n const {\n panelsHelpers\n } = (0,external_window_wp_element_.useContext)(PanelLevel/* PanelContext */.Q);\n const maybeValues = builderValue.items[bar.id];\n const allItems = ct_customizer_localizations.header_builder_data.footer;\n const primaryItem = allItems.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id === bar.id;\n });\n const values = maybeValues ? maybeValues.values : {};\n let columns = 'initial';\n\n if (bar.columns.length === 2) {\n columns = values['2_columns_layout'] || {\n desktop: 'repeat(2, 1fr)',\n tablet: 'initial',\n mobile: 'initial'\n };\n }\n\n if (bar.columns.length === 3) {\n columns = values['3_columns_layout'] || {\n desktop: 'repeat(3, 1fr)',\n tablet: 'initial',\n mobile: 'initial'\n };\n }\n\n if (bar.columns.length === 4) {\n columns = values['4_columns_layout'] || {\n desktop: 'repeat(4, 1fr)',\n tablet: 'initial',\n mobile: 'initial'\n };\n }\n\n if (bar.columns.length === 5) {\n columns = values['5_columns_layout'] || {\n desktop: 'repeat(5, 1fr)',\n tablet: 'initial',\n mobile: 'initial'\n };\n }\n\n if (bar.columns.length === 6) {\n columns = values['6_columns_layout'] || {\n desktop: 'repeat(6, 1fr)',\n tablet: 'initial',\n mobile: 'initial'\n };\n }\n\n if (columns && columns.desktop) {\n columns = columns.desktop;\n }\n\n return (0,external_window_wp_element_.createElement)(\"li\", {\n className: \"builder-row\"\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-row-actions\",\n onClick: () => panelsHelpers.open(`builder_panel_${bar.id}`)\n }, {\n 'top-row': (0,external_window_wp_i18n_.__)('Top Row', 'blocksy'),\n 'middle-row': (0,external_window_wp_i18n_.__)('Middle Row', 'blocksy'),\n 'bottom-row': (0,external_window_wp_i18n_.__)('Bottom Row', 'blocksy')\n }[bar.id]), (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"row-inner\",\n style: {\n '--gridTemplateColummns': columns\n }\n }, bar.columns.map((column, index) => (0,external_window_wp_element_.createElement)(\"li\", {\n className: \"builder-column\",\n key: index\n }, (0,external_window_wp_element_.createElement)(columns_DraggableItems, {\n draggableId: `${bar.id}:${index}`,\n items: column\n })))));\n};\n\nconst ColumnsBuilder_shallowCompare = (prev, next) => {\n for (let key in next) {\n if (next[key] !== prev[key]) return false;\n }\n\n return true;\n};\n\nfunction ColumnsBuilder_memo(Component) {\n let areEqual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ColumnsBuilder_shallowCompare;\n let prevProps = {};\n let prevResult;\n return nextProps => {\n if (prevResult !== undefined && areEqual(prevProps, nextProps)) {\n return prevResult;\n }\n\n prevProps = nextProps;\n prevResult = (0,external_window_wp_element_.createElement)(Component, Object.assign({}, nextProps));\n return prevResult;\n };\n}\nconst ColumnsBuilder = ColumnsBuilder_memo(_ref3 => {\n let {\n builderValue\n } = _ref3;\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()('placements-builder')\n }, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"horizontal-rows\"\n }, ['top-row', 'middle-row', 'bottom-row'].map(bar => (0,external_window_wp_element_.createElement)(Bar, {\n builderValue: builderValue,\n bar: builderValue.rows.find(_ref4 => {\n let {\n id\n } = _ref4;\n return id === bar;\n }),\n key: bar\n }))));\n}); // const ColumnsBuilder = () => null\n\n/* harmony default export */ const columns_ColumnsBuilder = (ColumnsBuilder);\n// EXTERNAL MODULE: ./static/js/options/options/ct-panel.js\nvar ct_panel = __webpack_require__(3731);\n// EXTERNAL MODULE: ./static/js/options/helpers/get-value-from-input.js\nvar get_value_from_input = __webpack_require__(7069);\n// EXTERNAL MODULE: ./static/js/options/OptionsPanel.js + 7 modules\nvar OptionsPanel = __webpack_require__(7429);\n// EXTERNAL MODULE: external \"window.wp.components\"\nvar external_window_wp_components_ = __webpack_require__(8441);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/columns/builder-sidebar/SecondaryItems.js\nfunction SecondaryItems_extends() { SecondaryItems_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return SecondaryItems_extends.apply(this, arguments); }\n\n\n\n\n\n\n\n\n\n\nconst SecondaryItems = _ref => {\n let {\n builderValue,\n builderValueDispatch,\n inlinedItemsFromBuilder,\n displayList = true\n } = _ref;\n const {\n panelsState,\n panelsActions,\n currentView,\n isDragging\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const inlinedItemsFromAllViewsBuilder = builderValue.rows.reduce((currentItems, _ref2) => {\n let {\n columns\n } = _ref2;\n return [...currentItems, ...(columns || []).reduce((c, items) => [...c, ...items], [])];\n }, []);\n const secondaryItems = ct_customizer_localizations.header_builder_data.secondary_items.footer.filter(_ref3 => {\n let {\n config\n } = _ref3;\n return (// config.devices.indexOf(currentView) > -1 &&\n config.enabled\n );\n });\n const allItems = ct_customizer_localizations.header_builder_data.footer;\n /**\n * Dynamic items have a : in their ID\n */\n\n const allDynamicItems = Object.keys(builderValue.items).filter(id => id.indexOf((0,helpers/* customItemsSeparator */.SU)()) > -1);\n return (0,external_window_wp_element_.createElement)(columns_DraggableItems, {\n options: {\n sort: false,\n filter: '.ct-item-in-builder'\n },\n group: {\n name: 'header_sortables',\n put: false,\n pull: 'clone'\n },\n draggableId: 'available-items',\n items: [...secondaryItems.map(_ref4 => {\n let {\n id\n } = _ref4;\n return id;\n }), ...allDynamicItems].sort((a, b) => {\n const aItemData = ct_customizer_localizations.header_builder_data['footer'].find(_ref5 => {\n let {\n id\n } = _ref5;\n return id === (0,helpers/* getOriginalId */.t_)(a);\n });\n const bItemData = ct_customizer_localizations.header_builder_data['footer'].find(_ref6 => {\n let {\n id\n } = _ref6;\n return id === (0,helpers/* getOriginalId */.t_)(b);\n });\n return aItemData.config.name.localeCompare(bItemData.config.name);\n }),\n hasPointers: false,\n panelType: \"footer\",\n displayWrapper: displayList,\n propsForItem: item => ({\n renderItem: _ref7 => {\n let {\n item,\n itemData,\n index\n } = _ref7;\n const itemOptions = allItems.find(_ref8 => {\n let {\n id\n } = _ref8;\n return id === (0,helpers/* getOriginalId */.t_)(item);\n }).options;\n const allClonesAndOriginal = [(0,helpers/* getOriginalId */.t_)(item), ...allDynamicItems.filter(id => (0,helpers/* getOriginalId */.t_)(id) === (0,helpers/* getOriginalId */.t_)(item))];\n const itemName = allClonesAndOriginal.length > 1 ? `${itemData.config.name} ${allClonesAndOriginal.indexOf(item) + 1}` : itemData.config.name;\n const option = {\n label: itemName,\n 'inner-options': itemOptions\n };\n const itemInBuilder = inlinedItemsFromBuilder.indexOf(item) > -1;\n const id = `builder_panel_${item}`;\n return (0,external_window_wp_element_.createElement)(ct_panel.PanelMetaWrapper, SecondaryItems_extends({\n id: id,\n option: option\n }, panelsActions, {\n getActualOption: _ref9 => {\n let {\n open,\n container\n } = _ref9;\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, inlinedItemsFromAllViewsBuilder.indexOf(item) > -1 && (0,external_window_wp_element_.createElement)(ct_panel[\"default\"], {\n id: id,\n getValues: () => {\n let itemValue = builderValue.items[item];\n\n if (itemValue && Object.keys(itemValue.values) > 5) {\n return itemValue.values;\n }\n\n return (0,get_value_from_input/* getValueFromInput */.n6)(itemOptions, itemValue ? itemValue.values : {});\n },\n option: option,\n onChangeFor: (optionId, optionValue) => {\n const currentValue = builderValue.items[item];\n builderValueDispatch({\n type: 'ITEM_VALUE_ON_CHANGE',\n payload: {\n id: item,\n optionId,\n optionValue,\n values: !currentValue || currentValue && Object.keys(currentValue.values).length === 0 ? (0,get_value_from_input/* getValueFromInput */.n6)(itemOptions, {}) : {}\n }\n });\n },\n view: \"simple\"\n }), displayList && (0,external_window_wp_element_.createElement)(\"div\", {\n ref: container,\n \"data-id\": item,\n className: classnames_default()({\n 'ct-item-in-builder': itemInBuilder,\n 'ct-builder-item': !itemInBuilder\n }),\n onClick: () => {\n if (isDragging) {\n return;\n }\n\n itemInBuilder && open();\n }\n }, itemName, (0,external_window_wp_element_.createElement)(external_window_wp_components_.Slot, {\n name: `ColumnsBuilderSidebarItem_${index}`,\n fillProps: {\n item,\n itemInBuilder,\n itemData\n }\n })));\n }\n }));\n }\n }),\n direction: \"vertical\"\n });\n};\n\n/* harmony default export */ const builder_sidebar_SecondaryItems = (SecondaryItems);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/columns/builder-sidebar/InvisiblePanels.js\nfunction InvisiblePanels_extends() { InvisiblePanels_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return InvisiblePanels_extends.apply(this, arguments); }\n\nfunction InvisiblePanels_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction InvisiblePanels_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? InvisiblePanels_ownKeys(Object(source), !0).forEach(function (key) { InvisiblePanels_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : InvisiblePanels_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction InvisiblePanels_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst InvisiblePanels = _ref => {\n let {\n builderValue,\n builderValueDispatch\n } = _ref;\n const secondaryItems = ct_customizer_localizations.header_builder_data.secondary_items.footer;\n const allItems = ct_customizer_localizations.header_builder_data.footer;\n const {\n panelsState,\n panelsActions\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const primaryItems = allItems.filter(_ref2 => {\n let {\n id\n } = _ref2;\n return !secondaryItems.find(item => item.id === id);\n });\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, primaryItems.map(primaryItem => {\n const option = {\n label: primaryItem.config.name,\n 'inner-options': primaryItem.options\n };\n const id = `builder_panel_${primaryItem.id}`;\n return (0,external_window_wp_element_.createElement)(ct_panel.PanelMetaWrapper, InvisiblePanels_extends({\n id: id,\n key: primaryItem.id,\n option: option\n }, panelsActions, {\n getActualOption: _ref3 => {\n let {\n container\n } = _ref3;\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(ct_panel[\"default\"], {\n id: id,\n getValues: () => {\n let itemValue = builderValue.items[primaryItem.id];\n const maybeRow = builderValue.rows.find(_ref4 => {\n let {\n id\n } = _ref4;\n return id === primaryItem.id;\n });\n let hasWidgetAreas = false;\n\n if (maybeRow) {\n if (maybeRow.columns.reduce((allItems, current) => [...allItems, current], []).join('').indexOf('widget-area') > -1) {\n hasWidgetAreas = true;\n }\n }\n\n if (itemValue && Object.keys(itemValue.values) > 5) {\n return InvisiblePanels_objectSpread(InvisiblePanels_objectSpread({}, itemValue.values), maybeRow ? {\n items_per_row: maybeRow.columns.length.toString(),\n has_widget_areas: hasWidgetAreas ? 'yes' : 'no'\n } : {});\n }\n\n return InvisiblePanels_objectSpread(InvisiblePanels_objectSpread({}, (0,get_value_from_input/* getValueFromInput */.n6)(primaryItem.options, itemValue ? itemValue.values : {})), maybeRow ? {\n items_per_row: maybeRow.columns.length.toString(),\n has_widget_areas: hasWidgetAreas ? 'yes' : 'no'\n } : {});\n },\n option: option,\n onChangeFor: (optionId, optionValue) => {\n const currentValue = builderValue.items[primaryItem.id];\n builderValueDispatch({\n type: 'ITEM_VALUE_ON_CHANGE',\n payload: {\n id: primaryItem.id,\n optionId,\n optionValue,\n values: !currentValue || currentValue && Object.keys(currentValue.values).length === 0 ? (0,get_value_from_input/* getValueFromInput */.n6)(primaryItem.options, {}) : {}\n }\n });\n },\n view: \"simple\"\n }));\n }\n }));\n }));\n};\n\n/* harmony default export */ const builder_sidebar_InvisiblePanels = (InvisiblePanels);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/columns/builder-sidebar/PanelsManager.js\nfunction PanelsManager_extends() { PanelsManager_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return PanelsManager_extends.apply(this, arguments); }\n\n\n\n\n\n\n\n\nconst PanelsManager = () => {\n const secondaryItems = ct_customizer_localizations.header_builder_data.secondary_items.footer;\n const allItems = ct_customizer_localizations.header_builder_data.footer;\n const {\n builderValueCollection,\n builderValue,\n builderValueDispatch,\n panelsActions\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const allSections = builderValueCollection.sections.filter(_ref => {\n let {\n id\n } = _ref;\n return id !== 'type-2' && id !== 'type-3' && id.indexOf('ct-custom') === -1;\n });\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-panels-manager\"\n }, allSections.map(_ref2 => {\n let {\n name,\n id\n } = _ref2;\n return (0,external_window_wp_element_.createElement)(\"div\", null, name);\n }), (0,external_window_wp_element_.createElement)(\"ul\", {\n className: classnames_default()('ct-panels-list')\n }, allSections.map(_ref3 => {\n let {\n name,\n id\n } = _ref3;\n let panelLabel = name || {\n 'type-1': (0,external_window_wp_i18n_.__)('Global Footer', 'blocksy')\n }[id] || id;\n const panelId = `builder_footer_panel_${id}`;\n const footerOptions = ct_customizer_localizations.header_builder_data.footer_data.footer_options;\n const option = {\n label: panelLabel,\n 'inner-options': footerOptions\n };\n return (0,external_window_wp_element_.createElement)(ct_panel.PanelMetaWrapper, PanelsManager_extends({\n id: panelId,\n key: id,\n option: option\n }, panelsActions, {\n getActualOption: _ref4 => {\n let {\n open\n } = _ref4;\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, id === builderValue.id && (0,external_window_wp_element_.createElement)(ct_panel[\"default\"], {\n id: panelId,\n getValues: () => (0,get_value_from_input/* getValueFromInput */.n6)(footerOptions, Array.isArray(builderValue.settings) ? {} : builderValue.settings),\n option: option,\n onChangeFor: (optionId, optionValue) => {\n builderValueDispatch({\n type: 'BUILDER_GLOBAL_SETTING_ON_CHANGE',\n payload: {\n optionId,\n optionValue\n }\n });\n },\n view: \"simple\"\n }), id === builderValue.id && (0,external_window_wp_element_.createElement)(\"li\", {\n className: classnames_default()({\n active: id === builderValue.id,\n 'ct-global': id === 'type-1'\n }),\n onClick: () => {\n open();\n }\n }, (0,external_window_wp_element_.createElement)(\"span\", {\n className: \"ct-panel-name\"\n }, panelLabel)));\n }\n }));\n })));\n};\n\n/* harmony default export */ const builder_sidebar_PanelsManager = (PanelsManager);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/columns/AvailableItems.js\n\n\n\n\n\n\n\n\n\n\n\n\nconst AvailableItems = _ref => {\n let {\n builderValue,\n builderValueCollection,\n builderValueDispatch,\n inlinedItemsFromBuilder\n } = _ref;\n // panels | items | options\n const [currentTab, setCurrentTab] = (0,external_window_wp_element_.useState)('items');\n const secondaryItems = ct_customizer_localizations.header_builder_data.secondary_items.footer;\n const allItems = ct_customizer_localizations.header_builder_data.footer;\n const footerOptions = ct_customizer_localizations.header_builder_data.footer_data.footer_options;\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-available-items ct-footer-builder-options\"\n }, (0,external_window_wp_element_.createElement)(\"h3\", {\n className: \"ct-title\",\n dangerouslySetInnerHTML: {\n __html: sprintf((0,external_window_wp_i18n_.__)('Customizing: %s', 'blocksy'), `${(builderValueCollection.sections.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id === builderValue.id;\n }) || {}).name || {\n 'type-1': (0,external_window_wp_i18n_.__)('Global Footer', 'blocksy')\n }[builderValue.id] || builderValue.id}`)\n }\n }), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-tabs\"\n }, (0,external_window_wp_element_.createElement)(\"ul\", null, ['items', 'panels'].map(tab => (0,external_window_wp_element_.createElement)(\"li\", {\n key: tab,\n onClick: e => {\n e.preventDefault();\n setCurrentTab(tab);\n },\n className: classnames_default()({\n active: tab === currentTab\n })\n }, {\n panels: (0,external_window_wp_i18n_.__)('Footers', 'blocksy'),\n items: (0,external_window_wp_i18n_.__)('Elements', 'blocksy')\n }[tab]))), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-current-tab\"\n }, currentTab === 'panels' && (0,external_window_wp_element_.createElement)(external_window_wp_components_.Slot, {\n name: \"ColumnsBuilderPanelsManager\"\n }, fills => fills.length === 0 ? (0,external_window_wp_element_.createElement)(builder_sidebar_PanelsManager, null) : fills), (0,external_window_wp_element_.createElement)(builder_sidebar_SecondaryItems, {\n builderValue: builderValue,\n builderValueDispatch: builderValueDispatch,\n inlinedItemsFromBuilder: inlinedItemsFromBuilder,\n displayList: currentTab === 'items'\n }))), (0,external_window_wp_element_.createElement)(builder_sidebar_InvisiblePanels, {\n builderValue: builderValue,\n builderValueDispatch: builderValueDispatch\n }));\n};\n\n/* harmony default export */ const columns_AvailableItems = (AvailableItems);\n// EXTERNAL MODULE: ./node_modules/nanoid/index.browser.js\nvar index_browser = __webpack_require__(1496);\nvar index_browser_default = /*#__PURE__*/__webpack_require__.n(index_browser);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/columns/builderReducer.js\nfunction builderReducer_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = builderReducer_objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction builderReducer_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nfunction builderReducer_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction builderReducer_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? builderReducer_ownKeys(Object(source), !0).forEach(function (key) { builderReducer_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : builderReducer_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction builderReducer_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\nconst transformColumns = (columns, futureLength) => {\n columns = columns.filter(c => c.length > 0);\n return Array.from(Array(futureLength)).map((_, index) => {\n if (Array.isArray(columns[index])) {\n return columns[index];\n }\n\n return [];\n });\n};\n\nconst builderReducer = (builderValue, action) => {\n let updatedGlobalState = {};\n let newSections = [];\n let futureBuilderValue = builderValue.sections.find(_ref => {\n let {\n id\n } = _ref;\n return id.indexOf(builderValue.__forced_static_footer__ || fetchCurrentFooter() || builderValue.sections[0].id) > -1;\n });\n let shouldUpdate = false;\n let updateItemId = false;\n let removeSectionIds = [];\n\n if (action.type === 'BUILDER_GLOBAL_SETTING_ON_CHANGE') {\n const {\n optionId,\n optionValue,\n values = {}\n } = action.payload;\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n settings: builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue.settings), {}, {\n [optionId]: optionValue\n })\n });\n }\n\n if (action.type === 'ITEM_VALUE_ON_CHANGE') {\n const {\n id,\n optionId,\n optionValue,\n values = {}\n } = action.payload;\n updateItemId = `${id}:${optionId}`;\n let items = futureBuilderValue.items;\n\n if ((id === 'top-row' || id === 'middle-row' || id === 'bottom-row') && optionId === 'items_per_row') {\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n rows: futureBuilderValue.rows.map(row => row.id === id ? builderReducer_objectSpread(builderReducer_objectSpread({}, row), {}, {\n columns: transformColumns(row.columns, parseInt(optionValue, 10))\n }) : row)\n });\n } else {\n if (!items[id]) {\n items[id] = {\n id,\n values: {}\n };\n }\n\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n items: builderReducer_objectSpread(builderReducer_objectSpread({}, Array.isArray(items) ? {} : items), {}, {\n [id]: {\n id,\n values: builderReducer_objectSpread(builderReducer_objectSpread({}, items[id].values), {}, {\n [optionId]: optionValue\n })\n }\n })\n });\n }\n }\n\n if (action.type === 'REMOVE_CLONED_ITEM') {\n let _futureBuilderValue$i = futureBuilderValue.items,\n _action$payload$id = action.payload.id,\n {\n [_action$payload$id]: removedItem\n } = _futureBuilderValue$i,\n localItems = builderReducer_objectWithoutProperties(_futureBuilderValue$i, [_action$payload$id].map(_toPropertyKey));\n\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n items: localItems\n });\n }\n\n if (action.type === 'CLONE_ITEM') {\n const futureId = (0,helpers/* getOriginalId */.t_)(action.payload.id);\n let completeFutureId = `${futureId}${(0,helpers/* customItemsSeparator */.SU)()}${index_browser_default()()}`;\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n items: builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue.items), {}, {\n [completeFutureId]: {\n id: completeFutureId,\n values: futureBuilderValue.items[futureId] ? futureBuilderValue.items[futureId].values || {} : {}\n }\n })\n });\n }\n\n if (action.type === 'PICK_BUILDER_SECTION') {\n shouldUpdate = true;\n updatedGlobalState = {\n __forced_static_footer__: action.payload.id\n };\n }\n\n if (action.type === 'MARK_FOOTER_AS_GLOBAL') {\n shouldUpdate = true;\n updatedGlobalState = {\n __forced_static_footer__: action.payload.id,\n current_section: action.payload.id\n };\n }\n\n if (action.type === 'MARK_SPECIFIC_FOOTER_AS_GLOBAL') {\n updatedGlobalState = {\n current_section: action.payload.id\n };\n }\n\n if (action.type === 'SET_LIST') {\n shouldUpdate = true;\n const {\n lists\n } = action.payload;\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n rows: futureBuilderValue.rows.map(_ref2 => {\n let {\n id: barId,\n columns\n } = _ref2;\n const keys = Object.keys(lists);\n\n if (keys.map(k => k.split(':')[0]).indexOf(barId) > -1) {\n return {\n id: barId,\n columns: columns.map((column, index) => {\n if (lists[`${barId}:${index}`]) {\n return lists[`${barId}:${index}`];\n }\n\n return column;\n })\n };\n }\n\n return {\n id: barId,\n columns\n };\n })\n });\n }\n\n if (action.type === 'CREATE_NEW_SECTION') {\n const {\n name,\n copy\n } = action.payload;\n newSections = [copy ? builderReducer_objectSpread(builderReducer_objectSpread({}, builderValue.sections.find(_ref3 => {\n let {\n id\n } = _ref3;\n return id === copy;\n }) || {}), {}, {\n name,\n id: `ct-custom-${index_browser_default()()}`\n }) : {\n name,\n id: `ct-custom-${index_browser_default()()}`,\n mode: 'columns',\n rows: [{\n id: 'top-row',\n columns: [[], []]\n }, {\n id: 'middle-row',\n columns: [[], [], []]\n }, {\n id: 'bottom-row',\n columns: [['copyright']]\n }],\n items: [],\n settings: []\n }];\n }\n\n if (action.type === 'REMOVE_BUILDER_SECTION') {\n removeSectionIds.push(action.payload.id);\n }\n\n const actualBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread(builderReducer_objectSpread({}, builderValue), updatedGlobalState), {}, {\n __should_refresh__: shouldUpdate,\n __should_refresh_item__: updateItemId,\n sections: [...builderValue.sections.map(builder => builder.id === futureBuilderValue.id ? futureBuilderValue : builder), ...newSections].filter(_ref4 => {\n let {\n id\n } = _ref4;\n return removeSectionIds.indexOf(id) === -1;\n })\n });\n\n return actualBuilderValue;\n};\n;// CONCATENATED MODULE: ./static/js/options/options/ct-footer-builder.js\nconst ct_footer_builder_excluded = [\"__forced_static_footer__\", \"__should_refresh__\"],\n _excluded2 = [\"__forced_static_footer__\"];\n\nfunction ct_footer_builder_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction ct_footer_builder_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ct_footer_builder_ownKeys(Object(source), !0).forEach(function (key) { ct_footer_builder_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ct_footer_builder_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction ct_footer_builder_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction ct_footer_builder_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = ct_footer_builder_objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction ct_footer_builder_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\nconst DragDropContext = (0,external_window_wp_element_.createContext)({});\n\nconst getDocument = x => x.document || x.contentDocument || x.contentWindow.document;\n\nconst fetchCurrentFooter = () => {\n const document = getDocument(wp.customize.previewer.container.find('iframe')[0]);\n\n if (wp.customize.previewer.container.find('iframe')[0].contentDocument.querySelector('footer.ct-footer')) {\n return wp.customize.previewer.container.find('iframe')[0].contentDocument.querySelector('footer.ct-footer').dataset.id;\n }\n\n return null;\n};\n\nconst FooterBuilder = _ref => {\n let {\n value: allBuilderSections,\n option,\n onChange: onBuilderValueChange\n } = _ref;\n const currentFooter = (0,external_window_wp_element_.useRef)(null);\n\n if (currentFooter.current === null) {\n currentFooter.current = (allBuilderSections.sections.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id.indexOf(fetchCurrentFooter()) > -1;\n }) || allBuilderSections.sections[0]).id;\n }\n\n (0,external_window_wp_element_.useEffect)(() => {\n let _wp$customize = wp.customize('footer_placements')(),\n {\n __forced_static_footer__,\n __should_refresh__\n } = _wp$customize,\n old = ct_footer_builder_objectWithoutProperties(_wp$customize, ct_footer_builder_excluded);\n\n Object.keys(old).map(key => {\n if (parseFloat(key)) {\n delete old[key];\n }\n });\n\n try {\n wp.customize('footer_placements')(ct_footer_builder_objectSpread(ct_footer_builder_objectSpread({}, old), {}, {\n __forced_static_footer__: (allBuilderSections.sections.find(_ref3 => {\n let {\n id\n } = _ref3;\n return id.indexOf(fetchCurrentFooter()) > -1;\n }) || allBuilderSections.sections[0]).id\n }));\n } catch (e) {\n console.error(e);\n }\n\n return () => {\n const _wp$customize2 = wp.customize('footer_placements')(),\n {\n __forced_static_footer__\n } = _wp$customize2,\n old = ct_footer_builder_objectWithoutProperties(_wp$customize2, _excluded2);\n\n wp.customize('footer_placements')(ct_footer_builder_objectSpread({\n __should_refresh__: true,\n [Math.random()]: 'update'\n }, old));\n };\n }, []);\n const [builderValueCollection, builderValueDispatchInternal] = (0,external_window_wp_element_.useReducer)(builderReducer, ct_footer_builder_objectSpread(ct_footer_builder_objectSpread({}, allBuilderSections), currentFooter.current ? {\n __forced_static_footer__: currentFooter.current\n } : {}));\n const [builderCollapsed, setBuilderCollapsed] = (0,external_window_wp_element_.useState)(false);\n const builderValue = (0,external_window_wp_element_.useMemo)(() => builderValueCollection.sections.find(_ref4 => {\n let {\n id\n } = _ref4;\n return id === builderValueCollection.__forced_static_footer__;\n }) || builderValueCollection.sections[0], [builderValueCollection]);\n const [isDragging, setIsDragging] = (0,external_window_wp_element_.useState)(false);\n const inlinedItemsFromBuilder = builderValue.rows.reduce((currentItems, _ref5) => {\n let {\n columns\n } = _ref5;\n return [...currentItems, ...(columns || []).reduce((c, items) => [...c, ...items], [])];\n }, []);\n const builderValueDispatch = (0,external_window_wp_element_.useCallback)(action => {\n let newState = builderReducer(builderValueCollection, action);\n\n if (action.type === 'BUILDER_GLOBAL_SETTING_ON_CHANGE' && wp.customize.previewer) {\n const builderValue = newState.sections.find(_ref6 => {\n let {\n id\n } = _ref6;\n return id === newState.__forced_static_footer__;\n }) || newState.sections[0];\n const {\n optionId,\n optionValue,\n values = {}\n } = action.payload;\n wp.customize.previewer.send('ct:footer:receive-value-update', {\n itemId: 'global',\n optionId,\n optionValue,\n values: ct_footer_builder_objectSpread(ct_footer_builder_objectSpread({}, builderValue.settings), {}, {\n [optionId]: optionValue\n })\n });\n }\n\n if (action.type === 'ITEM_VALUE_ON_CHANGE' && wp.customize.previewer) {\n const {\n id,\n optionId,\n optionValue,\n values = {}\n } = action.payload;\n const builderValue = newState.sections.find(_ref7 => {\n let {\n id\n } = _ref7;\n return id === newState.__forced_static_footer__;\n }) || newState.sections[0];\n let items = builderValue.items;\n const currentItem = items[id] || {\n values: {}\n };\n wp.customize.previewer.send('ct:footer:receive-value-update', {\n itemId: id,\n optionId,\n optionValue,\n values: ct_footer_builder_objectSpread(ct_footer_builder_objectSpread(ct_footer_builder_objectSpread(ct_footer_builder_objectSpread(ct_footer_builder_objectSpread({}, currentItem.values), values), id === 'top-row' || id === 'middle-row' || id === 'bottom-row' ? {\n items_per_row: builderValue.rows.find(_ref8 => {\n let {\n id: _id\n } = _ref8;\n return id === _id;\n }).columns.length\n } : {}), (id === 'top-row' || id === 'middle-row' || id === 'bottom-row') && optionId === 'items_per_row' ? {\n items_per_row: parseInt(optionValue, 10)\n } : {}), {}, {\n [optionId]: optionValue\n })\n });\n }\n\n onBuilderValueChange(newState);\n builderValueDispatchInternal(action);\n }, [builderValueDispatchInternal, onBuilderValueChange, builderValueCollection]);\n\n const setList = lists => builderValueDispatch({\n type: 'SET_LIST',\n onBuilderValueChange,\n payload: {\n lists\n }\n });\n\n (0,external_window_wp_element_.useEffect)(() => {\n return () => {\n document.querySelector('.wp-full-overlay').classList.remove('ct-builder-collapsed');\n };\n }, []);\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(DragDropContext.Provider, {\n value: {\n isDragging,\n setIsDragging,\n setList,\n builderValueDispatch,\n builderValueCollection,\n builderValue,\n onChange: _ref9 => {\n let {\n id,\n value\n } = _ref9;\n return setList({\n [id]: value\n });\n }\n }\n }, (0,external_window_wp_element_.createElement)(columns_AvailableItems, {\n builderValue: builderValue,\n inlinedItemsFromBuilder: inlinedItemsFromBuilder,\n builderValueDispatch: builderValueDispatch,\n builderValueCollection: builderValueCollection\n }), (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-builder-footer\"\n }, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-view-switch\"\n }, (0,external_window_wp_element_.createElement)(\"li\", {\n className: \"ct-builder-toggle\",\n onClick: () => {\n setBuilderCollapsed(!builderCollapsed);\n\n if (builderCollapsed) {\n document.querySelector('.wp-full-overlay').classList.remove('ct-builder-collapsed');\n } else {\n document.querySelector('.wp-full-overlay').classList.add('ct-builder-collapsed');\n }\n }\n }, builderCollapsed ? (0,external_window_wp_i18n_.__)('Show Builder', 'blocksy') : (0,external_window_wp_i18n_.__)('Hide Builder', 'blocksy'))), (0,external_window_wp_element_.createElement)(columns_ColumnsBuilder, {\n builderValue: builderValue\n })), document.querySelector('.ct-panel-builder'))));\n};\n\nFooterBuilder.renderingConfig = {\n design: 'none'\n};\n/* harmony default export */ const ct_footer_builder = (FooterBuilder);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgyMS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDdklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL2NvbHVtbnMvRHJhZ2dhYmxlSXRlbXMuanM/MTk3NSIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL2NvbHVtbnMvQ29sdW1uc0J1aWxkZXIuanM/NWFhNCIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL2NvbHVtbnMvYnVpbGRlci1zaWRlYmFyL1NlY29uZGFyeUl0ZW1zLmpzPzk1MDYiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9wYW5lbHMtYnVpbGRlci9jb2x1bW5zL2J1aWxkZXItc2lkZWJhci9JbnZpc2libGVQYW5lbHMuanM/MzgwMiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL2NvbHVtbnMvYnVpbGRlci1zaWRlYmFyL1BhbmVsc01hbmFnZXIuanM/NTdiZSIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL2NvbHVtbnMvQXZhaWxhYmxlSXRlbXMuanM/MjZlMyIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL2NvbHVtbnMvYnVpbGRlclJlZHVjZXIuanM/NTYyYiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3QtZm9vdGVyLWJ1aWxkZXIuanM/ZTgwZSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBfZXhjbHVkZWQgPSBbXCJpdGVtc1wiLCBcImRyYWdnYWJsZUlkXCIsIFwiaGFzUG9pbnRlcnNcIiwgXCJjbGFzc05hbWVcIiwgXCJ0YWdOYW1lXCIsIFwiZGlyZWN0aW9uXCIsIFwiZ3JvdXBcIiwgXCJvcHRpb25zXCIsIFwicHJvcHNGb3JJdGVtXCIsIFwicGFuZWxUeXBlXCIsIFwiZGlzcGxheVdyYXBwZXJcIl07XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCB1c2VDb250ZXh0IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgU29ydGFibGUgZnJvbSAnLi4vcGxhY2VtZW50cy9Tb3J0YWJsZSc7XG5pbXBvcnQgeyBEcmFnRHJvcENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9vcHRpb25zL29wdGlvbnMvY3QtZm9vdGVyLWJ1aWxkZXInO1xuaW1wb3J0IHsgUGFuZWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vb3B0aW9ucy9jb21wb25lbnRzL1BhbmVsTGV2ZWwnO1xuaW1wb3J0IHsgY3VzdG9tSXRlbXNTZXBhcmF0b3IsIGdldE9yaWdpbmFsSWQgfSBmcm9tICcuLi9wbGFjZW1lbnRzL2hlbHBlcnMnO1xuXG5jb25zdCBzaGFsbG93Q29tcGFyZSA9IChwcmV2LCBuZXh0KSA9PiB7XG4gIGZvciAobGV0IGtleSBpbiBuZXh0KSB7XG4gICAgaWYgKG5leHRba2V5XSAhPT0gcHJldltrZXldKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIG1lbW8oQ29tcG9uZW50KSB7XG4gIGxldCBhcmVFcXVhbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogc2hhbGxvd0NvbXBhcmU7XG4gIGxldCBwcmV2UHJvcHMgPSB7fTtcbiAgbGV0IHByZXZSZXN1bHQ7XG4gIHJldHVybiBuZXh0UHJvcHMgPT4ge1xuICAgIGlmIChwcmV2UmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgYXJlRXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpKSB7XG4gICAgICByZXR1cm4gcHJldlJlc3VsdDtcbiAgICB9XG5cbiAgICBwcmV2UHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgcHJldlJlc3VsdCA9IGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBuZXh0UHJvcHMpKTtcbiAgICByZXR1cm4gcHJldlJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdnYWJsZUl0ZW0gPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBpdGVtLFxuICAgIGluZGV4LFxuICAgIHBhbmVsVHlwZSxcbiAgICBvblJlbW92ZSxcbiAgICByZW5kZXJJdGVtLFxuICAgIG9uQ2xpY2ssXG4gICAgY2xhc3NOYW1lXG4gIH0gPSBfcmVmO1xuICBjb25zdCBpdGVtRGF0YSA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhW3BhbmVsVHlwZV0uZmluZChfcmVmMiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWYyO1xuICAgIHJldHVybiBpZCA9PT0gZ2V0T3JpZ2luYWxJZChpdGVtKTtcbiAgfSk7XG4gIGNvbnN0IHtcbiAgICBidWlsZGVyVmFsdWVcbiAgfSA9IHVzZUNvbnRleHQoRHJhZ0Ryb3BDb250ZXh0KTtcblxuICBpZiAocmVuZGVySXRlbSkge1xuICAgIHJldHVybiByZW5kZXJJdGVtKHtcbiAgICAgIGl0ZW0sXG4gICAgICBpdGVtRGF0YSxcbiAgICAgIGluZGV4XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIER5bmFtaWMgaXRlbXMgaGF2ZSBhIDogaW4gdGhlaXIgSURcbiAgICovXG5cblxuICBjb25zdCBhbGxEeW5hbWljSXRlbXMgPSBPYmplY3Qua2V5cyhidWlsZGVyVmFsdWUuaXRlbXMpLmZpbHRlcihpZCA9PiBpZC5pbmRleE9mKGN1c3RvbUl0ZW1zU2VwYXJhdG9yKCkpID4gLTEpO1xuICBjb25zdCBhbGxDbG9uZXNBbmRPcmlnaW5hbCA9IFtnZXRPcmlnaW5hbElkKGl0ZW0pLCAuLi5hbGxEeW5hbWljSXRlbXMuZmlsdGVyKGlkID0+IGdldE9yaWdpbmFsSWQoaWQpID09PSBnZXRPcmlnaW5hbElkKGl0ZW0pKV07XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBcImRhdGEtaWRcIjogaXRlbSxcbiAgICBjbGFzc05hbWU6IGNscygnY3QtYnVpbGRlci1pdGVtJywgY2xhc3NOYW1lLCB7Ly8gJ2N0LWlzLWRyYWdnaW5nJzogc25hcHNob3QuaXNEcmFnZ2luZ1xuICAgIH0pLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2tcbiAgfSwgaXRlbURhdGEgJiYgaXRlbURhdGEuY29uZmlnID8gYWxsQ2xvbmVzQW5kT3JpZ2luYWwubGVuZ3RoID4gMSA/IGAke2l0ZW1EYXRhLmNvbmZpZy5uYW1lfSAke2FsbENsb25lc0FuZE9yaWdpbmFsLmluZGV4T2YoaXRlbSkgKyAxfWAgOiBpdGVtRGF0YS5jb25maWcubmFtZSA6IGl0ZW0sIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1idG4tcmVtb3ZlXCIsXG4gICAgb25DbGljazogZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25SZW1vdmUoKTtcbiAgICB9XG4gIH0pKTtcbn07XG5cbmNvbnN0IERyYWdnYWJsZUl0ZW1zID0gX3JlZjMgPT4ge1xuICBsZXQge1xuICAgIGl0ZW1zLFxuICAgIGRyYWdnYWJsZUlkLFxuICAgIGhhc1BvaW50ZXJzID0gdHJ1ZSxcbiAgICBjbGFzc05hbWUsXG4gICAgdGFnTmFtZSA9ICdkaXYnLFxuICAgIGRpcmVjdGlvbiA9ICdob3Jpem9udGFsJyxcbiAgICBncm91cCA9ICdoZWFkZXJfc29ydGFibGVzJyxcbiAgICBvcHRpb25zID0ge30sXG4gICAgcHJvcHNGb3JJdGVtID0gaXRlbSA9PiAoe30pLFxuICAgIHBhbmVsVHlwZSA9ICdmb290ZXInLFxuICAgIGRpc3BsYXlXcmFwcGVyID0gdHJ1ZVxuICB9ID0gX3JlZjMsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMywgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCB7XG4gICAgaXNEcmFnZ2luZyxcbiAgICBzZXRJc0RyYWdnaW5nLFxuICAgIG9uQ2hhbmdlLFxuICAgIHNldExpc3RcbiAgfSA9IHVzZUNvbnRleHQoRHJhZ0Ryb3BDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIHBhbmVsc0hlbHBlcnNcbiAgfSA9IHVzZUNvbnRleHQoUGFuZWxDb250ZXh0KTtcbiAgY29uc3QgaXRlbXNPdXRwdXQgPSBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiBjcmVhdGVFbGVtZW50KERyYWdnYWJsZUl0ZW0sIF9leHRlbmRzKHtcbiAgICBrZXk6IGl0ZW0sXG4gICAgaW5kZXg6IGluZGV4LFxuICAgIHBhbmVsVHlwZTogcGFuZWxUeXBlLFxuICAgIGl0ZW06IGl0ZW0sXG4gICAgY2xhc3NOYW1lOiBwYW5lbHNIZWxwZXJzLmlzT3BlbkZvcihgYnVpbGRlcl9wYW5lbF8ke2l0ZW19YCkgPyAnY3QtY3VzdG9taXppbmcnIDogJycsXG4gICAgb25DbGljazogZSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcGFuZWxzSGVscGVycy5vcGVuKGBidWlsZGVyX3BhbmVsXyR7aXRlbX1gKTtcbiAgICB9LFxuICAgIG9uUmVtb3ZlOiAoKSA9PiB7XG4gICAgICBwYW5lbHNIZWxwZXJzLmNsb3NlKCk7XG4gICAgICBzZXRMaXN0KHtcbiAgICAgICAgW2RyYWdnYWJsZUlkXTogaXRlbXMuZmlsdGVyKGlkID0+IGlkICE9PSBpdGVtKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCBwcm9wc0Zvckl0ZW0oaXRlbSkpKSk7XG5cbiAgaWYgKCFkaXNwbGF5V3JhcHBlcikge1xuICAgIHJldHVybiBpdGVtc091dHB1dDtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFNvcnRhYmxlLCBfZXh0ZW5kcyh7XG4gICAgb3B0aW9uczogX29iamVjdFNwcmVhZCh7XG4gICAgICBkZWxheTogMCxcbiAgICAgIGdyb3VwLFxuICAgICAgZmFsbGJhY2tPbkJvZHk6IHRydWUsXG4gICAgICBmb3JjZUZhbGxiYWNrOiB0cnVlLFxuICAgICAgZmFsbGJhY2tUb2xlcmFuY2U6IDUsXG4gICAgICBmaWx0ZXI6ICcuY3QtcG9pbnRlcicsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIHRvdWNoU3RhcnRUaHJlc2hvbGQ6IDUsXG4gICAgICBvblN0YXJ0OiBldmVudCA9PiB7XG4gICAgICAgIHNldElzRHJhZ2dpbmcoZXZlbnQuaXRlbS5kYXRhc2V0LmlkKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdjdC1idWlsZGVyLWRyYWdnaW5nJyk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmZyb20gJiYgZ3JvdXAgJiYgZ3JvdXAucHVsbCAhPT0gJ2Nsb25lJykge1xuICAgICAgICAgIGV2ZW50LnRvLmNsYXNzTGlzdC5hZGQoJ2N0LWlzLW92ZXInKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uRW5kOiAoKSA9PiB7XG4gICAgICAgIHNldElzRHJhZ2dpbmcoZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2N0LWJ1aWxkZXItZHJhZ2dpbmcnKTtcbiAgICAgICAgWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jdC1wYW5lbC1idWlsZGVyIC5jdC1pcy1vdmVyJyldLm1hcChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjdC1pcy1vdmVyJykpO1xuICAgICAgfSxcbiAgICAgIG9uTW92ZTogKGV2ZW50LCBvcmlnaW5hbEV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5mcm9tLmNsb3Nlc3QoJyNjdC1vcHRpb24taGVhZGVyLWJ1aWxkZXItaXRlbXMnKSkge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gWy4uLmV2ZW50LmZyb20ucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtaWQ9XCIke2V2ZW50LmRyYWdnZWQuZGF0YXNldC5pZH1cIl1gKV0ubWFwKGVsID0+IHtcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2N0LWJ1aWxkZXItaXRlbScpO1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnY3QtaXRlbS1pbi1idWlsZGVyJyk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LnRvKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LnRvLmNoaWxkcmVuICYmIEFycmF5LmZyb20oZXZlbnQudG8uY2hpbGRyZW4pLmZpbHRlcihlID0+IGUuZGF0YXNldC5pZCAhPT0gJ19fcG9pbnRlcl9fJyAmJiBlLmRhdGFzZXQuaWQgIT09ICdfX2ZpbGxlcl9fJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIDtcbiAgICAgICAgICBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmN0LXBhbmVsLWJ1aWxkZXIgLmN0LWlzLW92ZXInKV0ubWFwKGVsID0+IGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2N0LWlzLW92ZXInKSk7XG4gICAgICAgICAgZXZlbnQudG8uY2xhc3NMaXN0LmFkZCgnY3QtaXMtb3ZlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgb3B0aW9ucyksXG4gICAgb25DaGFuZ2U6IChvcmRlciwgc29ydGFibGUsIGV2dCkgPT4ge1xuICAgICAgaWYgKGRyYWdnYWJsZUlkID09PSAnYXZhaWxhYmxlLWl0ZW1zJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG9uQ2hhbmdlKHtcbiAgICAgICAgaWQ6IGRyYWdnYWJsZUlkLFxuICAgICAgICB2YWx1ZTogb3JkZXIuZmlsdGVyKGkgPT4gaSAhPT0gJ19fcG9pbnRlcl9fJyAmJiBpICE9PSAnX19maWxsZXJfXycpXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHRhZzogdGFnTmFtZSxcbiAgICBjbGFzc05hbWU6IGNscygnY3QtYnVpbGRlci1pdGVtcycsIGNsYXNzTmFtZSlcbiAgfSwgcHJvcHMsIHtcbiAgICBcImRhdGEtaWRcIjogZHJhZ2dhYmxlSWRcbiAgfSksIGRyYWdnYWJsZUlkICE9PSAnYXZhaWxhYmxlLWl0ZW1zJyAmJiBpc0RyYWdnaW5nICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIFwiZGF0YS1pZFwiOiBcIl9fZmlsbGVyX19cIixcbiAgICBjbGFzc05hbWU6IFwiY3QtZmlsbGVyXCJcbiAgfSksIGhhc1BvaW50ZXJzICYmIGlzRHJhZ2dpbmcgJiYgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJkYXRhLWlkXCI6IFwiX19wb2ludGVyX19cIixcbiAgICBjbGFzc05hbWU6IFwiY3QtcG9pbnRlclwiXG4gIH0pLCBpdGVtc091dHB1dCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBEcmFnZ2FibGVJdGVtczsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCB1c2VDb250ZXh0IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IERyYWdnYWJsZUl0ZW1zIGZyb20gJy4vRHJhZ2dhYmxlSXRlbXMnO1xuaW1wb3J0IHsgUGFuZWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vb3B0aW9ucy9jb21wb25lbnRzL1BhbmVsTGV2ZWwnO1xuXG5jb25zdCBCYXIgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBiYXIsXG4gICAgYnVpbGRlclZhbHVlLFxuICAgIGRpcmVjdGlvbiA9ICdob3Jpem9udGFsJ1xuICB9ID0gX3JlZjtcbiAgY29uc3Qge1xuICAgIHBhbmVsc0hlbHBlcnNcbiAgfSA9IHVzZUNvbnRleHQoUGFuZWxDb250ZXh0KTtcbiAgY29uc3QgbWF5YmVWYWx1ZXMgPSBidWlsZGVyVmFsdWUuaXRlbXNbYmFyLmlkXTtcbiAgY29uc3QgYWxsSXRlbXMgPSBjdF9jdXN0b21pemVyX2xvY2FsaXphdGlvbnMuaGVhZGVyX2J1aWxkZXJfZGF0YS5mb290ZXI7XG4gIGNvbnN0IHByaW1hcnlJdGVtID0gYWxsSXRlbXMuZmluZChfcmVmMiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWYyO1xuICAgIHJldHVybiBpZCA9PT0gYmFyLmlkO1xuICB9KTtcbiAgY29uc3QgdmFsdWVzID0gbWF5YmVWYWx1ZXMgPyBtYXliZVZhbHVlcy52YWx1ZXMgOiB7fTtcbiAgbGV0IGNvbHVtbnMgPSAnaW5pdGlhbCc7XG5cbiAgaWYgKGJhci5jb2x1bW5zLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbHVtbnMgPSB2YWx1ZXNbJzJfY29sdW1uc19sYXlvdXQnXSB8fCB7XG4gICAgICBkZXNrdG9wOiAncmVwZWF0KDIsIDFmciknLFxuICAgICAgdGFibGV0OiAnaW5pdGlhbCcsXG4gICAgICBtb2JpbGU6ICdpbml0aWFsJ1xuICAgIH07XG4gIH1cblxuICBpZiAoYmFyLmNvbHVtbnMubGVuZ3RoID09PSAzKSB7XG4gICAgY29sdW1ucyA9IHZhbHVlc1snM19jb2x1bW5zX2xheW91dCddIHx8IHtcbiAgICAgIGRlc2t0b3A6ICdyZXBlYXQoMywgMWZyKScsXG4gICAgICB0YWJsZXQ6ICdpbml0aWFsJyxcbiAgICAgIG1vYmlsZTogJ2luaXRpYWwnXG4gICAgfTtcbiAgfVxuXG4gIGlmIChiYXIuY29sdW1ucy5sZW5ndGggPT09IDQpIHtcbiAgICBjb2x1bW5zID0gdmFsdWVzWyc0X2NvbHVtbnNfbGF5b3V0J10gfHwge1xuICAgICAgZGVza3RvcDogJ3JlcGVhdCg0LCAxZnIpJyxcbiAgICAgIHRhYmxldDogJ2luaXRpYWwnLFxuICAgICAgbW9iaWxlOiAnaW5pdGlhbCdcbiAgICB9O1xuICB9XG5cbiAgaWYgKGJhci5jb2x1bW5zLmxlbmd0aCA9PT0gNSkge1xuICAgIGNvbHVtbnMgPSB2YWx1ZXNbJzVfY29sdW1uc19sYXlvdXQnXSB8fCB7XG4gICAgICBkZXNrdG9wOiAncmVwZWF0KDUsIDFmciknLFxuICAgICAgdGFibGV0OiAnaW5pdGlhbCcsXG4gICAgICBtb2JpbGU6ICdpbml0aWFsJ1xuICAgIH07XG4gIH1cblxuICBpZiAoYmFyLmNvbHVtbnMubGVuZ3RoID09PSA2KSB7XG4gICAgY29sdW1ucyA9IHZhbHVlc1snNl9jb2x1bW5zX2xheW91dCddIHx8IHtcbiAgICAgIGRlc2t0b3A6ICdyZXBlYXQoNiwgMWZyKScsXG4gICAgICB0YWJsZXQ6ICdpbml0aWFsJyxcbiAgICAgIG1vYmlsZTogJ2luaXRpYWwnXG4gICAgfTtcbiAgfVxuXG4gIGlmIChjb2x1bW5zICYmIGNvbHVtbnMuZGVza3RvcCkge1xuICAgIGNvbHVtbnMgPSBjb2x1bW5zLmRlc2t0b3A7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiYnVpbGRlci1yb3dcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtcm93LWFjdGlvbnNcIixcbiAgICBvbkNsaWNrOiAoKSA9PiBwYW5lbHNIZWxwZXJzLm9wZW4oYGJ1aWxkZXJfcGFuZWxfJHtiYXIuaWR9YClcbiAgfSwge1xuICAgICd0b3Atcm93JzogX18oJ1RvcCBSb3cnLCAnYmxvY2tzeScpLFxuICAgICdtaWRkbGUtcm93JzogX18oJ01pZGRsZSBSb3cnLCAnYmxvY2tzeScpLFxuICAgICdib3R0b20tcm93JzogX18oJ0JvdHRvbSBSb3cnLCAnYmxvY2tzeScpXG4gIH1bYmFyLmlkXSksIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcInJvdy1pbm5lclwiLFxuICAgIHN0eWxlOiB7XG4gICAgICAnLS1ncmlkVGVtcGxhdGVDb2x1bW1ucyc6IGNvbHVtbnNcbiAgICB9XG4gIH0sIGJhci5jb2x1bW5zLm1hcCgoY29sdW1uLCBpbmRleCkgPT4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiYnVpbGRlci1jb2x1bW5cIixcbiAgICBrZXk6IGluZGV4XG4gIH0sIGNyZWF0ZUVsZW1lbnQoRHJhZ2dhYmxlSXRlbXMsIHtcbiAgICBkcmFnZ2FibGVJZDogYCR7YmFyLmlkfToke2luZGV4fWAsXG4gICAgaXRlbXM6IGNvbHVtblxuICB9KSkpKSk7XG59O1xuXG5jb25zdCBzaGFsbG93Q29tcGFyZSA9IChwcmV2LCBuZXh0KSA9PiB7XG4gIGZvciAobGV0IGtleSBpbiBuZXh0KSB7XG4gICAgaWYgKG5leHRba2V5XSAhPT0gcHJldltrZXldKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBtZW1vKENvbXBvbmVudCkge1xuICBsZXQgYXJlRXF1YWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHNoYWxsb3dDb21wYXJlO1xuICBsZXQgcHJldlByb3BzID0ge307XG4gIGxldCBwcmV2UmVzdWx0O1xuICByZXR1cm4gbmV4dFByb3BzID0+IHtcbiAgICBpZiAocHJldlJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGFyZUVxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSkge1xuICAgICAgcmV0dXJuIHByZXZSZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJldlByb3BzID0gbmV4dFByb3BzO1xuICAgIHByZXZSZXN1bHQgPSBjcmVhdGVFbGVtZW50KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgbmV4dFByb3BzKSk7XG4gICAgcmV0dXJuIHByZXZSZXN1bHQ7XG4gIH07XG59XG5jb25zdCBDb2x1bW5zQnVpbGRlciA9IG1lbW8oX3JlZjMgPT4ge1xuICBsZXQge1xuICAgIGJ1aWxkZXJWYWx1ZVxuICB9ID0gX3JlZjM7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNscygncGxhY2VtZW50cy1idWlsZGVyJylcbiAgfSwgY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiaG9yaXpvbnRhbC1yb3dzXCJcbiAgfSwgWyd0b3Atcm93JywgJ21pZGRsZS1yb3cnLCAnYm90dG9tLXJvdyddLm1hcChiYXIgPT4gY3JlYXRlRWxlbWVudChCYXIsIHtcbiAgICBidWlsZGVyVmFsdWU6IGJ1aWxkZXJWYWx1ZSxcbiAgICBiYXI6IGJ1aWxkZXJWYWx1ZS5yb3dzLmZpbmQoX3JlZjQgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgaWRcbiAgICAgIH0gPSBfcmVmNDtcbiAgICAgIHJldHVybiBpZCA9PT0gYmFyO1xuICAgIH0pLFxuICAgIGtleTogYmFyXG4gIH0pKSkpO1xufSk7IC8vIGNvbnN0IENvbHVtbnNCdWlsZGVyID0gKCkgPT4gbnVsbFxuXG5leHBvcnQgZGVmYXVsdCBDb2x1bW5zQnVpbGRlcjsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlQ29udGV4dCwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IERyYWdnYWJsZUl0ZW1zIGZyb20gJy4uL0RyYWdnYWJsZUl0ZW1zJztcbmltcG9ydCB7IERyYWdEcm9wQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uLy4uL29wdGlvbnMvb3B0aW9ucy9jdC1mb290ZXItYnVpbGRlcic7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFBhbmVsLCB7IFBhbmVsTWV0YVdyYXBwZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9vcHRpb25zL29wdGlvbnMvY3QtcGFuZWwnO1xuaW1wb3J0IHsgZ2V0VmFsdWVGcm9tSW5wdXQgfSBmcm9tICcuLi8uLi8uLi8uLi9vcHRpb25zL2hlbHBlcnMvZ2V0LXZhbHVlLWZyb20taW5wdXQnO1xuaW1wb3J0IHsgZ2V0T3JpZ2luYWxJZCwgY3VzdG9tSXRlbXNTZXBhcmF0b3IgfSBmcm9tICcuLi8uLi9wbGFjZW1lbnRzL2hlbHBlcnMnO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gJ0B3b3JkcHJlc3MvY29tcG9uZW50cyc7XG5cbmNvbnN0IFNlY29uZGFyeUl0ZW1zID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgYnVpbGRlclZhbHVlLFxuICAgIGJ1aWxkZXJWYWx1ZURpc3BhdGNoLFxuICAgIGlubGluZWRJdGVtc0Zyb21CdWlsZGVyLFxuICAgIGRpc3BsYXlMaXN0ID0gdHJ1ZVxuICB9ID0gX3JlZjtcbiAgY29uc3Qge1xuICAgIHBhbmVsc1N0YXRlLFxuICAgIHBhbmVsc0FjdGlvbnMsXG4gICAgY3VycmVudFZpZXcsXG4gICAgaXNEcmFnZ2luZ1xuICB9ID0gdXNlQ29udGV4dChEcmFnRHJvcENvbnRleHQpO1xuICBjb25zdCBpbmxpbmVkSXRlbXNGcm9tQWxsVmlld3NCdWlsZGVyID0gYnVpbGRlclZhbHVlLnJvd3MucmVkdWNlKChjdXJyZW50SXRlbXMsIF9yZWYyKSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGNvbHVtbnNcbiAgICB9ID0gX3JlZjI7XG4gICAgcmV0dXJuIFsuLi5jdXJyZW50SXRlbXMsIC4uLihjb2x1bW5zIHx8IFtdKS5yZWR1Y2UoKGMsIGl0ZW1zKSA9PiBbLi4uYywgLi4uaXRlbXNdLCBbXSldO1xuICB9LCBbXSk7XG4gIGNvbnN0IHNlY29uZGFyeUl0ZW1zID0gY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zLmhlYWRlcl9idWlsZGVyX2RhdGEuc2Vjb25kYXJ5X2l0ZW1zLmZvb3Rlci5maWx0ZXIoX3JlZjMgPT4ge1xuICAgIGxldCB7XG4gICAgICBjb25maWdcbiAgICB9ID0gX3JlZjM7XG4gICAgcmV0dXJuICgvLyBjb25maWcuZGV2aWNlcy5pbmRleE9mKGN1cnJlbnRWaWV3KSA+IC0xICYmXG4gICAgICBjb25maWcuZW5hYmxlZFxuICAgICk7XG4gIH0pO1xuICBjb25zdCBhbGxJdGVtcyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLmZvb3RlcjtcbiAgLyoqXG4gICAqIER5bmFtaWMgaXRlbXMgaGF2ZSBhIDogaW4gdGhlaXIgSURcbiAgICovXG5cbiAgY29uc3QgYWxsRHluYW1pY0l0ZW1zID0gT2JqZWN0LmtleXMoYnVpbGRlclZhbHVlLml0ZW1zKS5maWx0ZXIoaWQgPT4gaWQuaW5kZXhPZihjdXN0b21JdGVtc1NlcGFyYXRvcigpKSA+IC0xKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRHJhZ2dhYmxlSXRlbXMsIHtcbiAgICBvcHRpb25zOiB7XG4gICAgICBzb3J0OiBmYWxzZSxcbiAgICAgIGZpbHRlcjogJy5jdC1pdGVtLWluLWJ1aWxkZXInXG4gICAgfSxcbiAgICBncm91cDoge1xuICAgICAgbmFtZTogJ2hlYWRlcl9zb3J0YWJsZXMnLFxuICAgICAgcHV0OiBmYWxzZSxcbiAgICAgIHB1bGw6ICdjbG9uZSdcbiAgICB9LFxuICAgIGRyYWdnYWJsZUlkOiAnYXZhaWxhYmxlLWl0ZW1zJyxcbiAgICBpdGVtczogWy4uLnNlY29uZGFyeUl0ZW1zLm1hcChfcmVmNCA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpZFxuICAgICAgfSA9IF9yZWY0O1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pLCAuLi5hbGxEeW5hbWljSXRlbXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFJdGVtRGF0YSA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhWydmb290ZXInXS5maW5kKF9yZWY1ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpZFxuICAgICAgICB9ID0gX3JlZjU7XG4gICAgICAgIHJldHVybiBpZCA9PT0gZ2V0T3JpZ2luYWxJZChhKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYkl0ZW1EYXRhID0gY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zLmhlYWRlcl9idWlsZGVyX2RhdGFbJ2Zvb3RlciddLmZpbmQoX3JlZjYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0gPSBfcmVmNjtcbiAgICAgICAgcmV0dXJuIGlkID09PSBnZXRPcmlnaW5hbElkKGIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYUl0ZW1EYXRhLmNvbmZpZy5uYW1lLmxvY2FsZUNvbXBhcmUoYkl0ZW1EYXRhLmNvbmZpZy5uYW1lKTtcbiAgICB9KSxcbiAgICBoYXNQb2ludGVyczogZmFsc2UsXG4gICAgcGFuZWxUeXBlOiBcImZvb3RlclwiLFxuICAgIGRpc3BsYXlXcmFwcGVyOiBkaXNwbGF5TGlzdCxcbiAgICBwcm9wc0Zvckl0ZW06IGl0ZW0gPT4gKHtcbiAgICAgIHJlbmRlckl0ZW06IF9yZWY3ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGl0ZW1EYXRhLFxuICAgICAgICAgIGluZGV4XG4gICAgICAgIH0gPSBfcmVmNztcbiAgICAgICAgY29uc3QgaXRlbU9wdGlvbnMgPSBhbGxJdGVtcy5maW5kKF9yZWY4ID0+IHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9ID0gX3JlZjg7XG4gICAgICAgICAgcmV0dXJuIGlkID09PSBnZXRPcmlnaW5hbElkKGl0ZW0pO1xuICAgICAgICB9KS5vcHRpb25zO1xuICAgICAgICBjb25zdCBhbGxDbG9uZXNBbmRPcmlnaW5hbCA9IFtnZXRPcmlnaW5hbElkKGl0ZW0pLCAuLi5hbGxEeW5hbWljSXRlbXMuZmlsdGVyKGlkID0+IGdldE9yaWdpbmFsSWQoaWQpID09PSBnZXRPcmlnaW5hbElkKGl0ZW0pKV07XG4gICAgICAgIGNvbnN0IGl0ZW1OYW1lID0gYWxsQ2xvbmVzQW5kT3JpZ2luYWwubGVuZ3RoID4gMSA/IGAke2l0ZW1EYXRhLmNvbmZpZy5uYW1lfSAke2FsbENsb25lc0FuZE9yaWdpbmFsLmluZGV4T2YoaXRlbSkgKyAxfWAgOiBpdGVtRGF0YS5jb25maWcubmFtZTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgICAgIGxhYmVsOiBpdGVtTmFtZSxcbiAgICAgICAgICAnaW5uZXItb3B0aW9ucyc6IGl0ZW1PcHRpb25zXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGl0ZW1JbkJ1aWxkZXIgPSBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlci5pbmRleE9mKGl0ZW0pID4gLTE7XG4gICAgICAgIGNvbnN0IGlkID0gYGJ1aWxkZXJfcGFuZWxfJHtpdGVtfWA7XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFBhbmVsTWV0YVdyYXBwZXIsIF9leHRlbmRzKHtcbiAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgb3B0aW9uOiBvcHRpb25cbiAgICAgICAgfSwgcGFuZWxzQWN0aW9ucywge1xuICAgICAgICAgIGdldEFjdHVhbE9wdGlvbjogX3JlZjkgPT4ge1xuICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgb3BlbixcbiAgICAgICAgICAgICAgY29udGFpbmVyXG4gICAgICAgICAgICB9ID0gX3JlZjk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgaW5saW5lZEl0ZW1zRnJvbUFsbFZpZXdzQnVpbGRlci5pbmRleE9mKGl0ZW0pID4gLTEgJiYgY3JlYXRlRWxlbWVudChQYW5lbCwge1xuICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgIGdldFZhbHVlczogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpdGVtVmFsdWUgPSBidWlsZGVyVmFsdWUuaXRlbXNbaXRlbV07XG5cbiAgICAgICAgICAgICAgICBpZiAoaXRlbVZhbHVlICYmIE9iamVjdC5rZXlzKGl0ZW1WYWx1ZS52YWx1ZXMpID4gNSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1WYWx1ZS52YWx1ZXM7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlRnJvbUlucHV0KGl0ZW1PcHRpb25zLCBpdGVtVmFsdWUgPyBpdGVtVmFsdWUudmFsdWVzIDoge30pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcHRpb246IG9wdGlvbixcbiAgICAgICAgICAgICAgb25DaGFuZ2VGb3I6IChvcHRpb25JZCwgb3B0aW9uVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBidWlsZGVyVmFsdWUuaXRlbXNbaXRlbV07XG4gICAgICAgICAgICAgICAgYnVpbGRlclZhbHVlRGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ0lURU1fVkFMVUVfT05fQ0hBTkdFJyxcbiAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAhY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZSAmJiBPYmplY3Qua2V5cyhjdXJyZW50VmFsdWUudmFsdWVzKS5sZW5ndGggPT09IDAgPyBnZXRWYWx1ZUZyb21JbnB1dChpdGVtT3B0aW9ucywge30pIDoge31cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmlldzogXCJzaW1wbGVcIlxuICAgICAgICAgICAgfSksIGRpc3BsYXlMaXN0ICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgICByZWY6IGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgXCJkYXRhLWlkXCI6IGl0ZW0sXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogY2xzKHtcbiAgICAgICAgICAgICAgICAnY3QtaXRlbS1pbi1idWlsZGVyJzogaXRlbUluQnVpbGRlcixcbiAgICAgICAgICAgICAgICAnY3QtYnVpbGRlci1pdGVtJzogIWl0ZW1JbkJ1aWxkZXJcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGl0ZW1JbkJ1aWxkZXIgJiYgb3BlbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBpdGVtTmFtZSwgY3JlYXRlRWxlbWVudChTbG90LCB7XG4gICAgICAgICAgICAgIG5hbWU6IGBDb2x1bW5zQnVpbGRlclNpZGViYXJJdGVtXyR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgZmlsbFByb3BzOiB7XG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBpdGVtSW5CdWlsZGVyLFxuICAgICAgICAgICAgICAgIGl0ZW1EYXRhXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCJcbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTZWNvbmRhcnlJdGVtczsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlQ29udGV4dCwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQYW5lbCwgeyBQYW5lbE1ldGFXcmFwcGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vb3B0aW9ucy9vcHRpb25zL2N0LXBhbmVsJztcbmltcG9ydCB7IGdldFZhbHVlRnJvbUlucHV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vb3B0aW9ucy9oZWxwZXJzL2dldC12YWx1ZS1mcm9tLWlucHV0JztcbmltcG9ydCB7IERyYWdEcm9wQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uLy4uL29wdGlvbnMvb3B0aW9ucy9jdC1mb290ZXItYnVpbGRlcic7XG5cbmNvbnN0IEludmlzaWJsZVBhbmVscyA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGJ1aWxkZXJWYWx1ZSxcbiAgICBidWlsZGVyVmFsdWVEaXNwYXRjaFxuICB9ID0gX3JlZjtcbiAgY29uc3Qgc2Vjb25kYXJ5SXRlbXMgPSBjdF9jdXN0b21pemVyX2xvY2FsaXphdGlvbnMuaGVhZGVyX2J1aWxkZXJfZGF0YS5zZWNvbmRhcnlfaXRlbXMuZm9vdGVyO1xuICBjb25zdCBhbGxJdGVtcyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLmZvb3RlcjtcbiAgY29uc3Qge1xuICAgIHBhbmVsc1N0YXRlLFxuICAgIHBhbmVsc0FjdGlvbnNcbiAgfSA9IHVzZUNvbnRleHQoRHJhZ0Ryb3BDb250ZXh0KTtcbiAgY29uc3QgcHJpbWFyeUl0ZW1zID0gYWxsSXRlbXMuZmlsdGVyKF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAgaWRcbiAgICB9ID0gX3JlZjI7XG4gICAgcmV0dXJuICFzZWNvbmRhcnlJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gaWQpO1xuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIHByaW1hcnlJdGVtcy5tYXAocHJpbWFyeUl0ZW0gPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IHtcbiAgICAgIGxhYmVsOiBwcmltYXJ5SXRlbS5jb25maWcubmFtZSxcbiAgICAgICdpbm5lci1vcHRpb25zJzogcHJpbWFyeUl0ZW0ub3B0aW9uc1xuICAgIH07XG4gICAgY29uc3QgaWQgPSBgYnVpbGRlcl9wYW5lbF8ke3ByaW1hcnlJdGVtLmlkfWA7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoUGFuZWxNZXRhV3JhcHBlciwgX2V4dGVuZHMoe1xuICAgICAgaWQ6IGlkLFxuICAgICAga2V5OiBwcmltYXJ5SXRlbS5pZCxcbiAgICAgIG9wdGlvbjogb3B0aW9uXG4gICAgfSwgcGFuZWxzQWN0aW9ucywge1xuICAgICAgZ2V0QWN0dWFsT3B0aW9uOiBfcmVmMyA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY29udGFpbmVyXG4gICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoUGFuZWwsIHtcbiAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgZ2V0VmFsdWVzOiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXRlbVZhbHVlID0gYnVpbGRlclZhbHVlLml0ZW1zW3ByaW1hcnlJdGVtLmlkXTtcbiAgICAgICAgICAgIGNvbnN0IG1heWJlUm93ID0gYnVpbGRlclZhbHVlLnJvd3MuZmluZChfcmVmNCA9PiB7XG4gICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgfSA9IF9yZWY0O1xuICAgICAgICAgICAgICByZXR1cm4gaWQgPT09IHByaW1hcnlJdGVtLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgaGFzV2lkZ2V0QXJlYXMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKG1heWJlUm93KSB7XG4gICAgICAgICAgICAgIGlmIChtYXliZVJvdy5jb2x1bW5zLnJlZHVjZSgoYWxsSXRlbXMsIGN1cnJlbnQpID0+IFsuLi5hbGxJdGVtcywgY3VycmVudF0sIFtdKS5qb2luKCcnKS5pbmRleE9mKCd3aWRnZXQtYXJlYScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBoYXNXaWRnZXRBcmVhcyA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGl0ZW1WYWx1ZSAmJiBPYmplY3Qua2V5cyhpdGVtVmFsdWUudmFsdWVzKSA+IDUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaXRlbVZhbHVlLnZhbHVlcyksIG1heWJlUm93ID8ge1xuICAgICAgICAgICAgICAgIGl0ZW1zX3Blcl9yb3c6IG1heWJlUm93LmNvbHVtbnMubGVuZ3RoLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgaGFzX3dpZGdldF9hcmVhczogaGFzV2lkZ2V0QXJlYXMgPyAneWVzJyA6ICdubydcbiAgICAgICAgICAgICAgfSA6IHt9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0VmFsdWVGcm9tSW5wdXQocHJpbWFyeUl0ZW0ub3B0aW9ucywgaXRlbVZhbHVlID8gaXRlbVZhbHVlLnZhbHVlcyA6IHt9KSksIG1heWJlUm93ID8ge1xuICAgICAgICAgICAgICBpdGVtc19wZXJfcm93OiBtYXliZVJvdy5jb2x1bW5zLmxlbmd0aC50b1N0cmluZygpLFxuICAgICAgICAgICAgICBoYXNfd2lkZ2V0X2FyZWFzOiBoYXNXaWRnZXRBcmVhcyA/ICd5ZXMnIDogJ25vJ1xuICAgICAgICAgICAgfSA6IHt9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbjogb3B0aW9uLFxuICAgICAgICAgIG9uQ2hhbmdlRm9yOiAob3B0aW9uSWQsIG9wdGlvblZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBidWlsZGVyVmFsdWUuaXRlbXNbcHJpbWFyeUl0ZW0uaWRdO1xuICAgICAgICAgICAgYnVpbGRlclZhbHVlRGlzcGF0Y2goe1xuICAgICAgICAgICAgICB0eXBlOiAnSVRFTV9WQUxVRV9PTl9DSEFOR0UnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHByaW1hcnlJdGVtLmlkLFxuICAgICAgICAgICAgICAgIG9wdGlvbklkLFxuICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgIHZhbHVlczogIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUgJiYgT2JqZWN0LmtleXMoY3VycmVudFZhbHVlLnZhbHVlcykubGVuZ3RoID09PSAwID8gZ2V0VmFsdWVGcm9tSW5wdXQocHJpbWFyeUl0ZW0ub3B0aW9ucywge30pIDoge31cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aWV3OiBcInNpbXBsZVwiXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEludmlzaWJsZVBhbmVsczsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlQ29udGV4dCwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IERyYWdEcm9wQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uLy4uL29wdGlvbnMvb3B0aW9ucy9jdC1mb290ZXItYnVpbGRlcic7XG5pbXBvcnQgUGFuZWwsIHsgUGFuZWxNZXRhV3JhcHBlciB9IGZyb20gJy4uLy4uLy4uLy4uL29wdGlvbnMvb3B0aW9ucy9jdC1wYW5lbCc7XG5pbXBvcnQgeyBnZXRWYWx1ZUZyb21JbnB1dCB9IGZyb20gJy4uLy4uLy4uLy4uL29wdGlvbnMvaGVscGVycy9nZXQtdmFsdWUtZnJvbS1pbnB1dCc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuXG5jb25zdCBQYW5lbHNNYW5hZ2VyID0gKCkgPT4ge1xuICBjb25zdCBzZWNvbmRhcnlJdGVtcyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLnNlY29uZGFyeV9pdGVtcy5mb290ZXI7XG4gIGNvbnN0IGFsbEl0ZW1zID0gY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zLmhlYWRlcl9idWlsZGVyX2RhdGEuZm9vdGVyO1xuICBjb25zdCB7XG4gICAgYnVpbGRlclZhbHVlQ29sbGVjdGlvbixcbiAgICBidWlsZGVyVmFsdWUsXG4gICAgYnVpbGRlclZhbHVlRGlzcGF0Y2gsXG4gICAgcGFuZWxzQWN0aW9uc1xuICB9ID0gdXNlQ29udGV4dChEcmFnRHJvcENvbnRleHQpO1xuICBjb25zdCBhbGxTZWN0aW9ucyA9IGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb24uc2VjdGlvbnMuZmlsdGVyKF9yZWYgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmO1xuICAgIHJldHVybiBpZCAhPT0gJ3R5cGUtMicgJiYgaWQgIT09ICd0eXBlLTMnICYmIGlkLmluZGV4T2YoJ2N0LWN1c3RvbScpID09PSAtMTtcbiAgfSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtcGFuZWxzLW1hbmFnZXJcIlxuICB9LCBhbGxTZWN0aW9ucy5tYXAoX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBuYW1lLFxuICAgICAgaWRcbiAgICB9ID0gX3JlZjI7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgbmFtZSk7XG4gIH0pLCBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzKCdjdC1wYW5lbHMtbGlzdCcpXG4gIH0sIGFsbFNlY3Rpb25zLm1hcChfcmVmMyA9PiB7XG4gICAgbGV0IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZFxuICAgIH0gPSBfcmVmMztcbiAgICBsZXQgcGFuZWxMYWJlbCA9IG5hbWUgfHwge1xuICAgICAgJ3R5cGUtMSc6IF9fKCdHbG9iYWwgRm9vdGVyJywgJ2Jsb2Nrc3knKVxuICAgIH1baWRdIHx8IGlkO1xuICAgIGNvbnN0IHBhbmVsSWQgPSBgYnVpbGRlcl9mb290ZXJfcGFuZWxfJHtpZH1gO1xuICAgIGNvbnN0IGZvb3Rlck9wdGlvbnMgPSBjdF9jdXN0b21pemVyX2xvY2FsaXphdGlvbnMuaGVhZGVyX2J1aWxkZXJfZGF0YS5mb290ZXJfZGF0YS5mb290ZXJfb3B0aW9ucztcbiAgICBjb25zdCBvcHRpb24gPSB7XG4gICAgICBsYWJlbDogcGFuZWxMYWJlbCxcbiAgICAgICdpbm5lci1vcHRpb25zJzogZm9vdGVyT3B0aW9uc1xuICAgIH07XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoUGFuZWxNZXRhV3JhcHBlciwgX2V4dGVuZHMoe1xuICAgICAgaWQ6IHBhbmVsSWQsXG4gICAgICBrZXk6IGlkLFxuICAgICAgb3B0aW9uOiBvcHRpb25cbiAgICB9LCBwYW5lbHNBY3Rpb25zLCB7XG4gICAgICBnZXRBY3R1YWxPcHRpb246IF9yZWY0ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBvcGVuXG4gICAgICAgIH0gPSBfcmVmNDtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGlkID09PSBidWlsZGVyVmFsdWUuaWQgJiYgY3JlYXRlRWxlbWVudChQYW5lbCwge1xuICAgICAgICAgIGlkOiBwYW5lbElkLFxuICAgICAgICAgIGdldFZhbHVlczogKCkgPT4gZ2V0VmFsdWVGcm9tSW5wdXQoZm9vdGVyT3B0aW9ucywgQXJyYXkuaXNBcnJheShidWlsZGVyVmFsdWUuc2V0dGluZ3MpID8ge30gOiBidWlsZGVyVmFsdWUuc2V0dGluZ3MpLFxuICAgICAgICAgIG9wdGlvbjogb3B0aW9uLFxuICAgICAgICAgIG9uQ2hhbmdlRm9yOiAob3B0aW9uSWQsIG9wdGlvblZhbHVlKSA9PiB7XG4gICAgICAgICAgICBidWlsZGVyVmFsdWVEaXNwYXRjaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdCVUlMREVSX0dMT0JBTF9TRVRUSU5HX09OX0NIQU5HRScsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBvcHRpb25JZCxcbiAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZpZXc6IFwic2ltcGxlXCJcbiAgICAgICAgfSksIGlkID09PSBidWlsZGVyVmFsdWUuaWQgJiYgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNscyh7XG4gICAgICAgICAgICBhY3RpdmU6IGlkID09PSBidWlsZGVyVmFsdWUuaWQsXG4gICAgICAgICAgICAnY3QtZ2xvYmFsJzogaWQgPT09ICd0eXBlLTEnXG4gICAgICAgICAgfSksXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgb3BlbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJjdC1wYW5lbC1uYW1lXCJcbiAgICAgICAgfSwgcGFuZWxMYWJlbCkpKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQYW5lbHNNYW5hZ2VyOyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgdXNlU3RhdGUsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBEcmFnZ2FibGVJdGVtcyBmcm9tICcuL0RyYWdnYWJsZUl0ZW1zJztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUGFuZWwsIHsgUGFuZWxNZXRhV3JhcHBlciB9IGZyb20gJy4uLy4uLy4uL29wdGlvbnMvb3B0aW9ucy9jdC1wYW5lbCc7XG5pbXBvcnQgeyBnZXRWYWx1ZUZyb21JbnB1dCB9IGZyb20gJy4uLy4uLy4uL29wdGlvbnMvaGVscGVycy9nZXQtdmFsdWUtZnJvbS1pbnB1dCc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IE9wdGlvbnNQYW5lbCBmcm9tICcuLi8uLi8uLi9vcHRpb25zL09wdGlvbnNQYW5lbCc7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSAnQHdvcmRwcmVzcy9jb21wb25lbnRzJztcbmltcG9ydCBTZWNvbmRhcnlJdGVtcyBmcm9tICcuL2J1aWxkZXItc2lkZWJhci9TZWNvbmRhcnlJdGVtcyc7XG5pbXBvcnQgSW52aXNpYmxlUGFuZWxzIGZyb20gJy4vYnVpbGRlci1zaWRlYmFyL0ludmlzaWJsZVBhbmVscyc7XG5pbXBvcnQgUGFuZWxzTWFuYWdlciBmcm9tICcuL2J1aWxkZXItc2lkZWJhci9QYW5lbHNNYW5hZ2VyJztcblxuY29uc3QgQXZhaWxhYmxlSXRlbXMgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBidWlsZGVyVmFsdWUsXG4gICAgYnVpbGRlclZhbHVlQ29sbGVjdGlvbixcbiAgICBidWlsZGVyVmFsdWVEaXNwYXRjaCxcbiAgICBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlclxuICB9ID0gX3JlZjtcbiAgLy8gcGFuZWxzIHwgaXRlbXMgfCBvcHRpb25zXG4gIGNvbnN0IFtjdXJyZW50VGFiLCBzZXRDdXJyZW50VGFiXSA9IHVzZVN0YXRlKCdpdGVtcycpO1xuICBjb25zdCBzZWNvbmRhcnlJdGVtcyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLnNlY29uZGFyeV9pdGVtcy5mb290ZXI7XG4gIGNvbnN0IGFsbEl0ZW1zID0gY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zLmhlYWRlcl9idWlsZGVyX2RhdGEuZm9vdGVyO1xuICBjb25zdCBmb290ZXJPcHRpb25zID0gY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zLmhlYWRlcl9idWlsZGVyX2RhdGEuZm9vdGVyX2RhdGEuZm9vdGVyX29wdGlvbnM7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtYXZhaWxhYmxlLWl0ZW1zIGN0LWZvb3Rlci1idWlsZGVyLW9wdGlvbnNcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC10aXRsZVwiLFxuICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICBfX2h0bWw6IHNwcmludGYoX18oJ0N1c3RvbWl6aW5nOiAlcycsICdibG9ja3N5JyksIGA8c3Bhbj4keyhidWlsZGVyVmFsdWVDb2xsZWN0aW9uLnNlY3Rpb25zLmZpbmQoX3JlZjIgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0gPSBfcmVmMjtcbiAgICAgICAgcmV0dXJuIGlkID09PSBidWlsZGVyVmFsdWUuaWQ7XG4gICAgICB9KSB8fCB7fSkubmFtZSB8fCB7XG4gICAgICAgICd0eXBlLTEnOiBfXygnR2xvYmFsIEZvb3RlcicsICdibG9ja3N5JylcbiAgICAgIH1bYnVpbGRlclZhbHVlLmlkXSB8fCBidWlsZGVyVmFsdWUuaWR9PC9zcGFuPmApXG4gICAgfVxuICB9KSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXRhYnNcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwidWxcIiwgbnVsbCwgWydpdGVtcycsICdwYW5lbHMnXS5tYXAodGFiID0+IGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiB0YWIsXG4gICAgb25DbGljazogZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRDdXJyZW50VGFiKHRhYik7XG4gICAgfSxcbiAgICBjbGFzc05hbWU6IGNscyh7XG4gICAgICBhY3RpdmU6IHRhYiA9PT0gY3VycmVudFRhYlxuICAgIH0pXG4gIH0sIHtcbiAgICBwYW5lbHM6IF9fKCdGb290ZXJzJywgJ2Jsb2Nrc3knKSxcbiAgICBpdGVtczogX18oJ0VsZW1lbnRzJywgJ2Jsb2Nrc3knKVxuICB9W3RhYl0pKSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1jdXJyZW50LXRhYlwiXG4gIH0sIGN1cnJlbnRUYWIgPT09ICdwYW5lbHMnICYmIGNyZWF0ZUVsZW1lbnQoU2xvdCwge1xuICAgIG5hbWU6IFwiQ29sdW1uc0J1aWxkZXJQYW5lbHNNYW5hZ2VyXCJcbiAgfSwgZmlsbHMgPT4gZmlsbHMubGVuZ3RoID09PSAwID8gY3JlYXRlRWxlbWVudChQYW5lbHNNYW5hZ2VyLCBudWxsKSA6IGZpbGxzKSwgY3JlYXRlRWxlbWVudChTZWNvbmRhcnlJdGVtcywge1xuICAgIGJ1aWxkZXJWYWx1ZTogYnVpbGRlclZhbHVlLFxuICAgIGJ1aWxkZXJWYWx1ZURpc3BhdGNoOiBidWlsZGVyVmFsdWVEaXNwYXRjaCxcbiAgICBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlcjogaW5saW5lZEl0ZW1zRnJvbUJ1aWxkZXIsXG4gICAgZGlzcGxheUxpc3Q6IGN1cnJlbnRUYWIgPT09ICdpdGVtcydcbiAgfSkpKSwgY3JlYXRlRWxlbWVudChJbnZpc2libGVQYW5lbHMsIHtcbiAgICBidWlsZGVyVmFsdWU6IGJ1aWxkZXJWYWx1ZSxcbiAgICBidWlsZGVyVmFsdWVEaXNwYXRjaDogYnVpbGRlclZhbHVlRGlzcGF0Y2hcbiAgfSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXZhaWxhYmxlSXRlbXM7IiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuXG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IG5hbm9pZCBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHsgZmV0Y2hDdXJyZW50Rm9vdGVyIH0gZnJvbSAnLi4vLi4vLi4vb3B0aW9ucy9vcHRpb25zL2N0LWZvb3Rlci1idWlsZGVyJztcbmltcG9ydCB7IGdldE9yaWdpbmFsSWQsIGN1c3RvbUl0ZW1zU2VwYXJhdG9yIH0gZnJvbSAnLi4vcGxhY2VtZW50cy9oZWxwZXJzJztcblxuY29uc3QgdHJhbnNmb3JtQ29sdW1ucyA9IChjb2x1bW5zLCBmdXR1cmVMZW5ndGgpID0+IHtcbiAgY29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGMgPT4gYy5sZW5ndGggPiAwKTtcbiAgcmV0dXJuIEFycmF5LmZyb20oQXJyYXkoZnV0dXJlTGVuZ3RoKSkubWFwKChfLCBpbmRleCkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbnNbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIGNvbHVtbnNbaW5kZXhdO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGRlclJlZHVjZXIgPSAoYnVpbGRlclZhbHVlLCBhY3Rpb24pID0+IHtcbiAgbGV0IHVwZGF0ZWRHbG9iYWxTdGF0ZSA9IHt9O1xuICBsZXQgbmV3U2VjdGlvbnMgPSBbXTtcbiAgbGV0IGZ1dHVyZUJ1aWxkZXJWYWx1ZSA9IGJ1aWxkZXJWYWx1ZS5zZWN0aW9ucy5maW5kKF9yZWYgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmO1xuICAgIHJldHVybiBpZC5pbmRleE9mKGJ1aWxkZXJWYWx1ZS5fX2ZvcmNlZF9zdGF0aWNfZm9vdGVyX18gfHwgZmV0Y2hDdXJyZW50Rm9vdGVyKCkgfHwgYnVpbGRlclZhbHVlLnNlY3Rpb25zWzBdLmlkKSA+IC0xO1xuICB9KTtcbiAgbGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICBsZXQgdXBkYXRlSXRlbUlkID0gZmFsc2U7XG4gIGxldCByZW1vdmVTZWN0aW9uSWRzID0gW107XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnQlVJTERFUl9HTE9CQUxfU0VUVElOR19PTl9DSEFOR0UnKSB7XG4gICAgY29uc3Qge1xuICAgICAgb3B0aW9uSWQsXG4gICAgICBvcHRpb25WYWx1ZSxcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGZ1dHVyZUJ1aWxkZXJWYWx1ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZnV0dXJlQnVpbGRlclZhbHVlKSwge30sIHtcbiAgICAgIHNldHRpbmdzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZ1dHVyZUJ1aWxkZXJWYWx1ZS5zZXR0aW5ncyksIHt9LCB7XG4gICAgICAgIFtvcHRpb25JZF06IG9wdGlvblZhbHVlXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnSVRFTV9WQUxVRV9PTl9DSEFOR0UnKSB7XG4gICAgY29uc3Qge1xuICAgICAgaWQsXG4gICAgICBvcHRpb25JZCxcbiAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgdmFsdWVzID0ge31cbiAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgdXBkYXRlSXRlbUlkID0gYCR7aWR9OiR7b3B0aW9uSWR9YDtcbiAgICBsZXQgaXRlbXMgPSBmdXR1cmVCdWlsZGVyVmFsdWUuaXRlbXM7XG5cbiAgICBpZiAoKGlkID09PSAndG9wLXJvdycgfHwgaWQgPT09ICdtaWRkbGUtcm93JyB8fCBpZCA9PT0gJ2JvdHRvbS1yb3cnKSAmJiBvcHRpb25JZCA9PT0gJ2l0ZW1zX3Blcl9yb3cnKSB7XG4gICAgICBmdXR1cmVCdWlsZGVyVmFsdWUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZ1dHVyZUJ1aWxkZXJWYWx1ZSksIHt9LCB7XG4gICAgICAgIHJvd3M6IGZ1dHVyZUJ1aWxkZXJWYWx1ZS5yb3dzLm1hcChyb3cgPT4gcm93LmlkID09PSBpZCA/IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcm93KSwge30sIHtcbiAgICAgICAgICBjb2x1bW5zOiB0cmFuc2Zvcm1Db2x1bW5zKHJvdy5jb2x1bW5zLCBwYXJzZUludChvcHRpb25WYWx1ZSwgMTApKVxuICAgICAgICB9KSA6IHJvdylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWl0ZW1zW2lkXSkge1xuICAgICAgICBpdGVtc1tpZF0gPSB7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgdmFsdWVzOiB7fVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmdXR1cmVCdWlsZGVyVmFsdWUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZ1dHVyZUJ1aWxkZXJWYWx1ZSksIHt9LCB7XG4gICAgICAgIGl0ZW1zOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIEFycmF5LmlzQXJyYXkoaXRlbXMpID8ge30gOiBpdGVtcyksIHt9LCB7XG4gICAgICAgICAgW2lkXToge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB2YWx1ZXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaXRlbXNbaWRdLnZhbHVlcyksIHt9LCB7XG4gICAgICAgICAgICAgIFtvcHRpb25JZF06IG9wdGlvblZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ1JFTU9WRV9DTE9ORURfSVRFTScpIHtcbiAgICBsZXQgX2Z1dHVyZUJ1aWxkZXJWYWx1ZSRpID0gZnV0dXJlQnVpbGRlclZhbHVlLml0ZW1zLFxuICAgICAgICBfYWN0aW9uJHBheWxvYWQkaWQgPSBhY3Rpb24ucGF5bG9hZC5pZCxcbiAgICAgICAge1xuICAgICAgW19hY3Rpb24kcGF5bG9hZCRpZF06IHJlbW92ZWRJdGVtXG4gICAgfSA9IF9mdXR1cmVCdWlsZGVyVmFsdWUkaSxcbiAgICAgICAgbG9jYWxJdGVtcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfZnV0dXJlQnVpbGRlclZhbHVlJGksIFtfYWN0aW9uJHBheWxvYWQkaWRdLm1hcChfdG9Qcm9wZXJ0eUtleSkpO1xuXG4gICAgZnV0dXJlQnVpbGRlclZhbHVlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmdXR1cmVCdWlsZGVyVmFsdWUpLCB7fSwge1xuICAgICAgaXRlbXM6IGxvY2FsSXRlbXNcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ0NMT05FX0lURU0nKSB7XG4gICAgY29uc3QgZnV0dXJlSWQgPSBnZXRPcmlnaW5hbElkKGFjdGlvbi5wYXlsb2FkLmlkKTtcbiAgICBsZXQgY29tcGxldGVGdXR1cmVJZCA9IGAke2Z1dHVyZUlkfSR7Y3VzdG9tSXRlbXNTZXBhcmF0b3IoKX0ke25hbm9pZCgpfWA7XG4gICAgZnV0dXJlQnVpbGRlclZhbHVlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmdXR1cmVCdWlsZGVyVmFsdWUpLCB7fSwge1xuICAgICAgaXRlbXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZnV0dXJlQnVpbGRlclZhbHVlLml0ZW1zKSwge30sIHtcbiAgICAgICAgW2NvbXBsZXRlRnV0dXJlSWRdOiB7XG4gICAgICAgICAgaWQ6IGNvbXBsZXRlRnV0dXJlSWQsXG4gICAgICAgICAgdmFsdWVzOiBmdXR1cmVCdWlsZGVyVmFsdWUuaXRlbXNbZnV0dXJlSWRdID8gZnV0dXJlQnVpbGRlclZhbHVlLml0ZW1zW2Z1dHVyZUlkXS52YWx1ZXMgfHwge30gOiB7fVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnUElDS19CVUlMREVSX1NFQ1RJT04nKSB7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgICB1cGRhdGVkR2xvYmFsU3RhdGUgPSB7XG4gICAgICBfX2ZvcmNlZF9zdGF0aWNfZm9vdGVyX186IGFjdGlvbi5wYXlsb2FkLmlkXG4gICAgfTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ01BUktfRk9PVEVSX0FTX0dMT0JBTCcpIHtcbiAgICBzaG91bGRVcGRhdGUgPSB0cnVlO1xuICAgIHVwZGF0ZWRHbG9iYWxTdGF0ZSA9IHtcbiAgICAgIF9fZm9yY2VkX3N0YXRpY19mb290ZXJfXzogYWN0aW9uLnBheWxvYWQuaWQsXG4gICAgICBjdXJyZW50X3NlY3Rpb246IGFjdGlvbi5wYXlsb2FkLmlkXG4gICAgfTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ01BUktfU1BFQ0lGSUNfRk9PVEVSX0FTX0dMT0JBTCcpIHtcbiAgICB1cGRhdGVkR2xvYmFsU3RhdGUgPSB7XG4gICAgICBjdXJyZW50X3NlY3Rpb246IGFjdGlvbi5wYXlsb2FkLmlkXG4gICAgfTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ1NFVF9MSVNUJykge1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gICAgY29uc3Qge1xuICAgICAgbGlzdHNcbiAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgZnV0dXJlQnVpbGRlclZhbHVlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmdXR1cmVCdWlsZGVyVmFsdWUpLCB7fSwge1xuICAgICAgcm93czogZnV0dXJlQnVpbGRlclZhbHVlLnJvd3MubWFwKF9yZWYyID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpZDogYmFySWQsXG4gICAgICAgICAgY29sdW1uc1xuICAgICAgICB9ID0gX3JlZjI7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhsaXN0cyk7XG5cbiAgICAgICAgaWYgKGtleXMubWFwKGsgPT4gay5zcGxpdCgnOicpWzBdKS5pbmRleE9mKGJhcklkKSA+IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBiYXJJZCxcbiAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMubWFwKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChsaXN0c1tgJHtiYXJJZH06JHtpbmRleH1gXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaXN0c1tgJHtiYXJJZH06JHtpbmRleH1gXTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBiYXJJZCxcbiAgICAgICAgICBjb2x1bW5zXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnQ1JFQVRFX05FV19TRUNUSU9OJykge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBjb3B5XG4gICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIG5ld1NlY3Rpb25zID0gW2NvcHkgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJ1aWxkZXJWYWx1ZS5zZWN0aW9ucy5maW5kKF9yZWYzID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGlkXG4gICAgICB9ID0gX3JlZjM7XG4gICAgICByZXR1cm4gaWQgPT09IGNvcHk7XG4gICAgfSkgfHwge30pLCB7fSwge1xuICAgICAgbmFtZSxcbiAgICAgIGlkOiBgY3QtY3VzdG9tLSR7bmFub2lkKCl9YFxuICAgIH0pIDoge1xuICAgICAgbmFtZSxcbiAgICAgIGlkOiBgY3QtY3VzdG9tLSR7bmFub2lkKCl9YCxcbiAgICAgIG1vZGU6ICdjb2x1bW5zJyxcbiAgICAgIHJvd3M6IFt7XG4gICAgICAgIGlkOiAndG9wLXJvdycsXG4gICAgICAgIGNvbHVtbnM6IFtbXSwgW11dXG4gICAgICB9LCB7XG4gICAgICAgIGlkOiAnbWlkZGxlLXJvdycsXG4gICAgICAgIGNvbHVtbnM6IFtbXSwgW10sIFtdXVxuICAgICAgfSwge1xuICAgICAgICBpZDogJ2JvdHRvbS1yb3cnLFxuICAgICAgICBjb2x1bW5zOiBbWydjb3B5cmlnaHQnXV1cbiAgICAgIH1dLFxuICAgICAgaXRlbXM6IFtdLFxuICAgICAgc2V0dGluZ3M6IFtdXG4gICAgfV07XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdSRU1PVkVfQlVJTERFUl9TRUNUSU9OJykge1xuICAgIHJlbW92ZVNlY3Rpb25JZHMucHVzaChhY3Rpb24ucGF5bG9hZC5pZCk7XG4gIH1cblxuICBjb25zdCBhY3R1YWxCdWlsZGVyVmFsdWUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYnVpbGRlclZhbHVlKSwgdXBkYXRlZEdsb2JhbFN0YXRlKSwge30sIHtcbiAgICBfX3Nob3VsZF9yZWZyZXNoX186IHNob3VsZFVwZGF0ZSxcbiAgICBfX3Nob3VsZF9yZWZyZXNoX2l0ZW1fXzogdXBkYXRlSXRlbUlkLFxuICAgIHNlY3Rpb25zOiBbLi4uYnVpbGRlclZhbHVlLnNlY3Rpb25zLm1hcChidWlsZGVyID0+IGJ1aWxkZXIuaWQgPT09IGZ1dHVyZUJ1aWxkZXJWYWx1ZS5pZCA/IGZ1dHVyZUJ1aWxkZXJWYWx1ZSA6IGJ1aWxkZXIpLCAuLi5uZXdTZWN0aW9uc10uZmlsdGVyKF9yZWY0ID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGlkXG4gICAgICB9ID0gX3JlZjQ7XG4gICAgICByZXR1cm4gcmVtb3ZlU2VjdGlvbklkcy5pbmRleE9mKGlkKSA9PT0gLTE7XG4gICAgfSlcbiAgfSk7XG5cbiAgcmV0dXJuIGFjdHVhbEJ1aWxkZXJWYWx1ZTtcbn07IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiX19mb3JjZWRfc3RhdGljX2Zvb3Rlcl9fXCIsIFwiX19zaG91bGRfcmVmcmVzaF9fXCJdLFxuICAgICAgX2V4Y2x1ZGVkMiA9IFtcIl9fZm9yY2VkX3N0YXRpY19mb290ZXJfX1wiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgRnJhZ21lbnQsIHVzZVJlZiwgQ29tcG9uZW50LCB1c2VFZmZlY3QsIHVzZU1lbW8sIGNyZWF0ZVBvcnRhbCwgdXNlU3RhdGUsIHVzZUNhbGxiYWNrLCBjcmVhdGVDb250ZXh0LCB1c2VSZWR1Y2VyIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgQ29sdW1uc0J1aWxkZXIgZnJvbSAnLi4vLi4vY3VzdG9taXplci9wYW5lbHMtYnVpbGRlci9jb2x1bW5zL0NvbHVtbnNCdWlsZGVyJztcbmltcG9ydCBBdmFpbGFibGVJdGVtcyBmcm9tICcuLi8uLi9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL2NvbHVtbnMvQXZhaWxhYmxlSXRlbXMnO1xuaW1wb3J0IHsgYnVpbGRlclJlZHVjZXIgfSBmcm9tICcuLi8uLi9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL2NvbHVtbnMvYnVpbGRlclJlZHVjZXInO1xuZXhwb3J0IGNvbnN0IERyYWdEcm9wQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe30pO1xuXG5jb25zdCBnZXREb2N1bWVudCA9IHggPT4geC5kb2N1bWVudCB8fCB4LmNvbnRlbnREb2N1bWVudCB8fCB4LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG5cbmV4cG9ydCBjb25zdCBmZXRjaEN1cnJlbnRGb290ZXIgPSAoKSA9PiB7XG4gIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQod3AuY3VzdG9taXplLnByZXZpZXdlci5jb250YWluZXIuZmluZCgnaWZyYW1lJylbMF0pO1xuXG4gIGlmICh3cC5jdXN0b21pemUucHJldmlld2VyLmNvbnRhaW5lci5maW5kKCdpZnJhbWUnKVswXS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9vdGVyLmN0LWZvb3RlcicpKSB7XG4gICAgcmV0dXJuIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIuY29udGFpbmVyLmZpbmQoJ2lmcmFtZScpWzBdLmNvbnRlbnREb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb290ZXIuY3QtZm9vdGVyJykuZGF0YXNldC5pZDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgRm9vdGVyQnVpbGRlciA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHZhbHVlOiBhbGxCdWlsZGVyU2VjdGlvbnMsXG4gICAgb3B0aW9uLFxuICAgIG9uQ2hhbmdlOiBvbkJ1aWxkZXJWYWx1ZUNoYW5nZVxuICB9ID0gX3JlZjtcbiAgY29uc3QgY3VycmVudEZvb3RlciA9IHVzZVJlZihudWxsKTtcblxuICBpZiAoY3VycmVudEZvb3Rlci5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgY3VycmVudEZvb3Rlci5jdXJyZW50ID0gKGFsbEJ1aWxkZXJTZWN0aW9ucy5zZWN0aW9ucy5maW5kKF9yZWYyID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGlkXG4gICAgICB9ID0gX3JlZjI7XG4gICAgICByZXR1cm4gaWQuaW5kZXhPZihmZXRjaEN1cnJlbnRGb290ZXIoKSkgPiAtMTtcbiAgICB9KSB8fCBhbGxCdWlsZGVyU2VjdGlvbnMuc2VjdGlvbnNbMF0pLmlkO1xuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgX3dwJGN1c3RvbWl6ZSA9IHdwLmN1c3RvbWl6ZSgnZm9vdGVyX3BsYWNlbWVudHMnKSgpLFxuICAgICAgICB7XG4gICAgICBfX2ZvcmNlZF9zdGF0aWNfZm9vdGVyX18sXG4gICAgICBfX3Nob3VsZF9yZWZyZXNoX19cbiAgICB9ID0gX3dwJGN1c3RvbWl6ZSxcbiAgICAgICAgb2xkID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF93cCRjdXN0b21pemUsIF9leGNsdWRlZCk7XG5cbiAgICBPYmplY3Qua2V5cyhvbGQpLm1hcChrZXkgPT4ge1xuICAgICAgaWYgKHBhcnNlRmxvYXQoa2V5KSkge1xuICAgICAgICBkZWxldGUgb2xkW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgd3AuY3VzdG9taXplKCdmb290ZXJfcGxhY2VtZW50cycpKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2xkKSwge30sIHtcbiAgICAgICAgX19mb3JjZWRfc3RhdGljX2Zvb3Rlcl9fOiAoYWxsQnVpbGRlclNlY3Rpb25zLnNlY3Rpb25zLmZpbmQoX3JlZjMgPT4ge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgICByZXR1cm4gaWQuaW5kZXhPZihmZXRjaEN1cnJlbnRGb290ZXIoKSkgPiAtMTtcbiAgICAgICAgfSkgfHwgYWxsQnVpbGRlclNlY3Rpb25zLnNlY3Rpb25zWzBdKS5pZFxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IF93cCRjdXN0b21pemUyID0gd3AuY3VzdG9taXplKCdmb290ZXJfcGxhY2VtZW50cycpKCksXG4gICAgICAgICAgICB7XG4gICAgICAgIF9fZm9yY2VkX3N0YXRpY19mb290ZXJfX1xuICAgICAgfSA9IF93cCRjdXN0b21pemUyLFxuICAgICAgICAgICAgb2xkID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF93cCRjdXN0b21pemUyLCBfZXhjbHVkZWQyKTtcblxuICAgICAgd3AuY3VzdG9taXplKCdmb290ZXJfcGxhY2VtZW50cycpKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBfX3Nob3VsZF9yZWZyZXNoX186IHRydWUsXG4gICAgICAgIFtNYXRoLnJhbmRvbSgpXTogJ3VwZGF0ZSdcbiAgICAgIH0sIG9sZCkpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgW2J1aWxkZXJWYWx1ZUNvbGxlY3Rpb24sIGJ1aWxkZXJWYWx1ZURpc3BhdGNoSW50ZXJuYWxdID0gdXNlUmVkdWNlcihidWlsZGVyUmVkdWNlciwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhbGxCdWlsZGVyU2VjdGlvbnMpLCBjdXJyZW50Rm9vdGVyLmN1cnJlbnQgPyB7XG4gICAgX19mb3JjZWRfc3RhdGljX2Zvb3Rlcl9fOiBjdXJyZW50Rm9vdGVyLmN1cnJlbnRcbiAgfSA6IHt9KSk7XG4gIGNvbnN0IFtidWlsZGVyQ29sbGFwc2VkLCBzZXRCdWlsZGVyQ29sbGFwc2VkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgYnVpbGRlclZhbHVlID0gdXNlTWVtbygoKSA9PiBidWlsZGVyVmFsdWVDb2xsZWN0aW9uLnNlY3Rpb25zLmZpbmQoX3JlZjQgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmNDtcbiAgICByZXR1cm4gaWQgPT09IGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb24uX19mb3JjZWRfc3RhdGljX2Zvb3Rlcl9fO1xuICB9KSB8fCBidWlsZGVyVmFsdWVDb2xsZWN0aW9uLnNlY3Rpb25zWzBdLCBbYnVpbGRlclZhbHVlQ29sbGVjdGlvbl0pO1xuICBjb25zdCBbaXNEcmFnZ2luZywgc2V0SXNEcmFnZ2luZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGlubGluZWRJdGVtc0Zyb21CdWlsZGVyID0gYnVpbGRlclZhbHVlLnJvd3MucmVkdWNlKChjdXJyZW50SXRlbXMsIF9yZWY1KSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGNvbHVtbnNcbiAgICB9ID0gX3JlZjU7XG4gICAgcmV0dXJuIFsuLi5jdXJyZW50SXRlbXMsIC4uLihjb2x1bW5zIHx8IFtdKS5yZWR1Y2UoKGMsIGl0ZW1zKSA9PiBbLi4uYywgLi4uaXRlbXNdLCBbXSldO1xuICB9LCBbXSk7XG4gIGNvbnN0IGJ1aWxkZXJWYWx1ZURpc3BhdGNoID0gdXNlQ2FsbGJhY2soYWN0aW9uID0+IHtcbiAgICBsZXQgbmV3U3RhdGUgPSBidWlsZGVyUmVkdWNlcihidWlsZGVyVmFsdWVDb2xsZWN0aW9uLCBhY3Rpb24pO1xuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnQlVJTERFUl9HTE9CQUxfU0VUVElOR19PTl9DSEFOR0UnICYmIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXJWYWx1ZSA9IG5ld1N0YXRlLnNlY3Rpb25zLmZpbmQoX3JlZjYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0gPSBfcmVmNjtcbiAgICAgICAgcmV0dXJuIGlkID09PSBuZXdTdGF0ZS5fX2ZvcmNlZF9zdGF0aWNfZm9vdGVyX187XG4gICAgICB9KSB8fCBuZXdTdGF0ZS5zZWN0aW9uc1swXTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb3B0aW9uSWQsXG4gICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICB2YWx1ZXMgPSB7fVxuICAgICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgd3AuY3VzdG9taXplLnByZXZpZXdlci5zZW5kKCdjdDpmb290ZXI6cmVjZWl2ZS12YWx1ZS11cGRhdGUnLCB7XG4gICAgICAgIGl0ZW1JZDogJ2dsb2JhbCcsXG4gICAgICAgIG9wdGlvbklkLFxuICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgdmFsdWVzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJ1aWxkZXJWYWx1ZS5zZXR0aW5ncyksIHt9LCB7XG4gICAgICAgICAgW29wdGlvbklkXTogb3B0aW9uVmFsdWVcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ0lURU1fVkFMVUVfT05fQ0hBTkdFJyAmJiB3cC5jdXN0b21pemUucHJldmlld2VyKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlkLFxuICAgICAgICBvcHRpb25JZCxcbiAgICAgICAgb3B0aW9uVmFsdWUsXG4gICAgICAgIHZhbHVlcyA9IHt9XG4gICAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICBjb25zdCBidWlsZGVyVmFsdWUgPSBuZXdTdGF0ZS5zZWN0aW9ucy5maW5kKF9yZWY3ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpZFxuICAgICAgICB9ID0gX3JlZjc7XG4gICAgICAgIHJldHVybiBpZCA9PT0gbmV3U3RhdGUuX19mb3JjZWRfc3RhdGljX2Zvb3Rlcl9fO1xuICAgICAgfSkgfHwgbmV3U3RhdGUuc2VjdGlvbnNbMF07XG4gICAgICBsZXQgaXRlbXMgPSBidWlsZGVyVmFsdWUuaXRlbXM7XG4gICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGl0ZW1zW2lkXSB8fCB7XG4gICAgICAgIHZhbHVlczoge31cbiAgICAgIH07XG4gICAgICB3cC5jdXN0b21pemUucHJldmlld2VyLnNlbmQoJ2N0OmZvb3RlcjpyZWNlaXZlLXZhbHVlLXVwZGF0ZScsIHtcbiAgICAgICAgaXRlbUlkOiBpZCxcbiAgICAgICAgb3B0aW9uSWQsXG4gICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICB2YWx1ZXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudEl0ZW0udmFsdWVzKSwgdmFsdWVzKSwgaWQgPT09ICd0b3Atcm93JyB8fCBpZCA9PT0gJ21pZGRsZS1yb3cnIHx8IGlkID09PSAnYm90dG9tLXJvdycgPyB7XG4gICAgICAgICAgaXRlbXNfcGVyX3JvdzogYnVpbGRlclZhbHVlLnJvd3MuZmluZChfcmVmOCA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICBpZDogX2lkXG4gICAgICAgICAgICB9ID0gX3JlZjg7XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09IF9pZDtcbiAgICAgICAgICB9KS5jb2x1bW5zLmxlbmd0aFxuICAgICAgICB9IDoge30pLCAoaWQgPT09ICd0b3Atcm93JyB8fCBpZCA9PT0gJ21pZGRsZS1yb3cnIHx8IGlkID09PSAnYm90dG9tLXJvdycpICYmIG9wdGlvbklkID09PSAnaXRlbXNfcGVyX3JvdycgPyB7XG4gICAgICAgICAgaXRlbXNfcGVyX3JvdzogcGFyc2VJbnQob3B0aW9uVmFsdWUsIDEwKVxuICAgICAgICB9IDoge30pLCB7fSwge1xuICAgICAgICAgIFtvcHRpb25JZF06IG9wdGlvblZhbHVlXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkJ1aWxkZXJWYWx1ZUNoYW5nZShuZXdTdGF0ZSk7XG4gICAgYnVpbGRlclZhbHVlRGlzcGF0Y2hJbnRlcm5hbChhY3Rpb24pO1xuICB9LCBbYnVpbGRlclZhbHVlRGlzcGF0Y2hJbnRlcm5hbCwgb25CdWlsZGVyVmFsdWVDaGFuZ2UsIGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb25dKTtcblxuICBjb25zdCBzZXRMaXN0ID0gbGlzdHMgPT4gYnVpbGRlclZhbHVlRGlzcGF0Y2goe1xuICAgIHR5cGU6ICdTRVRfTElTVCcsXG4gICAgb25CdWlsZGVyVmFsdWVDaGFuZ2UsXG4gICAgcGF5bG9hZDoge1xuICAgICAgbGlzdHNcbiAgICB9XG4gIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53cC1mdWxsLW92ZXJsYXknKS5jbGFzc0xpc3QucmVtb3ZlKCdjdC1idWlsZGVyLWNvbGxhcHNlZCcpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoRHJhZ0Ryb3BDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHtcbiAgICAgIGlzRHJhZ2dpbmcsXG4gICAgICBzZXRJc0RyYWdnaW5nLFxuICAgICAgc2V0TGlzdCxcbiAgICAgIGJ1aWxkZXJWYWx1ZURpc3BhdGNoLFxuICAgICAgYnVpbGRlclZhbHVlQ29sbGVjdGlvbixcbiAgICAgIGJ1aWxkZXJWYWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBfcmVmOSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSA9IF9yZWY5O1xuICAgICAgICByZXR1cm4gc2V0TGlzdCh7XG4gICAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBjcmVhdGVFbGVtZW50KEF2YWlsYWJsZUl0ZW1zLCB7XG4gICAgYnVpbGRlclZhbHVlOiBidWlsZGVyVmFsdWUsXG4gICAgaW5saW5lZEl0ZW1zRnJvbUJ1aWxkZXI6IGlubGluZWRJdGVtc0Zyb21CdWlsZGVyLFxuICAgIGJ1aWxkZXJWYWx1ZURpc3BhdGNoOiBidWlsZGVyVmFsdWVEaXNwYXRjaCxcbiAgICBidWlsZGVyVmFsdWVDb2xsZWN0aW9uOiBidWlsZGVyVmFsdWVDb2xsZWN0aW9uXG4gIH0pLCBjcmVhdGVQb3J0YWwoY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWJ1aWxkZXItZm9vdGVyXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtdmlldy1zd2l0Y2hcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1idWlsZGVyLXRvZ2dsZVwiLFxuICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgIHNldEJ1aWxkZXJDb2xsYXBzZWQoIWJ1aWxkZXJDb2xsYXBzZWQpO1xuXG4gICAgICBpZiAoYnVpbGRlckNvbGxhcHNlZCkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud3AtZnVsbC1vdmVybGF5JykuY2xhc3NMaXN0LnJlbW92ZSgnY3QtYnVpbGRlci1jb2xsYXBzZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53cC1mdWxsLW92ZXJsYXknKS5jbGFzc0xpc3QuYWRkKCdjdC1idWlsZGVyLWNvbGxhcHNlZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgYnVpbGRlckNvbGxhcHNlZCA/IF9fKCdTaG93IEJ1aWxkZXInLCAnYmxvY2tzeScpIDogX18oJ0hpZGUgQnVpbGRlcicsICdibG9ja3N5JykpKSwgY3JlYXRlRWxlbWVudChDb2x1bW5zQnVpbGRlciwge1xuICAgIGJ1aWxkZXJWYWx1ZTogYnVpbGRlclZhbHVlXG4gIH0pKSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmN0LXBhbmVsLWJ1aWxkZXInKSkpKTtcbn07XG5cbkZvb3RlckJ1aWxkZXIucmVuZGVyaW5nQ29uZmlnID0ge1xuICBkZXNpZ246ICdub25lJ1xufTtcbmV4cG9ydCBkZWZhdWx0IEZvb3RlckJ1aWxkZXI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5821\n")},5565:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ ct_header_builder)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: ./static/js/customizer/panels-builder/placements/Sortable.js\nvar Sortable = __webpack_require__(7229);\n// EXTERNAL MODULE: ./static/js/options/components/PanelLevel.js + 1 modules\nvar PanelLevel = __webpack_require__(956);\n// EXTERNAL MODULE: ./static/js/customizer/panels-builder/placements/helpers.js\nvar helpers = __webpack_require__(8382);\n// EXTERNAL MODULE: ./static/js/options/helpers/get-label.js\nvar get_label = __webpack_require__(7493);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/DraggableItems.js\nconst _excluded = [\"items\", \"draggableId\", \"hasPointers\", \"className\", \"tagName\", \"direction\", \"group\", \"options\", \"propsForItem\", \"displayWrapper\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\nconst isItemAllowedIn = (itemId, barId, currentView) => {\n const item = ct_customizer_localizations.header_builder_data.header.find(_ref => {\n let {\n id\n } = _ref;\n return id === (0,helpers/* getOriginalId */.t_)(itemId);\n });\n\n if (!item) {\n return true;\n }\n\n let allowed_in = [];\n\n if (Array.isArray(item.config.allowed_in)) {\n allowed_in = item.config.allowed_in;\n } else {\n if (item.config.allowed_in[currentView]) {\n allowed_in = item.config.allowed_in[currentView];\n }\n }\n\n const allowedRespected = allowed_in.length > 0 ? allowed_in.indexOf(barId) > -1 : true;\n const exclusionRespected = item.config.excluded_from.length > 0 ? item.config.excluded_from.indexOf(barId) === -1 : true;\n return allowedRespected && exclusionRespected;\n};\n\nconst DraggableItem = _ref2 => {\n var _itemData$config$name, _itemData$config, _itemData$config$name2, _itemData$config2;\n\n let {\n item,\n index,\n panelType,\n onRemove,\n renderItem,\n onClick,\n className\n } = _ref2;\n const itemData = ct_customizer_localizations.header_builder_data[panelType].find(_ref3 => {\n let {\n id\n } = _ref3;\n return id === (0,helpers/* getOriginalId */.t_)(item);\n });\n const {\n builderValue\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n\n if (renderItem) {\n return renderItem({\n item,\n itemData,\n index\n });\n }\n /**\n * Dynamic items have a : in their ID\n */\n\n\n const allDynamicItems = builderValue.items.filter(_ref4 => {\n let {\n id\n } = _ref4;\n return id.indexOf((0,helpers/* customItemsSeparator */.SU)()) > -1;\n }).map(_ref5 => {\n let {\n id\n } = _ref5;\n return id;\n });\n const allClonesAndOriginal = [(0,helpers/* getOriginalId */.t_)(item), ...allDynamicItems.filter(id => (0,helpers/* getOriginalId */.t_)(id) === (0,helpers/* getOriginalId */.t_)(item))];\n const beautyItem = (0,get_label/* capitalizeFirstLetter */.f)((0,helpers/* getOriginalId */.t_)(item));\n return (0,external_window_wp_element_.createElement)(\"div\", {\n \"data-id\": item,\n className: classnames_default()('ct-builder-item', className, {// 'ct-is-dragging': snapshot.isDragging\n }),\n onClick: onClick\n }, allClonesAndOriginal.length > 1 ? `${(_itemData$config$name = itemData === null || itemData === void 0 ? void 0 : (_itemData$config = itemData.config) === null || _itemData$config === void 0 ? void 0 : _itemData$config.name) !== null && _itemData$config$name !== void 0 ? _itemData$config$name : beautyItem} ${allClonesAndOriginal.indexOf(item) + 1}` : (_itemData$config$name2 = itemData === null || itemData === void 0 ? void 0 : (_itemData$config2 = itemData.config) === null || _itemData$config2 === void 0 ? void 0 : _itemData$config2.name) !== null && _itemData$config$name2 !== void 0 ? _itemData$config$name2 : beautyItem, (0,external_window_wp_element_.createElement)(\"button\", {\n className: \"ct-btn-remove\",\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n onRemove();\n }\n }));\n};\n\nconst DraggableItems = _ref6 => {\n let {\n items,\n draggableId,\n hasPointers = true,\n className,\n tagName = 'div',\n direction = 'horizontal',\n group = 'header_sortables',\n options = {},\n propsForItem = item => ({}),\n displayWrapper = true\n } = _ref6,\n props = _objectWithoutProperties(_ref6, _excluded);\n\n const {\n currentView,\n isDragging,\n setIsDragging,\n onChange,\n setList\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const {\n panelsHelpers\n } = (0,external_window_wp_element_.useContext)(PanelLevel/* PanelContext */.Q);\n const itemsOutput = items.map((item, index) => (0,external_window_wp_element_.createElement)(DraggableItem, _extends({\n key: item,\n index: index,\n panelType: 'header',\n item: item,\n className: panelsHelpers.isOpenFor(`builder_panel_${item}`) ? 'ct-customizing' : '',\n onClick: e => {\n e.stopPropagation();\n e.preventDefault();\n\n if (isDragging) {\n return;\n }\n\n panelsHelpers.open(`builder_panel_${item}`);\n },\n onRemove: () => {\n panelsHelpers.close();\n setList(_objectSpread({\n [draggableId]: items.filter(id => id !== item)\n }, currentView === 'desktop' && item === 'trigger' ? {\n ['offcanvas:start']: []\n } : {}));\n }\n }, propsForItem(item))));\n\n if (!displayWrapper) {\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, itemsOutput);\n }\n\n return (0,external_window_wp_element_.createElement)(Sortable/* default */.Z, _extends({\n options: _objectSpread({\n delay: 0,\n group,\n fallbackOnBody: true,\n forceFallback: true,\n fallbackTolerance: 5,\n filter: '.ct-pointer',\n direction,\n touchStartThreshold: 5,\n onStart: event => {\n setIsDragging(event.item.dataset.id);\n let currentView = wp.customize.previewedDevice();\n\n if (currentView === 'tablet') {\n currentView = 'mobile';\n }\n\n if (isItemAllowedIn(event.item.dataset.id, 'middle-row', currentView)) {\n document.body.classList.add('ct-builder-dragging');\n }\n\n if (event.from && group && group.pull !== 'clone') {\n event.to.classList.add('ct-is-over');\n }\n },\n onEnd: () => {\n setIsDragging(false);\n document.body.classList.remove('ct-builder-dragging');\n [...document.querySelectorAll('.ct-panel-builder .ct-is-over')].map(el => el.classList.remove('ct-is-over'));\n },\n onMove: (event, originalEvent) => {\n let currentView = wp.customize.previewedDevice();\n\n if (currentView === 'tablet') {\n currentView = 'mobile';\n }\n\n if (event.from.closest('#ct-option-header-builder-items')) {\n Promise.resolve().then(() => [...event.from.querySelectorAll(`[data-id=\"${event.dragged.dataset.id}\"]`)].map(el => {\n el.classList.remove('ct-builder-item');\n el.classList.add('ct-item-in-builder');\n }));\n }\n\n ;\n [...document.querySelectorAll('.ct-panel-builder .ct-is-over')].map(el => el.classList.remove('ct-is-over'));\n\n if (event.to) {\n event.to.classList.add('ct-is-over');\n }\n\n if (!isItemAllowedIn(event.dragged.dataset.id, event.to.dataset.id.split(':')[0], currentView)) {\n return false;\n }\n }\n }, options),\n onChange: (order, sortable, evt) => {\n // console.log('here is change', order, draggableId)\n if (draggableId === 'available-items') {\n return;\n }\n\n onChange({\n id: draggableId,\n value: order.filter(i => i !== '__pointer__' && i !== '__filler__')\n });\n },\n tag: tagName,\n className: classnames_default()('ct-builder-items', className)\n }, props, {\n \"data-id\": draggableId\n }), ['end', 'start-middle'].indexOf(draggableId.split(':')[1]) > -1 && (0,external_window_wp_element_.createElement)(\"div\", {\n \"data-id\": \"__filler__\",\n className: \"ct-filler\"\n }), hasPointers && isDragging && isItemAllowedIn(isDragging, draggableId.split(':')[0], currentView) && (0,external_window_wp_element_.createElement)(\"div\", {\n \"data-id\": \"__pointer__\",\n className: \"ct-pointer\"\n }), itemsOutput);\n};\n\n/* harmony default export */ const placements_DraggableItems = (DraggableItems);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/PlacementsBuilder/PrimaryPlacement.js\nfunction PrimaryPlacement_extends() { PrimaryPlacement_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return PrimaryPlacement_extends.apply(this, arguments); }\n\n\n\n\nconst PrimaryPlacement = _ref => {\n let {\n placementName,\n bar,\n direction\n } = _ref;\n const placement = bar.placements.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id === placementName;\n });\n let placementsToRender = [placement];\n\n if (placementName !== 'middle') {\n const middle = bar.placements.find(_ref3 => {\n let {\n id\n } = _ref3;\n return id === 'middle';\n });\n\n if (middle && middle.items.length > 0) {\n if (placementName === 'start') {\n const startMiddle = bar.placements.find(_ref4 => {\n let {\n id\n } = _ref4;\n return id === 'start-middle';\n });\n placementsToRender = [placement, startMiddle];\n }\n\n if (placementName === 'end') {\n const endMiddle = bar.placements.find(_ref5 => {\n let {\n id\n } = _ref5;\n return id === 'end-middle';\n });\n placementsToRender = [endMiddle, placement];\n }\n }\n }\n\n return (0,external_window_wp_element_.createElement)(\"li\", PrimaryPlacement_extends({\n className: [`ct-builder-column-${placement.id}`]\n }, placement.id === 'middle' ? {\n 'data-count': placement.items.length\n } : {}), placementsToRender.map(placement => (0,external_window_wp_element_.createElement)(placements_DraggableItems, {\n key: placement.id,\n direction: direction,\n className: placement.id === 'middle' ? '' : `ct-${placement.id.indexOf('-') > -1 ? 'secondary' : 'primary'}-column`,\n draggableId: `${bar.id}:${placement.id}`,\n items: placement.items\n })));\n};\n\n/* harmony default export */ const PlacementsBuilder_PrimaryPlacement = (PrimaryPlacement);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/PlacementsBuilder/Row.js\n\n\n\n\n\nconst Row = _ref => {\n let {\n bar,\n direction = 'horizontal'\n } = _ref;\n const {\n panelsHelpers\n } = (0,external_window_wp_element_.useContext)(PanelLevel/* PanelContext */.Q);\n return (0,external_window_wp_element_.createElement)(\"li\", {\n className: \"builder-row\"\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-row-actions\",\n onClick: () => panelsHelpers.open(`builder_panel_${bar.id}`)\n }, {\n 'top-row': (0,external_window_wp_i18n_.__)('Top Row', 'blocksy'),\n 'middle-row': (0,external_window_wp_i18n_.__)('Main Row', 'blocksy'),\n 'bottom-row': (0,external_window_wp_i18n_.__)('Bottom Row', 'blocksy'),\n offcanvas: (0,external_window_wp_i18n_.__)('Off Canvas Area', 'blocksy')\n }[bar.id]), (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"row-inner\"\n }, ['start', 'middle', 'end'].filter(placementName => !!bar.placements.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id === placementName;\n })).map(placementName => (0,external_window_wp_element_.createElement)(PlacementsBuilder_PrimaryPlacement, {\n key: placementName,\n bar: bar,\n placementName: placementName,\n direction: direction\n }))));\n};\n\n/* harmony default export */ const PlacementsBuilder_Row = (Row);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/PlacementsBuilder.js\n\n\n\n\n\n\nconst PlacementsBuilder = _ref => {\n let {\n inlinedItemsFromBuilder,\n view,\n builderValueWithView\n } = _ref;\n let hasOffcanvas = view === 'mobile' || inlinedItemsFromBuilder.indexOf('trigger') > -1 && builderValueWithView.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id === 'offcanvas';\n });\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()('placements-builder', {\n 'ct-mobile': hasOffcanvas\n })\n }, hasOffcanvas && (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"offcanvas-container\"\n }, (0,external_window_wp_element_.createElement)(PlacementsBuilder_Row, {\n direction: \"vertical\",\n bar: builderValueWithView.find(_ref3 => {\n let {\n id\n } = _ref3;\n return id === 'offcanvas';\n })\n })), (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"horizontal-rows\"\n }, ['top-row', 'middle-row', 'bottom-row'].map(bar => {\n const maybeBar = builderValueWithView.find(_ref4 => {\n let {\n id\n } = _ref4;\n return id === bar;\n });\n\n if (!maybeBar) {\n return null;\n }\n\n return (0,external_window_wp_element_.createElement)(PlacementsBuilder_Row, {\n bar: maybeBar,\n key: bar\n });\n })));\n};\n\n/* harmony default export */ const placements_PlacementsBuilder = (PlacementsBuilder);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/ViewSwitch.js\n\n\n\n\nconst ViewSwitch = _ref => {\n let {\n currentView,\n setCurrentView\n } = _ref;\n const [builderCollapsed, setBuilderCollapsed] = (0,external_window_wp_element_.useState)(false);\n (0,external_window_wp_element_.useEffect)(() => {\n return () => {\n document.querySelector('.wp-full-overlay').classList.remove('ct-builder-collapsed');\n };\n }, []);\n return (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-view-switch\"\n }, ['desktop', 'mobile'].map(view => (0,external_window_wp_element_.createElement)(\"li\", {\n key: view,\n onClick: () => setCurrentView(view === 'mobile' ? 'tablet' : view),\n className: classnames_default()({\n active: currentView === view\n })\n }, {\n desktop: (0,external_window_wp_i18n_.__)('Desktop Header', 'blocksy'),\n mobile: (0,external_window_wp_i18n_.__)('Tablet / Mobile Header', 'blocksy')\n }[view])), (0,external_window_wp_element_.createElement)(\"li\", {\n className: \"ct-builder-toggle\",\n onClick: () => {\n setBuilderCollapsed(!builderCollapsed);\n\n if (builderCollapsed) {\n document.querySelector('.wp-full-overlay').classList.remove('ct-builder-collapsed');\n } else {\n document.querySelector('.wp-full-overlay').classList.add('ct-builder-collapsed');\n }\n }\n }, builderCollapsed ? (0,external_window_wp_i18n_.__)('Show Builder', 'blocksy') : (0,external_window_wp_i18n_.__)('Hide Builder', 'blocksy')));\n};\n\n/* harmony default export */ const placements_ViewSwitch = (ViewSwitch);\n// EXTERNAL MODULE: external \"window.wp.components\"\nvar external_window_wp_components_ = __webpack_require__(8441);\n// EXTERNAL MODULE: ./static/js/options/options/ct-panel.js\nvar ct_panel = __webpack_require__(3731);\n// EXTERNAL MODULE: ./static/js/options/helpers/get-value-from-input.js\nvar get_value_from_input = __webpack_require__(7069);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/builder-sidebar/SecondaryItems.js\nfunction SecondaryItems_extends() { SecondaryItems_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return SecondaryItems_extends.apply(this, arguments); }\n\nfunction SecondaryItems_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction SecondaryItems_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? SecondaryItems_ownKeys(Object(source), !0).forEach(function (key) { SecondaryItems_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : SecondaryItems_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction SecondaryItems_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\nconst SecondaryItems = _ref => {\n let {\n builderValue,\n builderValueDispatch,\n inlinedItemsFromBuilder,\n displayList = true\n } = _ref;\n const {\n panelsState,\n panelsActions,\n currentView,\n isDragging\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const inlinedItemsFromAllViewsBuilder = [...builderValue.desktop.reduce((currentItems, _ref2) => {\n let {\n id,\n placements\n } = _ref2;\n return [...currentItems, ...(placements || []).reduce((c, _ref3) => {\n let {\n id,\n items\n } = _ref3;\n return [...c, ...items];\n }, [])];\n }, []), ...builderValue.mobile.reduce((currentItems, _ref4) => {\n let {\n id,\n placements\n } = _ref4;\n return [...currentItems, ...(placements || []).reduce((c, _ref5) => {\n let {\n id,\n items\n } = _ref5;\n return [...c, ...items];\n }, [])];\n }, [])];\n const secondaryItems = ct_customizer_localizations.header_builder_data.secondary_items.header.filter(_ref6 => {\n let {\n config\n } = _ref6;\n return (// config.devices.indexOf(currentView) > -1 &&\n config.enabled\n );\n });\n const allItems = ct_customizer_localizations.header_builder_data.header;\n /**\n * Dynamic items have a : in their ID\n */\n\n const allDynamicItems = builderValue.items.filter(_ref7 => {\n let {\n id\n } = _ref7;\n return id.indexOf((0,helpers/* customItemsSeparator */.SU)()) > -1;\n }).map(_ref8 => {\n let {\n id\n } = _ref8;\n return id;\n });\n return (0,external_window_wp_element_.createElement)(placements_DraggableItems, {\n options: {\n sort: false,\n filter: '.ct-item-in-builder'\n },\n group: {\n name: 'header_sortables',\n put: false,\n pull: 'clone'\n },\n draggableId: 'available-items',\n items: [...secondaryItems.map(_ref9 => {\n let {\n id\n } = _ref9;\n return id;\n }), ...allDynamicItems].filter(el => allItems.some(_ref10 => {\n let {\n id\n } = _ref10;\n return id === (0,helpers/* getOriginalId */.t_)(el);\n })).sort((a, b) => {\n const aItemData = allItems.find(_ref11 => {\n let {\n id\n } = _ref11;\n return id === (0,helpers/* getOriginalId */.t_)(a);\n });\n const bItemData = allItems.find(_ref12 => {\n let {\n id\n } = _ref12;\n return id === (0,helpers/* getOriginalId */.t_)(b);\n });\n return aItemData.config.name.localeCompare(bItemData.config.name);\n }),\n hasPointers: false,\n displayWrapper: displayList,\n propsForItem: item => ({\n renderItem: _ref13 => {\n let {\n item,\n itemData,\n index\n } = _ref13;\n const itemOptions = allItems.find(_ref14 => {\n let {\n id\n } = _ref14;\n return id === (0,helpers/* getOriginalId */.t_)(item);\n }).options;\n const allClonesAndOriginal = [(0,helpers/* getOriginalId */.t_)(item), ...allDynamicItems.filter(id => (0,helpers/* getOriginalId */.t_)(id) === (0,helpers/* getOriginalId */.t_)(item))];\n const itemName = allClonesAndOriginal.length > 1 ? `${itemData.config.name} ${allClonesAndOriginal.indexOf(item) + 1}` : itemData.config.name;\n const option = {\n label: itemName,\n 'inner-options': itemOptions\n };\n const itemInBuilder = inlinedItemsFromBuilder.indexOf(item) > -1;\n let row = '__none__';\n\n if (itemInBuilder) {\n row = builderValue[currentView].find(_ref15 => {\n let {\n id,\n placements\n } = _ref15;\n const rowItems = (placements || []).reduce((c, _ref16) => {\n let {\n id,\n items\n } = _ref16;\n return [...c, ...items];\n }, []);\n return rowItems.find(i => i === item);\n }).id;\n }\n\n const id = `builder_panel_${item}`;\n const itemsOnlyWithTrigger = ['mobile-menu', 'mobile-menu-secondary', 'offcanvas-logo'];\n const isSidebarRepresentationPresent = displayList && itemData.config.devices.includes(currentView) && (!itemsOnlyWithTrigger.includes(item) || itemsOnlyWithTrigger.includes(item) && (currentView !== 'desktop' || inlinedItemsFromBuilder.indexOf('trigger') > -1));\n let itemTitle = itemData.config.name;\n return (0,external_window_wp_element_.createElement)(ct_panel.PanelMetaWrapper, SecondaryItems_extends({\n id: id,\n option: option\n }, panelsActions, {\n getActualOption: _ref17 => {\n let {\n open\n } = _ref17;\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, inlinedItemsFromAllViewsBuilder.indexOf(item) > -1 && (0,external_window_wp_element_.createElement)(ct_panel[\"default\"], {\n id: id,\n getValues: () => {\n let itemValue = builderValue.items.find(_ref18 => {\n let {\n id\n } = _ref18;\n return id === item;\n });\n\n if (itemValue && Object.keys(itemValue.values) > 5) {\n return SecondaryItems_objectSpread({\n builderSettings: builderValue.settings || {},\n row\n }, itemValue.values);\n }\n\n return SecondaryItems_objectSpread(SecondaryItems_objectSpread({}, (0,get_value_from_input/* getValueFromInput */.n6)(itemOptions, itemValue ? itemValue.values : {})), {}, {\n row,\n builderSettings: builderValue.settings || {}\n });\n },\n option: option,\n onChangeFor: (optionId, optionValue) => {\n const currentValue = builderValue.items.find(_ref19 => {\n let {\n id\n } = _ref19;\n return id === item;\n });\n builderValueDispatch({\n type: 'ITEM_VALUE_ON_CHANGE',\n payload: {\n id: item,\n optionId,\n optionValue,\n values: !currentValue || currentValue && Object.keys(currentValue.values).length === 0 ? (0,get_value_from_input/* getValueFromInput */.n6)(itemOptions, {}) : {}\n }\n });\n },\n view: \"simple\"\n }), isSidebarRepresentationPresent && (0,external_window_wp_element_.createElement)(\"div\", {\n \"data-id\": item,\n className: classnames_default()({\n 'ct-item-in-builder': itemInBuilder,\n 'ct-builder-item': !itemInBuilder\n }),\n onClick: e => {\n if (isDragging) {\n return;\n }\n\n itemInBuilder && open();\n }\n }, itemName, (0,external_window_wp_element_.createElement)(external_window_wp_components_.Slot, {\n name: `PlacementsBuilderSidebarItem_${index}`,\n fillProps: {\n item,\n itemInBuilder,\n itemData\n }\n })));\n }\n }));\n }\n }),\n direction: \"vertical\"\n });\n};\n\n/* harmony default export */ const builder_sidebar_SecondaryItems = (SecondaryItems);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/builder-sidebar/InvisiblePanels.js\nfunction InvisiblePanels_extends() { InvisiblePanels_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return InvisiblePanels_extends.apply(this, arguments); }\n\nfunction InvisiblePanels_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction InvisiblePanels_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? InvisiblePanels_ownKeys(Object(source), !0).forEach(function (key) { InvisiblePanels_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : InvisiblePanels_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction InvisiblePanels_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst InvisiblePanels = _ref => {\n let {\n builderValue,\n builderValueDispatch\n } = _ref;\n const secondaryItems = ct_customizer_localizations.header_builder_data.secondary_items.header;\n const allItems = ct_customizer_localizations.header_builder_data.header;\n const {\n panelsState,\n panelsActions\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const primaryItems = allItems.filter(_ref2 => {\n let {\n id\n } = _ref2;\n return !secondaryItems.find(item => item.id === id);\n });\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, primaryItems.map(primaryItem => {\n const option = {\n label: primaryItem.config.name,\n 'inner-options': primaryItem.options\n };\n const id = `builder_panel_${primaryItem.id}`;\n return (0,external_window_wp_element_.createElement)(ct_panel.PanelMetaWrapper, InvisiblePanels_extends({\n id: id,\n key: primaryItem.id,\n option: option\n }, panelsActions, {\n getActualOption: () => (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(ct_panel[\"default\"], {\n id: id,\n getValues: () => {\n let itemValue = builderValue.items.find(_ref3 => {\n let {\n id\n } = _ref3;\n return id === primaryItem.id;\n });\n let itemsCount = '0';\n\n if (primaryItem.id === 'top-row' || primaryItem.id === 'middle-row' || primaryItem.id === 'bottom-row') {\n itemsCount = (builderValue.desktop.find(_ref4 => {\n let {\n id\n } = _ref4;\n return id === primaryItem.id;\n }).placements.reduce((r, p) => {\n return [...r, ...p.items];\n }, []).length + builderValue.mobile.find(_ref5 => {\n let {\n id\n } = _ref5;\n return id === primaryItem.id;\n }).placements.reduce((r, p) => {\n return [...r, ...p.items];\n }, []).length).toString();\n }\n\n if (itemValue && Object.keys(itemValue.values) > 5) {\n return InvisiblePanels_objectSpread({\n itemsCount,\n builderSettings: builderValue.settings || {}\n }, itemValue.values);\n }\n\n return InvisiblePanels_objectSpread(InvisiblePanels_objectSpread({}, (0,get_value_from_input/* getValueFromInput */.n6)(primaryItem.options, itemValue ? itemValue.values : {})), {}, {\n itemsCount,\n builderSettings: builderValue.settings || {}\n });\n },\n option: option,\n onChangeFor: (optionId, optionValue) => {\n const currentValue = builderValue.items.find(_ref6 => {\n let {\n id\n } = _ref6;\n return id === primaryItem.id;\n });\n builderValueDispatch({\n type: 'ITEM_VALUE_ON_CHANGE',\n payload: {\n id: primaryItem.id,\n optionId,\n optionValue,\n values: !currentValue || currentValue && Object.keys(currentValue.values).length === 0 ? (0,get_value_from_input/* getValueFromInput */.n6)(primaryItem.options, {}) : {}\n }\n });\n },\n view: \"simple\"\n }))\n }));\n }));\n};\n\n/* harmony default export */ const builder_sidebar_InvisiblePanels = (InvisiblePanels);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/builder-sidebar/PanelsManager.js\nfunction PanelsManager_extends() { PanelsManager_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return PanelsManager_extends.apply(this, arguments); }\n\n\n\n\n\n\n\n\nconst PanelsManager = () => {\n const secondaryItems = ct_customizer_localizations.header_builder_data.secondary_items.header;\n const allItems = ct_customizer_localizations.header_builder_data.header;\n const {\n builderValue,\n option,\n builderValueCollection,\n builderValueDispatch,\n panelsActions\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const allSections = builderValueCollection.sections.filter(_ref => {\n let {\n id\n } = _ref;\n return id !== 'type-2' && id !== 'type-3' && id.indexOf('ct-custom') === -1;\n });\n return (0,external_window_wp_element_.createElement)(\"ul\", {\n className: classnames_default()('ct-panels-manager')\n }, allSections.map(_ref2 => {\n let {\n name,\n id\n } = _ref2;\n let panelLabel = name || {\n 'type-1': (0,external_window_wp_i18n_.__)('Global Header', 'blocksy')\n }[id] || id;\n const panelId = `builder_header_panel_${id}`;\n const headerOptions = ct_customizer_localizations.header_builder_data.header_data.header_options;\n const option = {\n label: panelLabel,\n 'inner-options': headerOptions\n };\n return (0,external_window_wp_element_.createElement)(ct_panel.PanelMetaWrapper, PanelsManager_extends({\n id: panelId,\n key: id,\n option: option\n }, panelsActions, {\n getActualOption: _ref3 => {\n let {\n open\n } = _ref3;\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, Object.keys(headerOptions).length > 0 && id === builderValue.id && (0,external_window_wp_element_.createElement)(ct_panel[\"default\"], {\n id: panelId,\n getValues: () => builderValue.settings || {},\n option: option,\n onChangeFor: (optionId, optionValue) => {\n builderValueDispatch({\n type: 'BUILDER_GLOBAL_SETTING_ON_CHANGE',\n payload: {\n optionId,\n optionValue,\n values: (0,get_value_from_input/* getValueFromInput */.n6)(headerOptions, Array.isArray(builderValue.settings) ? {} : builderValue.settings || {})\n }\n });\n },\n view: \"simple\"\n }), id === builderValue.id && (0,external_window_wp_element_.createElement)(\"li\", {\n className: classnames_default()({\n active: id === builderValue.id,\n 'ct-global': id === 'type-1'\n }),\n onClick: () => {\n if (Object.keys(headerOptions).length > 0) {\n open();\n }\n }\n }, (0,external_window_wp_element_.createElement)(\"span\", {\n className: \"ct-panel-name\"\n }, panelLabel)));\n }\n }));\n }));\n};\n\n/* harmony default export */ const builder_sidebar_PanelsManager = (PanelsManager);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/AvailableItems.js\n\n\n\n\n\n\n\n\n\n\nconst AvailableItems = _ref => {\n let {\n allBuilderSections,\n builderValue,\n builderValueDispatch,\n inlinedItemsFromBuilder\n } = _ref;\n // panels | items | options\n const [currentTab, setCurrentTab] = (0,external_window_wp_element_.useState)('items');\n const {\n builderValueCollection\n } = (0,external_window_wp_element_.useContext)(DragDropContext);\n const secondaryItems = ct_customizer_localizations.header_builder_data.secondary_items.header;\n const allItems = ct_customizer_localizations.header_builder_data.header;\n const headerOptions = ct_customizer_localizations.header_builder_data.header_data.header_options;\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-available-items\"\n }, (0,external_window_wp_element_.createElement)(\"h3\", {\n className: \"ct-title\",\n dangerouslySetInnerHTML: {\n __html: (0,external_window_wp_i18n_.sprintf)((0,external_window_wp_i18n_.__)('Customizing: %s', 'blocksy'), `${(builderValueCollection.sections.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id === builderValue.id;\n }) || {}).name || {\n 'type-1': (0,external_window_wp_i18n_.__)('Global Header', 'blocksy')\n }[builderValue.id] || builderValue.id}`)\n }\n }), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-tabs\"\n }, (0,external_window_wp_element_.createElement)(\"ul\", null, ['items', 'panels'].map(tab => (0,external_window_wp_element_.createElement)(\"li\", {\n key: tab,\n onClick: e => {\n e.preventDefault();\n setCurrentTab(tab);\n },\n className: classnames_default()({\n active: tab === currentTab\n })\n }, {\n panels: (0,external_window_wp_i18n_.__)('Headers', 'blocksy'),\n items: (0,external_window_wp_i18n_.__)('Elements', 'blocksy')\n }[tab]))), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-current-tab\"\n }, currentTab === 'panels' && (0,external_window_wp_element_.createElement)(external_window_wp_components_.Slot, {\n name: \"PlacementsBuilderPanelsManager\"\n }, fills => fills.length === 0 ? (0,external_window_wp_element_.createElement)(builder_sidebar_PanelsManager, null) : fills), (0,external_window_wp_element_.createElement)(builder_sidebar_SecondaryItems, {\n builderValue: builderValue,\n builderValueDispatch: builderValueDispatch,\n inlinedItemsFromBuilder: inlinedItemsFromBuilder,\n displayList: currentTab === 'items'\n }))), (0,external_window_wp_element_.createElement)(builder_sidebar_InvisiblePanels, {\n builderValue: builderValue,\n builderValueDispatch: builderValueDispatch\n }));\n};\n\n/* harmony default export */ const placements_AvailableItems = (AvailableItems);\n// EXTERNAL MODULE: ./node_modules/nanoid/index.browser.js\nvar index_browser = __webpack_require__(1496);\nvar index_browser_default = /*#__PURE__*/__webpack_require__.n(index_browser);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/builderReducer.js\nfunction builderReducer_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction builderReducer_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? builderReducer_ownKeys(Object(source), !0).forEach(function (key) { builderReducer_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : builderReducer_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction builderReducer_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nconst builderReducer = (builderValue, action) => {\n let updatedGlobalState = {};\n let newSections = [];\n let futureBuilderValue = builderValue.sections.find(_ref => {\n let {\n id\n } = _ref;\n return id.indexOf(builderValue.__forced_static_header__ || fetchCurrentHeader() || builderValue.sections[0].id) > -1;\n });\n let shouldUpdate = false;\n let updateItemId = false;\n let removeSectionIds = [];\n\n if (action.type === 'ITEM_VALUE_ON_CHANGE') {\n const {\n id,\n optionId,\n optionValue,\n values = {}\n } = action.payload;\n updateItemId = `${id}:${optionId}`;\n let items = futureBuilderValue.items;\n\n if (!items.find(_ref2 => {\n let {\n id: _id\n } = _ref2;\n return _id === id;\n })) {\n items = [...items, {\n id,\n values: {}\n }];\n }\n\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n items: items.map(item => item.id === id ? builderReducer_objectSpread(builderReducer_objectSpread({}, item), {}, {\n values: builderReducer_objectSpread(builderReducer_objectSpread(builderReducer_objectSpread({}, item.values), values), {}, {\n [optionId]: optionValue\n })\n }) : item)\n });\n }\n\n if (action.type === 'PICK_BUILDER_SECTION') {\n shouldUpdate = true;\n updatedGlobalState = {\n __forced_static_header__: action.payload.id\n };\n }\n\n if (action.type === 'MARK_HEADER_AS_GLOBAL') {\n shouldUpdate = true;\n updatedGlobalState = {\n current_section: builderValue.__forced_static_header__\n };\n }\n\n if (action.type === 'MARK_SPECIFIC_HEADER_AS_GLOBAL') {\n updatedGlobalState = {\n current_section: action.payload.id\n };\n }\n\n if (action.type === 'CLONE_ITEM') {\n const futureId = (0,helpers/* getOriginalId */.t_)(action.payload.id);\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n items: [...futureBuilderValue.items, {\n id: `${futureId}${(0,helpers/* customItemsSeparator */.SU)()}${index_browser_default()()}`,\n values: futureBuilderValue.items.find(_ref3 => {\n let {\n id\n } = _ref3;\n return id === futureId;\n }) ? futureBuilderValue.items.find(_ref4 => {\n let {\n id\n } = _ref4;\n return id === futureId;\n }).values : {}\n }]\n });\n }\n\n if (action.type === 'REMOVE_CLONED_ITEM') {\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n items: futureBuilderValue.items.filter(_ref5 => {\n let {\n id\n } = _ref5;\n return id !== action.payload.id;\n })\n });\n }\n\n if (action.type === 'SET_LIST') {\n shouldUpdate = true;\n const {\n currentView,\n lists\n } = action.payload;\n\n if (\n /**\n * If we just inserted offcanvas trigger on desktop\n */\n currentView === 'desktop' && Object.values(lists).reduce((all, current) => [...all, ...current], []).indexOf('trigger') > -1 && !futureBuilderValue.desktop.find(_ref6 => {\n let {\n id\n } = _ref6;\n return id === 'offcanvas';\n })) {\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n desktop: [...futureBuilderValue.desktop, {\n id: 'offcanvas',\n placements: [{\n id: 'start',\n items: []\n }]\n }]\n });\n }\n\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n [currentView]: futureBuilderValue[currentView].map(_ref7 => {\n let {\n id: barId,\n placements\n } = _ref7;\n const keys = Object.keys(lists);\n\n if (keys.map(k => k.split(':')[0]).indexOf(barId) > -1) {\n let futureBar = {\n id: barId,\n placements: placements.map(_ref8 => {\n let {\n id,\n items\n } = _ref8;\n\n if (lists[`${barId}:${id}`]) {\n return {\n id,\n items: lists[`${barId}:${id}`]\n };\n }\n\n return {\n id,\n items\n };\n })\n };\n\n if (futureBar.placements.find(_ref9 => {\n let {\n id\n } = _ref9;\n return id === 'middle';\n }) && futureBar.placements.find(_ref10 => {\n let {\n id\n } = _ref10;\n return id === 'middle';\n }).items.length === 0 && futureBar.placements.find(_ref11 => {\n let {\n id\n } = _ref11;\n return id === 'start-middle';\n }) && (futureBar.placements.find(_ref12 => {\n let {\n id\n } = _ref12;\n return id === 'start-middle';\n }).items.length > 0 || futureBar.placements.find(_ref13 => {\n let {\n id\n } = _ref13;\n return id === 'end-middle';\n }).items.length > 0)) {\n let updater = {};\n updater[`${barId}:start`] = [...futureBar.placements.find(_ref14 => {\n let {\n id\n } = _ref14;\n return id === 'start';\n }).items, ...futureBar.placements.find(_ref15 => {\n let {\n id\n } = _ref15;\n return id === 'start-middle';\n }).items];\n updater[`${barId}:end`] = [...futureBar.placements.find(_ref16 => {\n let {\n id\n } = _ref16;\n return id === 'end-middle';\n }).items, ...futureBar.placements.find(_ref17 => {\n let {\n id\n } = _ref17;\n return id === 'end';\n }).items];\n updater[`${barId}:start-middle`] = [];\n updater[`${barId}:end-middle`] = [];\n futureBar = {\n id: barId,\n placements: futureBar.placements.map(_ref18 => {\n let {\n id,\n items\n } = _ref18;\n\n if (updater[`${barId}:${id}`]) {\n return {\n id,\n items: updater[`${barId}:${id}`]\n };\n }\n\n return {\n id,\n items\n };\n })\n };\n }\n\n return futureBar;\n }\n\n return {\n id: barId,\n placements\n };\n })\n });\n }\n\n if (action.type === 'BUILDER_GLOBAL_SETTING_ON_CHANGE') {\n const {\n optionId,\n optionValue,\n values = {}\n } = action.payload;\n futureBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue), {}, {\n settings: builderReducer_objectSpread(builderReducer_objectSpread(builderReducer_objectSpread({}, futureBuilderValue.settings), values), {}, {\n [optionId]: optionValue\n })\n });\n }\n\n if (action.type === 'CREATE_NEW_SECTION') {\n const {\n name,\n copy\n } = action.payload;\n newSections = [copy ? builderReducer_objectSpread(builderReducer_objectSpread({}, builderValue.sections.find(_ref19 => {\n let {\n id\n } = _ref19;\n return id === copy;\n }) || {}), {}, {\n name,\n id: `ct-custom-${index_browser_default()()}`\n }) : {\n name,\n id: `ct-custom-${index_browser_default()()}`,\n mode: 'placements',\n items: [],\n settings: [],\n desktop: [{\n id: 'top-row',\n placements: [{\n id: 'start',\n items: []\n }, {\n id: 'middle',\n items: []\n }, {\n id: 'end',\n items: []\n }, {\n id: 'start-middle',\n items: []\n }, {\n id: 'end-middle',\n items: []\n }]\n }, {\n id: 'middle-row',\n placements: [{\n id: 'start',\n items: ['logo']\n }, {\n id: 'middle',\n items: []\n }, {\n id: 'end',\n items: ['menu']\n }, {\n id: 'start-middle',\n items: []\n }, {\n id: 'end-middle',\n items: []\n }]\n }, {\n id: 'bottom-row',\n placements: [{\n id: 'start',\n items: []\n }, {\n id: 'middle',\n items: []\n }, {\n id: 'end',\n items: []\n }, {\n id: 'start-middle',\n items: []\n }, {\n id: 'end-middle',\n items: []\n }]\n }],\n mobile: [{\n id: 'top-row',\n placements: [{\n id: 'start',\n items: []\n }, {\n id: 'middle',\n items: []\n }, {\n id: 'end',\n items: []\n }, {\n id: 'start-middle',\n items: []\n }, {\n id: 'end-middle',\n items: []\n }]\n }, {\n id: 'middle-row',\n placements: [{\n id: 'start',\n items: ['logo']\n }, {\n id: 'middle',\n items: []\n }, {\n id: 'end',\n items: ['trigger']\n }, {\n id: 'start-middle',\n items: []\n }, {\n id: 'end-middle',\n items: []\n }]\n }, {\n id: 'bottom-row',\n placements: [{\n id: 'start',\n items: []\n }, {\n id: 'middle',\n items: []\n }, {\n id: 'end',\n items: []\n }, {\n id: 'start-middle',\n items: []\n }, {\n id: 'end-middle',\n items: []\n }]\n }, {\n id: 'offcanvas',\n placements: [{\n id: 'start',\n items: ['mobile-menu']\n }]\n }]\n }];\n }\n\n if (action.type === 'REMOVE_BUILDER_SECTION') {\n removeSectionIds.push(action.payload.id);\n }\n\n const actualBuilderValue = builderReducer_objectSpread(builderReducer_objectSpread(builderReducer_objectSpread({}, builderValue), updatedGlobalState), {}, {\n __should_refresh__: shouldUpdate,\n __should_refresh_item__: updateItemId,\n sections: [...builderValue.sections.map(builder => builder.id === futureBuilderValue.id ? futureBuilderValue : builder), ...newSections].filter(_ref20 => {\n let {\n id\n } = _ref20;\n return removeSectionIds.indexOf(id) === -1;\n })\n });\n\n return actualBuilderValue;\n};\n// EXTERNAL MODULE: ./static/js/customizer/components/useDeviceManager.js\nvar useDeviceManager = __webpack_require__(5458);\n// EXTERNAL MODULE: external \"ctEvents\"\nvar external_ctEvents_ = __webpack_require__(2243);\n;// CONCATENATED MODULE: ./static/js/customizer/panels-builder/placements/BuilderRoot.js\nconst BuilderRoot_excluded = [\"__forced_dynamic_header__\", \"__forced_static_header__\", \"__should_refresh__\"],\n _excluded2 = [\"__forced_dynamic_header__\", \"__forced_static_header__\", \"__should_refresh__\"];\n\nfunction BuilderRoot_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction BuilderRoot_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? BuilderRoot_ownKeys(Object(source), !0).forEach(function (key) { BuilderRoot_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : BuilderRoot_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction BuilderRoot_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction BuilderRoot_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = BuilderRoot_objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction BuilderRoot_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\nconst DragDropContext = (0,external_window_wp_element_.createContext)({});\n\nconst getDocument = x => x.document || x.contentDocument || x.contentWindow.document;\n\nconst fetchCurrentHeader = () => {\n const document = getDocument(wp.customize.previewer.container.find('iframe')[0]);\n\n if (wp.customize.previewer.container.find('iframe')[0].contentDocument.querySelector('header#header')) {\n return wp.customize.previewer.container.find('iframe')[0].contentDocument.querySelector('header#header').dataset.id;\n }\n\n return null;\n};\n\nconst BuilderRoot = _ref => {\n let {\n value: allBuilderSections,\n option,\n onChange: onBuilderValueChange\n } = _ref;\n const currentHeader = (0,external_window_wp_element_.useRef)(null);\n\n if (currentHeader.current === null) {\n currentHeader.current = (allBuilderSections.sections.find(_ref2 => {\n let {\n id\n } = _ref2;\n return id.indexOf(fetchCurrentHeader()) > -1;\n }) || allBuilderSections.sections[0]).id;\n }\n\n (0,external_window_wp_element_.useEffect)(() => {\n let _wp$customize = wp.customize('header_placements')(),\n {\n __forced_dynamic_header__,\n __forced_static_header__,\n __should_refresh__\n } = _wp$customize,\n old = BuilderRoot_objectWithoutProperties(_wp$customize, BuilderRoot_excluded);\n\n Object.keys(old).map(key => {\n if (parseFloat(key)) {\n delete old[key];\n }\n });\n\n try {\n wp.customize('header_placements')(BuilderRoot_objectSpread(BuilderRoot_objectSpread({}, old), {}, {\n __forced_static_header__: (allBuilderSections.sections.find(_ref3 => {\n let {\n id\n } = _ref3;\n return id.indexOf(fetchCurrentHeader()) > -1;\n }) || allBuilderSections.sections[0]).id\n }));\n } catch (e) {\n console.error(e);\n }\n\n return () => {\n const _wp$customize2 = wp.customize('header_placements')(),\n {\n __forced_dynamic_header__,\n __forced_static_header__,\n __should_refresh__\n } = _wp$customize2,\n old = BuilderRoot_objectWithoutProperties(_wp$customize2, _excluded2);\n\n wp.customize('header_placements')(BuilderRoot_objectSpread({\n __should_refresh__: true,\n [Math.random()]: 'update'\n }, old));\n };\n }, []);\n const [isDragging, setIsDragging] = (0,external_window_wp_element_.useState)(false);\n const [builderValueCollection, builderValueDispatchInternal] = (0,external_window_wp_element_.useReducer)(builderReducer, BuilderRoot_objectSpread(BuilderRoot_objectSpread({}, allBuilderSections), currentHeader.current ? {\n __forced_static_header__: currentHeader.current\n } : {}));\n const builderValue = (0,external_window_wp_element_.useMemo)(() => builderValueCollection.sections.find(_ref4 => {\n let {\n id\n } = _ref4;\n return id === builderValueCollection.__forced_static_header__;\n }) || builderValueCollection.sections[0], [builderValueCollection]); // desktop | mobile\n\n const [currentView, setCurrentView] = (0,useDeviceManager/* useDeviceManager */.Or)({\n withTablet: false\n });\n const inlinedItemsFromBuilder = (0,external_window_wp_element_.useMemo)(() => builderValue[currentView].reduce((currentItems, _ref5) => {\n let {\n id,\n placements\n } = _ref5;\n return [...currentItems, ...(placements || []).reduce((c, _ref6) => {\n let {\n id,\n items\n } = _ref6;\n return [...c, ...items];\n }, [])];\n }, []), [builderValue, currentView]);\n const builderValueDispatch = (0,external_window_wp_element_.useCallback)(action => {\n let newState = builderReducer(builderValueCollection, action);\n\n if (action.type === 'ITEM_VALUE_ON_CHANGE') {\n const {\n id,\n optionId,\n optionValue,\n values = {}\n } = action.payload;\n const builderValue = newState.sections.find(_ref7 => {\n let {\n id\n } = _ref7;\n return id === newState.__forced_static_header__;\n }) || newState.sections[0];\n let items = builderValue.items;\n\n if (id === 'logo' && optionId === 'custom_logo' && builderValue.id === 'type-1') {\n wp.customize && wp.customize('custom_logo')(optionValue ? optionValue.desktop ? optionValue.desktop : optionValue : '');\n }\n\n wp.customize.previewer && wp.customize.previewer.send('ct:header:receive-value-update', {\n itemId: id,\n optionId,\n optionValue,\n futureItems: builderValue.items,\n values: BuilderRoot_objectSpread(BuilderRoot_objectSpread(BuilderRoot_objectSpread({}, (items.find(_ref8 => {\n let {\n id: _id\n } = _ref8;\n return id === _id;\n }) || {\n values: {}\n }).values), values), {}, {\n [optionId]: optionValue\n })\n });\n }\n\n if (action.type === 'BUILDER_GLOBAL_SETTING_ON_CHANGE') {\n const {\n optionId,\n optionValue,\n values = {}\n } = action.payload;\n const builderValue = newState.sections.find(_ref9 => {\n let {\n id\n } = _ref9;\n return id === newState.__forced_static_header__;\n }) || newState.sections[0];\n wp.customize.previewer && wp.customize.previewer.send('ct:header:receive-value-update', {\n itemId: 'global',\n optionId,\n optionValue,\n values: BuilderRoot_objectSpread(BuilderRoot_objectSpread(BuilderRoot_objectSpread({}, builderValue.settings), values), {}, {\n [optionId]: optionValue\n })\n });\n }\n\n onBuilderValueChange(newState);\n builderValueDispatchInternal(action);\n }, [builderValueDispatchInternal, onBuilderValueChange, builderValueCollection]);\n const setList = (0,external_window_wp_element_.useCallback)(lists => builderValueDispatch({\n type: 'SET_LIST',\n payload: {\n currentView,\n lists\n }\n }), [builderValueDispatch, currentView]);\n return (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, (0,external_window_wp_element_.createElement)(DragDropContext.Provider, {\n value: {\n option,\n currentView,\n isDragging,\n setIsDragging,\n setList,\n builderValueDispatch,\n builderValue,\n onChange: _ref10 => {\n let {\n id,\n value\n } = _ref10;\n return setList({\n [id]: value\n });\n },\n builderValueCollection\n }\n }, (0,external_window_wp_element_.createElement)(placements_AvailableItems, {\n allBuilderSections: allBuilderSections,\n builderValue: builderValue,\n inlinedItemsFromBuilder: inlinedItemsFromBuilder,\n builderValueDispatch: builderValueDispatch\n }), (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-builder-header\"\n }, (0,external_window_wp_element_.createElement)(placements_ViewSwitch, {\n currentView: currentView,\n setCurrentView: setCurrentView\n }), (0,external_window_wp_element_.createElement)(placements_PlacementsBuilder, {\n inlinedItemsFromBuilder: inlinedItemsFromBuilder,\n builderValueWithView: builderValue[currentView],\n view: currentView\n })), document.querySelector('.ct-panel-builder'))));\n};\n\n/* harmony default export */ const placements_BuilderRoot = (BuilderRoot);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-header-builder.js\n\n\n\nconst HeaderBuilder = props => (0,external_window_wp_element_.createElement)(placements_BuilderRoot, props);\n\nHeaderBuilder.renderingConfig = {\n design: 'none'\n};\n/* harmony default export */ const ct_header_builder = (HeaderBuilder);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU2NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQy9aQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9wYW5lbHMtYnVpbGRlci9wbGFjZW1lbnRzL0RyYWdnYWJsZUl0ZW1zLmpzPzQ0NzUiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9wYW5lbHMtYnVpbGRlci9wbGFjZW1lbnRzL1BsYWNlbWVudHNCdWlsZGVyL1ByaW1hcnlQbGFjZW1lbnQuanM/MTE5OCIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL3BsYWNlbWVudHMvUGxhY2VtZW50c0J1aWxkZXIvUm93LmpzP2EyNGYiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9wYW5lbHMtYnVpbGRlci9wbGFjZW1lbnRzL1BsYWNlbWVudHNCdWlsZGVyLmpzP2YxNjMiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9wYW5lbHMtYnVpbGRlci9wbGFjZW1lbnRzL1ZpZXdTd2l0Y2guanM/NjE3MCIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL3BsYWNlbWVudHMvYnVpbGRlci1zaWRlYmFyL1NlY29uZGFyeUl0ZW1zLmpzPzBjNzEiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvY3VzdG9taXplci9wYW5lbHMtYnVpbGRlci9wbGFjZW1lbnRzL2J1aWxkZXItc2lkZWJhci9JbnZpc2libGVQYW5lbHMuanM/NzcwYyIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL3BsYWNlbWVudHMvYnVpbGRlci1zaWRlYmFyL1BhbmVsc01hbmFnZXIuanM/MjJmMiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL3BsYWNlbWVudHMvQXZhaWxhYmxlSXRlbXMuanM/YzNlNSIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL3BsYWNlbWVudHMvYnVpbGRlclJlZHVjZXIuanM/NDlhZiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL3BsYWNlbWVudHMvQnVpbGRlclJvb3QuanM/M2U3YyIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3QtaGVhZGVyLWJ1aWxkZXIuanM/YWEyOSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBfZXhjbHVkZWQgPSBbXCJpdGVtc1wiLCBcImRyYWdnYWJsZUlkXCIsIFwiaGFzUG9pbnRlcnNcIiwgXCJjbGFzc05hbWVcIiwgXCJ0YWdOYW1lXCIsIFwiZGlyZWN0aW9uXCIsIFwiZ3JvdXBcIiwgXCJvcHRpb25zXCIsIFwicHJvcHNGb3JJdGVtXCIsIFwiZGlzcGxheVdyYXBwZXJcIl07XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCB1c2VDb250ZXh0LCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJy4vU29ydGFibGUnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BDb250ZXh0IH0gZnJvbSAnLi9CdWlsZGVyUm9vdCc7XG5pbXBvcnQgeyBQYW5lbENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9vcHRpb25zL2NvbXBvbmVudHMvUGFuZWxMZXZlbCc7XG5pbXBvcnQgeyBjdXN0b21JdGVtc1NlcGFyYXRvciwgZ2V0T3JpZ2luYWxJZCB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9vcHRpb25zL2hlbHBlcnMvZ2V0LWxhYmVsJztcblxuY29uc3QgaXNJdGVtQWxsb3dlZEluID0gKGl0ZW1JZCwgYmFySWQsIGN1cnJlbnRWaWV3KSA9PiB7XG4gIGNvbnN0IGl0ZW0gPSBjdF9jdXN0b21pemVyX2xvY2FsaXphdGlvbnMuaGVhZGVyX2J1aWxkZXJfZGF0YS5oZWFkZXIuZmluZChfcmVmID0+IHtcbiAgICBsZXQge1xuICAgICAgaWRcbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4gaWQgPT09IGdldE9yaWdpbmFsSWQoaXRlbUlkKTtcbiAgfSk7XG5cbiAgaWYgKCFpdGVtKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBsZXQgYWxsb3dlZF9pbiA9IFtdO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGl0ZW0uY29uZmlnLmFsbG93ZWRfaW4pKSB7XG4gICAgYWxsb3dlZF9pbiA9IGl0ZW0uY29uZmlnLmFsbG93ZWRfaW47XG4gIH0gZWxzZSB7XG4gICAgaWYgKGl0ZW0uY29uZmlnLmFsbG93ZWRfaW5bY3VycmVudFZpZXddKSB7XG4gICAgICBhbGxvd2VkX2luID0gaXRlbS5jb25maWcuYWxsb3dlZF9pbltjdXJyZW50Vmlld107XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYWxsb3dlZFJlc3BlY3RlZCA9IGFsbG93ZWRfaW4ubGVuZ3RoID4gMCA/IGFsbG93ZWRfaW4uaW5kZXhPZihiYXJJZCkgPiAtMSA6IHRydWU7XG4gIGNvbnN0IGV4Y2x1c2lvblJlc3BlY3RlZCA9IGl0ZW0uY29uZmlnLmV4Y2x1ZGVkX2Zyb20ubGVuZ3RoID4gMCA/IGl0ZW0uY29uZmlnLmV4Y2x1ZGVkX2Zyb20uaW5kZXhPZihiYXJJZCkgPT09IC0xIDogdHJ1ZTtcbiAgcmV0dXJuIGFsbG93ZWRSZXNwZWN0ZWQgJiYgZXhjbHVzaW9uUmVzcGVjdGVkO1xufTtcblxuZXhwb3J0IGNvbnN0IERyYWdnYWJsZUl0ZW0gPSBfcmVmMiA9PiB7XG4gIHZhciBfaXRlbURhdGEkY29uZmlnJG5hbWUsIF9pdGVtRGF0YSRjb25maWcsIF9pdGVtRGF0YSRjb25maWckbmFtZTIsIF9pdGVtRGF0YSRjb25maWcyO1xuXG4gIGxldCB7XG4gICAgaXRlbSxcbiAgICBpbmRleCxcbiAgICBwYW5lbFR5cGUsXG4gICAgb25SZW1vdmUsXG4gICAgcmVuZGVySXRlbSxcbiAgICBvbkNsaWNrLFxuICAgIGNsYXNzTmFtZVxuICB9ID0gX3JlZjI7XG4gIGNvbnN0IGl0ZW1EYXRhID0gY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zLmhlYWRlcl9idWlsZGVyX2RhdGFbcGFuZWxUeXBlXS5maW5kKF9yZWYzID0+IHtcbiAgICBsZXQge1xuICAgICAgaWRcbiAgICB9ID0gX3JlZjM7XG4gICAgcmV0dXJuIGlkID09PSBnZXRPcmlnaW5hbElkKGl0ZW0pO1xuICB9KTtcbiAgY29uc3Qge1xuICAgIGJ1aWxkZXJWYWx1ZVxuICB9ID0gdXNlQ29udGV4dChEcmFnRHJvcENvbnRleHQpO1xuXG4gIGlmIChyZW5kZXJJdGVtKSB7XG4gICAgcmV0dXJuIHJlbmRlckl0ZW0oe1xuICAgICAgaXRlbSxcbiAgICAgIGl0ZW1EYXRhLFxuICAgICAgaW5kZXhcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRHluYW1pYyBpdGVtcyBoYXZlIGEgOiBpbiB0aGVpciBJRFxuICAgKi9cblxuXG4gIGNvbnN0IGFsbER5bmFtaWNJdGVtcyA9IGJ1aWxkZXJWYWx1ZS5pdGVtcy5maWx0ZXIoX3JlZjQgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmNDtcbiAgICByZXR1cm4gaWQuaW5kZXhPZihjdXN0b21JdGVtc1NlcGFyYXRvcigpKSA+IC0xO1xuICB9KS5tYXAoX3JlZjUgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmNTtcbiAgICByZXR1cm4gaWQ7XG4gIH0pO1xuICBjb25zdCBhbGxDbG9uZXNBbmRPcmlnaW5hbCA9IFtnZXRPcmlnaW5hbElkKGl0ZW0pLCAuLi5hbGxEeW5hbWljSXRlbXMuZmlsdGVyKGlkID0+IGdldE9yaWdpbmFsSWQoaWQpID09PSBnZXRPcmlnaW5hbElkKGl0ZW0pKV07XG4gIGNvbnN0IGJlYXV0eUl0ZW0gPSBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZ2V0T3JpZ2luYWxJZChpdGVtKSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBcImRhdGEtaWRcIjogaXRlbSxcbiAgICBjbGFzc05hbWU6IGNscygnY3QtYnVpbGRlci1pdGVtJywgY2xhc3NOYW1lLCB7Ly8gJ2N0LWlzLWRyYWdnaW5nJzogc25hcHNob3QuaXNEcmFnZ2luZ1xuICAgIH0pLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2tcbiAgfSwgYWxsQ2xvbmVzQW5kT3JpZ2luYWwubGVuZ3RoID4gMSA/IGAkeyhfaXRlbURhdGEkY29uZmlnJG5hbWUgPSBpdGVtRGF0YSA9PT0gbnVsbCB8fCBpdGVtRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9pdGVtRGF0YSRjb25maWcgPSBpdGVtRGF0YS5jb25maWcpID09PSBudWxsIHx8IF9pdGVtRGF0YSRjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9pdGVtRGF0YSRjb25maWcubmFtZSkgIT09IG51bGwgJiYgX2l0ZW1EYXRhJGNvbmZpZyRuYW1lICE9PSB2b2lkIDAgPyBfaXRlbURhdGEkY29uZmlnJG5hbWUgOiBiZWF1dHlJdGVtfSAke2FsbENsb25lc0FuZE9yaWdpbmFsLmluZGV4T2YoaXRlbSkgKyAxfWAgOiAoX2l0ZW1EYXRhJGNvbmZpZyRuYW1lMiA9IGl0ZW1EYXRhID09PSBudWxsIHx8IGl0ZW1EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2l0ZW1EYXRhJGNvbmZpZzIgPSBpdGVtRGF0YS5jb25maWcpID09PSBudWxsIHx8IF9pdGVtRGF0YSRjb25maWcyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaXRlbURhdGEkY29uZmlnMi5uYW1lKSAhPT0gbnVsbCAmJiBfaXRlbURhdGEkY29uZmlnJG5hbWUyICE9PSB2b2lkIDAgPyBfaXRlbURhdGEkY29uZmlnJG5hbWUyIDogYmVhdXR5SXRlbSwgY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWJ0bi1yZW1vdmVcIixcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBvblJlbW92ZSgpO1xuICAgIH1cbiAgfSkpO1xufTtcblxuY29uc3QgRHJhZ2dhYmxlSXRlbXMgPSBfcmVmNiA9PiB7XG4gIGxldCB7XG4gICAgaXRlbXMsXG4gICAgZHJhZ2dhYmxlSWQsXG4gICAgaGFzUG9pbnRlcnMgPSB0cnVlLFxuICAgIGNsYXNzTmFtZSxcbiAgICB0YWdOYW1lID0gJ2RpdicsXG4gICAgZGlyZWN0aW9uID0gJ2hvcml6b250YWwnLFxuICAgIGdyb3VwID0gJ2hlYWRlcl9zb3J0YWJsZXMnLFxuICAgIG9wdGlvbnMgPSB7fSxcbiAgICBwcm9wc0Zvckl0ZW0gPSBpdGVtID0+ICh7fSksXG4gICAgZGlzcGxheVdyYXBwZXIgPSB0cnVlXG4gIH0gPSBfcmVmNixcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY2LCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IHtcbiAgICBjdXJyZW50VmlldyxcbiAgICBpc0RyYWdnaW5nLFxuICAgIHNldElzRHJhZ2dpbmcsXG4gICAgb25DaGFuZ2UsXG4gICAgc2V0TGlzdFxuICB9ID0gdXNlQ29udGV4dChEcmFnRHJvcENvbnRleHQpO1xuICBjb25zdCB7XG4gICAgcGFuZWxzSGVscGVyc1xuICB9ID0gdXNlQ29udGV4dChQYW5lbENvbnRleHQpO1xuICBjb25zdCBpdGVtc091dHB1dCA9IGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IGNyZWF0ZUVsZW1lbnQoRHJhZ2dhYmxlSXRlbSwgX2V4dGVuZHMoe1xuICAgIGtleTogaXRlbSxcbiAgICBpbmRleDogaW5kZXgsXG4gICAgcGFuZWxUeXBlOiAnaGVhZGVyJyxcbiAgICBpdGVtOiBpdGVtLFxuICAgIGNsYXNzTmFtZTogcGFuZWxzSGVscGVycy5pc09wZW5Gb3IoYGJ1aWxkZXJfcGFuZWxfJHtpdGVtfWApID8gJ2N0LWN1c3RvbWl6aW5nJyA6ICcnLFxuICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKGlzRHJhZ2dpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYW5lbHNIZWxwZXJzLm9wZW4oYGJ1aWxkZXJfcGFuZWxfJHtpdGVtfWApO1xuICAgIH0sXG4gICAgb25SZW1vdmU6ICgpID0+IHtcbiAgICAgIHBhbmVsc0hlbHBlcnMuY2xvc2UoKTtcbiAgICAgIHNldExpc3QoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIFtkcmFnZ2FibGVJZF06IGl0ZW1zLmZpbHRlcihpZCA9PiBpZCAhPT0gaXRlbSlcbiAgICAgIH0sIGN1cnJlbnRWaWV3ID09PSAnZGVza3RvcCcgJiYgaXRlbSA9PT0gJ3RyaWdnZXInID8ge1xuICAgICAgICBbJ29mZmNhbnZhczpzdGFydCddOiBbXVxuICAgICAgfSA6IHt9KSk7XG4gICAgfVxuICB9LCBwcm9wc0Zvckl0ZW0oaXRlbSkpKSk7XG5cbiAgaWYgKCFkaXNwbGF5V3JhcHBlcikge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBpdGVtc091dHB1dCk7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChTb3J0YWJsZSwgX2V4dGVuZHMoe1xuICAgIG9wdGlvbnM6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgZGVsYXk6IDAsXG4gICAgICBncm91cCxcbiAgICAgIGZhbGxiYWNrT25Cb2R5OiB0cnVlLFxuICAgICAgZm9yY2VGYWxsYmFjazogdHJ1ZSxcbiAgICAgIGZhbGxiYWNrVG9sZXJhbmNlOiA1LFxuICAgICAgZmlsdGVyOiAnLmN0LXBvaW50ZXInLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgdG91Y2hTdGFydFRocmVzaG9sZDogNSxcbiAgICAgIG9uU3RhcnQ6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0SXNEcmFnZ2luZyhldmVudC5pdGVtLmRhdGFzZXQuaWQpO1xuICAgICAgICBsZXQgY3VycmVudFZpZXcgPSB3cC5jdXN0b21pemUucHJldmlld2VkRGV2aWNlKCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRWaWV3ID09PSAndGFibGV0Jykge1xuICAgICAgICAgIGN1cnJlbnRWaWV3ID0gJ21vYmlsZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNJdGVtQWxsb3dlZEluKGV2ZW50Lml0ZW0uZGF0YXNldC5pZCwgJ21pZGRsZS1yb3cnLCBjdXJyZW50VmlldykpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2N0LWJ1aWxkZXItZHJhZ2dpbmcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5mcm9tICYmIGdyb3VwICYmIGdyb3VwLnB1bGwgIT09ICdjbG9uZScpIHtcbiAgICAgICAgICBldmVudC50by5jbGFzc0xpc3QuYWRkKCdjdC1pcy1vdmVyJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbkVuZDogKCkgPT4ge1xuICAgICAgICBzZXRJc0RyYWdnaW5nKGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdjdC1idWlsZGVyLWRyYWdnaW5nJyk7XG4gICAgICAgIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY3QtcGFuZWwtYnVpbGRlciAuY3QtaXMtb3ZlcicpXS5tYXAoZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnY3QtaXMtb3ZlcicpKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdmU6IChldmVudCwgb3JpZ2luYWxFdmVudCkgPT4ge1xuICAgICAgICBsZXQgY3VycmVudFZpZXcgPSB3cC5jdXN0b21pemUucHJldmlld2VkRGV2aWNlKCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRWaWV3ID09PSAndGFibGV0Jykge1xuICAgICAgICAgIGN1cnJlbnRWaWV3ID0gJ21vYmlsZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZnJvbS5jbG9zZXN0KCcjY3Qtb3B0aW9uLWhlYWRlci1idWlsZGVyLWl0ZW1zJykpIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IFsuLi5ldmVudC5mcm9tLnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLWlkPVwiJHtldmVudC5kcmFnZ2VkLmRhdGFzZXQuaWR9XCJdYCldLm1hcChlbCA9PiB7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjdC1idWlsZGVyLWl0ZW0nKTtcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2N0LWl0ZW0taW4tYnVpbGRlcicpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIDtcbiAgICAgICAgWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jdC1wYW5lbC1idWlsZGVyIC5jdC1pcy1vdmVyJyldLm1hcChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjdC1pcy1vdmVyJykpO1xuXG4gICAgICAgIGlmIChldmVudC50bykge1xuICAgICAgICAgIGV2ZW50LnRvLmNsYXNzTGlzdC5hZGQoJ2N0LWlzLW92ZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNJdGVtQWxsb3dlZEluKGV2ZW50LmRyYWdnZWQuZGF0YXNldC5pZCwgZXZlbnQudG8uZGF0YXNldC5pZC5zcGxpdCgnOicpWzBdLCBjdXJyZW50VmlldykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBvcHRpb25zKSxcbiAgICBvbkNoYW5nZTogKG9yZGVyLCBzb3J0YWJsZSwgZXZ0KSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnaGVyZSBpcyBjaGFuZ2UnLCBvcmRlciwgZHJhZ2dhYmxlSWQpXG4gICAgICBpZiAoZHJhZ2dhYmxlSWQgPT09ICdhdmFpbGFibGUtaXRlbXMnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb25DaGFuZ2Uoe1xuICAgICAgICBpZDogZHJhZ2dhYmxlSWQsXG4gICAgICAgIHZhbHVlOiBvcmRlci5maWx0ZXIoaSA9PiBpICE9PSAnX19wb2ludGVyX18nICYmIGkgIT09ICdfX2ZpbGxlcl9fJylcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdGFnOiB0YWdOYW1lLFxuICAgIGNsYXNzTmFtZTogY2xzKCdjdC1idWlsZGVyLWl0ZW1zJywgY2xhc3NOYW1lKVxuICB9LCBwcm9wcywge1xuICAgIFwiZGF0YS1pZFwiOiBkcmFnZ2FibGVJZFxuICB9KSwgWydlbmQnLCAnc3RhcnQtbWlkZGxlJ10uaW5kZXhPZihkcmFnZ2FibGVJZC5zcGxpdCgnOicpWzFdKSA+IC0xICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIFwiZGF0YS1pZFwiOiBcIl9fZmlsbGVyX19cIixcbiAgICBjbGFzc05hbWU6IFwiY3QtZmlsbGVyXCJcbiAgfSksIGhhc1BvaW50ZXJzICYmIGlzRHJhZ2dpbmcgJiYgaXNJdGVtQWxsb3dlZEluKGlzRHJhZ2dpbmcsIGRyYWdnYWJsZUlkLnNwbGl0KCc6JylbMF0sIGN1cnJlbnRWaWV3KSAmJiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBcImRhdGEtaWRcIjogXCJfX3BvaW50ZXJfX1wiLFxuICAgIGNsYXNzTmFtZTogXCJjdC1wb2ludGVyXCJcbiAgfSksIGl0ZW1zT3V0cHV0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERyYWdnYWJsZUl0ZW1zOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBEcmFnZ2FibGVJdGVtcyBmcm9tICcuLi9EcmFnZ2FibGVJdGVtcyc7XG5cbmNvbnN0IFByaW1hcnlQbGFjZW1lbnQgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBwbGFjZW1lbnROYW1lLFxuICAgIGJhcixcbiAgICBkaXJlY3Rpb25cbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHBsYWNlbWVudCA9IGJhci5wbGFjZW1lbnRzLmZpbmQoX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gaWQgPT09IHBsYWNlbWVudE5hbWU7XG4gIH0pO1xuICBsZXQgcGxhY2VtZW50c1RvUmVuZGVyID0gW3BsYWNlbWVudF07XG5cbiAgaWYgKHBsYWNlbWVudE5hbWUgIT09ICdtaWRkbGUnKSB7XG4gICAgY29uc3QgbWlkZGxlID0gYmFyLnBsYWNlbWVudHMuZmluZChfcmVmMyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpZFxuICAgICAgfSA9IF9yZWYzO1xuICAgICAgcmV0dXJuIGlkID09PSAnbWlkZGxlJztcbiAgICB9KTtcblxuICAgIGlmIChtaWRkbGUgJiYgbWlkZGxlLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChwbGFjZW1lbnROYW1lID09PSAnc3RhcnQnKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TWlkZGxlID0gYmFyLnBsYWNlbWVudHMuZmluZChfcmVmNCA9PiB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlkXG4gICAgICAgICAgfSA9IF9yZWY0O1xuICAgICAgICAgIHJldHVybiBpZCA9PT0gJ3N0YXJ0LW1pZGRsZSc7XG4gICAgICAgIH0pO1xuICAgICAgICBwbGFjZW1lbnRzVG9SZW5kZXIgPSBbcGxhY2VtZW50LCBzdGFydE1pZGRsZV07XG4gICAgICB9XG5cbiAgICAgIGlmIChwbGFjZW1lbnROYW1lID09PSAnZW5kJykge1xuICAgICAgICBjb25zdCBlbmRNaWRkbGUgPSBiYXIucGxhY2VtZW50cy5maW5kKF9yZWY1ID0+IHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9ID0gX3JlZjU7XG4gICAgICAgICAgcmV0dXJuIGlkID09PSAnZW5kLW1pZGRsZSc7XG4gICAgICAgIH0pO1xuICAgICAgICBwbGFjZW1lbnRzVG9SZW5kZXIgPSBbZW5kTWlkZGxlLCBwbGFjZW1lbnRdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwibGlcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogW2BjdC1idWlsZGVyLWNvbHVtbi0ke3BsYWNlbWVudC5pZH1gXVxuICB9LCBwbGFjZW1lbnQuaWQgPT09ICdtaWRkbGUnID8ge1xuICAgICdkYXRhLWNvdW50JzogcGxhY2VtZW50Lml0ZW1zLmxlbmd0aFxuICB9IDoge30pLCBwbGFjZW1lbnRzVG9SZW5kZXIubWFwKHBsYWNlbWVudCA9PiBjcmVhdGVFbGVtZW50KERyYWdnYWJsZUl0ZW1zLCB7XG4gICAga2V5OiBwbGFjZW1lbnQuaWQsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgY2xhc3NOYW1lOiBwbGFjZW1lbnQuaWQgPT09ICdtaWRkbGUnID8gJycgOiBgY3QtJHtwbGFjZW1lbnQuaWQuaW5kZXhPZignLScpID4gLTEgPyAnc2Vjb25kYXJ5JyA6ICdwcmltYXJ5J30tY29sdW1uYCxcbiAgICBkcmFnZ2FibGVJZDogYCR7YmFyLmlkfToke3BsYWNlbWVudC5pZH1gLFxuICAgIGl0ZW1zOiBwbGFjZW1lbnQuaXRlbXNcbiAgfSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByaW1hcnlQbGFjZW1lbnQ7IiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgdXNlQ29udGV4dCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IHsgUGFuZWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vLi4vb3B0aW9ucy9jb21wb25lbnRzL1BhbmVsTGV2ZWwnO1xuaW1wb3J0IFByaW1hcnlQbGFjZW1lbnQgZnJvbSAnLi9QcmltYXJ5UGxhY2VtZW50JztcblxuY29uc3QgUm93ID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgYmFyLFxuICAgIGRpcmVjdGlvbiA9ICdob3Jpem9udGFsJ1xuICB9ID0gX3JlZjtcbiAgY29uc3Qge1xuICAgIHBhbmVsc0hlbHBlcnNcbiAgfSA9IHVzZUNvbnRleHQoUGFuZWxDb250ZXh0KTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImJ1aWxkZXItcm93XCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXJvdy1hY3Rpb25zXCIsXG4gICAgb25DbGljazogKCkgPT4gcGFuZWxzSGVscGVycy5vcGVuKGBidWlsZGVyX3BhbmVsXyR7YmFyLmlkfWApXG4gIH0sIHtcbiAgICAndG9wLXJvdyc6IF9fKCdUb3AgUm93JywgJ2Jsb2Nrc3knKSxcbiAgICAnbWlkZGxlLXJvdyc6IF9fKCdNYWluIFJvdycsICdibG9ja3N5JyksXG4gICAgJ2JvdHRvbS1yb3cnOiBfXygnQm90dG9tIFJvdycsICdibG9ja3N5JyksXG4gICAgb2ZmY2FudmFzOiBfXygnT2ZmIENhbnZhcyBBcmVhJywgJ2Jsb2Nrc3knKVxuICB9W2Jhci5pZF0pLCBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJyb3ctaW5uZXJcIlxuICB9LCBbJ3N0YXJ0JywgJ21pZGRsZScsICdlbmQnXS5maWx0ZXIocGxhY2VtZW50TmFtZSA9PiAhIWJhci5wbGFjZW1lbnRzLmZpbmQoX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gaWQgPT09IHBsYWNlbWVudE5hbWU7XG4gIH0pKS5tYXAocGxhY2VtZW50TmFtZSA9PiBjcmVhdGVFbGVtZW50KFByaW1hcnlQbGFjZW1lbnQsIHtcbiAgICBrZXk6IHBsYWNlbWVudE5hbWUsXG4gICAgYmFyOiBiYXIsXG4gICAgcGxhY2VtZW50TmFtZTogcGxhY2VtZW50TmFtZSxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICB9KSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJvdzsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCB1c2VDb250ZXh0IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IERyYWdnYWJsZUl0ZW1zIGZyb20gJy4vRHJhZ2dhYmxlSXRlbXMnO1xuaW1wb3J0IFJvdyBmcm9tICcuL1BsYWNlbWVudHNCdWlsZGVyL1Jvdyc7XG5cbmNvbnN0IFBsYWNlbWVudHNCdWlsZGVyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaW5saW5lZEl0ZW1zRnJvbUJ1aWxkZXIsXG4gICAgdmlldyxcbiAgICBidWlsZGVyVmFsdWVXaXRoVmlld1xuICB9ID0gX3JlZjtcbiAgbGV0IGhhc09mZmNhbnZhcyA9IHZpZXcgPT09ICdtb2JpbGUnIHx8IGlubGluZWRJdGVtc0Zyb21CdWlsZGVyLmluZGV4T2YoJ3RyaWdnZXInKSA+IC0xICYmIGJ1aWxkZXJWYWx1ZVdpdGhWaWV3LmZpbmQoX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gaWQgPT09ICdvZmZjYW52YXMnO1xuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzKCdwbGFjZW1lbnRzLWJ1aWxkZXInLCB7XG4gICAgICAnY3QtbW9iaWxlJzogaGFzT2ZmY2FudmFzXG4gICAgfSlcbiAgfSwgaGFzT2ZmY2FudmFzICYmIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIm9mZmNhbnZhcy1jb250YWluZXJcIlxuICB9LCBjcmVhdGVFbGVtZW50KFJvdywge1xuICAgIGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiLFxuICAgIGJhcjogYnVpbGRlclZhbHVlV2l0aFZpZXcuZmluZChfcmVmMyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpZFxuICAgICAgfSA9IF9yZWYzO1xuICAgICAgcmV0dXJuIGlkID09PSAnb2ZmY2FudmFzJztcbiAgICB9KVxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImhvcml6b250YWwtcm93c1wiXG4gIH0sIFsndG9wLXJvdycsICdtaWRkbGUtcm93JywgJ2JvdHRvbS1yb3cnXS5tYXAoYmFyID0+IHtcbiAgICBjb25zdCBtYXliZUJhciA9IGJ1aWxkZXJWYWx1ZVdpdGhWaWV3LmZpbmQoX3JlZjQgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgaWRcbiAgICAgIH0gPSBfcmVmNDtcbiAgICAgIHJldHVybiBpZCA9PT0gYmFyO1xuICAgIH0pO1xuXG4gICAgaWYgKCFtYXliZUJhcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoUm93LCB7XG4gICAgICBiYXI6IG1heWJlQmFyLFxuICAgICAga2V5OiBiYXJcbiAgICB9KTtcbiAgfSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFBsYWNlbWVudHNCdWlsZGVyOyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5cbmNvbnN0IFZpZXdTd2l0Y2ggPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBjdXJyZW50VmlldyxcbiAgICBzZXRDdXJyZW50Vmlld1xuICB9ID0gX3JlZjtcbiAgY29uc3QgW2J1aWxkZXJDb2xsYXBzZWQsIHNldEJ1aWxkZXJDb2xsYXBzZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud3AtZnVsbC1vdmVybGF5JykuY2xhc3NMaXN0LnJlbW92ZSgnY3QtYnVpbGRlci1jb2xsYXBzZWQnKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC12aWV3LXN3aXRjaFwiXG4gIH0sIFsnZGVza3RvcCcsICdtb2JpbGUnXS5tYXAodmlldyA9PiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIGtleTogdmlldyxcbiAgICBvbkNsaWNrOiAoKSA9PiBzZXRDdXJyZW50Vmlldyh2aWV3ID09PSAnbW9iaWxlJyA/ICd0YWJsZXQnIDogdmlldyksXG4gICAgY2xhc3NOYW1lOiBjbHMoe1xuICAgICAgYWN0aXZlOiBjdXJyZW50VmlldyA9PT0gdmlld1xuICAgIH0pXG4gIH0sIHtcbiAgICBkZXNrdG9wOiBfXygnRGVza3RvcCBIZWFkZXInLCAnYmxvY2tzeScpLFxuICAgIG1vYmlsZTogX18oJ1RhYmxldCAvIE1vYmlsZSBIZWFkZXInLCAnYmxvY2tzeScpXG4gIH1bdmlld10pKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtYnVpbGRlci10b2dnbGVcIixcbiAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICBzZXRCdWlsZGVyQ29sbGFwc2VkKCFidWlsZGVyQ29sbGFwc2VkKTtcblxuICAgICAgaWYgKGJ1aWxkZXJDb2xsYXBzZWQpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndwLWZ1bGwtb3ZlcmxheScpLmNsYXNzTGlzdC5yZW1vdmUoJ2N0LWJ1aWxkZXItY29sbGFwc2VkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud3AtZnVsbC1vdmVybGF5JykuY2xhc3NMaXN0LmFkZCgnY3QtYnVpbGRlci1jb2xsYXBzZWQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIGJ1aWxkZXJDb2xsYXBzZWQgPyBfXygnU2hvdyBCdWlsZGVyJywgJ2Jsb2Nrc3knKSA6IF9fKCdIaWRlIEJ1aWxkZXInLCAnYmxvY2tzeScpKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWaWV3U3dpdGNoOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZVN0YXRlLCB1c2VDb250ZXh0LCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgRHJhZ2dhYmxlSXRlbXMgZnJvbSAnLi4vRHJhZ2dhYmxlSXRlbXMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BDb250ZXh0IH0gZnJvbSAnLi4vQnVpbGRlclJvb3QnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQYW5lbCwgeyBQYW5lbE1ldGFXcmFwcGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vb3B0aW9ucy9vcHRpb25zL2N0LXBhbmVsJztcbmltcG9ydCB7IGdldFZhbHVlRnJvbUlucHV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vb3B0aW9ucy9oZWxwZXJzL2dldC12YWx1ZS1mcm9tLWlucHV0JztcbmltcG9ydCB7IGdldE9yaWdpbmFsSWQsIGN1c3RvbUl0ZW1zU2VwYXJhdG9yIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSAnQHdvcmRwcmVzcy9jb21wb25lbnRzJztcblxuY29uc3QgU2Vjb25kYXJ5SXRlbXMgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBidWlsZGVyVmFsdWUsXG4gICAgYnVpbGRlclZhbHVlRGlzcGF0Y2gsXG4gICAgaW5saW5lZEl0ZW1zRnJvbUJ1aWxkZXIsXG4gICAgZGlzcGxheUxpc3QgPSB0cnVlXG4gIH0gPSBfcmVmO1xuICBjb25zdCB7XG4gICAgcGFuZWxzU3RhdGUsXG4gICAgcGFuZWxzQWN0aW9ucyxcbiAgICBjdXJyZW50VmlldyxcbiAgICBpc0RyYWdnaW5nXG4gIH0gPSB1c2VDb250ZXh0KERyYWdEcm9wQ29udGV4dCk7XG4gIGNvbnN0IGlubGluZWRJdGVtc0Zyb21BbGxWaWV3c0J1aWxkZXIgPSBbLi4uYnVpbGRlclZhbHVlLmRlc2t0b3AucmVkdWNlKChjdXJyZW50SXRlbXMsIF9yZWYyKSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkLFxuICAgICAgcGxhY2VtZW50c1xuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gWy4uLmN1cnJlbnRJdGVtcywgLi4uKHBsYWNlbWVudHMgfHwgW10pLnJlZHVjZSgoYywgX3JlZjMpID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGlkLFxuICAgICAgICBpdGVtc1xuICAgICAgfSA9IF9yZWYzO1xuICAgICAgcmV0dXJuIFsuLi5jLCAuLi5pdGVtc107XG4gICAgfSwgW10pXTtcbiAgfSwgW10pLCAuLi5idWlsZGVyVmFsdWUubW9iaWxlLnJlZHVjZSgoY3VycmVudEl0ZW1zLCBfcmVmNCkgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZCxcbiAgICAgIHBsYWNlbWVudHNcbiAgICB9ID0gX3JlZjQ7XG4gICAgcmV0dXJuIFsuLi5jdXJyZW50SXRlbXMsIC4uLihwbGFjZW1lbnRzIHx8IFtdKS5yZWR1Y2UoKGMsIF9yZWY1KSA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpZCxcbiAgICAgICAgaXRlbXNcbiAgICAgIH0gPSBfcmVmNTtcbiAgICAgIHJldHVybiBbLi4uYywgLi4uaXRlbXNdO1xuICAgIH0sIFtdKV07XG4gIH0sIFtdKV07XG4gIGNvbnN0IHNlY29uZGFyeUl0ZW1zID0gY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zLmhlYWRlcl9idWlsZGVyX2RhdGEuc2Vjb25kYXJ5X2l0ZW1zLmhlYWRlci5maWx0ZXIoX3JlZjYgPT4ge1xuICAgIGxldCB7XG4gICAgICBjb25maWdcbiAgICB9ID0gX3JlZjY7XG4gICAgcmV0dXJuICgvLyBjb25maWcuZGV2aWNlcy5pbmRleE9mKGN1cnJlbnRWaWV3KSA+IC0xICYmXG4gICAgICBjb25maWcuZW5hYmxlZFxuICAgICk7XG4gIH0pO1xuICBjb25zdCBhbGxJdGVtcyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLmhlYWRlcjtcbiAgLyoqXG4gICAqIER5bmFtaWMgaXRlbXMgaGF2ZSBhIDogaW4gdGhlaXIgSURcbiAgICovXG5cbiAgY29uc3QgYWxsRHluYW1pY0l0ZW1zID0gYnVpbGRlclZhbHVlLml0ZW1zLmZpbHRlcihfcmVmNyA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWY3O1xuICAgIHJldHVybiBpZC5pbmRleE9mKGN1c3RvbUl0ZW1zU2VwYXJhdG9yKCkpID4gLTE7XG4gIH0pLm1hcChfcmVmOCA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWY4O1xuICAgIHJldHVybiBpZDtcbiAgfSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KERyYWdnYWJsZUl0ZW1zLCB7XG4gICAgb3B0aW9uczoge1xuICAgICAgc29ydDogZmFsc2UsXG4gICAgICBmaWx0ZXI6ICcuY3QtaXRlbS1pbi1idWlsZGVyJ1xuICAgIH0sXG4gICAgZ3JvdXA6IHtcbiAgICAgIG5hbWU6ICdoZWFkZXJfc29ydGFibGVzJyxcbiAgICAgIHB1dDogZmFsc2UsXG4gICAgICBwdWxsOiAnY2xvbmUnXG4gICAgfSxcbiAgICBkcmFnZ2FibGVJZDogJ2F2YWlsYWJsZS1pdGVtcycsXG4gICAgaXRlbXM6IFsuLi5zZWNvbmRhcnlJdGVtcy5tYXAoX3JlZjkgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgaWRcbiAgICAgIH0gPSBfcmVmOTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9KSwgLi4uYWxsRHluYW1pY0l0ZW1zXS5maWx0ZXIoZWwgPT4gYWxsSXRlbXMuc29tZShfcmVmMTAgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgaWRcbiAgICAgIH0gPSBfcmVmMTA7XG4gICAgICByZXR1cm4gaWQgPT09IGdldE9yaWdpbmFsSWQoZWwpO1xuICAgIH0pKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhSXRlbURhdGEgPSBhbGxJdGVtcy5maW5kKF9yZWYxMSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IF9yZWYxMTtcbiAgICAgICAgcmV0dXJuIGlkID09PSBnZXRPcmlnaW5hbElkKGEpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBiSXRlbURhdGEgPSBhbGxJdGVtcy5maW5kKF9yZWYxMiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IF9yZWYxMjtcbiAgICAgICAgcmV0dXJuIGlkID09PSBnZXRPcmlnaW5hbElkKGIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYUl0ZW1EYXRhLmNvbmZpZy5uYW1lLmxvY2FsZUNvbXBhcmUoYkl0ZW1EYXRhLmNvbmZpZy5uYW1lKTtcbiAgICB9KSxcbiAgICBoYXNQb2ludGVyczogZmFsc2UsXG4gICAgZGlzcGxheVdyYXBwZXI6IGRpc3BsYXlMaXN0LFxuICAgIHByb3BzRm9ySXRlbTogaXRlbSA9PiAoe1xuICAgICAgcmVuZGVySXRlbTogX3JlZjEzID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGl0ZW1EYXRhLFxuICAgICAgICAgIGluZGV4XG4gICAgICAgIH0gPSBfcmVmMTM7XG4gICAgICAgIGNvbnN0IGl0ZW1PcHRpb25zID0gYWxsSXRlbXMuZmluZChfcmVmMTQgPT4ge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0gPSBfcmVmMTQ7XG4gICAgICAgICAgcmV0dXJuIGlkID09PSBnZXRPcmlnaW5hbElkKGl0ZW0pO1xuICAgICAgICB9KS5vcHRpb25zO1xuICAgICAgICBjb25zdCBhbGxDbG9uZXNBbmRPcmlnaW5hbCA9IFtnZXRPcmlnaW5hbElkKGl0ZW0pLCAuLi5hbGxEeW5hbWljSXRlbXMuZmlsdGVyKGlkID0+IGdldE9yaWdpbmFsSWQoaWQpID09PSBnZXRPcmlnaW5hbElkKGl0ZW0pKV07XG4gICAgICAgIGNvbnN0IGl0ZW1OYW1lID0gYWxsQ2xvbmVzQW5kT3JpZ2luYWwubGVuZ3RoID4gMSA/IGAke2l0ZW1EYXRhLmNvbmZpZy5uYW1lfSAke2FsbENsb25lc0FuZE9yaWdpbmFsLmluZGV4T2YoaXRlbSkgKyAxfWAgOiBpdGVtRGF0YS5jb25maWcubmFtZTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgICAgIGxhYmVsOiBpdGVtTmFtZSxcbiAgICAgICAgICAnaW5uZXItb3B0aW9ucyc6IGl0ZW1PcHRpb25zXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGl0ZW1JbkJ1aWxkZXIgPSBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlci5pbmRleE9mKGl0ZW0pID4gLTE7XG4gICAgICAgIGxldCByb3cgPSAnX19ub25lX18nO1xuXG4gICAgICAgIGlmIChpdGVtSW5CdWlsZGVyKSB7XG4gICAgICAgICAgcm93ID0gYnVpbGRlclZhbHVlW2N1cnJlbnRWaWV3XS5maW5kKF9yZWYxNSA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgcGxhY2VtZW50c1xuICAgICAgICAgICAgfSA9IF9yZWYxNTtcbiAgICAgICAgICAgIGNvbnN0IHJvd0l0ZW1zID0gKHBsYWNlbWVudHMgfHwgW10pLnJlZHVjZSgoYywgX3JlZjE2KSA9PiB7XG4gICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgaXRlbXNcbiAgICAgICAgICAgICAgfSA9IF9yZWYxNjtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5jLCAuLi5pdGVtc107XG4gICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gcm93SXRlbXMuZmluZChpID0+IGkgPT09IGl0ZW0pO1xuICAgICAgICAgIH0pLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSBgYnVpbGRlcl9wYW5lbF8ke2l0ZW19YDtcbiAgICAgICAgY29uc3QgaXRlbXNPbmx5V2l0aFRyaWdnZXIgPSBbJ21vYmlsZS1tZW51JywgJ21vYmlsZS1tZW51LXNlY29uZGFyeScsICdvZmZjYW52YXMtbG9nbyddO1xuICAgICAgICBjb25zdCBpc1NpZGViYXJSZXByZXNlbnRhdGlvblByZXNlbnQgPSBkaXNwbGF5TGlzdCAmJiBpdGVtRGF0YS5jb25maWcuZGV2aWNlcy5pbmNsdWRlcyhjdXJyZW50VmlldykgJiYgKCFpdGVtc09ubHlXaXRoVHJpZ2dlci5pbmNsdWRlcyhpdGVtKSB8fCBpdGVtc09ubHlXaXRoVHJpZ2dlci5pbmNsdWRlcyhpdGVtKSAmJiAoY3VycmVudFZpZXcgIT09ICdkZXNrdG9wJyB8fCBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlci5pbmRleE9mKCd0cmlnZ2VyJykgPiAtMSkpO1xuICAgICAgICBsZXQgaXRlbVRpdGxlID0gaXRlbURhdGEuY29uZmlnLm5hbWU7XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFBhbmVsTWV0YVdyYXBwZXIsIF9leHRlbmRzKHtcbiAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgb3B0aW9uOiBvcHRpb25cbiAgICAgICAgfSwgcGFuZWxzQWN0aW9ucywge1xuICAgICAgICAgIGdldEFjdHVhbE9wdGlvbjogX3JlZjE3ID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIG9wZW5cbiAgICAgICAgICAgIH0gPSBfcmVmMTc7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgaW5saW5lZEl0ZW1zRnJvbUFsbFZpZXdzQnVpbGRlci5pbmRleE9mKGl0ZW0pID4gLTEgJiYgY3JlYXRlRWxlbWVudChQYW5lbCwge1xuICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgIGdldFZhbHVlczogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpdGVtVmFsdWUgPSBidWlsZGVyVmFsdWUuaXRlbXMuZmluZChfcmVmMTggPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICAgIH0gPSBfcmVmMTg7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaWQgPT09IGl0ZW07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXRlbVZhbHVlICYmIE9iamVjdC5rZXlzKGl0ZW1WYWx1ZS52YWx1ZXMpID4gNSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgICAgICAgICBidWlsZGVyU2V0dGluZ3M6IGJ1aWxkZXJWYWx1ZS5zZXR0aW5ncyB8fCB7fSxcbiAgICAgICAgICAgICAgICAgICAgcm93XG4gICAgICAgICAgICAgICAgICB9LCBpdGVtVmFsdWUudmFsdWVzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRWYWx1ZUZyb21JbnB1dChpdGVtT3B0aW9ucywgaXRlbVZhbHVlID8gaXRlbVZhbHVlLnZhbHVlcyA6IHt9KSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgICBidWlsZGVyU2V0dGluZ3M6IGJ1aWxkZXJWYWx1ZS5zZXR0aW5ncyB8fCB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcHRpb246IG9wdGlvbixcbiAgICAgICAgICAgICAgb25DaGFuZ2VGb3I6IChvcHRpb25JZCwgb3B0aW9uVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBidWlsZGVyVmFsdWUuaXRlbXMuZmluZChfcmVmMTkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICAgIH0gPSBfcmVmMTk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaWQgPT09IGl0ZW07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnVpbGRlclZhbHVlRGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ0lURU1fVkFMVUVfT05fQ0hBTkdFJyxcbiAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAhY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZSAmJiBPYmplY3Qua2V5cyhjdXJyZW50VmFsdWUudmFsdWVzKS5sZW5ndGggPT09IDAgPyBnZXRWYWx1ZUZyb21JbnB1dChpdGVtT3B0aW9ucywge30pIDoge31cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmlldzogXCJzaW1wbGVcIlxuICAgICAgICAgICAgfSksIGlzU2lkZWJhclJlcHJlc2VudGF0aW9uUHJlc2VudCAmJiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgXCJkYXRhLWlkXCI6IGl0ZW0sXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogY2xzKHtcbiAgICAgICAgICAgICAgICAnY3QtaXRlbS1pbi1idWlsZGVyJzogaXRlbUluQnVpbGRlcixcbiAgICAgICAgICAgICAgICAnY3QtYnVpbGRlci1pdGVtJzogIWl0ZW1JbkJ1aWxkZXJcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaXRlbUluQnVpbGRlciAmJiBvcGVuKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGl0ZW1OYW1lLCBjcmVhdGVFbGVtZW50KFNsb3QsIHtcbiAgICAgICAgICAgICAgbmFtZTogYFBsYWNlbWVudHNCdWlsZGVyU2lkZWJhckl0ZW1fJHtpbmRleH1gLFxuICAgICAgICAgICAgICBmaWxsUHJvcHM6IHtcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIGl0ZW1JbkJ1aWxkZXIsXG4gICAgICAgICAgICAgICAgaXRlbURhdGFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBkaXJlY3Rpb246IFwidmVydGljYWxcIlxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNlY29uZGFyeUl0ZW1zOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZVN0YXRlLCB1c2VDb250ZXh0LCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFBhbmVsLCB7IFBhbmVsTWV0YVdyYXBwZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9vcHRpb25zL29wdGlvbnMvY3QtcGFuZWwnO1xuaW1wb3J0IHsgZ2V0VmFsdWVGcm9tSW5wdXQgfSBmcm9tICcuLi8uLi8uLi8uLi9vcHRpb25zL2hlbHBlcnMvZ2V0LXZhbHVlLWZyb20taW5wdXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BDb250ZXh0IH0gZnJvbSAnLi4vQnVpbGRlclJvb3QnO1xuXG5jb25zdCBJbnZpc2libGVQYW5lbHMgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBidWlsZGVyVmFsdWUsXG4gICAgYnVpbGRlclZhbHVlRGlzcGF0Y2hcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHNlY29uZGFyeUl0ZW1zID0gY3RfY3VzdG9taXplcl9sb2NhbGl6YXRpb25zLmhlYWRlcl9idWlsZGVyX2RhdGEuc2Vjb25kYXJ5X2l0ZW1zLmhlYWRlcjtcbiAgY29uc3QgYWxsSXRlbXMgPSBjdF9jdXN0b21pemVyX2xvY2FsaXphdGlvbnMuaGVhZGVyX2J1aWxkZXJfZGF0YS5oZWFkZXI7XG4gIGNvbnN0IHtcbiAgICBwYW5lbHNTdGF0ZSxcbiAgICBwYW5lbHNBY3Rpb25zXG4gIH0gPSB1c2VDb250ZXh0KERyYWdEcm9wQ29udGV4dCk7XG4gIGNvbnN0IHByaW1hcnlJdGVtcyA9IGFsbEl0ZW1zLmZpbHRlcihfcmVmMiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWYyO1xuICAgIHJldHVybiAhc2Vjb25kYXJ5SXRlbXMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGlkKTtcbiAgfSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBwcmltYXJ5SXRlbXMubWFwKHByaW1hcnlJdGVtID0+IHtcbiAgICBjb25zdCBvcHRpb24gPSB7XG4gICAgICBsYWJlbDogcHJpbWFyeUl0ZW0uY29uZmlnLm5hbWUsXG4gICAgICAnaW5uZXItb3B0aW9ucyc6IHByaW1hcnlJdGVtLm9wdGlvbnNcbiAgICB9O1xuICAgIGNvbnN0IGlkID0gYGJ1aWxkZXJfcGFuZWxfJHtwcmltYXJ5SXRlbS5pZH1gO1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFBhbmVsTWV0YVdyYXBwZXIsIF9leHRlbmRzKHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGtleTogcHJpbWFyeUl0ZW0uaWQsXG4gICAgICBvcHRpb246IG9wdGlvblxuICAgIH0sIHBhbmVsc0FjdGlvbnMsIHtcbiAgICAgIGdldEFjdHVhbE9wdGlvbjogKCkgPT4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgY3JlYXRlRWxlbWVudChQYW5lbCwge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGdldFZhbHVlczogKCkgPT4ge1xuICAgICAgICAgIGxldCBpdGVtVmFsdWUgPSBidWlsZGVyVmFsdWUuaXRlbXMuZmluZChfcmVmMyA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgfSA9IF9yZWYzO1xuICAgICAgICAgICAgcmV0dXJuIGlkID09PSBwcmltYXJ5SXRlbS5pZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQgaXRlbXNDb3VudCA9ICcwJztcblxuICAgICAgICAgIGlmIChwcmltYXJ5SXRlbS5pZCA9PT0gJ3RvcC1yb3cnIHx8IHByaW1hcnlJdGVtLmlkID09PSAnbWlkZGxlLXJvdycgfHwgcHJpbWFyeUl0ZW0uaWQgPT09ICdib3R0b20tcm93Jykge1xuICAgICAgICAgICAgaXRlbXNDb3VudCA9IChidWlsZGVyVmFsdWUuZGVza3RvcC5maW5kKF9yZWY0ID0+IHtcbiAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICB9ID0gX3JlZjQ7XG4gICAgICAgICAgICAgIHJldHVybiBpZCA9PT0gcHJpbWFyeUl0ZW0uaWQ7XG4gICAgICAgICAgICB9KS5wbGFjZW1lbnRzLnJlZHVjZSgociwgcCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gWy4uLnIsIC4uLnAuaXRlbXNdO1xuICAgICAgICAgICAgfSwgW10pLmxlbmd0aCArIGJ1aWxkZXJWYWx1ZS5tb2JpbGUuZmluZChfcmVmNSA9PiB7XG4gICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgfSA9IF9yZWY1O1xuICAgICAgICAgICAgICByZXR1cm4gaWQgPT09IHByaW1hcnlJdGVtLmlkO1xuICAgICAgICAgICAgfSkucGxhY2VtZW50cy5yZWR1Y2UoKHIsIHApID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5yLCAuLi5wLml0ZW1zXTtcbiAgICAgICAgICAgIH0sIFtdKS5sZW5ndGgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGl0ZW1WYWx1ZSAmJiBPYmplY3Qua2V5cyhpdGVtVmFsdWUudmFsdWVzKSA+IDUpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgICAgaXRlbXNDb3VudCxcbiAgICAgICAgICAgICAgYnVpbGRlclNldHRpbmdzOiBidWlsZGVyVmFsdWUuc2V0dGluZ3MgfHwge31cbiAgICAgICAgICAgIH0sIGl0ZW1WYWx1ZS52YWx1ZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldFZhbHVlRnJvbUlucHV0KHByaW1hcnlJdGVtLm9wdGlvbnMsIGl0ZW1WYWx1ZSA/IGl0ZW1WYWx1ZS52YWx1ZXMgOiB7fSkpLCB7fSwge1xuICAgICAgICAgICAgaXRlbXNDb3VudCxcbiAgICAgICAgICAgIGJ1aWxkZXJTZXR0aW5nczogYnVpbGRlclZhbHVlLnNldHRpbmdzIHx8IHt9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbjogb3B0aW9uLFxuICAgICAgICBvbkNoYW5nZUZvcjogKG9wdGlvbklkLCBvcHRpb25WYWx1ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGJ1aWxkZXJWYWx1ZS5pdGVtcy5maW5kKF9yZWY2ID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICB9ID0gX3JlZjY7XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09IHByaW1hcnlJdGVtLmlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJ1aWxkZXJWYWx1ZURpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdJVEVNX1ZBTFVFX09OX0NIQU5HRScsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGlkOiBwcmltYXJ5SXRlbS5pZCxcbiAgICAgICAgICAgICAgb3B0aW9uSWQsXG4gICAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICAgICB2YWx1ZXM6ICFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlICYmIE9iamVjdC5rZXlzKGN1cnJlbnRWYWx1ZS52YWx1ZXMpLmxlbmd0aCA9PT0gMCA/IGdldFZhbHVlRnJvbUlucHV0KHByaW1hcnlJdGVtLm9wdGlvbnMsIHt9KSA6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHZpZXc6IFwic2ltcGxlXCJcbiAgICAgIH0pKVxuICAgIH0pKTtcbiAgfSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSW52aXNpYmxlUGFuZWxzOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZVN0YXRlLCB1c2VDb250ZXh0LCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBEcmFnRHJvcENvbnRleHQgfSBmcm9tICcuLi9CdWlsZGVyUm9vdCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFBhbmVsLCB7IFBhbmVsTWV0YVdyYXBwZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9vcHRpb25zL29wdGlvbnMvY3QtcGFuZWwnO1xuaW1wb3J0IHsgZ2V0VmFsdWVGcm9tSW5wdXQgfSBmcm9tICcuLi8uLi8uLi8uLi9vcHRpb25zL2hlbHBlcnMvZ2V0LXZhbHVlLWZyb20taW5wdXQnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcblxuY29uc3QgUGFuZWxzTWFuYWdlciA9ICgpID0+IHtcbiAgY29uc3Qgc2Vjb25kYXJ5SXRlbXMgPSBjdF9jdXN0b21pemVyX2xvY2FsaXphdGlvbnMuaGVhZGVyX2J1aWxkZXJfZGF0YS5zZWNvbmRhcnlfaXRlbXMuaGVhZGVyO1xuICBjb25zdCBhbGxJdGVtcyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLmhlYWRlcjtcbiAgY29uc3Qge1xuICAgIGJ1aWxkZXJWYWx1ZSxcbiAgICBvcHRpb24sXG4gICAgYnVpbGRlclZhbHVlQ29sbGVjdGlvbixcbiAgICBidWlsZGVyVmFsdWVEaXNwYXRjaCxcbiAgICBwYW5lbHNBY3Rpb25zXG4gIH0gPSB1c2VDb250ZXh0KERyYWdEcm9wQ29udGV4dCk7XG4gIGNvbnN0IGFsbFNlY3Rpb25zID0gYnVpbGRlclZhbHVlQ29sbGVjdGlvbi5zZWN0aW9ucy5maWx0ZXIoX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIGlkICE9PSAndHlwZS0yJyAmJiBpZCAhPT0gJ3R5cGUtMycgJiYgaWQuaW5kZXhPZignY3QtY3VzdG9tJykgPT09IC0xO1xuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMoJ2N0LXBhbmVscy1tYW5hZ2VyJylcbiAgfSwgYWxsU2VjdGlvbnMubWFwKF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAgbmFtZSxcbiAgICAgIGlkXG4gICAgfSA9IF9yZWYyO1xuICAgIGxldCBwYW5lbExhYmVsID0gbmFtZSB8fCB7XG4gICAgICAndHlwZS0xJzogX18oJ0dsb2JhbCBIZWFkZXInLCAnYmxvY2tzeScpXG4gICAgfVtpZF0gfHwgaWQ7XG4gICAgY29uc3QgcGFuZWxJZCA9IGBidWlsZGVyX2hlYWRlcl9wYW5lbF8ke2lkfWA7XG4gICAgY29uc3QgaGVhZGVyT3B0aW9ucyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLmhlYWRlcl9kYXRhLmhlYWRlcl9vcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvbiA9IHtcbiAgICAgIGxhYmVsOiBwYW5lbExhYmVsLFxuICAgICAgJ2lubmVyLW9wdGlvbnMnOiBoZWFkZXJPcHRpb25zXG4gICAgfTtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChQYW5lbE1ldGFXcmFwcGVyLCBfZXh0ZW5kcyh7XG4gICAgICBpZDogcGFuZWxJZCxcbiAgICAgIGtleTogaWQsXG4gICAgICBvcHRpb246IG9wdGlvblxuICAgIH0sIHBhbmVsc0FjdGlvbnMsIHtcbiAgICAgIGdldEFjdHVhbE9wdGlvbjogX3JlZjMgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIG9wZW5cbiAgICAgICAgfSA9IF9yZWYzO1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgT2JqZWN0LmtleXMoaGVhZGVyT3B0aW9ucykubGVuZ3RoID4gMCAmJiBpZCA9PT0gYnVpbGRlclZhbHVlLmlkICYmIGNyZWF0ZUVsZW1lbnQoUGFuZWwsIHtcbiAgICAgICAgICBpZDogcGFuZWxJZCxcbiAgICAgICAgICBnZXRWYWx1ZXM6ICgpID0+IGJ1aWxkZXJWYWx1ZS5zZXR0aW5ncyB8fCB7fSxcbiAgICAgICAgICBvcHRpb246IG9wdGlvbixcbiAgICAgICAgICBvbkNoYW5nZUZvcjogKG9wdGlvbklkLCBvcHRpb25WYWx1ZSkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlclZhbHVlRGlzcGF0Y2goe1xuICAgICAgICAgICAgICB0eXBlOiAnQlVJTERFUl9HTE9CQUxfU0VUVElOR19PTl9DSEFOR0UnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgb3B0aW9uSWQsXG4gICAgICAgICAgICAgICAgb3B0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBnZXRWYWx1ZUZyb21JbnB1dChoZWFkZXJPcHRpb25zLCBBcnJheS5pc0FycmF5KGJ1aWxkZXJWYWx1ZS5zZXR0aW5ncykgPyB7fSA6IGJ1aWxkZXJWYWx1ZS5zZXR0aW5ncyB8fCB7fSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aWV3OiBcInNpbXBsZVwiXG4gICAgICAgIH0pLCBpZCA9PT0gYnVpbGRlclZhbHVlLmlkICYmIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbHMoe1xuICAgICAgICAgICAgYWN0aXZlOiBpZCA9PT0gYnVpbGRlclZhbHVlLmlkLFxuICAgICAgICAgICAgJ2N0LWdsb2JhbCc6IGlkID09PSAndHlwZS0xJ1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJPcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIG9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiY3QtcGFuZWwtbmFtZVwiXG4gICAgICAgIH0sIHBhbmVsTGFiZWwpKSk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQYW5lbHNNYW5hZ2VyOyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgdXNlU3RhdGUsIHVzZUNvbnRleHQsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBfXywgc3ByaW50ZiB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gJ0B3b3JkcHJlc3MvY29tcG9uZW50cyc7XG5pbXBvcnQgU2Vjb25kYXJ5SXRlbXMgZnJvbSAnLi9idWlsZGVyLXNpZGViYXIvU2Vjb25kYXJ5SXRlbXMnO1xuaW1wb3J0IEludmlzaWJsZVBhbmVscyBmcm9tICcuL2J1aWxkZXItc2lkZWJhci9JbnZpc2libGVQYW5lbHMnO1xuaW1wb3J0IFBhbmVsc01hbmFnZXIgZnJvbSAnLi9idWlsZGVyLXNpZGViYXIvUGFuZWxzTWFuYWdlcic7XG5pbXBvcnQgeyBEcmFnRHJvcENvbnRleHQgfSBmcm9tICcuL0J1aWxkZXJSb290JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5jb25zdCBBdmFpbGFibGVJdGVtcyA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGFsbEJ1aWxkZXJTZWN0aW9ucyxcbiAgICBidWlsZGVyVmFsdWUsXG4gICAgYnVpbGRlclZhbHVlRGlzcGF0Y2gsXG4gICAgaW5saW5lZEl0ZW1zRnJvbUJ1aWxkZXJcbiAgfSA9IF9yZWY7XG4gIC8vIHBhbmVscyB8IGl0ZW1zIHwgb3B0aW9uc1xuICBjb25zdCBbY3VycmVudFRhYiwgc2V0Q3VycmVudFRhYl0gPSB1c2VTdGF0ZSgnaXRlbXMnKTtcbiAgY29uc3Qge1xuICAgIGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb25cbiAgfSA9IHVzZUNvbnRleHQoRHJhZ0Ryb3BDb250ZXh0KTtcbiAgY29uc3Qgc2Vjb25kYXJ5SXRlbXMgPSBjdF9jdXN0b21pemVyX2xvY2FsaXphdGlvbnMuaGVhZGVyX2J1aWxkZXJfZGF0YS5zZWNvbmRhcnlfaXRlbXMuaGVhZGVyO1xuICBjb25zdCBhbGxJdGVtcyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLmhlYWRlcjtcbiAgY29uc3QgaGVhZGVyT3B0aW9ucyA9IGN0X2N1c3RvbWl6ZXJfbG9jYWxpemF0aW9ucy5oZWFkZXJfYnVpbGRlcl9kYXRhLmhlYWRlcl9kYXRhLmhlYWRlcl9vcHRpb25zO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWF2YWlsYWJsZS1pdGVtc1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXRpdGxlXCIsXG4gICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgIF9faHRtbDogc3ByaW50ZihfXygnQ3VzdG9taXppbmc6ICVzJywgJ2Jsb2Nrc3knKSwgYDxzcGFuPiR7KGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb24uc2VjdGlvbnMuZmluZChfcmVmMiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gaWQgPT09IGJ1aWxkZXJWYWx1ZS5pZDtcbiAgICAgIH0pIHx8IHt9KS5uYW1lIHx8IHtcbiAgICAgICAgJ3R5cGUtMSc6IF9fKCdHbG9iYWwgSGVhZGVyJywgJ2Jsb2Nrc3knKVxuICAgICAgfVtidWlsZGVyVmFsdWUuaWRdIHx8IGJ1aWxkZXJWYWx1ZS5pZH08L3NwYW4+YClcbiAgICB9XG4gIH0pLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdGFic1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBudWxsLCBbJ2l0ZW1zJywgJ3BhbmVscyddLm1hcCh0YWIgPT4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBrZXk6IHRhYixcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldEN1cnJlbnRUYWIodGFiKTtcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogY2xzKHtcbiAgICAgIGFjdGl2ZTogdGFiID09PSBjdXJyZW50VGFiXG4gICAgfSlcbiAgfSwge1xuICAgIHBhbmVsczogX18oJ0hlYWRlcnMnLCAnYmxvY2tzeScpLFxuICAgIGl0ZW1zOiBfXygnRWxlbWVudHMnLCAnYmxvY2tzeScpXG4gIH1bdGFiXSkpKSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWN1cnJlbnQtdGFiXCJcbiAgfSwgY3VycmVudFRhYiA9PT0gJ3BhbmVscycgJiYgY3JlYXRlRWxlbWVudChTbG90LCB7XG4gICAgbmFtZTogXCJQbGFjZW1lbnRzQnVpbGRlclBhbmVsc01hbmFnZXJcIlxuICB9LCBmaWxscyA9PiBmaWxscy5sZW5ndGggPT09IDAgPyBjcmVhdGVFbGVtZW50KFBhbmVsc01hbmFnZXIsIG51bGwpIDogZmlsbHMpLCBjcmVhdGVFbGVtZW50KFNlY29uZGFyeUl0ZW1zLCB7XG4gICAgYnVpbGRlclZhbHVlOiBidWlsZGVyVmFsdWUsXG4gICAgYnVpbGRlclZhbHVlRGlzcGF0Y2g6IGJ1aWxkZXJWYWx1ZURpc3BhdGNoLFxuICAgIGlubGluZWRJdGVtc0Zyb21CdWlsZGVyOiBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlcixcbiAgICBkaXNwbGF5TGlzdDogY3VycmVudFRhYiA9PT0gJ2l0ZW1zJ1xuICB9KSkpLCBjcmVhdGVFbGVtZW50KEludmlzaWJsZVBhbmVscywge1xuICAgIGJ1aWxkZXJWYWx1ZTogYnVpbGRlclZhbHVlLFxuICAgIGJ1aWxkZXJWYWx1ZURpc3BhdGNoOiBidWlsZGVyVmFsdWVEaXNwYXRjaFxuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBdmFpbGFibGVJdGVtczsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBmZXRjaEN1cnJlbnRIZWFkZXIgfSBmcm9tICcuL0J1aWxkZXJSb290JztcbmltcG9ydCB7IGdldE9yaWdpbmFsSWQsIGN1c3RvbUl0ZW1zU2VwYXJhdG9yIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCBuYW5vaWQgZnJvbSAnbmFub2lkJztcbmV4cG9ydCBjb25zdCBidWlsZGVyUmVkdWNlciA9IChidWlsZGVyVmFsdWUsIGFjdGlvbikgPT4ge1xuICBsZXQgdXBkYXRlZEdsb2JhbFN0YXRlID0ge307XG4gIGxldCBuZXdTZWN0aW9ucyA9IFtdO1xuICBsZXQgZnV0dXJlQnVpbGRlclZhbHVlID0gYnVpbGRlclZhbHVlLnNlY3Rpb25zLmZpbmQoX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIGlkLmluZGV4T2YoYnVpbGRlclZhbHVlLl9fZm9yY2VkX3N0YXRpY19oZWFkZXJfXyB8fCBmZXRjaEN1cnJlbnRIZWFkZXIoKSB8fCBidWlsZGVyVmFsdWUuc2VjdGlvbnNbMF0uaWQpID4gLTE7XG4gIH0pO1xuICBsZXQgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gIGxldCB1cGRhdGVJdGVtSWQgPSBmYWxzZTtcbiAgbGV0IHJlbW92ZVNlY3Rpb25JZHMgPSBbXTtcblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdJVEVNX1ZBTFVFX09OX0NIQU5HRScpIHtcbiAgICBjb25zdCB7XG4gICAgICBpZCxcbiAgICAgIG9wdGlvbklkLFxuICAgICAgb3B0aW9uVmFsdWUsXG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICB1cGRhdGVJdGVtSWQgPSBgJHtpZH06JHtvcHRpb25JZH1gO1xuICAgIGxldCBpdGVtcyA9IGZ1dHVyZUJ1aWxkZXJWYWx1ZS5pdGVtcztcblxuICAgIGlmICghaXRlbXMuZmluZChfcmVmMiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpZDogX2lkXG4gICAgICB9ID0gX3JlZjI7XG4gICAgICByZXR1cm4gX2lkID09PSBpZDtcbiAgICB9KSkge1xuICAgICAgaXRlbXMgPSBbLi4uaXRlbXMsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIHZhbHVlczoge31cbiAgICAgIH1dO1xuICAgIH1cblxuICAgIGZ1dHVyZUJ1aWxkZXJWYWx1ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZnV0dXJlQnVpbGRlclZhbHVlKSwge30sIHtcbiAgICAgIGl0ZW1zOiBpdGVtcy5tYXAoaXRlbSA9PiBpdGVtLmlkID09PSBpZCA/IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaXRlbSksIHt9LCB7XG4gICAgICAgIHZhbHVlczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW0udmFsdWVzKSwgdmFsdWVzKSwge30sIHtcbiAgICAgICAgICBbb3B0aW9uSWRdOiBvcHRpb25WYWx1ZVxuICAgICAgICB9KVxuICAgICAgfSkgOiBpdGVtKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnUElDS19CVUlMREVSX1NFQ1RJT04nKSB7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgICB1cGRhdGVkR2xvYmFsU3RhdGUgPSB7XG4gICAgICBfX2ZvcmNlZF9zdGF0aWNfaGVhZGVyX186IGFjdGlvbi5wYXlsb2FkLmlkXG4gICAgfTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ01BUktfSEVBREVSX0FTX0dMT0JBTCcpIHtcbiAgICBzaG91bGRVcGRhdGUgPSB0cnVlO1xuICAgIHVwZGF0ZWRHbG9iYWxTdGF0ZSA9IHtcbiAgICAgIGN1cnJlbnRfc2VjdGlvbjogYnVpbGRlclZhbHVlLl9fZm9yY2VkX3N0YXRpY19oZWFkZXJfX1xuICAgIH07XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdNQVJLX1NQRUNJRklDX0hFQURFUl9BU19HTE9CQUwnKSB7XG4gICAgdXBkYXRlZEdsb2JhbFN0YXRlID0ge1xuICAgICAgY3VycmVudF9zZWN0aW9uOiBhY3Rpb24ucGF5bG9hZC5pZFxuICAgIH07XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdDTE9ORV9JVEVNJykge1xuICAgIGNvbnN0IGZ1dHVyZUlkID0gZ2V0T3JpZ2luYWxJZChhY3Rpb24ucGF5bG9hZC5pZCk7XG4gICAgZnV0dXJlQnVpbGRlclZhbHVlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmdXR1cmVCdWlsZGVyVmFsdWUpLCB7fSwge1xuICAgICAgaXRlbXM6IFsuLi5mdXR1cmVCdWlsZGVyVmFsdWUuaXRlbXMsIHtcbiAgICAgICAgaWQ6IGAke2Z1dHVyZUlkfSR7Y3VzdG9tSXRlbXNTZXBhcmF0b3IoKX0ke25hbm9pZCgpfWAsXG4gICAgICAgIHZhbHVlczogZnV0dXJlQnVpbGRlclZhbHVlLml0ZW1zLmZpbmQoX3JlZjMgPT4ge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgICByZXR1cm4gaWQgPT09IGZ1dHVyZUlkO1xuICAgICAgICB9KSA/IGZ1dHVyZUJ1aWxkZXJWYWx1ZS5pdGVtcy5maW5kKF9yZWY0ID0+IHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9ID0gX3JlZjQ7XG4gICAgICAgICAgcmV0dXJuIGlkID09PSBmdXR1cmVJZDtcbiAgICAgICAgfSkudmFsdWVzIDoge31cbiAgICAgIH1dXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdSRU1PVkVfQ0xPTkVEX0lURU0nKSB7XG4gICAgZnV0dXJlQnVpbGRlclZhbHVlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmdXR1cmVCdWlsZGVyVmFsdWUpLCB7fSwge1xuICAgICAgaXRlbXM6IGZ1dHVyZUJ1aWxkZXJWYWx1ZS5pdGVtcy5maWx0ZXIoX3JlZjUgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0gPSBfcmVmNTtcbiAgICAgICAgcmV0dXJuIGlkICE9PSBhY3Rpb24ucGF5bG9hZC5pZDtcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09ICdTRVRfTElTVCcpIHtcbiAgICBzaG91bGRVcGRhdGUgPSB0cnVlO1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRWaWV3LFxuICAgICAgbGlzdHNcbiAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG5cbiAgICBpZiAoXG4gICAgLyoqXG4gICAgICogSWYgd2UganVzdCBpbnNlcnRlZCBvZmZjYW52YXMgdHJpZ2dlciBvbiBkZXNrdG9wXG4gICAgICovXG4gICAgY3VycmVudFZpZXcgPT09ICdkZXNrdG9wJyAmJiBPYmplY3QudmFsdWVzKGxpc3RzKS5yZWR1Y2UoKGFsbCwgY3VycmVudCkgPT4gWy4uLmFsbCwgLi4uY3VycmVudF0sIFtdKS5pbmRleE9mKCd0cmlnZ2VyJykgPiAtMSAmJiAhZnV0dXJlQnVpbGRlclZhbHVlLmRlc2t0b3AuZmluZChfcmVmNiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpZFxuICAgICAgfSA9IF9yZWY2O1xuICAgICAgcmV0dXJuIGlkID09PSAnb2ZmY2FudmFzJztcbiAgICB9KSkge1xuICAgICAgZnV0dXJlQnVpbGRlclZhbHVlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmdXR1cmVCdWlsZGVyVmFsdWUpLCB7fSwge1xuICAgICAgICBkZXNrdG9wOiBbLi4uZnV0dXJlQnVpbGRlclZhbHVlLmRlc2t0b3AsIHtcbiAgICAgICAgICBpZDogJ29mZmNhbnZhcycsXG4gICAgICAgICAgcGxhY2VtZW50czogW3tcbiAgICAgICAgICAgIGlkOiAnc3RhcnQnLFxuICAgICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgICAgfV1cbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1dHVyZUJ1aWxkZXJWYWx1ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZnV0dXJlQnVpbGRlclZhbHVlKSwge30sIHtcbiAgICAgIFtjdXJyZW50Vmlld106IGZ1dHVyZUJ1aWxkZXJWYWx1ZVtjdXJyZW50Vmlld10ubWFwKF9yZWY3ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpZDogYmFySWQsXG4gICAgICAgICAgcGxhY2VtZW50c1xuICAgICAgICB9ID0gX3JlZjc7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhsaXN0cyk7XG5cbiAgICAgICAgaWYgKGtleXMubWFwKGsgPT4gay5zcGxpdCgnOicpWzBdKS5pbmRleE9mKGJhcklkKSA+IC0xKSB7XG4gICAgICAgICAgbGV0IGZ1dHVyZUJhciA9IHtcbiAgICAgICAgICAgIGlkOiBiYXJJZCxcbiAgICAgICAgICAgIHBsYWNlbWVudHM6IHBsYWNlbWVudHMubWFwKF9yZWY4ID0+IHtcbiAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBpdGVtc1xuICAgICAgICAgICAgICB9ID0gX3JlZjg7XG5cbiAgICAgICAgICAgICAgaWYgKGxpc3RzW2Ake2JhcklkfToke2lkfWBdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgaXRlbXM6IGxpc3RzW2Ake2JhcklkfToke2lkfWBdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgaXRlbXNcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChmdXR1cmVCYXIucGxhY2VtZW50cy5maW5kKF9yZWY5ID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICB9ID0gX3JlZjk7XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09ICdtaWRkbGUnO1xuICAgICAgICAgIH0pICYmIGZ1dHVyZUJhci5wbGFjZW1lbnRzLmZpbmQoX3JlZjEwID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICB9ID0gX3JlZjEwO1xuICAgICAgICAgICAgcmV0dXJuIGlkID09PSAnbWlkZGxlJztcbiAgICAgICAgICB9KS5pdGVtcy5sZW5ndGggPT09IDAgJiYgZnV0dXJlQmFyLnBsYWNlbWVudHMuZmluZChfcmVmMTEgPT4ge1xuICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgIH0gPSBfcmVmMTE7XG4gICAgICAgICAgICByZXR1cm4gaWQgPT09ICdzdGFydC1taWRkbGUnO1xuICAgICAgICAgIH0pICYmIChmdXR1cmVCYXIucGxhY2VtZW50cy5maW5kKF9yZWYxMiA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgfSA9IF9yZWYxMjtcbiAgICAgICAgICAgIHJldHVybiBpZCA9PT0gJ3N0YXJ0LW1pZGRsZSc7XG4gICAgICAgICAgfSkuaXRlbXMubGVuZ3RoID4gMCB8fCBmdXR1cmVCYXIucGxhY2VtZW50cy5maW5kKF9yZWYxMyA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgfSA9IF9yZWYxMztcbiAgICAgICAgICAgIHJldHVybiBpZCA9PT0gJ2VuZC1taWRkbGUnO1xuICAgICAgICAgIH0pLml0ZW1zLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlciA9IHt9O1xuICAgICAgICAgICAgdXBkYXRlcltgJHtiYXJJZH06c3RhcnRgXSA9IFsuLi5mdXR1cmVCYXIucGxhY2VtZW50cy5maW5kKF9yZWYxNCA9PiB7XG4gICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgfSA9IF9yZWYxNDtcbiAgICAgICAgICAgICAgcmV0dXJuIGlkID09PSAnc3RhcnQnO1xuICAgICAgICAgICAgfSkuaXRlbXMsIC4uLmZ1dHVyZUJhci5wbGFjZW1lbnRzLmZpbmQoX3JlZjE1ID0+IHtcbiAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICB9ID0gX3JlZjE1O1xuICAgICAgICAgICAgICByZXR1cm4gaWQgPT09ICdzdGFydC1taWRkbGUnO1xuICAgICAgICAgICAgfSkuaXRlbXNdO1xuICAgICAgICAgICAgdXBkYXRlcltgJHtiYXJJZH06ZW5kYF0gPSBbLi4uZnV0dXJlQmFyLnBsYWNlbWVudHMuZmluZChfcmVmMTYgPT4ge1xuICAgICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgIH0gPSBfcmVmMTY7XG4gICAgICAgICAgICAgIHJldHVybiBpZCA9PT0gJ2VuZC1taWRkbGUnO1xuICAgICAgICAgICAgfSkuaXRlbXMsIC4uLmZ1dHVyZUJhci5wbGFjZW1lbnRzLmZpbmQoX3JlZjE3ID0+IHtcbiAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICB9ID0gX3JlZjE3O1xuICAgICAgICAgICAgICByZXR1cm4gaWQgPT09ICdlbmQnO1xuICAgICAgICAgICAgfSkuaXRlbXNdO1xuICAgICAgICAgICAgdXBkYXRlcltgJHtiYXJJZH06c3RhcnQtbWlkZGxlYF0gPSBbXTtcbiAgICAgICAgICAgIHVwZGF0ZXJbYCR7YmFySWR9OmVuZC1taWRkbGVgXSA9IFtdO1xuICAgICAgICAgICAgZnV0dXJlQmFyID0ge1xuICAgICAgICAgICAgICBpZDogYmFySWQsXG4gICAgICAgICAgICAgIHBsYWNlbWVudHM6IGZ1dHVyZUJhci5wbGFjZW1lbnRzLm1hcChfcmVmMTggPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zXG4gICAgICAgICAgICAgICAgfSA9IF9yZWYxODtcblxuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVyW2Ake2JhcklkfToke2lkfWBdKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IHVwZGF0ZXJbYCR7YmFySWR9OiR7aWR9YF1cbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgaXRlbXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZnV0dXJlQmFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogYmFySWQsXG4gICAgICAgICAgcGxhY2VtZW50c1xuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ0JVSUxERVJfR0xPQkFMX1NFVFRJTkdfT05fQ0hBTkdFJykge1xuICAgIGNvbnN0IHtcbiAgICAgIG9wdGlvbklkLFxuICAgICAgb3B0aW9uVmFsdWUsXG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICBmdXR1cmVCdWlsZGVyVmFsdWUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZ1dHVyZUJ1aWxkZXJWYWx1ZSksIHt9LCB7XG4gICAgICBzZXR0aW5nczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZ1dHVyZUJ1aWxkZXJWYWx1ZS5zZXR0aW5ncyksIHZhbHVlcyksIHt9LCB7XG4gICAgICAgIFtvcHRpb25JZF06IG9wdGlvblZhbHVlXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSAnQ1JFQVRFX05FV19TRUNUSU9OJykge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBjb3B5XG4gICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIG5ld1NlY3Rpb25zID0gW2NvcHkgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJ1aWxkZXJWYWx1ZS5zZWN0aW9ucy5maW5kKF9yZWYxOSA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpZFxuICAgICAgfSA9IF9yZWYxOTtcbiAgICAgIHJldHVybiBpZCA9PT0gY29weTtcbiAgICB9KSB8fCB7fSksIHt9LCB7XG4gICAgICBuYW1lLFxuICAgICAgaWQ6IGBjdC1jdXN0b20tJHtuYW5vaWQoKX1gXG4gICAgfSkgOiB7XG4gICAgICBuYW1lLFxuICAgICAgaWQ6IGBjdC1jdXN0b20tJHtuYW5vaWQoKX1gLFxuICAgICAgbW9kZTogJ3BsYWNlbWVudHMnLFxuICAgICAgaXRlbXM6IFtdLFxuICAgICAgc2V0dGluZ3M6IFtdLFxuICAgICAgZGVza3RvcDogW3tcbiAgICAgICAgaWQ6ICd0b3Atcm93JyxcbiAgICAgICAgcGxhY2VtZW50czogW3tcbiAgICAgICAgICBpZDogJ3N0YXJ0JyxcbiAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgfSwge1xuICAgICAgICAgIGlkOiAnbWlkZGxlJyxcbiAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgfSwge1xuICAgICAgICAgIGlkOiAnZW5kJyxcbiAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgfSwge1xuICAgICAgICAgIGlkOiAnc3RhcnQtbWlkZGxlJyxcbiAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgfSwge1xuICAgICAgICAgIGlkOiAnZW5kLW1pZGRsZScsXG4gICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgIH1dXG4gICAgICB9LCB7XG4gICAgICAgIGlkOiAnbWlkZGxlLXJvdycsXG4gICAgICAgIHBsYWNlbWVudHM6IFt7XG4gICAgICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICAgICAgaXRlbXM6IFsnbG9nbyddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpZDogJ21pZGRsZScsXG4gICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpZDogJ2VuZCcsXG4gICAgICAgICAgaXRlbXM6IFsnbWVudSddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpZDogJ3N0YXJ0LW1pZGRsZScsXG4gICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpZDogJ2VuZC1taWRkbGUnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9XVxuICAgICAgfSwge1xuICAgICAgICBpZDogJ2JvdHRvbS1yb3cnLFxuICAgICAgICBwbGFjZW1lbnRzOiBbe1xuICAgICAgICAgIGlkOiAnc3RhcnQnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICdtaWRkbGUnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICdlbmQnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICdzdGFydC1taWRkbGUnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICdlbmQtbWlkZGxlJyxcbiAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgfV1cbiAgICAgIH1dLFxuICAgICAgbW9iaWxlOiBbe1xuICAgICAgICBpZDogJ3RvcC1yb3cnLFxuICAgICAgICBwbGFjZW1lbnRzOiBbe1xuICAgICAgICAgIGlkOiAnc3RhcnQnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICdtaWRkbGUnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICdlbmQnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICdzdGFydC1taWRkbGUnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICdlbmQtbWlkZGxlJyxcbiAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgfV1cbiAgICAgIH0sIHtcbiAgICAgICAgaWQ6ICdtaWRkbGUtcm93JyxcbiAgICAgICAgcGxhY2VtZW50czogW3tcbiAgICAgICAgICBpZDogJ3N0YXJ0JyxcbiAgICAgICAgICBpdGVtczogWydsb2dvJ11cbiAgICAgICAgfSwge1xuICAgICAgICAgIGlkOiAnbWlkZGxlJyxcbiAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgfSwge1xuICAgICAgICAgIGlkOiAnZW5kJyxcbiAgICAgICAgICBpdGVtczogWyd0cmlnZ2VyJ11cbiAgICAgICAgfSwge1xuICAgICAgICAgIGlkOiAnc3RhcnQtbWlkZGxlJyxcbiAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgfSwge1xuICAgICAgICAgIGlkOiAnZW5kLW1pZGRsZScsXG4gICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgIH1dXG4gICAgICB9LCB7XG4gICAgICAgIGlkOiAnYm90dG9tLXJvdycsXG4gICAgICAgIHBsYWNlbWVudHM6IFt7XG4gICAgICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpZDogJ21pZGRsZScsXG4gICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpZDogJ2VuZCcsXG4gICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpZDogJ3N0YXJ0LW1pZGRsZScsXG4gICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpZDogJ2VuZC1taWRkbGUnLFxuICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICB9XVxuICAgICAgfSwge1xuICAgICAgICBpZDogJ29mZmNhbnZhcycsXG4gICAgICAgIHBsYWNlbWVudHM6IFt7XG4gICAgICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICAgICAgaXRlbXM6IFsnbW9iaWxlLW1lbnUnXVxuICAgICAgICB9XVxuICAgICAgfV1cbiAgICB9XTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gJ1JFTU9WRV9CVUlMREVSX1NFQ1RJT04nKSB7XG4gICAgcmVtb3ZlU2VjdGlvbklkcy5wdXNoKGFjdGlvbi5wYXlsb2FkLmlkKTtcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbEJ1aWxkZXJWYWx1ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBidWlsZGVyVmFsdWUpLCB1cGRhdGVkR2xvYmFsU3RhdGUpLCB7fSwge1xuICAgIF9fc2hvdWxkX3JlZnJlc2hfXzogc2hvdWxkVXBkYXRlLFxuICAgIF9fc2hvdWxkX3JlZnJlc2hfaXRlbV9fOiB1cGRhdGVJdGVtSWQsXG4gICAgc2VjdGlvbnM6IFsuLi5idWlsZGVyVmFsdWUuc2VjdGlvbnMubWFwKGJ1aWxkZXIgPT4gYnVpbGRlci5pZCA9PT0gZnV0dXJlQnVpbGRlclZhbHVlLmlkID8gZnV0dXJlQnVpbGRlclZhbHVlIDogYnVpbGRlciksIC4uLm5ld1NlY3Rpb25zXS5maWx0ZXIoX3JlZjIwID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGlkXG4gICAgICB9ID0gX3JlZjIwO1xuICAgICAgcmV0dXJuIHJlbW92ZVNlY3Rpb25JZHMuaW5kZXhPZihpZCkgPT09IC0xO1xuICAgIH0pXG4gIH0pO1xuXG4gIHJldHVybiBhY3R1YWxCdWlsZGVyVmFsdWU7XG59OyIsImNvbnN0IF9leGNsdWRlZCA9IFtcIl9fZm9yY2VkX2R5bmFtaWNfaGVhZGVyX19cIiwgXCJfX2ZvcmNlZF9zdGF0aWNfaGVhZGVyX19cIiwgXCJfX3Nob3VsZF9yZWZyZXNoX19cIl0sXG4gICAgICBfZXhjbHVkZWQyID0gW1wiX19mb3JjZWRfZHluYW1pY19oZWFkZXJfX1wiLCBcIl9fZm9yY2VkX3N0YXRpY19oZWFkZXJfX1wiLCBcIl9fc2hvdWxkX3JlZnJlc2hfX1wiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgRnJhZ21lbnQsIENvbXBvbmVudCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZU1lbW8sIGNyZWF0ZVBvcnRhbCwgdXNlU3RhdGUsIHVzZUNhbGxiYWNrLCBjcmVhdGVDb250ZXh0LCB1c2VSZWR1Y2VyIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBQbGFjZW1lbnRzQnVpbGRlciBmcm9tICcuL1BsYWNlbWVudHNCdWlsZGVyJztcbmltcG9ydCBEcmFnZ2FibGVJdGVtcyBmcm9tICcuL0RyYWdnYWJsZUl0ZW1zJztcbmltcG9ydCBWaWV3U3dpdGNoIGZyb20gJy4vVmlld1N3aXRjaCc7XG5pbXBvcnQgQXZhaWxhYmxlSXRlbXMgZnJvbSAnLi9BdmFpbGFibGVJdGVtcyc7XG5pbXBvcnQgeyBidWlsZGVyUmVkdWNlciB9IGZyb20gJy4vYnVpbGRlclJlZHVjZXInO1xuaW1wb3J0IHsgdXNlRGV2aWNlTWFuYWdlciB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdXNlRGV2aWNlTWFuYWdlcic7XG5pbXBvcnQgY3RFdmVudHMgZnJvbSAnY3QtZXZlbnRzJztcbmV4cG9ydCBjb25zdCBEcmFnRHJvcENvbnRleHQgPSBjcmVhdGVDb250ZXh0KHt9KTtcblxuY29uc3QgZ2V0RG9jdW1lbnQgPSB4ID0+IHguZG9jdW1lbnQgfHwgeC5jb250ZW50RG9jdW1lbnQgfHwgeC5jb250ZW50V2luZG93LmRvY3VtZW50O1xuXG5leHBvcnQgY29uc3QgZmV0Y2hDdXJyZW50SGVhZGVyID0gKCkgPT4ge1xuICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIuY29udGFpbmVyLmZpbmQoJ2lmcmFtZScpWzBdKTtcblxuICBpZiAod3AuY3VzdG9taXplLnByZXZpZXdlci5jb250YWluZXIuZmluZCgnaWZyYW1lJylbMF0uY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWRlciNoZWFkZXInKSkge1xuICAgIHJldHVybiB3cC5jdXN0b21pemUucHJldmlld2VyLmNvbnRhaW5lci5maW5kKCdpZnJhbWUnKVswXS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyI2hlYWRlcicpLmRhdGFzZXQuaWQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IEJ1aWxkZXJSb290ID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgdmFsdWU6IGFsbEJ1aWxkZXJTZWN0aW9ucyxcbiAgICBvcHRpb24sXG4gICAgb25DaGFuZ2U6IG9uQnVpbGRlclZhbHVlQ2hhbmdlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBjdXJyZW50SGVhZGVyID0gdXNlUmVmKG51bGwpO1xuXG4gIGlmIChjdXJyZW50SGVhZGVyLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICBjdXJyZW50SGVhZGVyLmN1cnJlbnQgPSAoYWxsQnVpbGRlclNlY3Rpb25zLnNlY3Rpb25zLmZpbmQoX3JlZjIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgaWRcbiAgICAgIH0gPSBfcmVmMjtcbiAgICAgIHJldHVybiBpZC5pbmRleE9mKGZldGNoQ3VycmVudEhlYWRlcigpKSA+IC0xO1xuICAgIH0pIHx8IGFsbEJ1aWxkZXJTZWN0aW9ucy5zZWN0aW9uc1swXSkuaWQ7XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBfd3AkY3VzdG9taXplID0gd3AuY3VzdG9taXplKCdoZWFkZXJfcGxhY2VtZW50cycpKCksXG4gICAgICAgIHtcbiAgICAgIF9fZm9yY2VkX2R5bmFtaWNfaGVhZGVyX18sXG4gICAgICBfX2ZvcmNlZF9zdGF0aWNfaGVhZGVyX18sXG4gICAgICBfX3Nob3VsZF9yZWZyZXNoX19cbiAgICB9ID0gX3dwJGN1c3RvbWl6ZSxcbiAgICAgICAgb2xkID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF93cCRjdXN0b21pemUsIF9leGNsdWRlZCk7XG5cbiAgICBPYmplY3Qua2V5cyhvbGQpLm1hcChrZXkgPT4ge1xuICAgICAgaWYgKHBhcnNlRmxvYXQoa2V5KSkge1xuICAgICAgICBkZWxldGUgb2xkW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgd3AuY3VzdG9taXplKCdoZWFkZXJfcGxhY2VtZW50cycpKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2xkKSwge30sIHtcbiAgICAgICAgX19mb3JjZWRfc3RhdGljX2hlYWRlcl9fOiAoYWxsQnVpbGRlclNlY3Rpb25zLnNlY3Rpb25zLmZpbmQoX3JlZjMgPT4ge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgICByZXR1cm4gaWQuaW5kZXhPZihmZXRjaEN1cnJlbnRIZWFkZXIoKSkgPiAtMTtcbiAgICAgICAgfSkgfHwgYWxsQnVpbGRlclNlY3Rpb25zLnNlY3Rpb25zWzBdKS5pZFxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IF93cCRjdXN0b21pemUyID0gd3AuY3VzdG9taXplKCdoZWFkZXJfcGxhY2VtZW50cycpKCksXG4gICAgICAgICAgICB7XG4gICAgICAgIF9fZm9yY2VkX2R5bmFtaWNfaGVhZGVyX18sXG4gICAgICAgIF9fZm9yY2VkX3N0YXRpY19oZWFkZXJfXyxcbiAgICAgICAgX19zaG91bGRfcmVmcmVzaF9fXG4gICAgICB9ID0gX3dwJGN1c3RvbWl6ZTIsXG4gICAgICAgICAgICBvbGQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3dwJGN1c3RvbWl6ZTIsIF9leGNsdWRlZDIpO1xuXG4gICAgICB3cC5jdXN0b21pemUoJ2hlYWRlcl9wbGFjZW1lbnRzJykoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIF9fc2hvdWxkX3JlZnJlc2hfXzogdHJ1ZSxcbiAgICAgICAgW01hdGgucmFuZG9tKCldOiAndXBkYXRlJ1xuICAgICAgfSwgb2xkKSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICBjb25zdCBbaXNEcmFnZ2luZywgc2V0SXNEcmFnZ2luZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtidWlsZGVyVmFsdWVDb2xsZWN0aW9uLCBidWlsZGVyVmFsdWVEaXNwYXRjaEludGVybmFsXSA9IHVzZVJlZHVjZXIoYnVpbGRlclJlZHVjZXIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYWxsQnVpbGRlclNlY3Rpb25zKSwgY3VycmVudEhlYWRlci5jdXJyZW50ID8ge1xuICAgIF9fZm9yY2VkX3N0YXRpY19oZWFkZXJfXzogY3VycmVudEhlYWRlci5jdXJyZW50XG4gIH0gOiB7fSkpO1xuICBjb25zdCBidWlsZGVyVmFsdWUgPSB1c2VNZW1vKCgpID0+IGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb24uc2VjdGlvbnMuZmluZChfcmVmNCA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWY0O1xuICAgIHJldHVybiBpZCA9PT0gYnVpbGRlclZhbHVlQ29sbGVjdGlvbi5fX2ZvcmNlZF9zdGF0aWNfaGVhZGVyX187XG4gIH0pIHx8IGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb24uc2VjdGlvbnNbMF0sIFtidWlsZGVyVmFsdWVDb2xsZWN0aW9uXSk7IC8vIGRlc2t0b3AgfCBtb2JpbGVcblxuICBjb25zdCBbY3VycmVudFZpZXcsIHNldEN1cnJlbnRWaWV3XSA9IHVzZURldmljZU1hbmFnZXIoe1xuICAgIHdpdGhUYWJsZXQ6IGZhbHNlXG4gIH0pO1xuICBjb25zdCBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlciA9IHVzZU1lbW8oKCkgPT4gYnVpbGRlclZhbHVlW2N1cnJlbnRWaWV3XS5yZWR1Y2UoKGN1cnJlbnRJdGVtcywgX3JlZjUpID0+IHtcbiAgICBsZXQge1xuICAgICAgaWQsXG4gICAgICBwbGFjZW1lbnRzXG4gICAgfSA9IF9yZWY1O1xuICAgIHJldHVybiBbLi4uY3VycmVudEl0ZW1zLCAuLi4ocGxhY2VtZW50cyB8fCBbXSkucmVkdWNlKChjLCBfcmVmNikgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgaWQsXG4gICAgICAgIGl0ZW1zXG4gICAgICB9ID0gX3JlZjY7XG4gICAgICByZXR1cm4gWy4uLmMsIC4uLml0ZW1zXTtcbiAgICB9LCBbXSldO1xuICB9LCBbXSksIFtidWlsZGVyVmFsdWUsIGN1cnJlbnRWaWV3XSk7XG4gIGNvbnN0IGJ1aWxkZXJWYWx1ZURpc3BhdGNoID0gdXNlQ2FsbGJhY2soYWN0aW9uID0+IHtcbiAgICBsZXQgbmV3U3RhdGUgPSBidWlsZGVyUmVkdWNlcihidWlsZGVyVmFsdWVDb2xsZWN0aW9uLCBhY3Rpb24pO1xuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnSVRFTV9WQUxVRV9PTl9DSEFOR0UnKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlkLFxuICAgICAgICBvcHRpb25JZCxcbiAgICAgICAgb3B0aW9uVmFsdWUsXG4gICAgICAgIHZhbHVlcyA9IHt9XG4gICAgICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICBjb25zdCBidWlsZGVyVmFsdWUgPSBuZXdTdGF0ZS5zZWN0aW9ucy5maW5kKF9yZWY3ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpZFxuICAgICAgICB9ID0gX3JlZjc7XG4gICAgICAgIHJldHVybiBpZCA9PT0gbmV3U3RhdGUuX19mb3JjZWRfc3RhdGljX2hlYWRlcl9fO1xuICAgICAgfSkgfHwgbmV3U3RhdGUuc2VjdGlvbnNbMF07XG4gICAgICBsZXQgaXRlbXMgPSBidWlsZGVyVmFsdWUuaXRlbXM7XG5cbiAgICAgIGlmIChpZCA9PT0gJ2xvZ28nICYmIG9wdGlvbklkID09PSAnY3VzdG9tX2xvZ28nICYmIGJ1aWxkZXJWYWx1ZS5pZCA9PT0gJ3R5cGUtMScpIHtcbiAgICAgICAgd3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZSgnY3VzdG9tX2xvZ28nKShvcHRpb25WYWx1ZSA/IG9wdGlvblZhbHVlLmRlc2t0b3AgPyBvcHRpb25WYWx1ZS5kZXNrdG9wIDogb3B0aW9uVmFsdWUgOiAnJyk7XG4gICAgICB9XG5cbiAgICAgIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIgJiYgd3AuY3VzdG9taXplLnByZXZpZXdlci5zZW5kKCdjdDpoZWFkZXI6cmVjZWl2ZS12YWx1ZS11cGRhdGUnLCB7XG4gICAgICAgIGl0ZW1JZDogaWQsXG4gICAgICAgIG9wdGlvbklkLFxuICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgZnV0dXJlSXRlbXM6IGJ1aWxkZXJWYWx1ZS5pdGVtcyxcbiAgICAgICAgdmFsdWVzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgKGl0ZW1zLmZpbmQoX3JlZjggPT4ge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpZDogX2lkXG4gICAgICAgICAgfSA9IF9yZWY4O1xuICAgICAgICAgIHJldHVybiBpZCA9PT0gX2lkO1xuICAgICAgICB9KSB8fCB7XG4gICAgICAgICAgdmFsdWVzOiB7fVxuICAgICAgICB9KS52YWx1ZXMpLCB2YWx1ZXMpLCB7fSwge1xuICAgICAgICAgIFtvcHRpb25JZF06IG9wdGlvblZhbHVlXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdCVUlMREVSX0dMT0JBTF9TRVRUSU5HX09OX0NIQU5HRScpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb3B0aW9uSWQsXG4gICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICB2YWx1ZXMgPSB7fVxuICAgICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgY29uc3QgYnVpbGRlclZhbHVlID0gbmV3U3RhdGUuc2VjdGlvbnMuZmluZChfcmVmOSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IF9yZWY5O1xuICAgICAgICByZXR1cm4gaWQgPT09IG5ld1N0YXRlLl9fZm9yY2VkX3N0YXRpY19oZWFkZXJfXztcbiAgICAgIH0pIHx8IG5ld1N0YXRlLnNlY3Rpb25zWzBdO1xuICAgICAgd3AuY3VzdG9taXplLnByZXZpZXdlciAmJiB3cC5jdXN0b21pemUucHJldmlld2VyLnNlbmQoJ2N0OmhlYWRlcjpyZWNlaXZlLXZhbHVlLXVwZGF0ZScsIHtcbiAgICAgICAgaXRlbUlkOiAnZ2xvYmFsJyxcbiAgICAgICAgb3B0aW9uSWQsXG4gICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICB2YWx1ZXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBidWlsZGVyVmFsdWUuc2V0dGluZ3MpLCB2YWx1ZXMpLCB7fSwge1xuICAgICAgICAgIFtvcHRpb25JZF06IG9wdGlvblZhbHVlXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkJ1aWxkZXJWYWx1ZUNoYW5nZShuZXdTdGF0ZSk7XG4gICAgYnVpbGRlclZhbHVlRGlzcGF0Y2hJbnRlcm5hbChhY3Rpb24pO1xuICB9LCBbYnVpbGRlclZhbHVlRGlzcGF0Y2hJbnRlcm5hbCwgb25CdWlsZGVyVmFsdWVDaGFuZ2UsIGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb25dKTtcbiAgY29uc3Qgc2V0TGlzdCA9IHVzZUNhbGxiYWNrKGxpc3RzID0+IGJ1aWxkZXJWYWx1ZURpc3BhdGNoKHtcbiAgICB0eXBlOiAnU0VUX0xJU1QnLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGN1cnJlbnRWaWV3LFxuICAgICAgbGlzdHNcbiAgICB9XG4gIH0pLCBbYnVpbGRlclZhbHVlRGlzcGF0Y2gsIGN1cnJlbnRWaWV3XSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KERyYWdEcm9wQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB7XG4gICAgICBvcHRpb24sXG4gICAgICBjdXJyZW50VmlldyxcbiAgICAgIGlzRHJhZ2dpbmcsXG4gICAgICBzZXRJc0RyYWdnaW5nLFxuICAgICAgc2V0TGlzdCxcbiAgICAgIGJ1aWxkZXJWYWx1ZURpc3BhdGNoLFxuICAgICAgYnVpbGRlclZhbHVlLFxuICAgICAgb25DaGFuZ2U6IF9yZWYxMCA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSA9IF9yZWYxMDtcbiAgICAgICAgcmV0dXJuIHNldExpc3Qoe1xuICAgICAgICAgIFtpZF06IHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGJ1aWxkZXJWYWx1ZUNvbGxlY3Rpb25cbiAgICB9XG4gIH0sIGNyZWF0ZUVsZW1lbnQoQXZhaWxhYmxlSXRlbXMsIHtcbiAgICBhbGxCdWlsZGVyU2VjdGlvbnM6IGFsbEJ1aWxkZXJTZWN0aW9ucyxcbiAgICBidWlsZGVyVmFsdWU6IGJ1aWxkZXJWYWx1ZSxcbiAgICBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlcjogaW5saW5lZEl0ZW1zRnJvbUJ1aWxkZXIsXG4gICAgYnVpbGRlclZhbHVlRGlzcGF0Y2g6IGJ1aWxkZXJWYWx1ZURpc3BhdGNoXG4gIH0pLCBjcmVhdGVQb3J0YWwoY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWJ1aWxkZXItaGVhZGVyXCJcbiAgfSwgY3JlYXRlRWxlbWVudChWaWV3U3dpdGNoLCB7XG4gICAgY3VycmVudFZpZXc6IGN1cnJlbnRWaWV3LFxuICAgIHNldEN1cnJlbnRWaWV3OiBzZXRDdXJyZW50Vmlld1xuICB9KSwgY3JlYXRlRWxlbWVudChQbGFjZW1lbnRzQnVpbGRlciwge1xuICAgIGlubGluZWRJdGVtc0Zyb21CdWlsZGVyOiBpbmxpbmVkSXRlbXNGcm9tQnVpbGRlcixcbiAgICBidWlsZGVyVmFsdWVXaXRoVmlldzogYnVpbGRlclZhbHVlW2N1cnJlbnRWaWV3XSxcbiAgICB2aWV3OiBjdXJyZW50Vmlld1xuICB9KSksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jdC1wYW5lbC1idWlsZGVyJykpKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBCdWlsZGVyUm9vdDsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBCdWlsZGVyUm9vdCBmcm9tICcuLi8uLi9jdXN0b21pemVyL3BhbmVscy1idWlsZGVyL3BsYWNlbWVudHMvQnVpbGRlclJvb3QnO1xuXG5jb25zdCBIZWFkZXJCdWlsZGVyID0gcHJvcHMgPT4gY3JlYXRlRWxlbWVudChCdWlsZGVyUm9vdCwgcHJvcHMpO1xuXG5IZWFkZXJCdWlsZGVyLnJlbmRlcmluZ0NvbmZpZyA9IHtcbiAgZGVzaWduOiAnbm9uZSdcbn07XG5leHBvcnQgZGVmYXVsdCBIZWFkZXJCdWlsZGVyOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5565\n")},6962:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var match_conditions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7465);\nconst _excluded = ["className"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\nconst ImagePicker = _ref => {\n let {\n option: {\n choices,\n tabletChoices,\n mobileChoices\n },\n option,\n device,\n value,\n values,\n onChange\n } = _ref;\n\n const _ref2 = _objectSpread({}, option.attr || {}),\n {\n className\n } = _ref2,\n attr = _objectWithoutProperties(_ref2, _excluded);\n\n let deviceChoices = option.choices;\n\n if (device === \'tablet\' && tabletChoices) {\n deviceChoices = tabletChoices;\n }\n\n if (device === \'mobile\' && mobileChoices) {\n deviceChoices = mobileChoices;\n }\n\n let matchingChoices = (Array.isArray(deviceChoices) ? deviceChoices : Object.keys(deviceChoices).map(choice => _objectSpread({\n key: choice\n }, deviceChoices[choice]))).filter(_ref3 => {\n let {\n key\n } = _ref3;\n\n if (!option.conditions) {\n return true;\n }\n\n if (!option.conditions[key]) {\n return true;\n }\n\n return (0,match_conditions__WEBPACK_IMPORTED_MODULE_2__/* .matchValuesWithCondition */ .Nj)((0,match_conditions__WEBPACK_IMPORTED_MODULE_2__/* .normalizeCondition */ .KY)(option.conditions[key]), values);\n });\n let normalizedValue = matchingChoices.map(_ref4 => {\n let {\n key\n } = _ref4;\n return key;\n }).includes(value) ? value : option.value;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", _extends({}, attr, {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(\'ct-image-picker\', className)\n }, option.title && null ? 0 : {}), matchingChoices.map(choice => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()({\n active: choice.key === normalizedValue\n }),\n onClick: () => onChange(choice.key),\n key: choice.key\n }, choice.src.indexOf(\'{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ImageUploader)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8441);\n/* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6715);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(underscore__WEBPACK_IMPORTED_MODULE_4__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nclass ImageUploader extends _wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n var _this;\n\n super(...arguments);\n _this = this;\n\n _defineProperty(this, \"params\", {\n height: 250,\n width: 250,\n flex_width: true,\n flex_height: true\n });\n\n _defineProperty(this, \"state\", {\n attachment_info: null\n });\n\n _defineProperty(this, \"getUrlFor\", attachmentInfo => attachmentInfo ? (attachmentInfo.width < 700 ? attachmentInfo.sizes.full : underscore__WEBPACK_IMPORTED_MODULE_4___default().max(underscore__WEBPACK_IMPORTED_MODULE_4___default().values(underscore__WEBPACK_IMPORTED_MODULE_4___default().keys(attachmentInfo.sizes).length === 1 ? attachmentInfo.sizes : underscore__WEBPACK_IMPORTED_MODULE_4___default().omit(attachmentInfo.sizes, 'full')), _ref => {\n let {\n width\n } = _ref;\n return width;\n })).url || attachmentInfo.url : null);\n\n _defineProperty(this, \"onChange\", function (value) {\n let attachment_info = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n return _this.props.onChange(_this.props.option.inline_value ? value || '' : _objectSpread(_objectSpread({}, _this.props.value), {}, {\n url: _this.getUrlFor(attachment_info),\n attachment_id: value\n }));\n });\n\n _defineProperty(this, \"getAttachmentId\", function () {\n let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.props;\n return props.option.inline_value ? props.value : props.value.attachment_id;\n });\n\n _defineProperty(this, \"onSelect\", () => {\n var attachment = this.frame.state().get('selection').first().toJSON();\n\n if ((this.props.option.logo || {}).width === attachment.width && (this.props.option.logo || {}).height === attachment.height && !(this.props.option.logo || {}).flex_width && !(this.props.option.logo || {}).flex_height || this.props.option.skipCrop || true) {\n this.setImageFromAttachment(attachment);\n this.frame.close();\n } else {}\n });\n\n _defineProperty(this, \"onCropped\", croppedImage => {\n this.setImageFromAttachment(croppedImage);\n });\n\n _defineProperty(this, \"onSkippedCrop\", () => {\n var attachment = this.frame.state().get('selection').first().toJSON();\n this.setImageFromAttachment(attachment);\n });\n\n _defineProperty(this, \"updateAttachmentInfo\", function () {\n let force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n let id = _this.getAttachmentId();\n\n if (!id) return;\n\n if (!wp.media.attachment(id).get('url') || force) {\n wp.media.attachment(id).fetch().then(() => _this.setState({\n attachment_info: JSON.parse(JSON.stringify(wp.media.attachment(id).toJSON()))\n }));\n } else {\n _this.setState({\n attachment_info: JSON.parse(JSON.stringify(wp.media.attachment(id).toJSON()))\n });\n }\n\n _this.detachListener();\n\n wp.media.attachment(id).on('change', _this.updateAttachmentInfo);\n });\n }\n\n /**\n * Create a media modal select frame, and store it so the instance can be reused when needed.\n */\n initFrame() {\n this.frame = wp.media({\n button: {\n text: 'Select',\n close: false\n },\n states: [new wp.media.controller.Library({\n title: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Select logo', 'blocksy'),\n library: wp.media.query({\n type: this.props.option.mediaType || 'image'\n }),\n multiple: false,\n date: false,\n priority: 20,\n suggestedWidth: (this.props.option.logo || {}).width,\n suggestedHeight: (this.props.option.logo || {}).height\n }), ...(this.props.option.skipCrop || true ? [] : 0)]\n });\n this.frame.on('select', this.onSelect, this);\n this.frame.on('close', () => {\n this.props.option.onFrameClose && this.props.option.onFrameClose();\n });\n this.frame.on('cropped', this.onCropped, this);\n this.frame.on('skippedcrop', this.onSkippedCrop, this);\n }\n /**\n * Open the media modal to the library state.\n */\n\n\n openFrame() {\n this.initFrame();\n this.frame.setState('library').open();\n this.props.option.onFrameOpen && this.props.option.onFrameOpen();\n }\n /**\n * After an image is selected in the media modal, switch to the cropper\n * state if the image isn't the right size.\n */\n\n\n /**\n * Returns a set of options, computed from the attached image data and\n * control-specific data, to be fed to the imgAreaSelect plugin in\n * wp.media.view.Cropper.\n *\n * @param {wp.media.model.Attachment} attachment\n * @param {wp.media.controller.Cropper} controller\n * @returns {Object} Options\n */\n calculateImageSelectOptions(attachment, controller) {\n var control = controller.get('control');\n var flexWidth = !!parseInt((control.props.option.logo || {}).flex_width, 10);\n var flexHeight = !!parseInt((control.props.option.logo || {}).flex_height, 10);\n var realWidth = attachment.get('width');\n var realHeight = attachment.get('height');\n var xInit = parseInt((control.props.option.logo || {}).width, 10);\n var yInit = parseInt((control.props.option.logo || {}).height, 10);\n var ratio = xInit / yInit;\n var xImg = xInit;\n var yImg = yInit;\n var x1;\n var y1;\n var imgSelectOptions;\n\n if (realWidth / realHeight > ratio) {\n yInit = realHeight;\n xInit = yInit * ratio;\n } else {\n xInit = realWidth;\n yInit = xInit / ratio;\n }\n\n x1 = (realWidth - xInit) / 2;\n y1 = (realHeight - yInit) / 2;\n imgSelectOptions = {\n handles: true,\n keys: true,\n instance: true,\n persistent: true,\n imageWidth: realWidth,\n imageHeight: realHeight,\n minWidth: xImg > xInit ? xInit : xImg,\n minHeight: yImg > yInit ? yInit : yImg,\n x1: x1,\n y1: y1,\n x2: xInit + x1,\n y2: yInit + y1\n };\n\n if (flexHeight === false && flexWidth === false) {\n imgSelectOptions.aspectRatio = xInit + ':' + yInit;\n }\n\n if (true === flexHeight) {\n delete imgSelectOptions.minHeight;\n imgSelectOptions.maxWidth = realWidth;\n }\n\n if (true === flexWidth) {\n delete imgSelectOptions.minWidth;\n imgSelectOptions.maxHeight = realHeight;\n }\n\n return imgSelectOptions;\n }\n /**\n * Return whether the image must be cropped, based on required dimensions.\n *\n * @param {bool} flexW\n * @param {bool} flexH\n * @param {int} dstW\n * @param {int} dstH\n * @param {int} imgW\n * @param {int} imgH\n * @return {bool}\n */\n\n\n mustBeCropped(flexW, flexH, dstW, dstH, imgW, imgH) {\n if (true === flexW && true === flexH) {\n return false;\n }\n\n if (true === flexW && dstH === imgH) {\n return false;\n }\n\n if (true === flexH && dstW === imgW) {\n return false;\n }\n\n if (dstW === imgW && dstH === imgH) {\n return false;\n }\n\n if (imgW <= dstW) {\n return false;\n }\n\n return true;\n }\n /**\n * If cropping was skipped, apply the image data directly to the setting.\n */\n\n\n /**\n * Updates the setting and re-renders the control UI.\n *\n * @param {object} attachment\n */\n setImageFromAttachment(attachment) {\n this.onChange(attachment.id, JSON.parse(JSON.stringify(wp.media.attachment(attachment.id).toJSON())));\n this.updateAttachmentInfo();\n }\n\n detachListener() {\n if (!this.getAttachmentId()) return;\n wp.media.attachment(this.getAttachmentId()).off('change', this.updateAttachmentInfo);\n }\n\n componentDidUpdate(prevProps) {\n if (this.getAttachmentId() !== this.getAttachmentId(prevProps)) {\n wp.media.attachment(this.getAttachmentId(prevProps)).off('change', this.updateAttachmentInfo);\n this.updateAttachmentInfo();\n }\n }\n\n componentDidMount() {\n this.updateAttachmentInfo();\n }\n\n componentWillUnmount() {\n this.detachListener();\n }\n\n render() {\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()('attachment-media-view ct-attachment', {\n ['landscape']: this.getAttachmentId() && this.state.attachment_info,\n ['attachment-media-view-image']: this.getAttachmentId() && this.state.attachment_info\n })\n }, this.props.option.attr || {}), this.getAttachmentId() && this.state.attachment_info ? (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"thumbnail thumbnail-image\",\n onClick: () => !this.props.option.has_position_picker && this.openFrame()\n }, !this.props.option.has_position_picker && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"img\", {\n className: \"attachment-thumb\",\n src: this.getUrlFor(this.state.attachment_info),\n draggable: \"false\",\n alt: \"\"\n }), this.props.option.has_position_picker && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__.FocalPointPicker, {\n url: this.getUrlFor(this.state.attachment_info),\n dimensions: {\n width: 400,\n height: 100\n },\n value: this.props.value,\n onChange: drag_position => {\n this.props.onChange(_objectSpread(_objectSpread({}, this.props.value), drag_position));\n }\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"actions\"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"button\", {\n type: \"button\",\n className: \"button edit-button control-focus\",\n title: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Edit', 'blocksy'),\n onClick: e => {\n e.stopPropagation();\n this.openFrame();\n },\n id: \"customize-media-control-button-35\"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"button\", {\n onClick: e => {\n e.stopPropagation();\n this.setState({\n attachment_info: null\n });\n this.onChange(null);\n },\n title: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Remove', 'blocksy'),\n type: \"button\",\n className: \"button remove-button\"\n })))) : (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"button\", {\n type: \"button\",\n onClick: () => this.openFrame(),\n className: \"button ct-upload-button\",\n id: \"customize-media-control-button-50\"\n }, this.props.option.emptyLabel || (0,ct_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Select logo', 'blocksy'))));\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA0OC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1pbWFnZS11cGxvYWRlci5qcz9jMGQ2Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCB7IEZvY2FsUG9pbnRQaWNrZXIgfSBmcm9tICdAd29yZHByZXNzL2NvbXBvbmVudHMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IF8gZnJvbSAndW5kZXJzY29yZSc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZVVwbG9hZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJwYXJhbXNcIiwge1xuICAgICAgaGVpZ2h0OiAyNTAsXG4gICAgICB3aWR0aDogMjUwLFxuICAgICAgZmxleF93aWR0aDogdHJ1ZSxcbiAgICAgIGZsZXhfaGVpZ2h0OiB0cnVlXG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzdGF0ZVwiLCB7XG4gICAgICBhdHRhY2htZW50X2luZm86IG51bGxcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldFVybEZvclwiLCBhdHRhY2htZW50SW5mbyA9PiBhdHRhY2htZW50SW5mbyA/IChhdHRhY2htZW50SW5mby53aWR0aCA8IDcwMCA/IGF0dGFjaG1lbnRJbmZvLnNpemVzLmZ1bGwgOiBfLm1heChfLnZhbHVlcyhfLmtleXMoYXR0YWNobWVudEluZm8uc2l6ZXMpLmxlbmd0aCA9PT0gMSA/IGF0dGFjaG1lbnRJbmZvLnNpemVzIDogXy5vbWl0KGF0dGFjaG1lbnRJbmZvLnNpemVzLCAnZnVsbCcpKSwgX3JlZiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB3aWR0aFxuICAgICAgfSA9IF9yZWY7XG4gICAgICByZXR1cm4gd2lkdGg7XG4gICAgfSkpLnVybCB8fCBhdHRhY2htZW50SW5mby51cmwgOiBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uQ2hhbmdlXCIsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgbGV0IGF0dGFjaG1lbnRfaW5mbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5vbkNoYW5nZShfdGhpcy5wcm9wcy5vcHRpb24uaW5saW5lX3ZhbHVlID8gdmFsdWUgfHwgJycgOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzLnByb3BzLnZhbHVlKSwge30sIHtcbiAgICAgICAgdXJsOiBfdGhpcy5nZXRVcmxGb3IoYXR0YWNobWVudF9pbmZvKSxcbiAgICAgICAgYXR0YWNobWVudF9pZDogdmFsdWVcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldEF0dGFjaG1lbnRJZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IF90aGlzLnByb3BzO1xuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbi5pbmxpbmVfdmFsdWUgPyBwcm9wcy52YWx1ZSA6IHByb3BzLnZhbHVlLmF0dGFjaG1lbnRfaWQ7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvblNlbGVjdFwiLCAoKSA9PiB7XG4gICAgICB2YXIgYXR0YWNobWVudCA9IHRoaXMuZnJhbWUuc3RhdGUoKS5nZXQoJ3NlbGVjdGlvbicpLmZpcnN0KCkudG9KU09OKCk7XG5cbiAgICAgIGlmICgodGhpcy5wcm9wcy5vcHRpb24ubG9nbyB8fCB7fSkud2lkdGggPT09IGF0dGFjaG1lbnQud2lkdGggJiYgKHRoaXMucHJvcHMub3B0aW9uLmxvZ28gfHwge30pLmhlaWdodCA9PT0gYXR0YWNobWVudC5oZWlnaHQgJiYgISh0aGlzLnByb3BzLm9wdGlvbi5sb2dvIHx8IHt9KS5mbGV4X3dpZHRoICYmICEodGhpcy5wcm9wcy5vcHRpb24ubG9nbyB8fCB7fSkuZmxleF9oZWlnaHQgfHwgdGhpcy5wcm9wcy5vcHRpb24uc2tpcENyb3AgfHwgdHJ1ZSkge1xuICAgICAgICB0aGlzLnNldEltYWdlRnJvbUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG4gICAgICAgIHRoaXMuZnJhbWUuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZnJhbWUuc2V0U3RhdGUoJ2Nyb3BwZXInKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uQ3JvcHBlZFwiLCBjcm9wcGVkSW1hZ2UgPT4ge1xuICAgICAgdGhpcy5zZXRJbWFnZUZyb21BdHRhY2htZW50KGNyb3BwZWRJbWFnZSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvblNraXBwZWRDcm9wXCIsICgpID0+IHtcbiAgICAgIHZhciBhdHRhY2htZW50ID0gdGhpcy5mcmFtZS5zdGF0ZSgpLmdldCgnc2VsZWN0aW9uJykuZmlyc3QoKS50b0pTT04oKTtcbiAgICAgIHRoaXMuc2V0SW1hZ2VGcm9tQXR0YWNobWVudChhdHRhY2htZW50KTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInVwZGF0ZUF0dGFjaG1lbnRJbmZvXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBmb3JjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICAgIGxldCBpZCA9IF90aGlzLmdldEF0dGFjaG1lbnRJZCgpO1xuXG4gICAgICBpZiAoIWlkKSByZXR1cm47XG5cbiAgICAgIGlmICghd3AubWVkaWEuYXR0YWNobWVudChpZCkuZ2V0KCd1cmwnKSB8fCBmb3JjZSkge1xuICAgICAgICB3cC5tZWRpYS5hdHRhY2htZW50KGlkKS5mZXRjaCgpLnRoZW4oKCkgPT4gX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGF0dGFjaG1lbnRfaW5mbzogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh3cC5tZWRpYS5hdHRhY2htZW50KGlkKS50b0pTT04oKSkpXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBhdHRhY2htZW50X2luZm86IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkod3AubWVkaWEuYXR0YWNobWVudChpZCkudG9KU09OKCkpKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZGV0YWNoTGlzdGVuZXIoKTtcblxuICAgICAgd3AubWVkaWEuYXR0YWNobWVudChpZCkub24oJ2NoYW5nZScsIF90aGlzLnVwZGF0ZUF0dGFjaG1lbnRJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtZWRpYSBtb2RhbCBzZWxlY3QgZnJhbWUsIGFuZCBzdG9yZSBpdCBzbyB0aGUgaW5zdGFuY2UgY2FuIGJlIHJldXNlZCB3aGVuIG5lZWRlZC5cbiAgICovXG4gIGluaXRGcmFtZSgpIHtcbiAgICB0aGlzLmZyYW1lID0gd3AubWVkaWEoe1xuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIHRleHQ6ICdTZWxlY3QnLFxuICAgICAgICBjbG9zZTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBzdGF0ZXM6IFtuZXcgd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5KHtcbiAgICAgICAgdGl0bGU6IF9fKCdTZWxlY3QgbG9nbycsICdibG9ja3N5JyksXG4gICAgICAgIGxpYnJhcnk6IHdwLm1lZGlhLnF1ZXJ5KHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnByb3BzLm9wdGlvbi5tZWRpYVR5cGUgfHwgJ2ltYWdlJ1xuICAgICAgICB9KSxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBkYXRlOiBmYWxzZSxcbiAgICAgICAgcHJpb3JpdHk6IDIwLFxuICAgICAgICBzdWdnZXN0ZWRXaWR0aDogKHRoaXMucHJvcHMub3B0aW9uLmxvZ28gfHwge30pLndpZHRoLFxuICAgICAgICBzdWdnZXN0ZWRIZWlnaHQ6ICh0aGlzLnByb3BzLm9wdGlvbi5sb2dvIHx8IHt9KS5oZWlnaHRcbiAgICAgIH0pLCAuLi4odGhpcy5wcm9wcy5vcHRpb24uc2tpcENyb3AgfHwgdHJ1ZSA/IFtdIDogW25ldyB3cC5tZWRpYS5jb250cm9sbGVyLkN1c3RvbWl6ZUltYWdlQ3JvcHBlcih7XG4gICAgICAgIGltZ1NlbGVjdE9wdGlvbnM6IHRoaXMuY2FsY3VsYXRlSW1hZ2VTZWxlY3RPcHRpb25zLFxuICAgICAgICBjb250cm9sOiB0aGlzXG4gICAgICB9KV0pXVxuICAgIH0pO1xuICAgIHRoaXMuZnJhbWUub24oJ3NlbGVjdCcsIHRoaXMub25TZWxlY3QsIHRoaXMpO1xuICAgIHRoaXMuZnJhbWUub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5vcHRpb24ub25GcmFtZUNsb3NlICYmIHRoaXMucHJvcHMub3B0aW9uLm9uRnJhbWVDbG9zZSgpO1xuICAgIH0pO1xuICAgIHRoaXMuZnJhbWUub24oJ2Nyb3BwZWQnLCB0aGlzLm9uQ3JvcHBlZCwgdGhpcyk7XG4gICAgdGhpcy5mcmFtZS5vbignc2tpcHBlZGNyb3AnLCB0aGlzLm9uU2tpcHBlZENyb3AsIHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBPcGVuIHRoZSBtZWRpYSBtb2RhbCB0byB0aGUgbGlicmFyeSBzdGF0ZS5cbiAgICovXG5cblxuICBvcGVuRnJhbWUoKSB7XG4gICAgdGhpcy5pbml0RnJhbWUoKTtcbiAgICB0aGlzLmZyYW1lLnNldFN0YXRlKCdsaWJyYXJ5Jykub3BlbigpO1xuICAgIHRoaXMucHJvcHMub3B0aW9uLm9uRnJhbWVPcGVuICYmIHRoaXMucHJvcHMub3B0aW9uLm9uRnJhbWVPcGVuKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFmdGVyIGFuIGltYWdlIGlzIHNlbGVjdGVkIGluIHRoZSBtZWRpYSBtb2RhbCwgc3dpdGNoIHRvIHRoZSBjcm9wcGVyXG4gICAqIHN0YXRlIGlmIHRoZSBpbWFnZSBpc24ndCB0aGUgcmlnaHQgc2l6ZS5cbiAgICovXG5cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNldCBvZiBvcHRpb25zLCBjb21wdXRlZCBmcm9tIHRoZSBhdHRhY2hlZCBpbWFnZSBkYXRhIGFuZFxuICAgKiBjb250cm9sLXNwZWNpZmljIGRhdGEsIHRvIGJlIGZlZCB0byB0aGUgaW1nQXJlYVNlbGVjdCBwbHVnaW4gaW5cbiAgICogd3AubWVkaWEudmlldy5Dcm9wcGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcbiAgICogQHBhcmFtIHt3cC5tZWRpYS5jb250cm9sbGVyLkNyb3BwZXJ9IGNvbnRyb2xsZXJcbiAgICogQHJldHVybnMge09iamVjdH0gT3B0aW9uc1xuICAgKi9cbiAgY2FsY3VsYXRlSW1hZ2VTZWxlY3RPcHRpb25zKGF0dGFjaG1lbnQsIGNvbnRyb2xsZXIpIHtcbiAgICB2YXIgY29udHJvbCA9IGNvbnRyb2xsZXIuZ2V0KCdjb250cm9sJyk7XG4gICAgdmFyIGZsZXhXaWR0aCA9ICEhcGFyc2VJbnQoKGNvbnRyb2wucHJvcHMub3B0aW9uLmxvZ28gfHwge30pLmZsZXhfd2lkdGgsIDEwKTtcbiAgICB2YXIgZmxleEhlaWdodCA9ICEhcGFyc2VJbnQoKGNvbnRyb2wucHJvcHMub3B0aW9uLmxvZ28gfHwge30pLmZsZXhfaGVpZ2h0LCAxMCk7XG4gICAgdmFyIHJlYWxXaWR0aCA9IGF0dGFjaG1lbnQuZ2V0KCd3aWR0aCcpO1xuICAgIHZhciByZWFsSGVpZ2h0ID0gYXR0YWNobWVudC5nZXQoJ2hlaWdodCcpO1xuICAgIHZhciB4SW5pdCA9IHBhcnNlSW50KChjb250cm9sLnByb3BzLm9wdGlvbi5sb2dvIHx8IHt9KS53aWR0aCwgMTApO1xuICAgIHZhciB5SW5pdCA9IHBhcnNlSW50KChjb250cm9sLnByb3BzLm9wdGlvbi5sb2dvIHx8IHt9KS5oZWlnaHQsIDEwKTtcbiAgICB2YXIgcmF0aW8gPSB4SW5pdCAvIHlJbml0O1xuICAgIHZhciB4SW1nID0geEluaXQ7XG4gICAgdmFyIHlJbWcgPSB5SW5pdDtcbiAgICB2YXIgeDE7XG4gICAgdmFyIHkxO1xuICAgIHZhciBpbWdTZWxlY3RPcHRpb25zO1xuXG4gICAgaWYgKHJlYWxXaWR0aCAvIHJlYWxIZWlnaHQgPiByYXRpbykge1xuICAgICAgeUluaXQgPSByZWFsSGVpZ2h0O1xuICAgICAgeEluaXQgPSB5SW5pdCAqIHJhdGlvO1xuICAgIH0gZWxzZSB7XG4gICAgICB4SW5pdCA9IHJlYWxXaWR0aDtcbiAgICAgIHlJbml0ID0geEluaXQgLyByYXRpbztcbiAgICB9XG5cbiAgICB4MSA9IChyZWFsV2lkdGggLSB4SW5pdCkgLyAyO1xuICAgIHkxID0gKHJlYWxIZWlnaHQgLSB5SW5pdCkgLyAyO1xuICAgIGltZ1NlbGVjdE9wdGlvbnMgPSB7XG4gICAgICBoYW5kbGVzOiB0cnVlLFxuICAgICAga2V5czogdHJ1ZSxcbiAgICAgIGluc3RhbmNlOiB0cnVlLFxuICAgICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICAgIGltYWdlV2lkdGg6IHJlYWxXaWR0aCxcbiAgICAgIGltYWdlSGVpZ2h0OiByZWFsSGVpZ2h0LFxuICAgICAgbWluV2lkdGg6IHhJbWcgPiB4SW5pdCA/IHhJbml0IDogeEltZyxcbiAgICAgIG1pbkhlaWdodDogeUltZyA+IHlJbml0ID8geUluaXQgOiB5SW1nLFxuICAgICAgeDE6IHgxLFxuICAgICAgeTE6IHkxLFxuICAgICAgeDI6IHhJbml0ICsgeDEsXG4gICAgICB5MjogeUluaXQgKyB5MVxuICAgIH07XG5cbiAgICBpZiAoZmxleEhlaWdodCA9PT0gZmFsc2UgJiYgZmxleFdpZHRoID09PSBmYWxzZSkge1xuICAgICAgaW1nU2VsZWN0T3B0aW9ucy5hc3BlY3RSYXRpbyA9IHhJbml0ICsgJzonICsgeUluaXQ7XG4gICAgfVxuXG4gICAgaWYgKHRydWUgPT09IGZsZXhIZWlnaHQpIHtcbiAgICAgIGRlbGV0ZSBpbWdTZWxlY3RPcHRpb25zLm1pbkhlaWdodDtcbiAgICAgIGltZ1NlbGVjdE9wdGlvbnMubWF4V2lkdGggPSByZWFsV2lkdGg7XG4gICAgfVxuXG4gICAgaWYgKHRydWUgPT09IGZsZXhXaWR0aCkge1xuICAgICAgZGVsZXRlIGltZ1NlbGVjdE9wdGlvbnMubWluV2lkdGg7XG4gICAgICBpbWdTZWxlY3RPcHRpb25zLm1heEhlaWdodCA9IHJlYWxIZWlnaHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGltZ1NlbGVjdE9wdGlvbnM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBpbWFnZSBtdXN0IGJlIGNyb3BwZWQsIGJhc2VkIG9uIHJlcXVpcmVkIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbH0gZmxleFdcbiAgICogQHBhcmFtIHtib29sfSBmbGV4SFxuICAgKiBAcGFyYW0ge2ludH0gIGRzdFdcbiAgICogQHBhcmFtIHtpbnR9ICBkc3RIXG4gICAqIEBwYXJhbSB7aW50fSAgaW1nV1xuICAgKiBAcGFyYW0ge2ludH0gIGltZ0hcbiAgICogQHJldHVybiB7Ym9vbH1cbiAgICovXG5cblxuICBtdXN0QmVDcm9wcGVkKGZsZXhXLCBmbGV4SCwgZHN0VywgZHN0SCwgaW1nVywgaW1nSCkge1xuICAgIGlmICh0cnVlID09PSBmbGV4VyAmJiB0cnVlID09PSBmbGV4SCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0cnVlID09PSBmbGV4VyAmJiBkc3RIID09PSBpbWdIKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRydWUgPT09IGZsZXhIICYmIGRzdFcgPT09IGltZ1cpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZHN0VyA9PT0gaW1nVyAmJiBkc3RIID09PSBpbWdIKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGltZ1cgPD0gZHN0Vykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBJZiBjcm9wcGluZyB3YXMgc2tpcHBlZCwgYXBwbHkgdGhlIGltYWdlIGRhdGEgZGlyZWN0bHkgdG8gdGhlIHNldHRpbmcuXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHNldHRpbmcgYW5kIHJlLXJlbmRlcnMgdGhlIGNvbnRyb2wgVUkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRhY2htZW50XG4gICAqL1xuICBzZXRJbWFnZUZyb21BdHRhY2htZW50KGF0dGFjaG1lbnQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlKGF0dGFjaG1lbnQuaWQsIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkod3AubWVkaWEuYXR0YWNobWVudChhdHRhY2htZW50LmlkKS50b0pTT04oKSkpKTtcbiAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRJbmZvKCk7XG4gIH1cblxuICBkZXRhY2hMaXN0ZW5lcigpIHtcbiAgICBpZiAoIXRoaXMuZ2V0QXR0YWNobWVudElkKCkpIHJldHVybjtcbiAgICB3cC5tZWRpYS5hdHRhY2htZW50KHRoaXMuZ2V0QXR0YWNobWVudElkKCkpLm9mZignY2hhbmdlJywgdGhpcy51cGRhdGVBdHRhY2htZW50SW5mbyk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgaWYgKHRoaXMuZ2V0QXR0YWNobWVudElkKCkgIT09IHRoaXMuZ2V0QXR0YWNobWVudElkKHByZXZQcm9wcykpIHtcbiAgICAgIHdwLm1lZGlhLmF0dGFjaG1lbnQodGhpcy5nZXRBdHRhY2htZW50SWQocHJldlByb3BzKSkub2ZmKCdjaGFuZ2UnLCB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRJbmZvKTtcbiAgICAgIHRoaXMudXBkYXRlQXR0YWNobWVudEluZm8oKTtcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRJbmZvKCk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmRldGFjaExpc3RlbmVyKCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdhdHRhY2htZW50LW1lZGlhLXZpZXcgY3QtYXR0YWNobWVudCcsIHtcbiAgICAgICAgWydsYW5kc2NhcGUnXTogdGhpcy5nZXRBdHRhY2htZW50SWQoKSAmJiB0aGlzLnN0YXRlLmF0dGFjaG1lbnRfaW5mbyxcbiAgICAgICAgWydhdHRhY2htZW50LW1lZGlhLXZpZXctaW1hZ2UnXTogdGhpcy5nZXRBdHRhY2htZW50SWQoKSAmJiB0aGlzLnN0YXRlLmF0dGFjaG1lbnRfaW5mb1xuICAgICAgfSlcbiAgICB9LCB0aGlzLnByb3BzLm9wdGlvbi5hdHRyIHx8IHt9KSwgdGhpcy5nZXRBdHRhY2htZW50SWQoKSAmJiB0aGlzLnN0YXRlLmF0dGFjaG1lbnRfaW5mbyA/IGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcInRodW1ibmFpbCB0aHVtYm5haWwtaW1hZ2VcIixcbiAgICAgIG9uQ2xpY2s6ICgpID0+ICF0aGlzLnByb3BzLm9wdGlvbi5oYXNfcG9zaXRpb25fcGlja2VyICYmIHRoaXMub3BlbkZyYW1lKClcbiAgICB9LCAhdGhpcy5wcm9wcy5vcHRpb24uaGFzX3Bvc2l0aW9uX3BpY2tlciAmJiBjcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJhdHRhY2htZW50LXRodW1iXCIsXG4gICAgICBzcmM6IHRoaXMuZ2V0VXJsRm9yKHRoaXMuc3RhdGUuYXR0YWNobWVudF9pbmZvKSxcbiAgICAgIGRyYWdnYWJsZTogXCJmYWxzZVwiLFxuICAgICAgYWx0OiBcIlwiXG4gICAgfSksIHRoaXMucHJvcHMub3B0aW9uLmhhc19wb3NpdGlvbl9waWNrZXIgJiYgY3JlYXRlRWxlbWVudChGb2NhbFBvaW50UGlja2VyLCB7XG4gICAgICB1cmw6IHRoaXMuZ2V0VXJsRm9yKHRoaXMuc3RhdGUuYXR0YWNobWVudF9pbmZvKSxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgd2lkdGg6IDQwMCxcbiAgICAgICAgaGVpZ2h0OiAxMDBcbiAgICAgIH0sXG4gICAgICB2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBkcmFnX3Bvc2l0aW9uID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMucHJvcHMudmFsdWUpLCBkcmFnX3Bvc2l0aW9uKSk7XG4gICAgICB9XG4gICAgfSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImFjdGlvbnNcIlxuICAgIH0sIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIGNsYXNzTmFtZTogXCJidXR0b24gZWRpdC1idXR0b24gY29udHJvbC1mb2N1c1wiLFxuICAgICAgdGl0bGU6IF9fKCdFZGl0JywgJ2Jsb2Nrc3knKSxcbiAgICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLm9wZW5GcmFtZSgpO1xuICAgICAgfSxcbiAgICAgIGlkOiBcImN1c3RvbWl6ZS1tZWRpYS1jb250cm9sLWJ1dHRvbi0zNVwiXG4gICAgfSksIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgb25DbGljazogZSA9PiB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGF0dGFjaG1lbnRfaW5mbzogbnVsbFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgIH0sXG4gICAgICB0aXRsZTogX18oJ1JlbW92ZScsICdibG9ja3N5JyksXG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgY2xhc3NOYW1lOiBcImJ1dHRvbiByZW1vdmUtYnV0dG9uXCJcbiAgICB9KSkpKSA6IGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMub3BlbkZyYW1lKCksXG4gICAgICBjbGFzc05hbWU6IFwiYnV0dG9uIGN0LXVwbG9hZC1idXR0b25cIixcbiAgICAgIGlkOiBcImN1c3RvbWl6ZS1tZWRpYS1jb250cm9sLWJ1dHRvbi01MFwiXG4gICAgfSwgdGhpcy5wcm9wcy5vcHRpb24uZW1wdHlMYWJlbCB8fCBfXygnU2VsZWN0IGxvZ28nLCAnYmxvY2tzeScpKSkpO1xuICB9XG5cbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3048\n")},379:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _OptionsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7429);\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nconst LayersMirror = _ref => {\n let {\n values,\n onChangeFor,\n value,\n option,\n onChange\n } = _ref;\n const wholeLayers = values[option.layers] || [];\n const ourLayers = wholeLayers.filter(_ref2 => {\n let {\n id,\n enabled\n } = _ref2;\n return enabled && id === option.field;\n });\n\n if (ourLayers.length === 0) {\n return null;\n }\n\n return ourLayers.map((layer, index) => {\n let computedOptions = Object.keys(option['inner-options']).reduce((all, optionId) => _objectSpread(_objectSpread({}, all), {}, {\n [optionId]: _objectSpread(_objectSpread({}, option['inner-options'][optionId]), {}, {\n label: option['inner-options'][optionId].label.replace('INDEX ', ourLayers.length === 1 ? '' : `${index + 1} `)\n })\n }), {});\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_OptionsPanel__WEBPACK_IMPORTED_MODULE_1__/* [\"default\"] */ .Z, {\n key: layer.__id || layer.id,\n onChange: (id, value) => {\n onChangeFor(option.layers, wholeLayers.map(l => l.__id !== layer.__id ? l : _objectSpread(_objectSpread({}, l), {}, {\n [id]: value\n })));\n },\n options: computedOptions,\n value: layer\n });\n });\n};\n\nLayersMirror.renderingConfig = {\n design: 'none'\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LayersMirror);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LWxheWVycy1taXJyb3IuanM/NWZmMCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgT3B0aW9uc1BhbmVsIGZyb20gJy4uL09wdGlvbnNQYW5lbCc7XG5cbmNvbnN0IExheWVyc01pcnJvciA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHZhbHVlcyxcbiAgICBvbkNoYW5nZUZvcixcbiAgICB2YWx1ZSxcbiAgICBvcHRpb24sXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHdob2xlTGF5ZXJzID0gdmFsdWVzW29wdGlvbi5sYXllcnNdIHx8IFtdO1xuICBjb25zdCBvdXJMYXllcnMgPSB3aG9sZUxheWVycy5maWx0ZXIoX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZCxcbiAgICAgIGVuYWJsZWRcbiAgICB9ID0gX3JlZjI7XG4gICAgcmV0dXJuIGVuYWJsZWQgJiYgaWQgPT09IG9wdGlvbi5maWVsZDtcbiAgfSk7XG5cbiAgaWYgKG91ckxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBvdXJMYXllcnMubWFwKChsYXllciwgaW5kZXgpID0+IHtcbiAgICBsZXQgY29tcHV0ZWRPcHRpb25zID0gT2JqZWN0LmtleXMob3B0aW9uWydpbm5lci1vcHRpb25zJ10pLnJlZHVjZSgoYWxsLCBvcHRpb25JZCkgPT4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhbGwpLCB7fSwge1xuICAgICAgW29wdGlvbklkXTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb25bJ2lubmVyLW9wdGlvbnMnXVtvcHRpb25JZF0pLCB7fSwge1xuICAgICAgICBsYWJlbDogb3B0aW9uWydpbm5lci1vcHRpb25zJ11bb3B0aW9uSWRdLmxhYmVsLnJlcGxhY2UoJ0lOREVYICcsIG91ckxheWVycy5sZW5ndGggPT09IDEgPyAnJyA6IGAke2luZGV4ICsgMX0gYClcbiAgICAgIH0pXG4gICAgfSksIHt9KTtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChPcHRpb25zUGFuZWwsIHtcbiAgICAgIGtleTogbGF5ZXIuX19pZCB8fCBsYXllci5pZCxcbiAgICAgIG9uQ2hhbmdlOiAoaWQsIHZhbHVlKSA9PiB7XG4gICAgICAgIG9uQ2hhbmdlRm9yKG9wdGlvbi5sYXllcnMsIHdob2xlTGF5ZXJzLm1hcChsID0+IGwuX19pZCAhPT0gbGF5ZXIuX19pZCA/IGwgOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGwpLCB7fSwge1xuICAgICAgICAgIFtpZF06IHZhbHVlXG4gICAgICAgIH0pKSk7XG4gICAgICB9LFxuICAgICAgb3B0aW9uczogY29tcHV0ZWRPcHRpb25zLFxuICAgICAgdmFsdWU6IGxheWVyXG4gICAgfSk7XG4gIH0pO1xufTtcblxuTGF5ZXJzTWlycm9yLnJlbmRlcmluZ0NvbmZpZyA9IHtcbiAgZGVzaWduOiAnbm9uZSdcbn07XG5leHBvcnQgZGVmYXVsdCBMYXllcnNNaXJyb3I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///379\n")},6780:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "LayersContext": () => (/* binding */ LayersContext),\n "default": () => (/* binding */ ct_layers),\n "itemsThatAreNotAdded": () => (/* binding */ itemsThatAreNotAdded)\n});\n\n// EXTERNAL MODULE: external "window.wp.element"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: ./node_modules/react-sortable-hoc/dist/react-sortable-hoc.esm.js + 18 modules\nvar react_sortable_hoc_esm = __webpack_require__(6362);\n// EXTERNAL MODULE: ./node_modules/array-move/index.js\nvar array_move = __webpack_require__(454);\nvar array_move_default = /*#__PURE__*/__webpack_require__.n(array_move);\n// EXTERNAL MODULE: ./static/js/options/OptionsPanel.js + 7 modules\nvar OptionsPanel = __webpack_require__(7429);\n// EXTERNAL MODULE: ./static/js/options/helpers/get-value-from-input.js\nvar get_value_from_input = __webpack_require__(7069);\n// EXTERNAL MODULE: ./static/js/options/options/ct-select.js + 3 modules\nvar ct_select = __webpack_require__(1404);\n// EXTERNAL MODULE: ./node_modules/nanoid/index.browser.js\nvar index_browser = __webpack_require__(1496);\nvar index_browser_default = /*#__PURE__*/__webpack_require__.n(index_browser);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-layers/SelectThatAddsItems.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\nconst SelectThatAddsItems = _ref => {\n let {\n value,\n option\n } = _ref;\n const notAddedItems = itemsThatAreNotAdded(value, option);\n const {\n currentlyPickedItem,\n setCurrentItem,\n addCurrentlySelectedItem\n } = (0,external_window_wp_element_.useContext)(LayersContext);\n\n if (notAddedItems.length <= 0) {\n return null;\n }\n\n return (0,external_window_wp_element_.createElement)("div", {\n className: "ct-add-layer-controls"\n }, (0,external_window_wp_element_.createElement)(ct_select["default"], {\n onChange: currentlyPickedItem => setCurrentItem(currentlyPickedItem),\n option: _objectSpread({\n search: true,\n choices: notAddedItems.map(key => ({\n key,\n value: window._.template((option.settings[key] || {\n label: key\n }).label)({\n label: \'\'\n })\n }))\n }, option.selectOption || {}),\n value: currentlyPickedItem || notAddedItems[0]\n }), (0,external_window_wp_element_.createElement)("button", {\n type: "button",\n className: "button button-primary",\n onClick: () => addCurrentlySelectedItem()\n }, (0,external_window_wp_element_.createElement)("svg", {\n width: "10",\n height: "10",\n viewBox: "0 0 17 17"\n }, (0,external_window_wp_element_.createElement)("path", {\n d: "M17,10h-7v7H7v-7H0V7h7V0h3v7h7V10z"\n }))));\n};\n\n/* harmony default export */ const ct_layers_SelectThatAddsItems = (SelectThatAddsItems);\n// EXTERNAL MODULE: external "window.wp.i18n"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./node_modules/match-conditions/dist/index.es.js\nvar index_es = __webpack_require__(7465);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-layers/LayerControls.js\nfunction LayerControls_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction LayerControls_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? LayerControls_ownKeys(Object(source), !0).forEach(function (key) { LayerControls_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : LayerControls_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction LayerControls_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst LayerControls = _ref => {\n let {\n itemIndex,\n items,\n onChange,\n value\n } = _ref;\n const {\n removeForId,\n addForId,\n option,\n toggleOptionsPanel\n } = (0,external_window_wp_element_.useContext)(LayersContext);\n const hasOptions = option.settings[value.id] && option.settings[value.id].options && (!option.settings[value.id].options_condition || option.settings[value.id].options_condition && (0,index_es/* matchValuesWithCondition */.Nj)((0,index_es/* normalizeCondition */.KY)(option.settings[value.id].options_condition), LayerControls_objectSpread(LayerControls_objectSpread({}, value), {}, {\n itemIndex\n })));\n let itemsOfType = items.filter(_ref2 => {\n let {\n id\n } = _ref2;\n return id === value.id;\n });\n let relativeIndex = itemsOfType.map(_ref3 => {\n let {\n __id\n } = _ref3;\n return __id;\n }).indexOf(value.__id);\n return (0,external_window_wp_element_.createElement)("div", {\n className: "ct-layer-controls"\n }, !option.disableHiding && (0,external_window_wp_element_.createElement)("button", {\n type: "button",\n className: "ct-visibility",\n onClick: e => {\n e.stopPropagation();\n onChange(items.map(l => l.__id === value.__id ? LayerControls_objectSpread(LayerControls_objectSpread({}, l), {}, {\n enabled: !LayerControls_objectSpread({\n enabled: true\n }, l).enabled\n }) : l));\n }\n }, (0,external_window_wp_element_.createElement)("svg", {\n width: "13px",\n height: "13px",\n viewBox: "0 0 24 24"\n }, (0,external_window_wp_element_.createElement)("path", {\n d: "M12,4C4.1,4,0,12,0,12s3.1,8,12,8c8.1,0,12-8,12-8S20.1,4,12,4z M12,17c-2.9,0-5-2.2-5-5c0-2.8,2.1-5,5-5s5,2.2,5,5C17,14.8,14.9,17,12,17z M12,9c-1.7,0-3,1.4-3,3c0,1.6,1.3,3,3,3s3-1.4,3-3C15,10.4,13.7,9,12,9z"\n }))), (0,external_window_wp_element_.createElement)("div", {\n className: "ct-layer-label"\n }, (0,external_window_wp_element_.createElement)("span", null, window._.template((option.settings[value.id] || {\n label: value.id\n }).label)(value).replace(\' INDEX\', itemsOfType.length === 1 ? \'\' : ` ${relativeIndex + 1}`))), option.settings[value.id] && option.settings[value.id].clone && items.filter(_ref4 => {\n let {\n id\n } = _ref4;\n return id === value.id;\n }).length < (parseInt(option.settings[value.id].clone) || 1) + 1 && (0,external_window_wp_element_.createElement)("button", {\n type: "button",\n className: "ct-clone",\n onClick: () => addForId(value.id, value)\n }, (0,external_window_wp_element_.createElement)("svg", {\n width: "11px",\n height: "11px",\n viewBox: "0 0 24 24"\n }, (0,external_window_wp_element_.createElement)("path", {\n d: "M23,24H7.7c-0.6,0-1-0.4-1-1V7.7c0-0.6,0.4-1,1-1H23c0.6,0,1,0.4,1,1V23C24,23.6,23.6,24,23,24z M8.7,22H22V8.7 H8.7V22z"\n }), (0,external_window_wp_element_.createElement)("path", {\n d: "M17.3,16.3c0,0.6-0.4,1-1,1H1c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1h15.3c0.6,0,1,0.4,1,1V16.3z"\n })), (0,external_window_wp_element_.createElement)("i", {\n className: "ct-tooltip-top"\n }, (0,external_window_wp_i18n_.__)(\'Clone Item\', \'blocksy\'))), (option.manageable || option.settings[value.id] && option.settings[value.id].clone && items.filter(_ref5 => {\n let {\n id\n } = _ref5;\n return id === value.id;\n }).length > 1 || !option.settings[value.id]) && (0,external_window_wp_element_.createElement)("button", {\n type: "button",\n className: "ct-remove",\n onClick: () => removeForId(value.__id)\n }), hasOptions && (0,external_window_wp_element_.createElement)("button", {\n type: "button",\n className: "ct-toggle",\n onMouseDown: e => {\n e.stopPropagation();\n },\n onClick: e => {\n e.stopPropagation();\n toggleOptionsPanel(value.__id);\n }\n }));\n};\n\n/* harmony default export */ const ct_layers_LayerControls = ((0,react_sortable_hoc_esm/* SortableHandle */.W6)(LayerControls));\n;// CONCATENATED MODULE: ./static/js/options/options/ct-layers.js\nfunction ct_layers_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction ct_layers_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ct_layers_ownKeys(Object(source), !0).forEach(function (key) { ct_layers_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ct_layers_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction ct_layers_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\n\nconst valueWithUniqueIds = value => value.map(singleItem => ct_layers_objectSpread(ct_layers_objectSpread({}, singleItem), singleItem.__id ? {} : {\n __id: index_browser_default()()\n}));\n\nconst itemsThatAreNotAdded = (value, option) => Object.keys(option.settings).filter(optionId => !value.find(_ref => {\n let {\n id\n } = _ref;\n return id === optionId;\n}));\n\nconst getDefaultState = () => ({\n currentlyPickedItem: null,\n isDragging: false,\n isOpen: false\n});\n\nconst LayersContext = (0,external_window_wp_element_.createContext)(getDefaultState());\nconst {\n Provider,\n Consumer\n} = LayersContext;\n\nclass SingleItem extends external_window_wp_element_.Component {\n constructor() {\n super(...arguments);\n\n ct_layers_defineProperty(this, "state", {\n isOpen: false\n });\n }\n\n render() {\n const {\n value,\n items,\n onChange,\n index\n } = this.props;\n const itemIndex = items.map(_ref2 => {\n let {\n __id\n } = _ref2;\n return __id;\n }).indexOf(value.__id).toString();\n return (0,external_window_wp_element_.createElement)(Consumer, null, _ref3 => {\n let {\n option,\n isDragging,\n isOpen,\n parentValue\n } = _ref3;\n return (0,external_window_wp_element_.createElement)("li", {\n className: classnames_default()(\'ct-layer\', option.itemClass, {\n [`ct-disabled`]: !ct_layers_objectSpread({\n enabled: true\n }, value).enabled\n })\n }, (0,external_window_wp_element_.createElement)(ct_layers_LayerControls, {\n items: items,\n onChange: onChange,\n value: value,\n itemIndex: itemIndex\n }), option.settings[value.id] && option.settings[value.id].options && isOpen === value.__id && (!isDragging || isDragging && isDragging !== isOpen) && (0,external_window_wp_element_.createElement)("div", {\n className: "ct-layer-content"\n }, (0,external_window_wp_element_.createElement)(OptionsPanel/* default */.Z, {\n hasRevertButton: false,\n parentValue: parentValue,\n onChange: (key, newValue) => {\n if (option.settings[value.id].sync && option.settings[value.id].clone) {\n let totalItems = items.filter(_ref4 => {\n let {\n id\n } = _ref4;\n return id === value.id;\n }).length;\n let idForSync = `${option.settings[value.id].sync.id}_first`;\n\n if (totalItems > 1 && items.filter(_ref5 => {\n let {\n id\n } = _ref5;\n return id === value.id;\n }).map(_ref6 => {\n let {\n __id\n } = _ref6;\n return __id;\n }).indexOf(value.__id) > 0) {\n idForSync = `${option.settings[value.id].sync.id}_second`;\n }\n\n wp.customize && wp.customize.previewer && wp.customize.previewer.send(\'ct:sync:refresh_partial\', {\n id: idForSync\n });\n }\n\n onChange(items.map(l => l.__id === value.__id ? ct_layers_objectSpread(ct_layers_objectSpread({}, l), {}, {\n [key]: newValue\n }) : l));\n },\n value: (0,get_value_from_input/* getValueFromInput */.n6)(option.settings[value.id].options, ct_layers_objectSpread(ct_layers_objectSpread(ct_layers_objectSpread({}, option.value.filter(_ref7 => {\n let {\n id\n } = _ref7;\n return id === value.id;\n }).length > 1 ? option.value.filter(_ref8 => {\n let {\n id\n } = _ref8;\n return value.id === id;\n })[items.filter(_ref9 => {\n let {\n id\n } = _ref9;\n return id === value.id;\n }).map(_ref10 => {\n let {\n __id\n } = _ref10;\n return __id;\n }).indexOf(value.__id)] : {}), value), {}, {\n itemIndex\n })),\n options: option.settings[value.id].options\n })));\n });\n }\n\n}\n\nconst SortableItem = (0,react_sortable_hoc_esm/* SortableElement */.W8)(SingleItem);\nconst SortableList = (0,react_sortable_hoc_esm/* SortableContainer */.JN)(_ref11 => {\n let {\n items,\n onChange\n } = _ref11;\n return (0,external_window_wp_element_.createElement)(Consumer, null, _ref12 => {\n let {\n option\n } = _ref12;\n return (0,external_window_wp_element_.createElement)("ul", {\n className: "ct-layers"\n }, items.map((value, index) => (0,external_window_wp_element_.createElement)(SortableItem, {\n key: value.__id,\n index: index,\n onChange: onChange,\n value: value,\n items: items,\n disabled: !!option.disableDrag\n })));\n });\n});\n\nconst Layers = _ref13 => {\n let {\n value,\n option,\n onChange,\n values\n } = _ref13;\n const [state, setState] = (0,external_window_wp_element_.useState)(getDefaultState());\n\n const addForId = function (idToAdd) {\n let val = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n onChange([...(value || []), ct_layers_objectSpread(ct_layers_objectSpread(ct_layers_objectSpread({\n id: idToAdd,\n enabled: true\n }, (0,get_value_from_input/* getValueFromInput */.n6)(option.settings[idToAdd].options || {}, {})), val), {}, {\n __id: index_browser_default()()\n })]);\n };\n\n const computedValue = (option.manageable ? valueWithUniqueIds(value) : [...valueWithUniqueIds(value), ...option.value.filter(_ref14 => {\n let {\n id\n } = _ref14;\n return value.map(_ref15 => {\n let {\n id\n } = _ref15;\n return id;\n }).indexOf(id) === -1;\n }).map(item => ct_layers_objectSpread(ct_layers_objectSpread({}, item), {}, {\n __id: index_browser_default()(),\n enabled: false\n }))]).filter(item => !!option.settings[item.id]);\n return (0,external_window_wp_element_.createElement)(Provider, {\n value: ct_layers_objectSpread(ct_layers_objectSpread({}, state), {}, {\n parentValue: values,\n addCurrentlySelectedItem: () => {\n const idToAdd = state.currentlyPickedItem || itemsThatAreNotAdded(valueWithUniqueIds(value), option)[0];\n setState(state => ct_layers_objectSpread(ct_layers_objectSpread({}, state), {}, {\n currentlyPickedItem: null\n }));\n addForId(idToAdd);\n },\n addForId: (id, value) => addForId(id, value),\n option: option,\n setCurrentItem: currentlyPickedItem => setState(state => ct_layers_objectSpread(ct_layers_objectSpread({}, state), {}, {\n currentlyPickedItem\n })),\n removeForId: idToRemove => onChange(valueWithUniqueIds(value).filter(_ref16 => {\n let {\n __id: id\n } = _ref16;\n return id !== idToRemove;\n })),\n toggleOptionsPanel: idToAdd => {\n if (value.length > 0 && !value[0].__id) {\n wp.customize && wp.customize.previewer && wp.customize.previewer.send(\'ct:sync:refresh_partial\', {\n shouldSkip: true\n });\n onChange(computedValue);\n }\n\n setState(state => ct_layers_objectSpread(ct_layers_objectSpread({}, state), {}, {\n isOpen: state.isOpen === idToAdd ? false : idToAdd\n }));\n }\n })\n }, option.manageable && (0,external_window_wp_element_.createElement)(ct_layers_SelectThatAddsItems, {\n value: computedValue,\n option\n }), (0,external_window_wp_element_.createElement)(SortableList, {\n useDragHandle: true,\n distance: 3,\n lockAxis: "y",\n items: computedValue,\n onChange: v => onChange(v),\n helperContainer: () => document.querySelector(\'#customize-theme-controls\') || document.body,\n onSortEnd: _ref17 => {\n let {\n oldIndex,\n newIndex\n } = _ref17;\n onChange(array_move_default()(computedValue, oldIndex, newIndex));\n setState(state => ct_layers_objectSpread(ct_layers_objectSpread({}, state), {}, {\n isDragging: false\n }));\n },\n updateBeforeSortStart: _ref18 => {\n let {\n index\n } = _ref18;\n new Promise(resolve => {\n if (value.length > 0 && !value[0].__id) {\n wp.customize && wp.customize.previewer && wp.customize.previewer.send(\'ct:sync:refresh_partial\', {\n shouldSkip: true\n });\n onChange(computedValue);\n }\n\n setState(state => ct_layers_objectSpread(ct_layers_objectSpread({}, state), {}, {\n isDragging: computedValue[index].__id\n }));\n resolve();\n });\n }\n }));\n};\n\n/* harmony default export */ const ct_layers = (Layers);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc4MC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1sYXllcnMvU2VsZWN0VGhhdEFkZHNJdGVtcy5qcz84ZTIzIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1sYXllcnMvTGF5ZXJDb250cm9scy5qcz8yYzM2Iiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1sYXllcnMuanM/MDA4NSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBGcmFnbWVudCwgdXNlQ29udGV4dCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBpdGVtc1RoYXRBcmVOb3RBZGRlZCwgTGF5ZXJzQ29udGV4dCB9IGZyb20gJy4uL2N0LWxheWVycyc7XG5pbXBvcnQgU2VsZWN0IGZyb20gJy4uL2N0LXNlbGVjdCc7XG5cbmNvbnN0IFNlbGVjdFRoYXRBZGRzSXRlbXMgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICB2YWx1ZSxcbiAgICBvcHRpb25cbiAgfSA9IF9yZWY7XG4gIGNvbnN0IG5vdEFkZGVkSXRlbXMgPSBpdGVtc1RoYXRBcmVOb3RBZGRlZCh2YWx1ZSwgb3B0aW9uKTtcbiAgY29uc3Qge1xuICAgIGN1cnJlbnRseVBpY2tlZEl0ZW0sXG4gICAgc2V0Q3VycmVudEl0ZW0sXG4gICAgYWRkQ3VycmVudGx5U2VsZWN0ZWRJdGVtXG4gIH0gPSB1c2VDb250ZXh0KExheWVyc0NvbnRleHQpO1xuXG4gIGlmIChub3RBZGRlZEl0ZW1zLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWFkZC1sYXllci1jb250cm9sc1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoU2VsZWN0LCB7XG4gICAgb25DaGFuZ2U6IGN1cnJlbnRseVBpY2tlZEl0ZW0gPT4gc2V0Q3VycmVudEl0ZW0oY3VycmVudGx5UGlja2VkSXRlbSksXG4gICAgb3B0aW9uOiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHNlYXJjaDogdHJ1ZSxcbiAgICAgIGNob2ljZXM6IG5vdEFkZGVkSXRlbXMubWFwKGtleSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB3aW5kb3cuXy50ZW1wbGF0ZSgob3B0aW9uLnNldHRpbmdzW2tleV0gfHwge1xuICAgICAgICAgIGxhYmVsOiBrZXlcbiAgICAgICAgfSkubGFiZWwpKHtcbiAgICAgICAgICBsYWJlbDogJydcbiAgICAgICAgfSlcbiAgICAgIH0pKVxuICAgIH0sIG9wdGlvbi5zZWxlY3RPcHRpb24gfHwge30pLFxuICAgIHZhbHVlOiBjdXJyZW50bHlQaWNrZWRJdGVtIHx8IG5vdEFkZGVkSXRlbXNbMF1cbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcImJ1dHRvbiBidXR0b24tcHJpbWFyeVwiLFxuICAgIG9uQ2xpY2s6ICgpID0+IGFkZEN1cnJlbnRseVNlbGVjdGVkSXRlbSgpXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjEwXCIsXG4gICAgaGVpZ2h0OiBcIjEwXCIsXG4gICAgdmlld0JveDogXCIwIDAgMTcgMTdcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTcsMTBoLTd2N0g3di03SDBWN2g3VjBoM3Y3aDdWMTB6XCJcbiAgfSkpKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RUaGF0QWRkc0l0ZW1zOyIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHVzZUNvbnRleHQsIHVzZVN0YXRlLCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBTb3J0YWJsZUhhbmRsZSB9IGZyb20gJ3JlYWN0LXNvcnRhYmxlLWhvYyc7XG5pbXBvcnQgeyBMYXllcnNDb250ZXh0IH0gZnJvbSAnLi4vY3QtbGF5ZXJzJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgeyBub3JtYWxpemVDb25kaXRpb24sIG1hdGNoVmFsdWVzV2l0aENvbmRpdGlvbiB9IGZyb20gJ21hdGNoLWNvbmRpdGlvbnMnO1xuXG5jb25zdCBMYXllckNvbnRyb2xzID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgaXRlbUluZGV4LFxuICAgIGl0ZW1zLFxuICAgIG9uQ2hhbmdlLFxuICAgIHZhbHVlXG4gIH0gPSBfcmVmO1xuICBjb25zdCB7XG4gICAgcmVtb3ZlRm9ySWQsXG4gICAgYWRkRm9ySWQsXG4gICAgb3B0aW9uLFxuICAgIHRvZ2dsZU9wdGlvbnNQYW5lbFxuICB9ID0gdXNlQ29udGV4dChMYXllcnNDb250ZXh0KTtcbiAgY29uc3QgaGFzT3B0aW9ucyA9IG9wdGlvbi5zZXR0aW5nc1t2YWx1ZS5pZF0gJiYgb3B0aW9uLnNldHRpbmdzW3ZhbHVlLmlkXS5vcHRpb25zICYmICghb3B0aW9uLnNldHRpbmdzW3ZhbHVlLmlkXS5vcHRpb25zX2NvbmRpdGlvbiB8fCBvcHRpb24uc2V0dGluZ3NbdmFsdWUuaWRdLm9wdGlvbnNfY29uZGl0aW9uICYmIG1hdGNoVmFsdWVzV2l0aENvbmRpdGlvbihub3JtYWxpemVDb25kaXRpb24ob3B0aW9uLnNldHRpbmdzW3ZhbHVlLmlkXS5vcHRpb25zX2NvbmRpdGlvbiksIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgIGl0ZW1JbmRleFxuICB9KSkpO1xuICBsZXQgaXRlbXNPZlR5cGUgPSBpdGVtcy5maWx0ZXIoX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gaWQgPT09IHZhbHVlLmlkO1xuICB9KTtcbiAgbGV0IHJlbGF0aXZlSW5kZXggPSBpdGVtc09mVHlwZS5tYXAoX3JlZjMgPT4ge1xuICAgIGxldCB7XG4gICAgICBfX2lkXG4gICAgfSA9IF9yZWYzO1xuICAgIHJldHVybiBfX2lkO1xuICB9KS5pbmRleE9mKHZhbHVlLl9faWQpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWxheWVyLWNvbnRyb2xzXCJcbiAgfSwgIW9wdGlvbi5kaXNhYmxlSGlkaW5nICYmIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcImN0LXZpc2liaWxpdHlcIixcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBvbkNoYW5nZShpdGVtcy5tYXAobCA9PiBsLl9faWQgPT09IHZhbHVlLl9faWQgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGwpLCB7fSwge1xuICAgICAgICBlbmFibGVkOiAhX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgICB9LCBsKS5lbmFibGVkXG4gICAgICB9KSA6IGwpKTtcbiAgICB9XG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjEzcHhcIixcbiAgICBoZWlnaHQ6IFwiMTNweFwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEyLDRDNC4xLDQsMCwxMiwwLDEyczMuMSw4LDEyLDhjOC4xLDAsMTItOCwxMi04UzIwLjEsNCwxMiw0eiBNMTIsMTdjLTIuOSwwLTUtMi4yLTUtNWMwLTIuOCwyLjEtNSw1LTVzNSwyLjIsNSw1QzE3LDE0LjgsMTQuOSwxNywxMiwxN3ogTTEyLDljLTEuNywwLTMsMS40LTMsM2MwLDEuNiwxLjMsMywzLDNzMy0xLjQsMy0zQzE1LDEwLjQsMTMuNyw5LDEyLDl6XCJcbiAgfSkpKSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWxheWVyLWxhYmVsXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgd2luZG93Ll8udGVtcGxhdGUoKG9wdGlvbi5zZXR0aW5nc1t2YWx1ZS5pZF0gfHwge1xuICAgIGxhYmVsOiB2YWx1ZS5pZFxuICB9KS5sYWJlbCkodmFsdWUpLnJlcGxhY2UoJyBJTkRFWCcsIGl0ZW1zT2ZUeXBlLmxlbmd0aCA9PT0gMSA/ICcnIDogYCAke3JlbGF0aXZlSW5kZXggKyAxfWApKSksIG9wdGlvbi5zZXR0aW5nc1t2YWx1ZS5pZF0gJiYgb3B0aW9uLnNldHRpbmdzW3ZhbHVlLmlkXS5jbG9uZSAmJiBpdGVtcy5maWx0ZXIoX3JlZjQgPT4ge1xuICAgIGxldCB7XG4gICAgICBpZFxuICAgIH0gPSBfcmVmNDtcbiAgICByZXR1cm4gaWQgPT09IHZhbHVlLmlkO1xuICB9KS5sZW5ndGggPCAocGFyc2VJbnQob3B0aW9uLnNldHRpbmdzW3ZhbHVlLmlkXS5jbG9uZSkgfHwgMSkgKyAxICYmIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcImN0LWNsb25lXCIsXG4gICAgb25DbGljazogKCkgPT4gYWRkRm9ySWQodmFsdWUuaWQsIHZhbHVlKVxuICB9LCBjcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogXCIxMXB4XCIsXG4gICAgaGVpZ2h0OiBcIjExcHhcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yMywyNEg3LjdjLTAuNiwwLTEtMC40LTEtMVY3LjdjMC0wLjYsMC40LTEsMS0xSDIzYzAuNiwwLDEsMC40LDEsMVYyM0MyNCwyMy42LDIzLjYsMjQsMjMsMjR6IE04LjcsMjJIMjJWOC43IEg4LjdWMjJ6XCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNy4zLDE2LjNjMCwwLjYtMC40LDEtMSwxSDFjLTAuNiwwLTEtMC40LTEtMVYxYzAtMC42LDAuNC0xLDEtMWgxNS4zYzAuNiwwLDEsMC40LDEsMVYxNi4zelwiXG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImlcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC10b29sdGlwLXRvcFwiXG4gIH0sIF9fKCdDbG9uZSBJdGVtJywgJ2Jsb2Nrc3knKSkpLCAob3B0aW9uLm1hbmFnZWFibGUgfHwgb3B0aW9uLnNldHRpbmdzW3ZhbHVlLmlkXSAmJiBvcHRpb24uc2V0dGluZ3NbdmFsdWUuaWRdLmNsb25lICYmIGl0ZW1zLmZpbHRlcihfcmVmNSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGlkXG4gICAgfSA9IF9yZWY1O1xuICAgIHJldHVybiBpZCA9PT0gdmFsdWUuaWQ7XG4gIH0pLmxlbmd0aCA+IDEgfHwgIW9wdGlvbi5zZXR0aW5nc1t2YWx1ZS5pZF0pICYmIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcImN0LXJlbW92ZVwiLFxuICAgIG9uQ2xpY2s6ICgpID0+IHJlbW92ZUZvcklkKHZhbHVlLl9faWQpXG4gIH0pLCBoYXNPcHRpb25zICYmIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcImN0LXRvZ2dsZVwiLFxuICAgIG9uTW91c2VEb3duOiBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0b2dnbGVPcHRpb25zUGFuZWwodmFsdWUuX19pZCk7XG4gICAgfVxuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTb3J0YWJsZUhhbmRsZShMYXllckNvbnRyb2xzKTsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIGNyZWF0ZUNvbnRleHQsIHVzZVN0YXRlLCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IFNvcnRhYmxlQ29udGFpbmVyLCBTb3J0YWJsZUVsZW1lbnQsIFNvcnRhYmxlSGFuZGxlIH0gZnJvbSAncmVhY3Qtc29ydGFibGUtaG9jJztcbmltcG9ydCBhcnJheU1vdmUgZnJvbSAnYXJyYXktbW92ZSc7XG5pbXBvcnQgT3B0aW9uc1BhbmVsIGZyb20gJy4uL09wdGlvbnNQYW5lbCc7XG5pbXBvcnQgeyBnZXRWYWx1ZUZyb21JbnB1dCB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0LXZhbHVlLWZyb20taW5wdXQnO1xuaW1wb3J0IFNlbGVjdCBmcm9tICcuL2N0LXNlbGVjdCc7XG5pbXBvcnQgbmFub2lkIGZyb20gJ25hbm9pZCc7XG5pbXBvcnQgU2VsZWN0VGhhdEFkZHNJdGVtcyBmcm9tICcuL2N0LWxheWVycy9TZWxlY3RUaGF0QWRkc0l0ZW1zJztcbmltcG9ydCBMYXllckNvbnRyb2xzIGZyb20gJy4vY3QtbGF5ZXJzL0xheWVyQ29udHJvbHMnO1xuXG5jb25zdCB2YWx1ZVdpdGhVbmlxdWVJZHMgPSB2YWx1ZSA9PiB2YWx1ZS5tYXAoc2luZ2xlSXRlbSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNpbmdsZUl0ZW0pLCBzaW5nbGVJdGVtLl9faWQgPyB7fSA6IHtcbiAgX19pZDogbmFub2lkKClcbn0pKTtcblxuZXhwb3J0IGNvbnN0IGl0ZW1zVGhhdEFyZU5vdEFkZGVkID0gKHZhbHVlLCBvcHRpb24pID0+IE9iamVjdC5rZXlzKG9wdGlvbi5zZXR0aW5ncykuZmlsdGVyKG9wdGlvbklkID0+ICF2YWx1ZS5maW5kKF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGlkXG4gIH0gPSBfcmVmO1xuICByZXR1cm4gaWQgPT09IG9wdGlvbklkO1xufSkpO1xuXG5jb25zdCBnZXREZWZhdWx0U3RhdGUgPSAoKSA9PiAoe1xuICBjdXJyZW50bHlQaWNrZWRJdGVtOiBudWxsLFxuICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgaXNPcGVuOiBmYWxzZVxufSk7XG5cbmV4cG9ydCBjb25zdCBMYXllcnNDb250ZXh0ID0gY3JlYXRlQ29udGV4dChnZXREZWZhdWx0U3RhdGUoKSk7XG5jb25zdCB7XG4gIFByb3ZpZGVyLFxuICBDb25zdW1lclxufSA9IExheWVyc0NvbnRleHQ7XG5cbmNsYXNzIFNpbmdsZUl0ZW0gZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic3RhdGVcIiwge1xuICAgICAgaXNPcGVuOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHZhbHVlLFxuICAgICAgaXRlbXMsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGluZGV4XG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgaXRlbUluZGV4ID0gaXRlbXMubWFwKF9yZWYyID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIF9faWRcbiAgICAgIH0gPSBfcmVmMjtcbiAgICAgIHJldHVybiBfX2lkO1xuICAgIH0pLmluZGV4T2YodmFsdWUuX19pZCkudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChDb25zdW1lciwgbnVsbCwgX3JlZjMgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgb3B0aW9uLFxuICAgICAgICBpc0RyYWdnaW5nLFxuICAgICAgICBpc09wZW4sXG4gICAgICAgIHBhcmVudFZhbHVlXG4gICAgICB9ID0gX3JlZjM7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC1sYXllcicsIG9wdGlvbi5pdGVtQ2xhc3MsIHtcbiAgICAgICAgICBbYGN0LWRpc2FibGVkYF06ICFfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICAgICAgICB9LCB2YWx1ZSkuZW5hYmxlZFxuICAgICAgICB9KVxuICAgICAgfSwgY3JlYXRlRWxlbWVudChMYXllckNvbnRyb2xzLCB7XG4gICAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGl0ZW1JbmRleDogaXRlbUluZGV4XG4gICAgICB9KSwgb3B0aW9uLnNldHRpbmdzW3ZhbHVlLmlkXSAmJiBvcHRpb24uc2V0dGluZ3NbdmFsdWUuaWRdLm9wdGlvbnMgJiYgaXNPcGVuID09PSB2YWx1ZS5fX2lkICYmICghaXNEcmFnZ2luZyB8fCBpc0RyYWdnaW5nICYmIGlzRHJhZ2dpbmcgIT09IGlzT3BlbikgJiYgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJjdC1sYXllci1jb250ZW50XCJcbiAgICAgIH0sIGNyZWF0ZUVsZW1lbnQoT3B0aW9uc1BhbmVsLCB7XG4gICAgICAgIGhhc1JldmVydEJ1dHRvbjogZmFsc2UsXG4gICAgICAgIHBhcmVudFZhbHVlOiBwYXJlbnRWYWx1ZSxcbiAgICAgICAgb25DaGFuZ2U6IChrZXksIG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbi5zZXR0aW5nc1t2YWx1ZS5pZF0uc3luYyAmJiBvcHRpb24uc2V0dGluZ3NbdmFsdWUuaWRdLmNsb25lKSB7XG4gICAgICAgICAgICBsZXQgdG90YWxJdGVtcyA9IGl0ZW1zLmZpbHRlcihfcmVmNCA9PiB7XG4gICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgfSA9IF9yZWY0O1xuICAgICAgICAgICAgICByZXR1cm4gaWQgPT09IHZhbHVlLmlkO1xuICAgICAgICAgICAgfSkubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGlkRm9yU3luYyA9IGAke29wdGlvbi5zZXR0aW5nc1t2YWx1ZS5pZF0uc3luYy5pZH1fZmlyc3RgO1xuXG4gICAgICAgICAgICBpZiAodG90YWxJdGVtcyA+IDEgJiYgaXRlbXMuZmlsdGVyKF9yZWY1ID0+IHtcbiAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICB9ID0gX3JlZjU7XG4gICAgICAgICAgICAgIHJldHVybiBpZCA9PT0gdmFsdWUuaWQ7XG4gICAgICAgICAgICB9KS5tYXAoX3JlZjYgPT4ge1xuICAgICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICAgIF9faWRcbiAgICAgICAgICAgICAgfSA9IF9yZWY2O1xuICAgICAgICAgICAgICByZXR1cm4gX19pZDtcbiAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUuX19pZCkgPiAwKSB7XG4gICAgICAgICAgICAgIGlkRm9yU3luYyA9IGAke29wdGlvbi5zZXR0aW5nc1t2YWx1ZS5pZF0uc3luYy5pZH1fc2Vjb25kYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIgJiYgd3AuY3VzdG9taXplLnByZXZpZXdlci5zZW5kKCdjdDpzeW5jOnJlZnJlc2hfcGFydGlhbCcsIHtcbiAgICAgICAgICAgICAgaWQ6IGlkRm9yU3luY1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb25DaGFuZ2UoaXRlbXMubWFwKGwgPT4gbC5fX2lkID09PSB2YWx1ZS5fX2lkID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBsKSwge30sIHtcbiAgICAgICAgICAgIFtrZXldOiBuZXdWYWx1ZVxuICAgICAgICAgIH0pIDogbCkpO1xuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogZ2V0VmFsdWVGcm9tSW5wdXQob3B0aW9uLnNldHRpbmdzW3ZhbHVlLmlkXS5vcHRpb25zLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9uLnZhbHVlLmZpbHRlcihfcmVmNyA9PiB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlkXG4gICAgICAgICAgfSA9IF9yZWY3O1xuICAgICAgICAgIHJldHVybiBpZCA9PT0gdmFsdWUuaWQ7XG4gICAgICAgIH0pLmxlbmd0aCA+IDEgPyBvcHRpb24udmFsdWUuZmlsdGVyKF9yZWY4ID0+IHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9ID0gX3JlZjg7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmlkID09PSBpZDtcbiAgICAgICAgfSlbaXRlbXMuZmlsdGVyKF9yZWY5ID0+IHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9ID0gX3JlZjk7XG4gICAgICAgICAgcmV0dXJuIGlkID09PSB2YWx1ZS5pZDtcbiAgICAgICAgfSkubWFwKF9yZWYxMCA9PiB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIF9faWRcbiAgICAgICAgICB9ID0gX3JlZjEwO1xuICAgICAgICAgIHJldHVybiBfX2lkO1xuICAgICAgICB9KS5pbmRleE9mKHZhbHVlLl9faWQpXSA6IHt9KSwgdmFsdWUpLCB7fSwge1xuICAgICAgICAgIGl0ZW1JbmRleFxuICAgICAgICB9KSksXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbi5zZXR0aW5nc1t2YWx1ZS5pZF0ub3B0aW9uc1xuICAgICAgfSkpKTtcbiAgICB9KTtcbiAgfVxuXG59XG5cbmNvbnN0IFNvcnRhYmxlSXRlbSA9IFNvcnRhYmxlRWxlbWVudChTaW5nbGVJdGVtKTtcbmNvbnN0IFNvcnRhYmxlTGlzdCA9IFNvcnRhYmxlQ29udGFpbmVyKF9yZWYxMSA9PiB7XG4gIGxldCB7XG4gICAgaXRlbXMsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWYxMTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ29uc3VtZXIsIG51bGwsIF9yZWYxMiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIG9wdGlvblxuICAgIH0gPSBfcmVmMTI7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiY3QtbGF5ZXJzXCJcbiAgICB9LCBpdGVtcy5tYXAoKHZhbHVlLCBpbmRleCkgPT4gY3JlYXRlRWxlbWVudChTb3J0YWJsZUl0ZW0sIHtcbiAgICAgIGtleTogdmFsdWUuX19pZCxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgIGRpc2FibGVkOiAhIW9wdGlvbi5kaXNhYmxlRHJhZ1xuICAgIH0pKSk7XG4gIH0pO1xufSk7XG5cbmNvbnN0IExheWVycyA9IF9yZWYxMyA9PiB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgb3B0aW9uLFxuICAgIG9uQ2hhbmdlLFxuICAgIHZhbHVlc1xuICB9ID0gX3JlZjEzO1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlKGdldERlZmF1bHRTdGF0ZSgpKTtcblxuICBjb25zdCBhZGRGb3JJZCA9IGZ1bmN0aW9uIChpZFRvQWRkKSB7XG4gICAgbGV0IHZhbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgb25DaGFuZ2UoWy4uLih2YWx1ZSB8fCBbXSksIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGlkOiBpZFRvQWRkLFxuICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgIH0sIGdldFZhbHVlRnJvbUlucHV0KG9wdGlvbi5zZXR0aW5nc1tpZFRvQWRkXS5vcHRpb25zIHx8IHt9LCB7fSkpLCB2YWwpLCB7fSwge1xuICAgICAgX19pZDogbmFub2lkKClcbiAgICB9KV0pO1xuICB9O1xuXG4gIGNvbnN0IGNvbXB1dGVkVmFsdWUgPSAob3B0aW9uLm1hbmFnZWFibGUgPyB2YWx1ZVdpdGhVbmlxdWVJZHModmFsdWUpIDogWy4uLnZhbHVlV2l0aFVuaXF1ZUlkcyh2YWx1ZSksIC4uLm9wdGlvbi52YWx1ZS5maWx0ZXIoX3JlZjE0ID0+IHtcbiAgICBsZXQge1xuICAgICAgaWRcbiAgICB9ID0gX3JlZjE0O1xuICAgIHJldHVybiB2YWx1ZS5tYXAoX3JlZjE1ID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGlkXG4gICAgICB9ID0gX3JlZjE1O1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pLmluZGV4T2YoaWQpID09PSAtMTtcbiAgfSkubWFwKGl0ZW0gPT4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIHtcbiAgICBfX2lkOiBuYW5vaWQoKSxcbiAgICBlbmFibGVkOiBmYWxzZVxuICB9KSldKS5maWx0ZXIoaXRlbSA9PiAhIW9wdGlvbi5zZXR0aW5nc1tpdGVtLmlkXSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgcGFyZW50VmFsdWU6IHZhbHVlcyxcbiAgICAgIGFkZEN1cnJlbnRseVNlbGVjdGVkSXRlbTogKCkgPT4ge1xuICAgICAgICBjb25zdCBpZFRvQWRkID0gc3RhdGUuY3VycmVudGx5UGlja2VkSXRlbSB8fCBpdGVtc1RoYXRBcmVOb3RBZGRlZCh2YWx1ZVdpdGhVbmlxdWVJZHModmFsdWUpLCBvcHRpb24pWzBdO1xuICAgICAgICBzZXRTdGF0ZShzdGF0ZSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgICAgICBjdXJyZW50bHlQaWNrZWRJdGVtOiBudWxsXG4gICAgICAgIH0pKTtcbiAgICAgICAgYWRkRm9ySWQoaWRUb0FkZCk7XG4gICAgICB9LFxuICAgICAgYWRkRm9ySWQ6IChpZCwgdmFsdWUpID0+IGFkZEZvcklkKGlkLCB2YWx1ZSksXG4gICAgICBvcHRpb246IG9wdGlvbixcbiAgICAgIHNldEN1cnJlbnRJdGVtOiBjdXJyZW50bHlQaWNrZWRJdGVtID0+IHNldFN0YXRlKHN0YXRlID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICBjdXJyZW50bHlQaWNrZWRJdGVtXG4gICAgICB9KSksXG4gICAgICByZW1vdmVGb3JJZDogaWRUb1JlbW92ZSA9PiBvbkNoYW5nZSh2YWx1ZVdpdGhVbmlxdWVJZHModmFsdWUpLmZpbHRlcihfcmVmMTYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIF9faWQ6IGlkXG4gICAgICAgIH0gPSBfcmVmMTY7XG4gICAgICAgIHJldHVybiBpZCAhPT0gaWRUb1JlbW92ZTtcbiAgICAgIH0pKSxcbiAgICAgIHRvZ2dsZU9wdGlvbnNQYW5lbDogaWRUb0FkZCA9PiB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwICYmICF2YWx1ZVswXS5fX2lkKSB7XG4gICAgICAgICAgd3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIgJiYgd3AuY3VzdG9taXplLnByZXZpZXdlci5zZW5kKCdjdDpzeW5jOnJlZnJlc2hfcGFydGlhbCcsIHtcbiAgICAgICAgICAgIHNob3VsZFNraXA6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvbkNoYW5nZShjb21wdXRlZFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFN0YXRlKHN0YXRlID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICAgIGlzT3Blbjogc3RhdGUuaXNPcGVuID09PSBpZFRvQWRkID8gZmFsc2UgOiBpZFRvQWRkXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9KVxuICB9LCBvcHRpb24ubWFuYWdlYWJsZSAmJiBjcmVhdGVFbGVtZW50KFNlbGVjdFRoYXRBZGRzSXRlbXMsIHtcbiAgICB2YWx1ZTogY29tcHV0ZWRWYWx1ZSxcbiAgICBvcHRpb25cbiAgfSksIGNyZWF0ZUVsZW1lbnQoU29ydGFibGVMaXN0LCB7XG4gICAgdXNlRHJhZ0hhbmRsZTogdHJ1ZSxcbiAgICBkaXN0YW5jZTogMyxcbiAgICBsb2NrQXhpczogXCJ5XCIsXG4gICAgaXRlbXM6IGNvbXB1dGVkVmFsdWUsXG4gICAgb25DaGFuZ2U6IHYgPT4gb25DaGFuZ2UodiksXG4gICAgaGVscGVyQ29udGFpbmVyOiAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY3VzdG9taXplLXRoZW1lLWNvbnRyb2xzJykgfHwgZG9jdW1lbnQuYm9keSxcbiAgICBvblNvcnRFbmQ6IF9yZWYxNyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBvbGRJbmRleCxcbiAgICAgICAgbmV3SW5kZXhcbiAgICAgIH0gPSBfcmVmMTc7XG4gICAgICBvbkNoYW5nZShhcnJheU1vdmUoY29tcHV0ZWRWYWx1ZSwgb2xkSW5kZXgsIG5ld0luZGV4KSk7XG4gICAgICBzZXRTdGF0ZShzdGF0ZSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgICAgaXNEcmFnZ2luZzogZmFsc2VcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgIHVwZGF0ZUJlZm9yZVNvcnRTdGFydDogX3JlZjE4ID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGluZGV4XG4gICAgICB9ID0gX3JlZjE4O1xuICAgICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwICYmICF2YWx1ZVswXS5fX2lkKSB7XG4gICAgICAgICAgd3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIgJiYgd3AuY3VzdG9taXplLnByZXZpZXdlci5zZW5kKCdjdDpzeW5jOnJlZnJlc2hfcGFydGlhbCcsIHtcbiAgICAgICAgICAgIHNob3VsZFNraXA6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvbkNoYW5nZShjb21wdXRlZFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFN0YXRlKHN0YXRlID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICAgIGlzRHJhZ2dpbmc6IGNvbXB1dGVkVmFsdWVbaW5kZXhdLl9faWRcbiAgICAgICAgfSkpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExheWVyczsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n')},546:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ MultiImageUploader)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6715);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(underscore__WEBPACK_IMPORTED_MODULE_3__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\nconst ALLOWED_MEDIA_TYPES = [\'image\'];\nclass MultiImageUploader extends _wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n\n _defineProperty(this, "params", {\n height: 250,\n width: 250,\n flex_width: true,\n flex_height: true\n });\n\n _defineProperty(this, "state", {\n attachment_info: []\n });\n\n _defineProperty(this, "getUrlFor", attachmentInfo => attachmentInfo ? (attachmentInfo.width < 700 ? attachmentInfo.sizes.full : underscore__WEBPACK_IMPORTED_MODULE_3___default().max(underscore__WEBPACK_IMPORTED_MODULE_3___default().values(underscore__WEBPACK_IMPORTED_MODULE_3___default().keys(attachmentInfo.sizes).length === 1 ? attachmentInfo.sizes : underscore__WEBPACK_IMPORTED_MODULE_3___default().omit(attachmentInfo.sizes, \'full\')), _ref => {\n let {\n width\n } = _ref;\n return width;\n })).url || attachmentInfo.url : null);\n }\n\n render() {\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(\'ct-attachment-multi\', {})\n }, this.props.option.attr || {}), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(wp.mediaUtils.MediaUpload, {\n onSelect: media => {\n const result = media.map(attachment => ({\n url: this.getUrlFor(attachment),\n attachment_id: attachment.id\n }));\n this.props.onChange(result);\n },\n gallery: true,\n allowedTypes: ALLOWED_MEDIA_TYPES,\n value: this.props.value.map(_ref2 => {\n let {\n attachment_id\n } = _ref2;\n return attachment_id;\n }),\n multiple: true,\n render: _ref3 => {\n let {\n open\n } = _ref3;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, Array.isArray(this.props.value) && this.props.value.length > 0 && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-thumbnails-list"\n }, this.props.value.map(_ref4 => {\n let {\n url,\n attachment_id\n } = _ref4;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n key: attachment_id,\n className: "thumbnail thumbnail-image",\n onClick: () => {\n open();\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("img", {\n className: "attachment-thumb",\n src: url,\n draggable: "false",\n alt: ""\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "actions"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n type: "button",\n className: "button edit-button control-focus",\n title: "Edit"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n title: "Remove",\n type: "button",\n className: "button remove-button",\n onClick: e => {\n e.stopPropagation();\n this.props.onChange(this.props.value.filter(a => a.attachment_id !== attachment_id));\n }\n })));\n })), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {\n type: "button",\n className: "button edit-button control-focus",\n title: "Edit",\n onClick: () => open()\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)(\'Add/Edit Gallery\', \'blocksy\')));\n }\n }));\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ2LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LW11bHRpLWltYWdlLXVwbG9hZGVyLmpzPzVmNmMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IF8gZnJvbSAndW5kZXJzY29yZSc7XG5jb25zdCBBTExPV0VEX01FRElBX1RZUEVTID0gWydpbWFnZSddO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXVsdGlJbWFnZVVwbG9hZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInBhcmFtc1wiLCB7XG4gICAgICBoZWlnaHQ6IDI1MCxcbiAgICAgIHdpZHRoOiAyNTAsXG4gICAgICBmbGV4X3dpZHRoOiB0cnVlLFxuICAgICAgZmxleF9oZWlnaHQ6IHRydWVcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN0YXRlXCIsIHtcbiAgICAgIGF0dGFjaG1lbnRfaW5mbzogW11cbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldFVybEZvclwiLCBhdHRhY2htZW50SW5mbyA9PiBhdHRhY2htZW50SW5mbyA/IChhdHRhY2htZW50SW5mby53aWR0aCA8IDcwMCA/IGF0dGFjaG1lbnRJbmZvLnNpemVzLmZ1bGwgOiBfLm1heChfLnZhbHVlcyhfLmtleXMoYXR0YWNobWVudEluZm8uc2l6ZXMpLmxlbmd0aCA9PT0gMSA/IGF0dGFjaG1lbnRJbmZvLnNpemVzIDogXy5vbWl0KGF0dGFjaG1lbnRJbmZvLnNpemVzLCAnZnVsbCcpKSwgX3JlZiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB3aWR0aFxuICAgICAgfSA9IF9yZWY7XG4gICAgICByZXR1cm4gd2lkdGg7XG4gICAgfSkpLnVybCB8fCBhdHRhY2htZW50SW5mby51cmwgOiBudWxsKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LWF0dGFjaG1lbnQtbXVsdGknLCB7fSlcbiAgICB9LCB0aGlzLnByb3BzLm9wdGlvbi5hdHRyIHx8IHt9KSwgY3JlYXRlRWxlbWVudCh3cC5tZWRpYVV0aWxzLk1lZGlhVXBsb2FkLCB7XG4gICAgICBvblNlbGVjdDogbWVkaWEgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBtZWRpYS5tYXAoYXR0YWNobWVudCA9PiAoe1xuICAgICAgICAgIHVybDogdGhpcy5nZXRVcmxGb3IoYXR0YWNobWVudCksXG4gICAgICAgICAgYXR0YWNobWVudF9pZDogYXR0YWNobWVudC5pZFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UocmVzdWx0KTtcbiAgICAgIH0sXG4gICAgICBnYWxsZXJ5OiB0cnVlLFxuICAgICAgYWxsb3dlZFR5cGVzOiBBTExPV0VEX01FRElBX1RZUEVTLFxuICAgICAgdmFsdWU6IHRoaXMucHJvcHMudmFsdWUubWFwKF9yZWYyID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBhdHRhY2htZW50X2lkXG4gICAgICAgIH0gPSBfcmVmMjtcbiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRfaWQ7XG4gICAgICB9KSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgcmVuZGVyOiBfcmVmMyA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgb3BlblxuICAgICAgICB9ID0gX3JlZjM7XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBBcnJheS5pc0FycmF5KHRoaXMucHJvcHMudmFsdWUpICYmIHRoaXMucHJvcHMudmFsdWUubGVuZ3RoID4gMCAmJiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiY3QtdGh1bWJuYWlscy1saXN0XCJcbiAgICAgICAgfSwgdGhpcy5wcm9wcy52YWx1ZS5tYXAoX3JlZjQgPT4ge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBhdHRhY2htZW50X2lkXG4gICAgICAgICAgfSA9IF9yZWY0O1xuICAgICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGtleTogYXR0YWNobWVudF9pZCxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ0aHVtYm5haWwgdGh1bWJuYWlsLWltYWdlXCIsXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIG9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBjcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJhdHRhY2htZW50LXRodW1iXCIsXG4gICAgICAgICAgICBzcmM6IHVybCxcbiAgICAgICAgICAgIGRyYWdnYWJsZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgYWx0OiBcIlwiXG4gICAgICAgICAgfSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImFjdGlvbnNcIlxuICAgICAgICAgIH0sIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJidXR0b24gZWRpdC1idXR0b24gY29udHJvbC1mb2N1c1wiLFxuICAgICAgICAgICAgdGl0bGU6IFwiRWRpdFwiXG4gICAgICAgICAgfSksIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgdGl0bGU6IFwiUmVtb3ZlXCIsXG4gICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ1dHRvbiByZW1vdmUtYnV0dG9uXCIsXG4gICAgICAgICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnZhbHVlLmZpbHRlcihhID0+IGEuYXR0YWNobWVudF9pZCAhPT0gYXR0YWNobWVudF9pZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0pKSwgY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICBjbGFzc05hbWU6IFwiYnV0dG9uIGVkaXQtYnV0dG9uIGNvbnRyb2wtZm9jdXNcIixcbiAgICAgICAgICB0aXRsZTogXCJFZGl0XCIsXG4gICAgICAgICAgb25DbGljazogKCkgPT4gb3BlbigpXG4gICAgICAgIH0sIF9fKCdBZGQvRWRpdCBHYWxsZXJ5JywgJ2Jsb2Nrc3knKSkpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///546\n')},9875:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nconst Notification = _ref => {\n let {\n option: {\n text = \'\',\n attr = {}\n }\n } = _ref;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n className: "ct-notification"\n }, _objectSpread({}, attr || {}), {\n dangerouslySetInnerHTML: {\n __html: text\n }\n })));\n};\n\nNotification.renderingConfig = {\n design: \'none\'\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notification);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTg3NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3Qtbm90aWZpY2F0aW9uLmpzPzkxMTYiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IEZyYWdtZW50LCBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuXG5jb25zdCBOb3RpZmljYXRpb24gPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb246IHtcbiAgICAgIHRleHQgPSAnJyxcbiAgICAgIGF0dHIgPSB7fVxuICAgIH1cbiAgfSA9IF9yZWY7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtbm90aWZpY2F0aW9uXCJcbiAgfSwgX29iamVjdFNwcmVhZCh7fSwgYXR0ciB8fCB7fSksIHtcbiAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgX19odG1sOiB0ZXh0XG4gICAgfVxuICB9KSkpO1xufTtcblxuTm90aWZpY2F0aW9uLnJlbmRlcmluZ0NvbmZpZyA9IHtcbiAgZGVzaWduOiAnbm9uZSdcbn07XG5leHBvcnQgZGVmYXVsdCBOb3RpZmljYXRpb247Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9875\n')},4949:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6715);\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(underscore__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _components_InputWithOnlyNumbers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6086);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\n\n\n\n\n\nconst round = value => Math.round(value * 10) / 10;\n\nconst NumberOption = _ref => {\n let {\n value,\n option,\n option: {\n attr,\n step = 1,\n markAsAutoFor\n },\n device,\n onChange\n } = _ref;\n const parsedValue = markAsAutoFor && markAsAutoFor.indexOf(device) > -1 ? 'auto' : value;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()('ct-option-number', {\n [`ct-reached-limits`]: parseFloat(parsedValue) === parseInt(option.min) || parseFloat(parsedValue) === parseInt(option.max)\n })\n }, attr || {}), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"a\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()('ct-minus', {\n ['ct-disabled']: parseFloat(parsedValue) === parseInt(option.min)\n }),\n onClick: () => onChange(round(Math.min(Math.max(parseFloat(parsedValue) - parseFloat(step), option.min || -Infinity), option.max || Infinity)))\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"a\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()('ct-plus', {\n ['ct-disabled']: parseFloat(parsedValue) === parseInt(option.max)\n }),\n onClick: () => onChange(round(Math.min(Math.max(parseFloat(parsedValue) + parseFloat(step), option.min || -Infinity), option.max || Infinity)))\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_components_InputWithOnlyNumbers__WEBPACK_IMPORTED_MODULE_3__/* [\"default\"] */ .Z, {\n value: parsedValue,\n step: step,\n onBlur: () => parseFloat(parsedValue) ? onChange(round(Math.min(Math.max(parsedValue, option.min || -Infinity), option.max || Infinity))) : [],\n onChange: (value, can_safely_parse) => can_safely_parse && underscore__WEBPACK_IMPORTED_MODULE_1___default().isNumber(parseFloat(value)) ? onChange(round(Math.min(Math.max(value, option.min || -Infinity), option.max || Infinity))) : parseFloat(value) ? onChange(round(Math.min(parseFloat(value), option.max || Infinity))) : onChange(round(value))\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NumberOption);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk0OS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1udW1iZXIuanM/NDY5MiJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBfIGZyb20gJ3VuZGVyc2NvcmUnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgSW5wdXRXaXRoT25seU51bWJlcnMgZnJvbSAnLi4vY29tcG9uZW50cy9JbnB1dFdpdGhPbmx5TnVtYmVycyc7XG5cbmNvbnN0IHJvdW5kID0gdmFsdWUgPT4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwKSAvIDEwO1xuXG5jb25zdCBOdW1iZXJPcHRpb24gPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICB2YWx1ZSxcbiAgICBvcHRpb24sXG4gICAgb3B0aW9uOiB7XG4gICAgICBhdHRyLFxuICAgICAgc3RlcCA9IDEsXG4gICAgICBtYXJrQXNBdXRvRm9yXG4gICAgfSxcbiAgICBkZXZpY2UsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHBhcnNlZFZhbHVlID0gbWFya0FzQXV0b0ZvciAmJiBtYXJrQXNBdXRvRm9yLmluZGV4T2YoZGV2aWNlKSA+IC0xID8gJ2F1dG8nIDogdmFsdWU7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LW9wdGlvbi1udW1iZXInLCB7XG4gICAgICBbYGN0LXJlYWNoZWQtbGltaXRzYF06IHBhcnNlRmxvYXQocGFyc2VkVmFsdWUpID09PSBwYXJzZUludChvcHRpb24ubWluKSB8fCBwYXJzZUZsb2F0KHBhcnNlZFZhbHVlKSA9PT0gcGFyc2VJbnQob3B0aW9uLm1heClcbiAgICB9KVxuICB9LCBhdHRyIHx8IHt9KSwgY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3QtbWludXMnLCB7XG4gICAgICBbJ2N0LWRpc2FibGVkJ106IHBhcnNlRmxvYXQocGFyc2VkVmFsdWUpID09PSBwYXJzZUludChvcHRpb24ubWluKVxuICAgIH0pLFxuICAgIG9uQ2xpY2s6ICgpID0+IG9uQ2hhbmdlKHJvdW5kKE1hdGgubWluKE1hdGgubWF4KHBhcnNlRmxvYXQocGFyc2VkVmFsdWUpIC0gcGFyc2VGbG9hdChzdGVwKSwgb3B0aW9uLm1pbiB8fCAtSW5maW5pdHkpLCBvcHRpb24ubWF4IHx8IEluZmluaXR5KSkpXG4gIH0pLCBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC1wbHVzJywge1xuICAgICAgWydjdC1kaXNhYmxlZCddOiBwYXJzZUZsb2F0KHBhcnNlZFZhbHVlKSA9PT0gcGFyc2VJbnQob3B0aW9uLm1heClcbiAgICB9KSxcbiAgICBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShyb3VuZChNYXRoLm1pbihNYXRoLm1heChwYXJzZUZsb2F0KHBhcnNlZFZhbHVlKSArIHBhcnNlRmxvYXQoc3RlcCksIG9wdGlvbi5taW4gfHwgLUluZmluaXR5KSwgb3B0aW9uLm1heCB8fCBJbmZpbml0eSkpKVxuICB9KSwgY3JlYXRlRWxlbWVudChJbnB1dFdpdGhPbmx5TnVtYmVycywge1xuICAgIHZhbHVlOiBwYXJzZWRWYWx1ZSxcbiAgICBzdGVwOiBzdGVwLFxuICAgIG9uQmx1cjogKCkgPT4gcGFyc2VGbG9hdChwYXJzZWRWYWx1ZSkgPyBvbkNoYW5nZShyb3VuZChNYXRoLm1pbihNYXRoLm1heChwYXJzZWRWYWx1ZSwgb3B0aW9uLm1pbiB8fCAtSW5maW5pdHkpLCBvcHRpb24ubWF4IHx8IEluZmluaXR5KSkpIDogW10sXG4gICAgb25DaGFuZ2U6ICh2YWx1ZSwgY2FuX3NhZmVseV9wYXJzZSkgPT4gY2FuX3NhZmVseV9wYXJzZSAmJiBfLmlzTnVtYmVyKHBhcnNlRmxvYXQodmFsdWUpKSA/IG9uQ2hhbmdlKHJvdW5kKE1hdGgubWluKE1hdGgubWF4KHZhbHVlLCBvcHRpb24ubWluIHx8IC1JbmZpbml0eSksIG9wdGlvbi5tYXggfHwgSW5maW5pdHkpKSkgOiBwYXJzZUZsb2F0KHZhbHVlKSA/IG9uQ2hhbmdlKHJvdW5kKE1hdGgubWluKHBhcnNlRmxvYXQodmFsdWUpLCBvcHRpb24ubWF4IHx8IEluZmluaXR5KSkpIDogb25DaGFuZ2Uocm91bmQodmFsdWUpKVxuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOdW1iZXJPcHRpb247Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4949\n")},3731:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PanelMetaWrapper\": () => (/* binding */ PanelMetaWrapper),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var bezier_easing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3431);\n/* harmony import */ var bezier_easing__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(bezier_easing__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _options_OptionsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7429);\n/* harmony import */ var _ct_switch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9497);\n/* harmony import */ var _components_PanelLevel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(956);\n/* harmony import */ var _react_spring_web__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1472);\n\n\n\n\n\n\n\nconst PanelMetaWrapper = _ref => {\n let {\n id,\n option,\n getActualOption,\n value\n } = _ref;\n const {\n panelsState,\n panelsHelpers,\n panelsDispatch,\n containerRef\n } = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useContext)(_components_PanelLevel__WEBPACK_IMPORTED_MODULE_5__/* .PanelContext */ .Q);\n const selfPanelId = id;\n (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (panelsState.previousPanel) {\n return;\n }\n\n if (!panelsHelpers.isTransitioningFor(id)) {\n return;\n }\n\n if (panelsHelpers.isOpenFor(id)) {\n if (!panelsHelpers.getWrapperParent().querySelector('.ct-tmp-panel-wrapper')) {\n const wrapper = document.createElement('div');\n wrapper.classList.add('ct-tmp-panel-wrapper');\n panelsHelpers.getWrapperParent().appendChild(wrapper);\n }\n\n if (panelsHelpers.getParentOptionsWrapper()) {\n panelsHelpers.getParentOptionsWrapper().classList.add('ct-panel-open');\n }\n\n const h3 = containerRef.current.closest('ul') && containerRef.current.closest('ul').querySelector('.customize-section-description-container h3');\n panelsDispatch({\n type: 'PANEL_RECEIVE_TITLE',\n payload: {\n titlePrefix: h3 ? `${h3.querySelector('span').innerText} ▸ ${h3.innerText.split('\\n')[h3.innerText.split('\\n').length - 1]}` : ''\n }\n });\n } else {\n if (!containerRef.current.closest('.accordion-section-content') || !containerRef.current.closest('.accordion-section-content').classList.contains('ct-panel-open')) {// return\n }\n\n if (panelsHelpers.getParentOptionsWrapper()) {\n panelsHelpers.getParentOptionsWrapper().classList.remove('ct-panel-open');\n }\n /*\n setTimeout(() =>\n \t(containerRef.current.querySelector('button')\n \t\t? containerRef.current.querySelector('button')\n \t\t: containerRef.current\n \t).focus()\n )\n */\n\n }\n }, [panelsState.previousPanel, id, panelsHelpers.isOpenFor(id)]);\n (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n return () => {\n ;\n [...document.querySelectorAll('.ct-panel-open:not(.open)')].map(el => el.classList.remove('ct-panel-open'));\n };\n }, []);\n const isEnabled = value === 'yes' || value === true;\n return getActualOption({\n open: () => panelsHelpers.open(id),\n wrapperAttr: {\n className: `${option.switch ? isEnabled ? 'ct-click-allowed' : '' : 'ct-click-allowed'} ct-panel`,\n onClick: _ref2 => {\n let {\n target\n } = _ref2;\n\n if (option.switch && !isEnabled) {\n return;\n }\n\n if (target.closest('.ct-tmp-panel-wrapper')) {\n return;\n }\n\n panelsHelpers.open(selfPanelId);\n }\n }\n });\n};\n\nconst PanelContainer = _ref3 => {\n let {\n option,\n id,\n onChange,\n getValues,\n onChangeFor\n } = _ref3;\n let maybeLabel = Object.keys(option).indexOf('label') === -1 ? (id || '').replace(/./, s => s.toUpperCase()).replace(/\\_|\\-/g, ' ') : option.label;\n const {\n panelsState: {\n titlePrefix,\n previousPanel\n },\n panelsState,\n panelsHelpers,\n containerRef\n } = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useContext)(_components_PanelLevel__WEBPACK_IMPORTED_MODULE_5__/* .PanelContext */ .Q);\n return containerRef.current && panelsHelpers.getWrapperParent().querySelector('.ct-tmp-panel-wrapper') ? (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createPortal)((0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_react_spring_web__WEBPACK_IMPORTED_MODULE_6__.Transition, {\n items: panelsHelpers.isOpenFor(id),\n from: {\n transform: 'translateX(100%)'\n },\n enter: {\n transform: 'translateX(0%)'\n },\n leave: previousPanel === id ? {\n transform: 'translateX(-100%)'\n } : {\n transform: 'translateX(100%)'\n },\n config: (item, type) => ({\n // delay: type === 'enter' ? 180 * 10 : 0,\n // duration: 2000,\n duration: 180,\n easing: bezier_easing__WEBPACK_IMPORTED_MODULE_2___default()(0.645, 0.045, 0.355, 1)\n }),\n onRest: isOpen => {\n panelsHelpers.stopTransitioning();\n\n if (isOpen) {\n ;\n [...panelsHelpers.getWrapperParent().querySelectorAll('.ct-tmp-panel-wrapper')].map(el => {\n setTimeout(() => {\n if (!el.firstElementChild) {\n return;\n }\n\n el.firstElementChild.removeAttribute('style');\n });\n });\n return;\n }\n\n if (!previousPanel) {\n ;\n [...panelsHelpers.getWrapperParent().querySelectorAll('.ct-tmp-panel-wrapper')].map(el => el.parentNode.removeChild(el));\n }\n }\n }, (props, isOpen) => isOpen && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_react_spring_web__WEBPACK_IMPORTED_MODULE_6__.animated.div, {\n style: props,\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()('ct-customizer-panel ct-options-container', {\n 'ct-panel-second-level': panelsState.currentLevel === 2\n })\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"customize-panel-actions\"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"button\", {\n onClick: e => {\n e.stopPropagation();\n panelsHelpers.close();\n },\n type: \"button\",\n className: \"customize-section-back\"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"h3\", null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", null, titlePrefix), maybeLabel)), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"customizer-panel-content\"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_options_OptionsPanel__WEBPACK_IMPORTED_MODULE_3__/* [\"default\"] */ .Z, {\n purpose: \"customizer\",\n onChange: (key, val) => onChangeFor(key, val),\n options: option['inner-options'],\n value: getValues()\n }))), (panelsState.currentLevel === 2 || panelsState.secondLevelTitleLabel) && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"customize-panel-actions\"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"button\", {\n onClick: e => {\n e.stopPropagation();\n panelsHelpers.close();\n },\n type: \"button\",\n className: \"customize-section-back\"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"h3\", null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", null, panelsState.titlePrefix + ' ▸ ' + maybeLabel), panelsState.secondLevelTitleLabel)), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"customizer-panel-content\"\n })))), panelsHelpers.getWrapperParent().querySelector('.ct-tmp-panel-wrapper')) : null;\n};\n\nconst Panel = _ref4 => {\n let {\n id,\n getValues,\n values,\n onChangeFor,\n option,\n value,\n view = 'normal',\n onChange\n } = _ref4;\n const {\n panelsState: {\n isOpen,\n isTransitioning\n },\n panelsHelpers\n } = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useContext)(_components_PanelLevel__WEBPACK_IMPORTED_MODULE_5__/* .PanelContext */ .Q);\n\n if (view === 'simple') {\n return panelsHelpers.isTransitioningFor(id) || panelsHelpers.isOpenFor(id) ? (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(PanelContainer, {\n id: id,\n getValues: () => getValues ? getValues() : values,\n onChangeFor: onChangeFor,\n option: option\n }) : null;\n }\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"ct-customizer-panel-container\"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()('ct-customizer-panel-option')\n }, option.switch && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_ct_switch__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n value: value,\n onChange: onChange,\n onClick: e => e.stopPropagation(),\n option: {\n behavior: option.switchBehavior || 'words'\n }\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"button\", {\n type: \"button\"\n })), (panelsHelpers.isTransitioningFor(id) || panelsHelpers.isOpenFor(id)) && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(PanelContainer, {\n id: id,\n getValues: () => getValues ? getValues() : values,\n onChangeFor: onChangeFor,\n option: option\n }));\n};\n\nPanel.renderingConfig = {\n design: 'inline'\n};\nPanel.MetaWrapper = PanelMetaWrapper;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Panel);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzczMS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC1wYW5lbC5qcz9lYTcwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgY3JlYXRlUG9ydGFsIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGJlemllckVhc2luZyBmcm9tICdiZXppZXItZWFzaW5nJztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vLi4vb3B0aW9ucy9PcHRpb25zUGFuZWwnO1xuaW1wb3J0IFN3aXRjaCBmcm9tICcuL2N0LXN3aXRjaCc7XG5pbXBvcnQgeyBQYW5lbENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL1BhbmVsTGV2ZWwnO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiwgYW5pbWF0ZWQgfSBmcm9tICdAcmVhY3Qtc3ByaW5nL3dlYic7XG5leHBvcnQgY29uc3QgUGFuZWxNZXRhV3JhcHBlciA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGlkLFxuICAgIG9wdGlvbixcbiAgICBnZXRBY3R1YWxPcHRpb24sXG4gICAgdmFsdWVcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHtcbiAgICBwYW5lbHNTdGF0ZSxcbiAgICBwYW5lbHNIZWxwZXJzLFxuICAgIHBhbmVsc0Rpc3BhdGNoLFxuICAgIGNvbnRhaW5lclJlZlxuICB9ID0gdXNlQ29udGV4dChQYW5lbENvbnRleHQpO1xuICBjb25zdCBzZWxmUGFuZWxJZCA9IGlkO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwYW5lbHNTdGF0ZS5wcmV2aW91c1BhbmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFwYW5lbHNIZWxwZXJzLmlzVHJhbnNpdGlvbmluZ0ZvcihpZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGFuZWxzSGVscGVycy5pc09wZW5Gb3IoaWQpKSB7XG4gICAgICBpZiAoIXBhbmVsc0hlbHBlcnMuZ2V0V3JhcHBlclBhcmVudCgpLnF1ZXJ5U2VsZWN0b3IoJy5jdC10bXAtcGFuZWwtd3JhcHBlcicpKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdjdC10bXAtcGFuZWwtd3JhcHBlcicpO1xuICAgICAgICBwYW5lbHNIZWxwZXJzLmdldFdyYXBwZXJQYXJlbnQoKS5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhbmVsc0hlbHBlcnMuZ2V0UGFyZW50T3B0aW9uc1dyYXBwZXIoKSkge1xuICAgICAgICBwYW5lbHNIZWxwZXJzLmdldFBhcmVudE9wdGlvbnNXcmFwcGVyKCkuY2xhc3NMaXN0LmFkZCgnY3QtcGFuZWwtb3BlbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoMyA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmNsb3Nlc3QoJ3VsJykgJiYgY29udGFpbmVyUmVmLmN1cnJlbnQuY2xvc2VzdCgndWwnKS5xdWVyeVNlbGVjdG9yKCcuY3VzdG9taXplLXNlY3Rpb24tZGVzY3JpcHRpb24tY29udGFpbmVyIGgzJyk7XG4gICAgICBwYW5lbHNEaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6ICdQQU5FTF9SRUNFSVZFX1RJVExFJyxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIHRpdGxlUHJlZml4OiBoMyA/IGAke2gzLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKS5pbm5lclRleHR9IOKWuCAke2gzLmlubmVyVGV4dC5zcGxpdCgnXFxuJylbaDMuaW5uZXJUZXh0LnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxXX1gIDogJydcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY29udGFpbmVyUmVmLmN1cnJlbnQuY2xvc2VzdCgnLmFjY29yZGlvbi1zZWN0aW9uLWNvbnRlbnQnKSB8fCAhY29udGFpbmVyUmVmLmN1cnJlbnQuY2xvc2VzdCgnLmFjY29yZGlvbi1zZWN0aW9uLWNvbnRlbnQnKS5jbGFzc0xpc3QuY29udGFpbnMoJ2N0LXBhbmVsLW9wZW4nKSkgey8vIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAocGFuZWxzSGVscGVycy5nZXRQYXJlbnRPcHRpb25zV3JhcHBlcigpKSB7XG4gICAgICAgIHBhbmVsc0hlbHBlcnMuZ2V0UGFyZW50T3B0aW9uc1dyYXBwZXIoKS5jbGFzc0xpc3QucmVtb3ZlKCdjdC1wYW5lbC1vcGVuJyk7XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgc2V0VGltZW91dCgoKSA9PlxuICAgICAgXHQoY29udGFpbmVyUmVmLmN1cnJlbnQucXVlcnlTZWxlY3RvcignYnV0dG9uJylcbiAgICAgIFx0XHQ/IGNvbnRhaW5lclJlZi5jdXJyZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpXG4gICAgICBcdFx0OiBjb250YWluZXJSZWYuY3VycmVudFxuICAgICAgXHQpLmZvY3VzKClcbiAgICAgIClcbiAgICAgICAgICAgICAgICovXG5cbiAgICB9XG4gIH0sIFtwYW5lbHNTdGF0ZS5wcmV2aW91c1BhbmVsLCBpZCwgcGFuZWxzSGVscGVycy5pc09wZW5Gb3IoaWQpXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIDtcbiAgICAgIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY3QtcGFuZWwtb3Blbjpub3QoLm9wZW4pJyldLm1hcChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjdC1wYW5lbC1vcGVuJykpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgaXNFbmFibGVkID0gdmFsdWUgPT09ICd5ZXMnIHx8IHZhbHVlID09PSB0cnVlO1xuICByZXR1cm4gZ2V0QWN0dWFsT3B0aW9uKHtcbiAgICBvcGVuOiAoKSA9PiBwYW5lbHNIZWxwZXJzLm9wZW4oaWQpLFxuICAgIHdyYXBwZXJBdHRyOiB7XG4gICAgICBjbGFzc05hbWU6IGAke29wdGlvbi5zd2l0Y2ggPyBpc0VuYWJsZWQgPyAnY3QtY2xpY2stYWxsb3dlZCcgOiAnJyA6ICdjdC1jbGljay1hbGxvd2VkJ30gY3QtcGFuZWxgLFxuICAgICAgb25DbGljazogX3JlZjIgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHRhcmdldFxuICAgICAgICB9ID0gX3JlZjI7XG5cbiAgICAgICAgaWYgKG9wdGlvbi5zd2l0Y2ggJiYgIWlzRW5hYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmN0LXRtcC1wYW5lbC13cmFwcGVyJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwYW5lbHNIZWxwZXJzLm9wZW4oc2VsZlBhbmVsSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCBQYW5lbENvbnRhaW5lciA9IF9yZWYzID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgaWQsXG4gICAgb25DaGFuZ2UsXG4gICAgZ2V0VmFsdWVzLFxuICAgIG9uQ2hhbmdlRm9yXG4gIH0gPSBfcmVmMztcbiAgbGV0IG1heWJlTGFiZWwgPSBPYmplY3Qua2V5cyhvcHRpb24pLmluZGV4T2YoJ2xhYmVsJykgPT09IC0xID8gKGlkIHx8ICcnKS5yZXBsYWNlKC8uLywgcyA9PiBzLnRvVXBwZXJDYXNlKCkpLnJlcGxhY2UoL1xcX3xcXC0vZywgJyAnKSA6IG9wdGlvbi5sYWJlbDtcbiAgY29uc3Qge1xuICAgIHBhbmVsc1N0YXRlOiB7XG4gICAgICB0aXRsZVByZWZpeCxcbiAgICAgIHByZXZpb3VzUGFuZWxcbiAgICB9LFxuICAgIHBhbmVsc1N0YXRlLFxuICAgIHBhbmVsc0hlbHBlcnMsXG4gICAgY29udGFpbmVyUmVmXG4gIH0gPSB1c2VDb250ZXh0KFBhbmVsQ29udGV4dCk7XG4gIHJldHVybiBjb250YWluZXJSZWYuY3VycmVudCAmJiBwYW5lbHNIZWxwZXJzLmdldFdyYXBwZXJQYXJlbnQoKS5xdWVyeVNlbGVjdG9yKCcuY3QtdG1wLXBhbmVsLXdyYXBwZXInKSA/IGNyZWF0ZVBvcnRhbChjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHtcbiAgICBpdGVtczogcGFuZWxzSGVscGVycy5pc09wZW5Gb3IoaWQpLFxuICAgIGZyb206IHtcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknXG4gICAgfSxcbiAgICBlbnRlcjoge1xuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwJSknXG4gICAgfSxcbiAgICBsZWF2ZTogcHJldmlvdXNQYW5lbCA9PT0gaWQgPyB7XG4gICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKSdcbiAgICB9IDoge1xuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKSdcbiAgICB9LFxuICAgIGNvbmZpZzogKGl0ZW0sIHR5cGUpID0+ICh7XG4gICAgICAvLyBkZWxheTogdHlwZSA9PT0gJ2VudGVyJyA/IDE4MCAqIDEwIDogMCxcbiAgICAgIC8vIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgZHVyYXRpb246IDE4MCxcbiAgICAgIGVhc2luZzogYmV6aWVyRWFzaW5nKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpXG4gICAgfSksXG4gICAgb25SZXN0OiBpc09wZW4gPT4ge1xuICAgICAgcGFuZWxzSGVscGVycy5zdG9wVHJhbnNpdGlvbmluZygpO1xuXG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIDtcbiAgICAgICAgWy4uLnBhbmVsc0hlbHBlcnMuZ2V0V3JhcHBlclBhcmVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jdC10bXAtcGFuZWwtd3JhcHBlcicpXS5tYXAoZWwgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlbC5maXJzdEVsZW1lbnRDaGlsZCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVsLmZpcnN0RWxlbWVudENoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcmV2aW91c1BhbmVsKSB7XG4gICAgICAgIDtcbiAgICAgICAgWy4uLnBhbmVsc0hlbHBlcnMuZ2V0V3JhcHBlclBhcmVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jdC10bXAtcGFuZWwtd3JhcHBlcicpXS5tYXAoZWwgPT4gZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgKHByb3BzLCBpc09wZW4pID0+IGlzT3BlbiAmJiBjcmVhdGVFbGVtZW50KGFuaW1hdGVkLmRpdiwge1xuICAgIHN0eWxlOiBwcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LWN1c3RvbWl6ZXItcGFuZWwgY3Qtb3B0aW9ucy1jb250YWluZXInLCB7XG4gICAgICAnY3QtcGFuZWwtc2Vjb25kLWxldmVsJzogcGFuZWxzU3RhdGUuY3VycmVudExldmVsID09PSAyXG4gICAgfSlcbiAgfSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3VzdG9taXplLXBhbmVsLWFjdGlvbnNcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBwYW5lbHNIZWxwZXJzLmNsb3NlKCk7XG4gICAgfSxcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGNsYXNzTmFtZTogXCJjdXN0b21pemUtc2VjdGlvbi1iYWNrXCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJoM1wiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCB0aXRsZVByZWZpeCksIG1heWJlTGFiZWwpKSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN1c3RvbWl6ZXItcGFuZWwtY29udGVudFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoT3B0aW9uc1BhbmVsLCB7XG4gICAgcHVycG9zZTogXCJjdXN0b21pemVyXCIsXG4gICAgb25DaGFuZ2U6IChrZXksIHZhbCkgPT4gb25DaGFuZ2VGb3Ioa2V5LCB2YWwpLFxuICAgIG9wdGlvbnM6IG9wdGlvblsnaW5uZXItb3B0aW9ucyddLFxuICAgIHZhbHVlOiBnZXRWYWx1ZXMoKVxuICB9KSkpLCAocGFuZWxzU3RhdGUuY3VycmVudExldmVsID09PSAyIHx8IHBhbmVsc1N0YXRlLnNlY29uZExldmVsVGl0bGVMYWJlbCkgJiYgY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3VzdG9taXplLXBhbmVsLWFjdGlvbnNcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBwYW5lbHNIZWxwZXJzLmNsb3NlKCk7XG4gICAgfSxcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGNsYXNzTmFtZTogXCJjdXN0b21pemUtc2VjdGlvbi1iYWNrXCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJoM1wiLCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBwYW5lbHNTdGF0ZS50aXRsZVByZWZpeCArICcg4pa4ICcgKyBtYXliZUxhYmVsKSwgcGFuZWxzU3RhdGUuc2Vjb25kTGV2ZWxUaXRsZUxhYmVsKSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdXN0b21pemVyLXBhbmVsLWNvbnRlbnRcIlxuICB9KSkpKSwgcGFuZWxzSGVscGVycy5nZXRXcmFwcGVyUGFyZW50KCkucXVlcnlTZWxlY3RvcignLmN0LXRtcC1wYW5lbC13cmFwcGVyJykpIDogbnVsbDtcbn07XG5cbmNvbnN0IFBhbmVsID0gX3JlZjQgPT4ge1xuICBsZXQge1xuICAgIGlkLFxuICAgIGdldFZhbHVlcyxcbiAgICB2YWx1ZXMsXG4gICAgb25DaGFuZ2VGb3IsXG4gICAgb3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIHZpZXcgPSAnbm9ybWFsJyxcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjQ7XG4gIGNvbnN0IHtcbiAgICBwYW5lbHNTdGF0ZToge1xuICAgICAgaXNPcGVuLFxuICAgICAgaXNUcmFuc2l0aW9uaW5nXG4gICAgfSxcbiAgICBwYW5lbHNIZWxwZXJzXG4gIH0gPSB1c2VDb250ZXh0KFBhbmVsQ29udGV4dCk7XG5cbiAgaWYgKHZpZXcgPT09ICdzaW1wbGUnKSB7XG4gICAgcmV0dXJuIHBhbmVsc0hlbHBlcnMuaXNUcmFuc2l0aW9uaW5nRm9yKGlkKSB8fCBwYW5lbHNIZWxwZXJzLmlzT3BlbkZvcihpZCkgPyBjcmVhdGVFbGVtZW50KFBhbmVsQ29udGFpbmVyLCB7XG4gICAgICBpZDogaWQsXG4gICAgICBnZXRWYWx1ZXM6ICgpID0+IGdldFZhbHVlcyA/IGdldFZhbHVlcygpIDogdmFsdWVzLFxuICAgICAgb25DaGFuZ2VGb3I6IG9uQ2hhbmdlRm9yLFxuICAgICAgb3B0aW9uOiBvcHRpb25cbiAgICB9KSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LWN1c3RvbWl6ZXItcGFuZWwtY29udGFpbmVyXCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC1jdXN0b21pemVyLXBhbmVsLW9wdGlvbicpXG4gIH0sIG9wdGlvbi5zd2l0Y2ggJiYgY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgIG9uQ2xpY2s6IGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSxcbiAgICBvcHRpb246IHtcbiAgICAgIGJlaGF2aW9yOiBvcHRpb24uc3dpdGNoQmVoYXZpb3IgfHwgJ3dvcmRzJ1xuICAgIH1cbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCJcbiAgfSkpLCAocGFuZWxzSGVscGVycy5pc1RyYW5zaXRpb25pbmdGb3IoaWQpIHx8IHBhbmVsc0hlbHBlcnMuaXNPcGVuRm9yKGlkKSkgJiYgY3JlYXRlRWxlbWVudChQYW5lbENvbnRhaW5lciwge1xuICAgIGlkOiBpZCxcbiAgICBnZXRWYWx1ZXM6ICgpID0+IGdldFZhbHVlcyA/IGdldFZhbHVlcygpIDogdmFsdWVzLFxuICAgIG9uQ2hhbmdlRm9yOiBvbkNoYW5nZUZvcixcbiAgICBvcHRpb246IG9wdGlvblxuICB9KSk7XG59O1xuXG5QYW5lbC5yZW5kZXJpbmdDb25maWcgPSB7XG4gIGRlc2lnbjogJ2lubGluZSdcbn07XG5QYW5lbC5NZXRhV3JhcHBlciA9IFBhbmVsTWV0YVdyYXBwZXI7XG5leHBvcnQgZGVmYXVsdCBQYW5lbDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3731\n")},7636:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var match_conditions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7465);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\n\n\n\n\nconst RadioInput = props => {\n const {\n inline = false\n } = props.option;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n className: "ct-radio-option"\n }, inline ? {\n [\'data-inline\']: \'\'\n } : {}, props.option.attr || {}), Object.keys(props.option.choices).map(choice => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("label", {\n key: choice\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("input", {\n type: "radio",\n checked: choice === props.value,\n onChange: () => props.onChange(choice)\n }), props.option.choices[choice])));\n};\n\nconst DefaultRadio = _ref => {\n let {\n option,\n values,\n value,\n onChange,\n singleChoiceProps\n } = _ref;\n const {\n inline = false\n } = option;\n let matchingChoices = Object.keys(option.choices).filter(choice => {\n if (!option.conditions) {\n return true;\n }\n\n if (!option.conditions[choice]) {\n return true;\n }\n\n return (0,match_conditions__WEBPACK_IMPORTED_MODULE_2__/* .matchValuesWithCondition */ .Nj)((0,match_conditions__WEBPACK_IMPORTED_MODULE_2__/* .normalizeCondition */ .KY)(option.conditions[choice]), values);\n });\n let normalizedValue = matchingChoices.includes(value) ? value : option.value;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", _extends({\n className: "ct-radio-option ct-buttons-group"\n }, inline ? {\n [\'data-inline\']: \'\'\n } : {}, option.attr || {}), matchingChoices.map((choice, index) => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()({\n active: choice === normalizedValue\n }),\n onClick: () => onChange(choice),\n key: choice,\n dangerouslySetInnerHTML: {\n __html: option.choices[choice]\n }\n }, singleChoiceProps ? singleChoiceProps(choice) : {}))));\n};\n\nconst Radio = props => {\n const {\n option: {\n view\n }\n } = props;\n\n if (view === \'radio\') {\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(RadioInput, props);\n }\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(DefaultRadio, props);\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Radio);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYzNi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LXJhZGlvLmpzP2I0ZTIiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmRpdGlvbiwgbWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uIH0gZnJvbSAnbWF0Y2gtY29uZGl0aW9ucyc7XG5cbmNvbnN0IFJhZGlvSW5wdXQgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBpbmxpbmUgPSBmYWxzZVxuICB9ID0gcHJvcHMub3B0aW9uO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBcImN0LXJhZGlvLW9wdGlvblwiXG4gIH0sIGlubGluZSA/IHtcbiAgICBbJ2RhdGEtaW5saW5lJ106ICcnXG4gIH0gOiB7fSwgcHJvcHMub3B0aW9uLmF0dHIgfHwge30pLCBPYmplY3Qua2V5cyhwcm9wcy5vcHRpb24uY2hvaWNlcykubWFwKGNob2ljZSA9PiBjcmVhdGVFbGVtZW50KFwibGFiZWxcIiwge1xuICAgIGtleTogY2hvaWNlXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG4gICAgdHlwZTogXCJyYWRpb1wiLFxuICAgIGNoZWNrZWQ6IGNob2ljZSA9PT0gcHJvcHMudmFsdWUsXG4gICAgb25DaGFuZ2U6ICgpID0+IHByb3BzLm9uQ2hhbmdlKGNob2ljZSlcbiAgfSksIHByb3BzLm9wdGlvbi5jaG9pY2VzW2Nob2ljZV0pKSk7XG59O1xuXG5jb25zdCBEZWZhdWx0UmFkaW8gPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgdmFsdWVzLFxuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICAgIHNpbmdsZUNob2ljZVByb3BzXG4gIH0gPSBfcmVmO1xuICBjb25zdCB7XG4gICAgaW5saW5lID0gZmFsc2VcbiAgfSA9IG9wdGlvbjtcbiAgbGV0IG1hdGNoaW5nQ2hvaWNlcyA9IE9iamVjdC5rZXlzKG9wdGlvbi5jaG9pY2VzKS5maWx0ZXIoY2hvaWNlID0+IHtcbiAgICBpZiAoIW9wdGlvbi5jb25kaXRpb25zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbi5jb25kaXRpb25zW2Nob2ljZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaFZhbHVlc1dpdGhDb25kaXRpb24obm9ybWFsaXplQ29uZGl0aW9uKG9wdGlvbi5jb25kaXRpb25zW2Nob2ljZV0pLCB2YWx1ZXMpO1xuICB9KTtcbiAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IG1hdGNoaW5nQ2hvaWNlcy5pbmNsdWRlcyh2YWx1ZSkgPyB2YWx1ZSA6IG9wdGlvbi52YWx1ZTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBcImN0LXJhZGlvLW9wdGlvbiBjdC1idXR0b25zLWdyb3VwXCJcbiAgfSwgaW5saW5lID8ge1xuICAgIFsnZGF0YS1pbmxpbmUnXTogJydcbiAgfSA6IHt9LCBvcHRpb24uYXR0ciB8fCB7fSksIG1hdGNoaW5nQ2hvaWNlcy5tYXAoKGNob2ljZSwgaW5kZXgpID0+IGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKHtcbiAgICAgIGFjdGl2ZTogY2hvaWNlID09PSBub3JtYWxpemVkVmFsdWVcbiAgICB9KSxcbiAgICBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShjaG9pY2UpLFxuICAgIGtleTogY2hvaWNlLFxuICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICBfX2h0bWw6IG9wdGlvbi5jaG9pY2VzW2Nob2ljZV1cbiAgICB9XG4gIH0sIHNpbmdsZUNob2ljZVByb3BzID8gc2luZ2xlQ2hvaWNlUHJvcHMoY2hvaWNlKSA6IHt9KSkpKTtcbn07XG5cbmNvbnN0IFJhZGlvID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgb3B0aW9uOiB7XG4gICAgICB2aWV3XG4gICAgfVxuICB9ID0gcHJvcHM7XG5cbiAgaWYgKHZpZXcgPT09ICdyYWRpbycpIHtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChSYWRpb0lucHV0LCBwcm9wcyk7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChEZWZhdWx0UmFkaW8sIHByb3BzKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJhZGlvOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7636\n')},9735:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ ct_ratio)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./static/js/options/options/react-outside-click-handler.js\nvar react_outside_click_handler = __webpack_require__(8204);\n// EXTERNAL MODULE: ./node_modules/react-spring/renderprops.js\nvar renderprops = __webpack_require__(4823);\n// EXTERNAL MODULE: ./node_modules/bezier-easing/src/index.js\nvar src = __webpack_require__(3431);\nvar src_default = /*#__PURE__*/__webpack_require__.n(src);\n// EXTERNAL MODULE: ./static/js/options/GenericOptionType.js\nvar GenericOptionType = __webpack_require__(6095);\n;// CONCATENATED MODULE: ./static/js/options/options/ratio/RatioModal.js\n\n\n\n\n\n\n\nconst RatioModal = _ref => {\n let {\n renderContent,\n stopTransitioning,\n el,\n isTransitioning,\n isPicking\n } = _ref;\n return (isTransitioning || isPicking) && (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(renderprops/* Transition */.uT, {\n items: isPicking,\n onRest: isOpen => stopTransitioning(),\n config: {\n duration: 100,\n easing: src_default()(0.25, 0.1, 0.25, 1.0)\n },\n from: {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n },\n enter: {\n transform: 'scale3d(1, 1, 1)',\n opacity: 1\n },\n leave: {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n }\n }, isPicking => isPicking && (props => (0,external_window_wp_element_.createElement)(\"div\", {\n style: props,\n className: \"ct-ratio-modal\",\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n },\n onMouseDownCapture: e => {\n e.nativeEvent.stopImmediatePropagation();\n e.nativeEvent.stopPropagation();\n },\n onMouseUpCapture: e => {\n e.nativeEvent.stopImmediatePropagation();\n e.nativeEvent.stopPropagation();\n }\n }, renderContent && renderContent()))), el.current.closest('.ct-single-palette') ? el.current.closest('.ct-single-palette').querySelector('.ct-color-modal-wrapper') : el.current.closest('.ct-color-modal-wrapper') ? el.current.closest('.ct-color-modal-wrapper') : el.current.closest('.ct-control').querySelector('.ct-color-modal-wrapper'));\n};\n\n/* harmony default export */ const ratio_RatioModal = (RatioModal);\n// EXTERNAL MODULE: ./static/js/options/OptionsPanel.js + 7 modules\nvar OptionsPanel = __webpack_require__(7429);\n// EXTERNAL MODULE: ./static/js/options/helpers/get-value-from-input.js\nvar get_value_from_input = __webpack_require__(7069);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-ratio.js\n\n\n\n\n\n\n\n\nconst Ratio = _ref => {\n let {\n option,\n value,\n onChange,\n onChangeFor,\n values\n } = _ref;\n const [isForcedReversed, setIsReversed] = (0,external_window_wp_element_.useState)(false);\n let {\n hasOriginalRatio = true,\n // popup | inline\n view = 'popup',\n preview_width_key = null\n } = option || {};\n const [currentModalTab, setCurrentTab] = (0,external_window_wp_element_.useState)('ratio');\n let normal_ratios = ['4/3', '16/9', '2/1'];\n let reversed_ratios = ['3/4', '9/16', '1/2'];\n const el = (0,external_window_wp_element_.useRef)();\n const [{\n isPicking,\n isTransitioning\n }, setAnimationState] = (0,external_window_wp_element_.useState)({\n isPicking: false,\n isTransitioning: false\n });\n const isReversed = normal_ratios.indexOf(value) > -1 ? false : reversed_ratios.indexOf(value) > -1 ? true : isForcedReversed;\n let currentTab = value === 'original' ? 'original' : value.indexOf('/') === -1 ? 'custom' : 'predefined';\n let isCustom = value.indexOf('/') === -1;\n const inlineRatioView = (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, null, option && option['inner-options'] && (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-modal-tabs\"\n }, (0,external_window_wp_element_.createElement)(\"li\", {\n onClick: () => setCurrentTab('ratio'),\n className: classnames_default()({\n active: currentModalTab === 'ratio'\n })\n }, (0,external_window_wp_i18n_.__)('Image Ratio', 'blocksy')), (0,external_window_wp_element_.createElement)(\"li\", {\n onClick: () => setCurrentTab('size'),\n className: classnames_default()({\n active: currentModalTab === 'size'\n })\n }, (0,external_window_wp_i18n_.__)('Image Size', 'blocksy'))), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-ratio-content\"\n }, currentModalTab === 'ratio' && (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()('ct-ratio-picker', {\n reversed: isReversed\n })\n }, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-radio-option ct-buttons-group\"\n }, hasOriginalRatio && (0,external_window_wp_element_.createElement)(\"li\", {\n className: classnames_default()({\n active: currentTab === 'original'\n }),\n onClick: () => {\n if (value !== 'original') {\n onChange('original');\n }\n }\n }, (0,external_window_wp_i18n_.__)('Original', 'blocksy')), (0,external_window_wp_element_.createElement)(\"li\", {\n className: classnames_default()({\n active: currentTab === 'predefined'\n }),\n onClick: () => {\n if (value.indexOf('/') === -1 || value === 'original') {\n onChange(option.value === 'original' ? '1/1' : option.value);\n }\n }\n }, (0,external_window_wp_i18n_.__)('Predefined', 'blocksy')), (0,external_window_wp_element_.createElement)(\"li\", {\n className: classnames_default()({\n active: currentTab === 'custom'\n }),\n onClick: () => {\n if (value.indexOf('/') !== -1 || value === 'original') {\n let [first, second] = (value === 'original' ? option.value === 'original' ? '1/1' : option.value : value).split('/');\n onChange(`${first}:${second}`);\n }\n }\n }, (0,external_window_wp_i18n_.__)('Custom', 'blocksy'))), currentTab === 'predefined' && (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-ratio-predefined\"\n }, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: \"ct-buttons-group\"\n }, ['1/1', ...(isReversed ? reversed_ratios : normal_ratios)].map(ratio => (0,external_window_wp_element_.createElement)(\"li\", {\n key: ratio,\n className: classnames_default()({\n active: ratio === value\n }),\n onClick: () => onChange(ratio)\n }, ratio))), (0,external_window_wp_element_.createElement)(\"button\", {\n onClick: e => {\n e.preventDefault();\n\n if (value === '1/1') {\n setIsReversed(!isReversed);\n return;\n }\n\n let [first_component, second_component] = value.split('/');\n setIsReversed(+first_component < +second_component);\n onChange(value.split('/').reverse().join('/'));\n }\n }, (0,external_window_wp_element_.createElement)(\"span\", null), (0,external_window_wp_element_.createElement)(\"i\", {\n className: \"ct-tooltip-top\"\n }, \"Reverse\"))), currentTab === 'custom' && (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-ratio-custom\"\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-option-input\"\n }, (0,external_window_wp_element_.createElement)(\"input\", {\n type: \"text\",\n value: value.split(':')[0],\n onChange: _ref2 => {\n let {\n target: {\n value: val\n }\n } = _ref2;\n onChange(`${val}:${value.split(':')[1]}`);\n }\n })), (0,external_window_wp_element_.createElement)(\"span\", null, \":\"), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-option-input\"\n }, (0,external_window_wp_element_.createElement)(\"input\", {\n type: \"text\",\n value: value.split(':')[1],\n onChange: _ref3 => {\n let {\n target: {\n value: val\n }\n } = _ref3;\n onChange(`${value.split(':')[0]}:${val}`);\n }\n })), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-notification\",\n dangerouslySetInnerHTML: {\n __html: (0,external_window_wp_i18n_.sprintf)((0,external_window_wp_i18n_.__)('Use this online %stool%s for calculating a custom image ratio based on your image size.', 'blocksy'), '', '')\n }\n })), currentTab === 'original' && (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-ratio-original\"\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-notification\"\n }, (0,external_window_wp_i18n_.__)('Images will be displayed using the aspect ratio in which they were uploaded.', 'blocksy')))), currentModalTab === 'size' && option['inner-options'] && (0,external_window_wp_element_.createElement)(OptionsPanel/* default */.Z, {\n onChange: (key, val) => onChangeFor(key, val),\n options: option['inner-options'],\n value: values\n })));\n\n if (view === 'inline') {\n return inlineRatioView;\n }\n\n return (0,external_window_wp_element_.createElement)(\"div\", {\n ref: el,\n className: classnames_default()('ct-ratio-picker-container', {})\n }, (0,external_window_wp_element_.createElement)(react_outside_click_handler[\"default\"], {\n useCapture: false,\n disabled: !isPicking,\n className: \"ct-ratio-preview\",\n onOutsideClick: () => {\n if (!isPicking) {\n return;\n }\n\n setAnimationState({\n isTransitioning: false,\n isPicking: false\n });\n },\n wrapperProps: {\n onClick: e => {\n e.preventDefault();\n setAnimationState({\n isTransitioning: true,\n isPicking: !isPicking\n });\n }\n }\n }, value.indexOf(':') > -1 && (0,external_window_wp_element_.createElement)(\"span\", {\n className: \"ct-ratio-key\"\n }, (0,external_window_wp_i18n_.__)('Custom', 'blocksy')), value.indexOf('/') > -1 && (0,external_window_wp_element_.createElement)(\"span\", {\n className: \"ct-ratio-key\"\n }, (0,external_window_wp_i18n_.__)('Predefined', 'blocksy')), value === 'original' ? (0,external_window_wp_i18n_.__)('Original Ratio', 'blocksy') : value.replace('/', ':'), preview_width_key && (0,external_window_wp_element_.createElement)(\"span\", {\n className: \"ct-width-key\"\n }, values[preview_width_key])), (0,external_window_wp_element_.createElement)(ratio_RatioModal, {\n el: el,\n value: value,\n onChange: onChange,\n option: option,\n isPicking: isPicking,\n isTransitioning: isTransitioning,\n onPickingChange: isPicking => {\n setAnimationState({\n isTransitioning: true,\n isPicking\n });\n },\n stopTransitioning: () => setAnimationState({\n isPicking,\n isTransitioning: false\n }),\n renderContent: () => inlineRatioView\n }));\n};\n\nRatio.ControlEnd = () => (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-color-modal-wrapper\",\n onMouseDown: e => e.stopPropagation(),\n onMouseUp: e => e.stopPropagation()\n});\n\n/* harmony default export */ const ct_ratio = (Ratio);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTczNS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL3JhdGlvL1JhdGlvTW9kYWwuanM/NTNiMiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3QtcmF0aW8uanM/MjIyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIGNyZWF0ZVBvcnRhbCwgdXNlUmVmLCBjcmVhdGVSZWYgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiB9IGZyb20gJ3JlYWN0LXNwcmluZy9yZW5kZXJwcm9wcyc7XG5pbXBvcnQgYmV6aWVyRWFzaW5nIGZyb20gJ2Jlemllci1lYXNpbmcnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgR2VuZXJpY09wdGlvblR5cGUgZnJvbSAnLi4vLi4vR2VuZXJpY09wdGlvblR5cGUnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcblxuY29uc3QgUmF0aW9Nb2RhbCA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHJlbmRlckNvbnRlbnQsXG4gICAgc3RvcFRyYW5zaXRpb25pbmcsXG4gICAgZWwsXG4gICAgaXNUcmFuc2l0aW9uaW5nLFxuICAgIGlzUGlja2luZ1xuICB9ID0gX3JlZjtcbiAgcmV0dXJuIChpc1RyYW5zaXRpb25pbmcgfHwgaXNQaWNraW5nKSAmJiBjcmVhdGVQb3J0YWwoY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCB7XG4gICAgaXRlbXM6IGlzUGlja2luZyxcbiAgICBvblJlc3Q6IGlzT3BlbiA9PiBzdG9wVHJhbnNpdGlvbmluZygpLFxuICAgIGNvbmZpZzoge1xuICAgICAgZHVyYXRpb246IDEwMCxcbiAgICAgIGVhc2luZzogYmV6aWVyRWFzaW5nKDAuMjUsIDAuMSwgMC4yNSwgMS4wKVxuICAgIH0sXG4gICAgZnJvbToge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUzZCgwLjk1LCAwLjk1LCAxKScsXG4gICAgICBvcGFjaXR5OiAwXG4gICAgfSxcbiAgICBlbnRlcjoge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUzZCgxLCAxLCAxKScsXG4gICAgICBvcGFjaXR5OiAxXG4gICAgfSxcbiAgICBsZWF2ZToge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUzZCgwLjk1LCAwLjk1LCAxKScsXG4gICAgICBvcGFjaXR5OiAwXG4gICAgfVxuICB9LCBpc1BpY2tpbmcgPT4gaXNQaWNraW5nICYmIChwcm9wcyA9PiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZTogcHJvcHMsXG4gICAgY2xhc3NOYW1lOiBcImN0LXJhdGlvLW1vZGFsXCIsXG4gICAgb25DbGljazogZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG4gICAgb25Nb3VzZURvd25DYXB0dXJlOiBlID0+IHtcbiAgICAgIGUubmF0aXZlRXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG4gICAgb25Nb3VzZVVwQ2FwdHVyZTogZSA9PiB7XG4gICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgZS5uYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH0sIHJlbmRlckNvbnRlbnQgJiYgcmVuZGVyQ29udGVudCgpKSkpLCBlbC5jdXJyZW50LmNsb3Nlc3QoJy5jdC1zaW5nbGUtcGFsZXR0ZScpID8gZWwuY3VycmVudC5jbG9zZXN0KCcuY3Qtc2luZ2xlLXBhbGV0dGUnKS5xdWVyeVNlbGVjdG9yKCcuY3QtY29sb3ItbW9kYWwtd3JhcHBlcicpIDogZWwuY3VycmVudC5jbG9zZXN0KCcuY3QtY29sb3ItbW9kYWwtd3JhcHBlcicpID8gZWwuY3VycmVudC5jbG9zZXN0KCcuY3QtY29sb3ItbW9kYWwtd3JhcHBlcicpIDogZWwuY3VycmVudC5jbG9zZXN0KCcuY3QtY29udHJvbCcpLnF1ZXJ5U2VsZWN0b3IoJy5jdC1jb2xvci1tb2RhbC13cmFwcGVyJykpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUmF0aW9Nb2RhbDsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZVN0YXRlLCB1c2VSZWYsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBfXywgc3ByaW50ZiB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IE91dHNpZGVDbGlja0hhbmRsZXIgZnJvbSAnLi9yZWFjdC1vdXRzaWRlLWNsaWNrLWhhbmRsZXInO1xuaW1wb3J0IFJhdGlvTW9kYWwgZnJvbSAnLi9yYXRpby9SYXRpb01vZGFsJztcbmltcG9ydCBPcHRpb25zUGFuZWwgZnJvbSAnLi4vT3B0aW9uc1BhbmVsJztcbmltcG9ydCB7IGdldFZhbHVlRnJvbUlucHV0IH0gZnJvbSAnLi4vaGVscGVycy9nZXQtdmFsdWUtZnJvbS1pbnB1dCc7XG5cbmNvbnN0IFJhdGlvID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uQ2hhbmdlRm9yLFxuICAgIHZhbHVlc1xuICB9ID0gX3JlZjtcbiAgY29uc3QgW2lzRm9yY2VkUmV2ZXJzZWQsIHNldElzUmV2ZXJzZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBsZXQge1xuICAgIGhhc09yaWdpbmFsUmF0aW8gPSB0cnVlLFxuICAgIC8vIHBvcHVwIHwgaW5saW5lXG4gICAgdmlldyA9ICdwb3B1cCcsXG4gICAgcHJldmlld193aWR0aF9rZXkgPSBudWxsXG4gIH0gPSBvcHRpb24gfHwge307XG4gIGNvbnN0IFtjdXJyZW50TW9kYWxUYWIsIHNldEN1cnJlbnRUYWJdID0gdXNlU3RhdGUoJ3JhdGlvJyk7XG4gIGxldCBub3JtYWxfcmF0aW9zID0gWyc0LzMnLCAnMTYvOScsICcyLzEnXTtcbiAgbGV0IHJldmVyc2VkX3JhdGlvcyA9IFsnMy80JywgJzkvMTYnLCAnMS8yJ107XG4gIGNvbnN0IGVsID0gdXNlUmVmKCk7XG4gIGNvbnN0IFt7XG4gICAgaXNQaWNraW5nLFxuICAgIGlzVHJhbnNpdGlvbmluZ1xuICB9LCBzZXRBbmltYXRpb25TdGF0ZV0gPSB1c2VTdGF0ZSh7XG4gICAgaXNQaWNraW5nOiBmYWxzZSxcbiAgICBpc1RyYW5zaXRpb25pbmc6IGZhbHNlXG4gIH0pO1xuICBjb25zdCBpc1JldmVyc2VkID0gbm9ybWFsX3JhdGlvcy5pbmRleE9mKHZhbHVlKSA+IC0xID8gZmFsc2UgOiByZXZlcnNlZF9yYXRpb3MuaW5kZXhPZih2YWx1ZSkgPiAtMSA/IHRydWUgOiBpc0ZvcmNlZFJldmVyc2VkO1xuICBsZXQgY3VycmVudFRhYiA9IHZhbHVlID09PSAnb3JpZ2luYWwnID8gJ29yaWdpbmFsJyA6IHZhbHVlLmluZGV4T2YoJy8nKSA9PT0gLTEgPyAnY3VzdG9tJyA6ICdwcmVkZWZpbmVkJztcbiAgbGV0IGlzQ3VzdG9tID0gdmFsdWUuaW5kZXhPZignLycpID09PSAtMTtcbiAgY29uc3QgaW5saW5lUmF0aW9WaWV3ID0gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgb3B0aW9uICYmIG9wdGlvblsnaW5uZXItb3B0aW9ucyddICYmIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LW1vZGFsLXRhYnNcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIG9uQ2xpY2s6ICgpID0+IHNldEN1cnJlbnRUYWIoJ3JhdGlvJyksXG4gICAgY2xhc3NOYW1lOiBjbHMoe1xuICAgICAgYWN0aXZlOiBjdXJyZW50TW9kYWxUYWIgPT09ICdyYXRpbydcbiAgICB9KVxuICB9LCBfXygnSW1hZ2UgUmF0aW8nLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBvbkNsaWNrOiAoKSA9PiBzZXRDdXJyZW50VGFiKCdzaXplJyksXG4gICAgY2xhc3NOYW1lOiBjbHMoe1xuICAgICAgYWN0aXZlOiBjdXJyZW50TW9kYWxUYWIgPT09ICdzaXplJ1xuICAgIH0pXG4gIH0sIF9fKCdJbWFnZSBTaXplJywgJ2Jsb2Nrc3knKSkpLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtcmF0aW8tY29udGVudFwiXG4gIH0sIGN1cnJlbnRNb2RhbFRhYiA9PT0gJ3JhdGlvJyAmJiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNscygnY3QtcmF0aW8tcGlja2VyJywge1xuICAgICAgcmV2ZXJzZWQ6IGlzUmV2ZXJzZWRcbiAgICB9KVxuICB9LCBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1yYWRpby1vcHRpb24gY3QtYnV0dG9ucy1ncm91cFwiXG4gIH0sIGhhc09yaWdpbmFsUmF0aW8gJiYgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IGNscyh7XG4gICAgICBhY3RpdmU6IGN1cnJlbnRUYWIgPT09ICdvcmlnaW5hbCdcbiAgICB9KSxcbiAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICBpZiAodmFsdWUgIT09ICdvcmlnaW5hbCcpIHtcbiAgICAgICAgb25DaGFuZ2UoJ29yaWdpbmFsJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfXygnT3JpZ2luYWwnLCAnYmxvY2tzeScpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IGNscyh7XG4gICAgICBhY3RpdmU6IGN1cnJlbnRUYWIgPT09ICdwcmVkZWZpbmVkJ1xuICAgIH0pLFxuICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcvJykgPT09IC0xIHx8IHZhbHVlID09PSAnb3JpZ2luYWwnKSB7XG4gICAgICAgIG9uQ2hhbmdlKG9wdGlvbi52YWx1ZSA9PT0gJ29yaWdpbmFsJyA/ICcxLzEnIDogb3B0aW9uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9fKCdQcmVkZWZpbmVkJywgJ2Jsb2Nrc3knKSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMoe1xuICAgICAgYWN0aXZlOiBjdXJyZW50VGFiID09PSAnY3VzdG9tJ1xuICAgIH0pLFxuICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcvJykgIT09IC0xIHx8IHZhbHVlID09PSAnb3JpZ2luYWwnKSB7XG4gICAgICAgIGxldCBbZmlyc3QsIHNlY29uZF0gPSAodmFsdWUgPT09ICdvcmlnaW5hbCcgPyBvcHRpb24udmFsdWUgPT09ICdvcmlnaW5hbCcgPyAnMS8xJyA6IG9wdGlvbi52YWx1ZSA6IHZhbHVlKS5zcGxpdCgnLycpO1xuICAgICAgICBvbkNoYW5nZShgJHtmaXJzdH06JHtzZWNvbmR9YCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfXygnQ3VzdG9tJywgJ2Jsb2Nrc3knKSkpLCBjdXJyZW50VGFiID09PSAncHJlZGVmaW5lZCcgJiYgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXJhdGlvLXByZWRlZmluZWRcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1idXR0b25zLWdyb3VwXCJcbiAgfSwgWycxLzEnLCAuLi4oaXNSZXZlcnNlZCA/IHJldmVyc2VkX3JhdGlvcyA6IG5vcm1hbF9yYXRpb3MpXS5tYXAocmF0aW8gPT4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBrZXk6IHJhdGlvLFxuICAgIGNsYXNzTmFtZTogY2xzKHtcbiAgICAgIGFjdGl2ZTogcmF0aW8gPT09IHZhbHVlXG4gICAgfSksXG4gICAgb25DbGljazogKCkgPT4gb25DaGFuZ2UocmF0aW8pXG4gIH0sIHJhdGlvKSkpLCBjcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKHZhbHVlID09PSAnMS8xJykge1xuICAgICAgICBzZXRJc1JldmVyc2VkKCFpc1JldmVyc2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgW2ZpcnN0X2NvbXBvbmVudCwgc2Vjb25kX2NvbXBvbmVudF0gPSB2YWx1ZS5zcGxpdCgnLycpO1xuICAgICAgc2V0SXNSZXZlcnNlZCgrZmlyc3RfY29tcG9uZW50IDwgK3NlY29uZF9jb21wb25lbnQpO1xuICAgICAgb25DaGFuZ2UodmFsdWUuc3BsaXQoJy8nKS5yZXZlcnNlKCkuam9pbignLycpKTtcbiAgICB9XG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpLCBjcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXRvb2x0aXAtdG9wXCJcbiAgfSwgXCJSZXZlcnNlXCIpKSksIGN1cnJlbnRUYWIgPT09ICdjdXN0b20nICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1yYXRpby1jdXN0b21cIlxuICB9LCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtb3B0aW9uLWlucHV0XCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICB0eXBlOiBcInRleHRcIixcbiAgICB2YWx1ZTogdmFsdWUuc3BsaXQoJzonKVswXSxcbiAgICBvbkNoYW5nZTogX3JlZjIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgICB9XG4gICAgICB9ID0gX3JlZjI7XG4gICAgICBvbkNoYW5nZShgJHt2YWx9OiR7dmFsdWUuc3BsaXQoJzonKVsxXX1gKTtcbiAgICB9XG4gIH0pKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgXCI6XCIpLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtb3B0aW9uLWlucHV0XCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICB0eXBlOiBcInRleHRcIixcbiAgICB2YWx1ZTogdmFsdWUuc3BsaXQoJzonKVsxXSxcbiAgICBvbkNoYW5nZTogX3JlZjMgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgICB9XG4gICAgICB9ID0gX3JlZjM7XG4gICAgICBvbkNoYW5nZShgJHt2YWx1ZS5zcGxpdCgnOicpWzBdfToke3ZhbH1gKTtcbiAgICB9XG4gIH0pKSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LW5vdGlmaWNhdGlvblwiLFxuICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICBfX2h0bWw6IHNwcmludGYoX18oJ1VzZSB0aGlzIG9ubGluZSAlc3Rvb2wlcyBmb3IgY2FsY3VsYXRpbmcgYSBjdXN0b20gaW1hZ2UgcmF0aW8gYmFzZWQgb24geW91ciBpbWFnZSBzaXplLicsICdibG9ja3N5JyksICc8YSBocmVmPVwiaHR0cHM6Ly93d3cuZGlnaXRhbHJlYmVsbGlvbi5jb20vd2ViYXBwcy9hc3BlY3RjYWxjXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JywgJzwvYT4nKVxuICAgIH1cbiAgfSkpLCBjdXJyZW50VGFiID09PSAnb3JpZ2luYWwnICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1yYXRpby1vcmlnaW5hbFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1ub3RpZmljYXRpb25cIlxuICB9LCBfXygnSW1hZ2VzIHdpbGwgYmUgZGlzcGxheWVkIHVzaW5nIHRoZSBhc3BlY3QgcmF0aW8gaW4gd2hpY2ggdGhleSB3ZXJlIHVwbG9hZGVkLicsICdibG9ja3N5JykpKSksIGN1cnJlbnRNb2RhbFRhYiA9PT0gJ3NpemUnICYmIG9wdGlvblsnaW5uZXItb3B0aW9ucyddICYmIGNyZWF0ZUVsZW1lbnQoT3B0aW9uc1BhbmVsLCB7XG4gICAgb25DaGFuZ2U6IChrZXksIHZhbCkgPT4gb25DaGFuZ2VGb3Ioa2V5LCB2YWwpLFxuICAgIG9wdGlvbnM6IG9wdGlvblsnaW5uZXItb3B0aW9ucyddLFxuICAgIHZhbHVlOiB2YWx1ZXNcbiAgfSkpKTtcblxuICBpZiAodmlldyA9PT0gJ2lubGluZScpIHtcbiAgICByZXR1cm4gaW5saW5lUmF0aW9WaWV3O1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogZWwsXG4gICAgY2xhc3NOYW1lOiBjbHMoJ2N0LXJhdGlvLXBpY2tlci1jb250YWluZXInLCB7fSlcbiAgfSwgY3JlYXRlRWxlbWVudChPdXRzaWRlQ2xpY2tIYW5kbGVyLCB7XG4gICAgdXNlQ2FwdHVyZTogZmFsc2UsXG4gICAgZGlzYWJsZWQ6ICFpc1BpY2tpbmcsXG4gICAgY2xhc3NOYW1lOiBcImN0LXJhdGlvLXByZXZpZXdcIixcbiAgICBvbk91dHNpZGVDbGljazogKCkgPT4ge1xuICAgICAgaWYgKCFpc1BpY2tpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgIGlzVHJhbnNpdGlvbmluZzogZmFsc2UsXG4gICAgICAgIGlzUGlja2luZzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgd3JhcHBlclByb3BzOiB7XG4gICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlLFxuICAgICAgICAgIGlzUGlja2luZzogIWlzUGlja2luZ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHZhbHVlLmluZGV4T2YoJzonKSA+IC0xICYmIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtcmF0aW8ta2V5XCJcbiAgfSwgX18oJ0N1c3RvbScsICdibG9ja3N5JykpLCB2YWx1ZS5pbmRleE9mKCcvJykgPiAtMSAmJiBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXJhdGlvLWtleVwiXG4gIH0sIF9fKCdQcmVkZWZpbmVkJywgJ2Jsb2Nrc3knKSksIHZhbHVlID09PSAnb3JpZ2luYWwnID8gX18oJ09yaWdpbmFsIFJhdGlvJywgJ2Jsb2Nrc3knKSA6IHZhbHVlLnJlcGxhY2UoJy8nLCAnOicpLCBwcmV2aWV3X3dpZHRoX2tleSAmJiBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXdpZHRoLWtleVwiXG4gIH0sIHZhbHVlc1twcmV2aWV3X3dpZHRoX2tleV0pKSwgY3JlYXRlRWxlbWVudChSYXRpb01vZGFsLCB7XG4gICAgZWw6IGVsLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgb3B0aW9uOiBvcHRpb24sXG4gICAgaXNQaWNraW5nOiBpc1BpY2tpbmcsXG4gICAgaXNUcmFuc2l0aW9uaW5nOiBpc1RyYW5zaXRpb25pbmcsXG4gICAgb25QaWNraW5nQ2hhbmdlOiBpc1BpY2tpbmcgPT4ge1xuICAgICAgc2V0QW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICBpc1RyYW5zaXRpb25pbmc6IHRydWUsXG4gICAgICAgIGlzUGlja2luZ1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBzdG9wVHJhbnNpdGlvbmluZzogKCkgPT4gc2V0QW5pbWF0aW9uU3RhdGUoe1xuICAgICAgaXNQaWNraW5nLFxuICAgICAgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZVxuICAgIH0pLFxuICAgIHJlbmRlckNvbnRlbnQ6ICgpID0+IGlubGluZVJhdGlvVmlld1xuICB9KSk7XG59O1xuXG5SYXRpby5Db250cm9sRW5kID0gKCkgPT4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gIGNsYXNzTmFtZTogXCJjdC1jb2xvci1tb2RhbC13cmFwcGVyXCIsXG4gIG9uTW91c2VEb3duOiBlID0+IGUuc3RvcFByb3BhZ2F0aW9uKCksXG4gIG9uTW91c2VVcDogZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgUmF0aW87Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9735\n")},1404:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "default": () => (/* binding */ ct_select)\n});\n\n// EXTERNAL MODULE: external "window.wp.element"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./static/js/options/helpers/parse-choices.js\nvar parse_choices = __webpack_require__(4592);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\nvar objectWithoutPropertiesLoose = __webpack_require__(3366);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nvar esm_extends = __webpack_require__(7462);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\nvar assertThisInitialized = __webpack_require__(7326);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\nvar inheritsLoose = __webpack_require__(4578);\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n// EXTERNAL MODULE: external "React"\nvar external_React_ = __webpack_require__(7363);\n// EXTERNAL MODULE: ./node_modules/downshift/node_modules/react-is/index.js\nvar react_is = __webpack_require__(1726);\n;// CONCATENATED MODULE: ./node_modules/compute-scroll-into-view/dist/index.module.js\nfunction t(t){return"object"==typeof t&&null!=t&&1===t.nodeType}function e(t,e){return(!e||"hidden"!==t)&&"visible"!==t&&"clip"!==t}function n(t,n){if(t.clientHeighte||o>t&&l=e&&d>=n?o-t-r:l>e&&dn?l-e+i:0}/* harmony default export */ function index_module(e,i){var o=window,l=i.scrollMode,d=i.block,u=i.inline,h=i.boundary,a=i.skipOverflowHiddenElements,c="function"==typeof h?h:function(t){return t!==h};if(!t(e))throw new TypeError("Invalid target");for(var f=document.scrollingElement||document.documentElement,s=[],p=e;t(p)&&c(p);){if((p=p.parentElement)===f){s.push(p);break}null!=p&&p===document.body&&n(p)&&!n(document.documentElement)||null!=p&&n(p,a)&&s.push(p)}for(var m=o.visualViewport?o.visualViewport.width:innerWidth,g=o.visualViewport?o.visualViewport.height:innerHeight,w=window.scrollX||pageXOffset,v=window.scrollY||pageYOffset,W=e.getBoundingClientRect(),b=W.height,H=W.width,y=W.top,E=W.right,M=W.bottom,V=W.left,x="start"===d||"nearest"===d?y:"end"===d?M:y+b/2,I="center"===u?V+H/2:"end"===u?E:V,C=[],T=0;T=0&&V>=0&&M<=g&&E<=m&&y>=R&&M<=Y&&V>=L&&E<=X)return C;var S=getComputedStyle(k),j=parseInt(S.borderLeftWidth,10),q=parseInt(S.borderTopWidth,10),z=parseInt(S.borderRightWidth,10),A=parseInt(S.borderBottomWidth,10),F=0,G=0,J="offsetWidth"in k?k.offsetWidth-k.clientWidth-j-z:0,K="offsetHeight"in k?k.offsetHeight-k.clientHeight-q-A:0;if(f===k)F="start"===d?x:"end"===d?x-g:"nearest"===d?r(v,v+g,g,q,A,v+x,v+x+b,b):x-g/2,G="start"===u?I:"center"===u?I-m/2:"end"===u?I-m:r(w,w+m,m,j,z,w+I,w+I+H,H),F=Math.max(0,F+v),G=Math.max(0,G+w);else{F="start"===d?x-R-q:"end"===d?x-Y+A+K:"nearest"===d?r(R,Y,D,q,A+K,x,x+b,b):x-(R+D/2)+K/2,G="start"===u?I-L-j:"center"===u?I-(L+O/2)+J/2:"end"===u?I-X+z+J:r(L,X,O,j,z+J,I,I+H,H);var N=k.scrollLeft,P=k.scrollTop;x+=P-(F=Math.max(0,Math.min(P+F,k.scrollHeight-D+K))),I+=N-(G=Math.max(0,Math.min(N+G,k.scrollWidth-O+J)))}C.push({el:k,top:F,left:G})}return C}\n//# sourceMappingURL=index.module.js.map\n\n;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== "function" && b !== null)\r\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nfunction __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nfunction __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError("Generator is already executing.");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nvar __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nfunction __exportStar(m, o) {\r\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === "number") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === "function" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i["return"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nfunction __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nfunction __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume("next", value); }\r\n function reject(value) { resume("throw", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nfunction __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nfunction __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, "default", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o["default"] = v;\r\n};\r\n\r\nfunction __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nfunction __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\r\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\r\n return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === "m") throw new TypeError("Private method is not writable");\r\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\r\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\r\n return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nfunction __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use \'in\' operator on non-object");\r\n return typeof state === "function" ? receiver === state : state.has(receiver);\r\n}\r\n\n;// CONCATENATED MODULE: ./node_modules/downshift/dist/downshift.esm.js\n\n\n\n\n\n\n\n\n\n\nvar idCounter = 0;\n/**\n * Accepts a parameter and returns it if it\'s a function\n * or a noop function if it\'s not. This allows us to\n * accept a callback, but not worry about it if it\'s not\n * passed.\n * @param {Function} cb the callback\n * @return {Function} a function\n */\n\nfunction cbToCb(cb) {\n return typeof cb === \'function\' ? cb : noop;\n}\n\nfunction noop() {}\n/**\n * Scroll node into view if necessary\n * @param {HTMLElement} node the element that should scroll into view\n * @param {HTMLElement} menuNode the menu element of the component\n */\n\n\nfunction scrollIntoView(node, menuNode) {\n if (!node) {\n return;\n }\n\n var actions = index_module(node, {\n boundary: menuNode,\n block: \'nearest\',\n scrollMode: \'if-needed\'\n });\n actions.forEach(function (_ref) {\n var el = _ref.el,\n top = _ref.top,\n left = _ref.left;\n el.scrollTop = top;\n el.scrollLeft = left;\n });\n}\n/**\n * @param {HTMLElement} parent the parent node\n * @param {HTMLElement} child the child node\n * @param {Window} environment The window context where downshift renders.\n * @return {Boolean} whether the parent is the child or the child is in the parent\n */\n\n\nfunction isOrContainsNode(parent, child, environment) {\n var result = parent === child || child instanceof environment.Node && parent.contains && parent.contains(child);\n return result;\n}\n/**\n * Simple debounce implementation. Will call the given\n * function once after the time given has passed since\n * it was last called.\n * @param {Function} fn the function to call after the time\n * @param {Number} time the time to wait\n * @return {Function} the debounced function\n */\n\n\nfunction debounce(fn, time) {\n var timeoutId;\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n\n function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n cancel();\n timeoutId = setTimeout(function () {\n timeoutId = null;\n fn.apply(void 0, args);\n }, time);\n }\n\n wrapper.cancel = cancel;\n return wrapper;\n}\n/**\n * This is intended to be used to compose event handlers.\n * They are executed in order until one of them sets\n * `event.preventDownshiftDefault = true`.\n * @param {...Function} fns the event handler functions\n * @return {Function} the event handler to add to an element\n */\n\n\nfunction callAllEventHandlers() {\n for (var _len2 = arguments.length, fns = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n fns[_key2] = arguments[_key2];\n }\n\n return function (event) {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n return fns.some(function (fn) {\n if (fn) {\n fn.apply(void 0, [event].concat(args));\n }\n\n return event.preventDownshiftDefault || event.hasOwnProperty(\'nativeEvent\') && event.nativeEvent.preventDownshiftDefault;\n });\n };\n}\n\nfunction handleRefs() {\n for (var _len4 = arguments.length, refs = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n refs[_key4] = arguments[_key4];\n }\n\n return function (node) {\n refs.forEach(function (ref) {\n if (typeof ref === \'function\') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n });\n };\n}\n/**\n * This generates a unique ID for an instance of Downshift\n * @return {String} the unique ID\n */\n\n\nfunction generateId() {\n return String(idCounter++);\n}\n/**\n * Resets idCounter to 0. Used for SSR.\n */\n\n\nfunction resetIdCounter() {\n idCounter = 0;\n}\n/**\n * Default implementation for status message. Only added when menu is open.\n * Will specify if there are results in the list, and if so, how many,\n * and what keys are relevant.\n *\n * @param {Object} param the downshift state and other relevant properties\n * @return {String} the a11y status message\n */\n\n\nfunction getA11yStatusMessage$1(_ref2) {\n var isOpen = _ref2.isOpen,\n resultCount = _ref2.resultCount,\n previousResultCount = _ref2.previousResultCount;\n\n if (!isOpen) {\n return \'\';\n }\n\n if (!resultCount) {\n return \'No results are available.\';\n }\n\n if (resultCount !== previousResultCount) {\n return resultCount + " result" + (resultCount === 1 ? \' is\' : \'s are\') + " available, use up and down arrow keys to navigate. Press Enter key to select.";\n }\n\n return \'\';\n}\n/**\n * Takes an argument and if it\'s an array, returns the first item in the array\n * otherwise returns the argument\n * @param {*} arg the maybe-array\n * @param {*} defaultValue the value if arg is falsey not defined\n * @return {*} the arg or it\'s first item\n */\n\n\nfunction unwrapArray(arg, defaultValue) {\n arg = Array.isArray(arg) ?\n /* istanbul ignore next (preact) */\n arg[0] : arg;\n\n if (!arg && defaultValue) {\n return defaultValue;\n } else {\n return arg;\n }\n}\n/**\n * @param {Object} element (P)react element\n * @return {Boolean} whether it\'s a DOM element\n */\n\n\nfunction isDOMElement(element) {\n\n\n return typeof element.type === \'string\';\n}\n/**\n * @param {Object} element (P)react element\n * @return {Object} the props\n */\n\n\nfunction getElementProps(element) {\n\n return element.props;\n}\n/**\n * Throws a helpful error message for required properties. Useful\n * to be used as a default in destructuring or object params.\n * @param {String} fnName the function name\n * @param {String} propName the prop name\n */\n\n\nfunction requiredProp(fnName, propName) {\n // eslint-disable-next-line no-console\n console.error("The property \\"" + propName + "\\" is required in \\"" + fnName + "\\"");\n}\n\nvar stateKeys = [\'highlightedIndex\', \'inputValue\', \'isOpen\', \'selectedItem\', \'type\'];\n/**\n * @param {Object} state the state object\n * @return {Object} state that is relevant to downshift\n */\n\nfunction pickState(state) {\n if (state === void 0) {\n state = {};\n }\n\n var result = {};\n stateKeys.forEach(function (k) {\n if (state.hasOwnProperty(k)) {\n result[k] = state[k];\n }\n });\n return result;\n}\n/**\n * This will perform a shallow merge of the given state object\n * with the state coming from props\n * (for the controlled component scenario)\n * This is used in state updater functions so they\'re referencing\n * the right state regardless of where it comes from.\n *\n * @param {Object} state The state of the component/hook.\n * @param {Object} props The props that may contain controlled values.\n * @returns {Object} The merged controlled state.\n */\n\n\nfunction getState(state, props) {\n return Object.keys(state).reduce(function (prevState, key) {\n prevState[key] = isControlledProp(props, key) ? props[key] : state[key];\n return prevState;\n }, {});\n}\n/**\n * This determines whether a prop is a "controlled prop" meaning it is\n * state which is controlled by the outside of this component rather\n * than within this component.\n *\n * @param {Object} props The props that may contain controlled values.\n * @param {String} key the key to check\n * @return {Boolean} whether it is a controlled controlled prop\n */\n\n\nfunction isControlledProp(props, key) {\n return props[key] !== undefined;\n}\n/**\n * Normalizes the \'key\' property of a KeyboardEvent in IE/Edge\n * @param {Object} event a keyboardEvent object\n * @return {String} keyboard key\n */\n\n\nfunction normalizeArrowKey(event) {\n var key = event.key,\n keyCode = event.keyCode;\n /* istanbul ignore next (ie) */\n\n if (keyCode >= 37 && keyCode <= 40 && key.indexOf(\'Arrow\') !== 0) {\n return "Arrow" + key;\n }\n\n return key;\n}\n/**\n * Simple check if the value passed is object literal\n * @param {*} obj any things\n * @return {Boolean} whether it\'s object literal\n */\n\n\nfunction isPlainObject(obj) {\n return Object.prototype.toString.call(obj) === \'[object Object]\';\n}\n/**\n * Returns the new index in the list, in a circular way. If next value is out of bonds from the total,\n * it will wrap to either 0 or itemCount - 1.\n *\n * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.\n * @param {number} baseIndex The initial position to move from.\n * @param {number} itemCount The total number of items.\n * @param {Function} getItemNodeFromIndex Used to check if item is disabled.\n * @param {boolean} circular Specify if navigation is circular. Default is true.\n * @returns {number} The new index after the move.\n */\n\n\nfunction getNextWrappingIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) {\n if (circular === void 0) {\n circular = true;\n }\n\n if (itemCount === 0) {\n return -1;\n }\n\n var itemsLastIndex = itemCount - 1;\n\n if (typeof baseIndex !== \'number\' || baseIndex < 0 || baseIndex >= itemCount) {\n baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1;\n }\n\n var newIndex = baseIndex + moveAmount;\n\n if (newIndex < 0) {\n newIndex = circular ? itemsLastIndex : 0;\n } else if (newIndex > itemsLastIndex) {\n newIndex = circular ? 0 : itemsLastIndex;\n }\n\n var nonDisabledNewIndex = getNextNonDisabledIndex(moveAmount, newIndex, itemCount, getItemNodeFromIndex, circular);\n\n if (nonDisabledNewIndex === -1) {\n return baseIndex >= itemCount ? -1 : baseIndex;\n }\n\n return nonDisabledNewIndex;\n}\n/**\n * Returns the next index in the list of an item that is not disabled.\n *\n * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.\n * @param {number} baseIndex The initial position to move from.\n * @param {number} itemCount The total number of items.\n * @param {Function} getItemNodeFromIndex Used to check if item is disabled.\n * @param {boolean} circular Specify if navigation is circular. Default is true.\n * @returns {number} The new index. Returns baseIndex if item is not disabled. Returns next non-disabled item otherwise. If no non-disabled found it will return -1.\n */\n\n\nfunction getNextNonDisabledIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) {\n var currentElementNode = getItemNodeFromIndex(baseIndex);\n\n if (!currentElementNode || !currentElementNode.hasAttribute(\'disabled\')) {\n return baseIndex;\n }\n\n if (moveAmount > 0) {\n for (var index = baseIndex + 1; index < itemCount; index++) {\n if (!getItemNodeFromIndex(index).hasAttribute(\'disabled\')) {\n return index;\n }\n }\n } else {\n for (var _index = baseIndex - 1; _index >= 0; _index--) {\n if (!getItemNodeFromIndex(_index).hasAttribute(\'disabled\')) {\n return _index;\n }\n }\n }\n\n if (circular) {\n return moveAmount > 0 ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false) : getNextNonDisabledIndex(-1, itemCount - 1, itemCount, getItemNodeFromIndex, false);\n }\n\n return -1;\n}\n/**\n * Checks if event target is within the downshift elements.\n *\n * @param {EventTarget} target Target to check.\n * @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc).\n * @param {Window} environment The window context where downshift renders.\n * @param {boolean} checkActiveElement Whether to also check activeElement.\n *\n * @returns {boolean} Whether or not the target is within downshift elements.\n */\n\n\nfunction targetWithinDownshift(target, downshiftElements, environment, checkActiveElement) {\n if (checkActiveElement === void 0) {\n checkActiveElement = true;\n }\n\n return downshiftElements.some(function (contextNode) {\n return contextNode && (isOrContainsNode(contextNode, target, environment) || checkActiveElement && isOrContainsNode(contextNode, environment.document.activeElement, environment));\n });\n} // eslint-disable-next-line import/no-mutable-exports\n\n\nvar validateControlledUnchanged = (/* unused pure expression or super */ null && (noop));\n/* istanbul ignore next */\n\nif (false) {}\n\nvar cleanupStatus = debounce(function (documentProp) {\n getStatusDiv(documentProp).textContent = \'\';\n}, 500);\n/**\n * @param {String} status the status message\n * @param {Object} documentProp document passed by the user.\n */\n\nfunction setStatus(status, documentProp) {\n var div = getStatusDiv(documentProp);\n\n if (!status) {\n return;\n }\n\n div.textContent = status;\n cleanupStatus(documentProp);\n}\n/**\n * Get the status node or create it if it does not already exist.\n * @param {Object} documentProp document passed by the user.\n * @return {HTMLElement} the status node.\n */\n\n\nfunction getStatusDiv(documentProp) {\n if (documentProp === void 0) {\n documentProp = document;\n }\n\n var statusDiv = documentProp.getElementById(\'a11y-status-message\');\n\n if (statusDiv) {\n return statusDiv;\n }\n\n statusDiv = documentProp.createElement(\'div\');\n statusDiv.setAttribute(\'id\', \'a11y-status-message\');\n statusDiv.setAttribute(\'role\', \'status\');\n statusDiv.setAttribute(\'aria-live\', \'polite\');\n statusDiv.setAttribute(\'aria-relevant\', \'additions text\');\n Object.assign(statusDiv.style, {\n border: \'0\',\n clip: \'rect(0 0 0 0)\',\n height: \'1px\',\n margin: \'-1px\',\n overflow: \'hidden\',\n padding: \'0\',\n position: \'absolute\',\n width: \'1px\'\n });\n documentProp.body.appendChild(statusDiv);\n return statusDiv;\n}\n\nvar unknown = false ? 0 : 0;\nvar mouseUp = false ? 0 : 1;\nvar itemMouseEnter = false ? 0 : 2;\nvar keyDownArrowUp = false ? 0 : 3;\nvar keyDownArrowDown = false ? 0 : 4;\nvar keyDownEscape = false ? 0 : 5;\nvar keyDownEnter = false ? 0 : 6;\nvar keyDownHome = false ? 0 : 7;\nvar keyDownEnd = false ? 0 : 8;\nvar clickItem = false ? 0 : 9;\nvar blurInput = false ? 0 : 10;\nvar changeInput = false ? 0 : 11;\nvar keyDownSpaceButton = false ? 0 : 12;\nvar clickButton = false ? 0 : 13;\nvar blurButton = false ? 0 : 14;\nvar controlledPropUpdatedSelectedItem = false ? 0 : 15;\nvar touchEnd = false ? 0 : 16;\n\nvar stateChangeTypes$3 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n unknown: unknown,\n mouseUp: mouseUp,\n itemMouseEnter: itemMouseEnter,\n keyDownArrowUp: keyDownArrowUp,\n keyDownArrowDown: keyDownArrowDown,\n keyDownEscape: keyDownEscape,\n keyDownEnter: keyDownEnter,\n keyDownHome: keyDownHome,\n keyDownEnd: keyDownEnd,\n clickItem: clickItem,\n blurInput: blurInput,\n changeInput: changeInput,\n keyDownSpaceButton: keyDownSpaceButton,\n clickButton: clickButton,\n blurButton: blurButton,\n controlledPropUpdatedSelectedItem: controlledPropUpdatedSelectedItem,\n touchEnd: touchEnd\n});\n\nvar _excluded$4 = ["refKey", "ref"],\n _excluded2$3 = ["onClick", "onPress", "onKeyDown", "onKeyUp", "onBlur"],\n _excluded3$2 = ["onKeyDown", "onBlur", "onChange", "onInput", "onChangeText"],\n _excluded4$1 = ["refKey", "ref"],\n _excluded5$1 = ["onMouseMove", "onMouseDown", "onClick", "onPress", "index", "item"];\n\nvar Downshift = /*#__PURE__*/function () {\n var Downshift = /*#__PURE__*/function (_Component) {\n (0,inheritsLoose/* default */.Z)(Downshift, _Component);\n\n function Downshift(_props) {\n var _this;\n\n _this = _Component.call(this, _props) || this; // fancy destructuring + defaults + aliases\n // this basically says each value of state should either be set to\n // the initial value or the default value if the initial value is not provided\n\n _this.id = _this.props.id || "downshift-" + generateId();\n _this.menuId = _this.props.menuId || _this.id + "-menu";\n _this.labelId = _this.props.labelId || _this.id + "-label";\n _this.inputId = _this.props.inputId || _this.id + "-input";\n\n _this.getItemId = _this.props.getItemId || function (index) {\n return _this.id + "-item-" + index;\n };\n\n _this.input = null;\n _this.items = [];\n _this.itemCount = null;\n _this.previousResultCount = 0;\n _this.timeoutIds = [];\n\n _this.internalSetTimeout = function (fn, time) {\n var id = setTimeout(function () {\n _this.timeoutIds = _this.timeoutIds.filter(function (i) {\n return i !== id;\n });\n fn();\n }, time);\n\n _this.timeoutIds.push(id);\n };\n\n _this.setItemCount = function (count) {\n _this.itemCount = count;\n };\n\n _this.unsetItemCount = function () {\n _this.itemCount = null;\n };\n\n _this.setHighlightedIndex = function (highlightedIndex, otherStateToSet) {\n if (highlightedIndex === void 0) {\n highlightedIndex = _this.props.defaultHighlightedIndex;\n }\n\n if (otherStateToSet === void 0) {\n otherStateToSet = {};\n }\n\n otherStateToSet = pickState(otherStateToSet);\n\n _this.internalSetState((0,esm_extends["default"])({\n highlightedIndex: highlightedIndex\n }, otherStateToSet));\n };\n\n _this.clearSelection = function (cb) {\n _this.internalSetState({\n selectedItem: null,\n inputValue: \'\',\n highlightedIndex: _this.props.defaultHighlightedIndex,\n isOpen: _this.props.defaultIsOpen\n }, cb);\n };\n\n _this.selectItem = function (item, otherStateToSet, cb) {\n otherStateToSet = pickState(otherStateToSet);\n\n _this.internalSetState((0,esm_extends["default"])({\n isOpen: _this.props.defaultIsOpen,\n highlightedIndex: _this.props.defaultHighlightedIndex,\n selectedItem: item,\n inputValue: _this.props.itemToString(item)\n }, otherStateToSet), cb);\n };\n\n _this.selectItemAtIndex = function (itemIndex, otherStateToSet, cb) {\n var item = _this.items[itemIndex];\n\n if (item == null) {\n return;\n }\n\n _this.selectItem(item, otherStateToSet, cb);\n };\n\n _this.selectHighlightedItem = function (otherStateToSet, cb) {\n return _this.selectItemAtIndex(_this.getState().highlightedIndex, otherStateToSet, cb);\n };\n\n _this.internalSetState = function (stateToSet, cb) {\n var isItemSelected, onChangeArg;\n var onStateChangeArg = {};\n var isStateToSetFunction = typeof stateToSet === \'function\'; // we want to call `onInputValueChange` before the `setState` call\n // so someone controlling the `inputValue` state gets notified of\n // the input change as soon as possible. This avoids issues with\n // preserving the cursor position.\n // See https://github.com/downshift-js/downshift/issues/217 for more info.\n\n if (!isStateToSetFunction && stateToSet.hasOwnProperty(\'inputValue\')) {\n _this.props.onInputValueChange(stateToSet.inputValue, (0,esm_extends["default"])({}, _this.getStateAndHelpers(), stateToSet));\n }\n\n return _this.setState(function (state) {\n state = _this.getState(state);\n var newStateToSet = isStateToSetFunction ? stateToSet(state) : stateToSet; // Your own function that could modify the state that will be set.\n\n newStateToSet = _this.props.stateReducer(state, newStateToSet); // checks if an item is selected, regardless of if it\'s different from\n // what was selected before\n // used to determine if onSelect and onChange callbacks should be called\n\n isItemSelected = newStateToSet.hasOwnProperty(\'selectedItem\'); // this keeps track of the object we want to call with setState\n\n var nextState = {}; // this is just used to tell whether the state changed\n\n var nextFullState = {}; // we need to call on change if the outside world is controlling any of our state\n // and we\'re trying to update that state. OR if the selection has changed and we\'re\n // trying to update the selection\n\n if (isItemSelected && newStateToSet.selectedItem !== state.selectedItem) {\n onChangeArg = newStateToSet.selectedItem;\n }\n\n newStateToSet.type = newStateToSet.type || unknown;\n Object.keys(newStateToSet).forEach(function (key) {\n // onStateChangeArg should only have the state that is\n // actually changing\n if (state[key] !== newStateToSet[key]) {\n onStateChangeArg[key] = newStateToSet[key];\n } // the type is useful for the onStateChangeArg\n // but we don\'t actually want to set it in internal state.\n // this is an undocumented feature for now... Not all internalSetState\n // calls support it and I\'m not certain we want them to yet.\n // But it enables users controlling the isOpen state to know when\n // the isOpen state changes due to mouseup events which is quite handy.\n\n\n if (key === \'type\') {\n return;\n }\n\n nextFullState[key] = newStateToSet[key]; // if it\'s coming from props, then we don\'t care to set it internally\n\n if (!isControlledProp(_this.props, key)) {\n nextState[key] = newStateToSet[key];\n }\n }); // if stateToSet is a function, then we weren\'t able to call onInputValueChange\n // earlier, so we\'ll call it now that we know what the inputValue state will be.\n\n if (isStateToSetFunction && newStateToSet.hasOwnProperty(\'inputValue\')) {\n _this.props.onInputValueChange(newStateToSet.inputValue, (0,esm_extends["default"])({}, _this.getStateAndHelpers(), newStateToSet));\n }\n\n return nextState;\n }, function () {\n // call the provided callback if it\'s a function\n cbToCb(cb)(); // only call the onStateChange and onChange callbacks if\n // we have relevant information to pass them.\n\n var hasMoreStateThanType = Object.keys(onStateChangeArg).length > 1;\n\n if (hasMoreStateThanType) {\n _this.props.onStateChange(onStateChangeArg, _this.getStateAndHelpers());\n }\n\n if (isItemSelected) {\n _this.props.onSelect(stateToSet.selectedItem, _this.getStateAndHelpers());\n }\n\n if (onChangeArg !== undefined) {\n _this.props.onChange(onChangeArg, _this.getStateAndHelpers());\n } // this is currently undocumented and therefore subject to change\n // We\'ll try to not break it, but just be warned.\n\n\n _this.props.onUserAction(onStateChangeArg, _this.getStateAndHelpers());\n });\n };\n\n _this.rootRef = function (node) {\n return _this._rootNode = node;\n };\n\n _this.getRootProps = function (_temp, _temp2) {\n var _extends2;\n\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$refKey = _ref.refKey,\n refKey = _ref$refKey === void 0 ? \'ref\' : _ref$refKey,\n ref = _ref.ref,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref, _excluded$4);\n\n var _ref2 = _temp2 === void 0 ? {} : _temp2,\n _ref2$suppressRefErro = _ref2.suppressRefError,\n suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro;\n\n // this is used in the render to know whether the user has called getRootProps.\n // It uses that to know whether to apply the props automatically\n _this.getRootProps.called = true;\n _this.getRootProps.refKey = refKey;\n _this.getRootProps.suppressRefError = suppressRefError;\n\n var _this$getState = _this.getState(),\n isOpen = _this$getState.isOpen;\n\n return (0,esm_extends["default"])((_extends2 = {}, _extends2[refKey] = handleRefs(ref, _this.rootRef), _extends2.role = \'combobox\', _extends2[\'aria-expanded\'] = isOpen, _extends2[\'aria-haspopup\'] = \'listbox\', _extends2[\'aria-owns\'] = isOpen ? _this.menuId : null, _extends2[\'aria-labelledby\'] = _this.labelId, _extends2), rest);\n };\n\n _this.keyDownHandlers = {\n ArrowDown: function ArrowDown(event) {\n var _this2 = this;\n\n event.preventDefault();\n\n if (this.getState().isOpen) {\n var amount = event.shiftKey ? 5 : 1;\n this.moveHighlightedIndex(amount, {\n type: keyDownArrowDown\n });\n } else {\n this.internalSetState({\n isOpen: true,\n type: keyDownArrowDown\n }, function () {\n var itemCount = _this2.getItemCount();\n\n if (itemCount > 0) {\n var _this2$getState = _this2.getState(),\n highlightedIndex = _this2$getState.highlightedIndex;\n\n var nextHighlightedIndex = getNextWrappingIndex(1, highlightedIndex, itemCount, function (index) {\n return _this2.getItemNodeFromIndex(index);\n });\n\n _this2.setHighlightedIndex(nextHighlightedIndex, {\n type: keyDownArrowDown\n });\n }\n });\n }\n },\n ArrowUp: function ArrowUp(event) {\n var _this3 = this;\n\n event.preventDefault();\n\n if (this.getState().isOpen) {\n var amount = event.shiftKey ? -5 : -1;\n this.moveHighlightedIndex(amount, {\n type: keyDownArrowUp\n });\n } else {\n this.internalSetState({\n isOpen: true,\n type: keyDownArrowUp\n }, function () {\n var itemCount = _this3.getItemCount();\n\n if (itemCount > 0) {\n var _this3$getState = _this3.getState(),\n highlightedIndex = _this3$getState.highlightedIndex;\n\n var nextHighlightedIndex = getNextWrappingIndex(-1, highlightedIndex, itemCount, function (index) {\n return _this3.getItemNodeFromIndex(index);\n });\n\n _this3.setHighlightedIndex(nextHighlightedIndex, {\n type: keyDownArrowUp\n });\n }\n });\n }\n },\n Enter: function Enter(event) {\n if (event.which === 229) {\n return;\n }\n\n var _this$getState2 = this.getState(),\n isOpen = _this$getState2.isOpen,\n highlightedIndex = _this$getState2.highlightedIndex;\n\n if (isOpen && highlightedIndex != null) {\n event.preventDefault();\n var item = this.items[highlightedIndex];\n var itemNode = this.getItemNodeFromIndex(highlightedIndex);\n\n if (item == null || itemNode && itemNode.hasAttribute(\'disabled\')) {\n return;\n }\n\n this.selectHighlightedItem({\n type: keyDownEnter\n });\n }\n },\n Escape: function Escape(event) {\n event.preventDefault();\n this.reset((0,esm_extends["default"])({\n type: keyDownEscape\n }, !this.state.isOpen && {\n selectedItem: null,\n inputValue: \'\'\n }));\n }\n };\n _this.buttonKeyDownHandlers = (0,esm_extends["default"])({}, _this.keyDownHandlers, {\n \' \': function _(event) {\n event.preventDefault();\n this.toggleMenu({\n type: keyDownSpaceButton\n });\n }\n });\n _this.inputKeyDownHandlers = (0,esm_extends["default"])({}, _this.keyDownHandlers, {\n Home: function Home(event) {\n var _this4 = this;\n\n var _this$getState3 = this.getState(),\n isOpen = _this$getState3.isOpen;\n\n if (!isOpen) {\n return;\n }\n\n event.preventDefault();\n var itemCount = this.getItemCount();\n\n if (itemCount <= 0 || !isOpen) {\n return;\n } // get next non-disabled starting downwards from 0 if that\'s disabled.\n\n\n var newHighlightedIndex = getNextNonDisabledIndex(1, 0, itemCount, function (index) {\n return _this4.getItemNodeFromIndex(index);\n }, false);\n this.setHighlightedIndex(newHighlightedIndex, {\n type: keyDownHome\n });\n },\n End: function End(event) {\n var _this5 = this;\n\n var _this$getState4 = this.getState(),\n isOpen = _this$getState4.isOpen;\n\n if (!isOpen) {\n return;\n }\n\n event.preventDefault();\n var itemCount = this.getItemCount();\n\n if (itemCount <= 0 || !isOpen) {\n return;\n } // get next non-disabled starting upwards from last index if that\'s disabled.\n\n\n var newHighlightedIndex = getNextNonDisabledIndex(-1, itemCount - 1, itemCount, function (index) {\n return _this5.getItemNodeFromIndex(index);\n }, false);\n this.setHighlightedIndex(newHighlightedIndex, {\n type: keyDownEnd\n });\n }\n });\n\n _this.getToggleButtonProps = function (_temp3) {\n var _ref3 = _temp3 === void 0 ? {} : _temp3,\n onClick = _ref3.onClick;\n _ref3.onPress;\n var onKeyDown = _ref3.onKeyDown,\n onKeyUp = _ref3.onKeyUp,\n onBlur = _ref3.onBlur,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref3, _excluded2$3);\n\n var _this$getState5 = _this.getState(),\n isOpen = _this$getState5.isOpen;\n\n var enabledEventHandlers = {\n onClick: callAllEventHandlers(onClick, _this.buttonHandleClick),\n onKeyDown: callAllEventHandlers(onKeyDown, _this.buttonHandleKeyDown),\n onKeyUp: callAllEventHandlers(onKeyUp, _this.buttonHandleKeyUp),\n onBlur: callAllEventHandlers(onBlur, _this.buttonHandleBlur)\n };\n var eventHandlers = rest.disabled ? {} : enabledEventHandlers;\n return (0,esm_extends["default"])({\n type: \'button\',\n role: \'button\',\n \'aria-label\': isOpen ? \'close menu\' : \'open menu\',\n \'aria-haspopup\': true,\n \'data-toggle\': true\n }, eventHandlers, rest);\n };\n\n _this.buttonHandleKeyUp = function (event) {\n // Prevent click event from emitting in Firefox\n event.preventDefault();\n };\n\n _this.buttonHandleKeyDown = function (event) {\n var key = normalizeArrowKey(event);\n\n if (_this.buttonKeyDownHandlers[key]) {\n _this.buttonKeyDownHandlers[key].call((0,assertThisInitialized/* default */.Z)(_this), event);\n }\n };\n\n _this.buttonHandleClick = function (event) {\n event.preventDefault(); // handle odd case for Safari and Firefox which\n // don\'t give the button the focus properly.\n\n /* istanbul ignore if (can\'t reasonably test this) */\n\n if (_this.props.environment.document.activeElement === _this.props.environment.document.body) {\n event.target.focus();\n } // to simplify testing components that use downshift, we\'ll not wrap this in a setTimeout\n // if the NODE_ENV is test. With the proper build system, this should be dead code eliminated\n // when building for production and should therefore have no impact on production code.\n\n\n if (false) {} else {\n // Ensure that toggle of menu occurs after the potential blur event in iOS\n _this.internalSetTimeout(function () {\n return _this.toggleMenu({\n type: clickButton\n });\n });\n }\n };\n\n _this.buttonHandleBlur = function (event) {\n var blurTarget = event.target; // Save blur target for comparison with activeElement later\n // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not body element\n\n _this.internalSetTimeout(function () {\n if (!_this.isMouseDown && (_this.props.environment.document.activeElement == null || _this.props.environment.document.activeElement.id !== _this.inputId) && _this.props.environment.document.activeElement !== blurTarget // Do nothing if we refocus the same element again (to solve issue in Safari on iOS)\n ) {\n _this.reset({\n type: blurButton\n });\n }\n });\n };\n\n _this.getLabelProps = function (props) {\n return (0,esm_extends["default"])({\n htmlFor: _this.inputId,\n id: _this.labelId\n }, props);\n };\n\n _this.getInputProps = function (_temp4) {\n var _ref4 = _temp4 === void 0 ? {} : _temp4,\n onKeyDown = _ref4.onKeyDown,\n onBlur = _ref4.onBlur,\n onChange = _ref4.onChange,\n onInput = _ref4.onInput;\n _ref4.onChangeText;\n var rest = (0,objectWithoutPropertiesLoose["default"])(_ref4, _excluded3$2);\n\n var onChangeKey;\n var eventHandlers = {};\n /* istanbul ignore next (preact) */\n\n {\n onChangeKey = \'onChange\';\n }\n\n var _this$getState6 = _this.getState(),\n inputValue = _this$getState6.inputValue,\n isOpen = _this$getState6.isOpen,\n highlightedIndex = _this$getState6.highlightedIndex;\n\n if (!rest.disabled) {\n var _eventHandlers;\n\n eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, _this.inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, _this.inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, _this.inputHandleBlur), _eventHandlers);\n }\n\n return (0,esm_extends["default"])({\n \'aria-autocomplete\': \'list\',\n \'aria-activedescendant\': isOpen && typeof highlightedIndex === \'number\' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null,\n \'aria-controls\': isOpen ? _this.menuId : null,\n \'aria-labelledby\': _this.labelId,\n // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\n // revert back since autocomplete="nope" is ignored on latest Chrome and Opera\n autoComplete: \'off\',\n value: inputValue,\n id: _this.inputId\n }, eventHandlers, rest);\n };\n\n _this.inputHandleKeyDown = function (event) {\n var key = normalizeArrowKey(event);\n\n if (key && _this.inputKeyDownHandlers[key]) {\n _this.inputKeyDownHandlers[key].call((0,assertThisInitialized/* default */.Z)(_this), event);\n }\n };\n\n _this.inputHandleChange = function (event) {\n _this.internalSetState({\n type: changeInput,\n isOpen: true,\n inputValue: event.target.value,\n highlightedIndex: _this.props.defaultHighlightedIndex\n });\n };\n\n _this.inputHandleBlur = function () {\n // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not the body element\n _this.internalSetTimeout(function () {\n var downshiftButtonIsActive = _this.props.environment.document && !!_this.props.environment.document.activeElement && !!_this.props.environment.document.activeElement.dataset && _this.props.environment.document.activeElement.dataset.toggle && _this._rootNode && _this._rootNode.contains(_this.props.environment.document.activeElement);\n\n if (!_this.isMouseDown && !downshiftButtonIsActive) {\n _this.reset({\n type: blurInput\n });\n }\n });\n };\n\n _this.menuRef = function (node) {\n _this._menuNode = node;\n };\n\n _this.getMenuProps = function (_temp5, _temp6) {\n var _extends3;\n\n var _ref5 = _temp5 === void 0 ? {} : _temp5,\n _ref5$refKey = _ref5.refKey,\n refKey = _ref5$refKey === void 0 ? \'ref\' : _ref5$refKey,\n ref = _ref5.ref,\n props = (0,objectWithoutPropertiesLoose["default"])(_ref5, _excluded4$1);\n\n var _ref6 = _temp6 === void 0 ? {} : _temp6,\n _ref6$suppressRefErro = _ref6.suppressRefError,\n suppressRefError = _ref6$suppressRefErro === void 0 ? false : _ref6$suppressRefErro;\n\n _this.getMenuProps.called = true;\n _this.getMenuProps.refKey = refKey;\n _this.getMenuProps.suppressRefError = suppressRefError;\n return (0,esm_extends["default"])((_extends3 = {}, _extends3[refKey] = handleRefs(ref, _this.menuRef), _extends3.role = \'listbox\', _extends3[\'aria-labelledby\'] = props && props[\'aria-label\'] ? null : _this.labelId, _extends3.id = _this.menuId, _extends3), props);\n };\n\n _this.getItemProps = function (_temp7) {\n var _enabledEventHandlers;\n\n var _ref7 = _temp7 === void 0 ? {} : _temp7,\n onMouseMove = _ref7.onMouseMove,\n onMouseDown = _ref7.onMouseDown,\n onClick = _ref7.onClick;\n _ref7.onPress;\n var index = _ref7.index,\n _ref7$item = _ref7.item,\n item = _ref7$item === void 0 ? true ?\n /* istanbul ignore next */\n undefined : 0 : _ref7$item,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref7, _excluded5$1);\n\n if (index === undefined) {\n _this.items.push(item);\n\n index = _this.items.indexOf(item);\n } else {\n _this.items[index] = item;\n }\n\n var onSelectKey = \'onClick\';\n var customClickHandler = onClick;\n var enabledEventHandlers = (_enabledEventHandlers = {\n // onMouseMove is used over onMouseEnter here. onMouseMove\n // is only triggered on actual mouse movement while onMouseEnter\n // can fire on DOM changes, interrupting keyboard navigation\n onMouseMove: callAllEventHandlers(onMouseMove, function () {\n if (index === _this.getState().highlightedIndex) {\n return;\n }\n\n _this.setHighlightedIndex(index, {\n type: itemMouseEnter\n }); // We never want to manually scroll when changing state based\n // on `onMouseMove` because we will be moving the element out\n // from under the user which is currently scrolling/moving the\n // cursor\n\n\n _this.avoidScrolling = true;\n\n _this.internalSetTimeout(function () {\n return _this.avoidScrolling = false;\n }, 250);\n }),\n onMouseDown: callAllEventHandlers(onMouseDown, function (event) {\n // This prevents the activeElement from being changed\n // to the item so it can remain with the current activeElement\n // which is a more common use case.\n event.preventDefault();\n })\n }, _enabledEventHandlers[onSelectKey] = callAllEventHandlers(customClickHandler, function () {\n _this.selectItemAtIndex(index, {\n type: clickItem\n });\n }), _enabledEventHandlers); // Passing down the onMouseDown handler to prevent redirect\n // of the activeElement if clicking on disabled items\n\n var eventHandlers = rest.disabled ? {\n onMouseDown: enabledEventHandlers.onMouseDown\n } : enabledEventHandlers;\n return (0,esm_extends["default"])({\n id: _this.getItemId(index),\n role: \'option\',\n \'aria-selected\': _this.getState().highlightedIndex === index\n }, eventHandlers, rest);\n };\n\n _this.clearItems = function () {\n _this.items = [];\n };\n\n _this.reset = function (otherStateToSet, cb) {\n if (otherStateToSet === void 0) {\n otherStateToSet = {};\n }\n\n otherStateToSet = pickState(otherStateToSet);\n\n _this.internalSetState(function (_ref8) {\n var selectedItem = _ref8.selectedItem;\n return (0,esm_extends["default"])({\n isOpen: _this.props.defaultIsOpen,\n highlightedIndex: _this.props.defaultHighlightedIndex,\n inputValue: _this.props.itemToString(selectedItem)\n }, otherStateToSet);\n }, cb);\n };\n\n _this.toggleMenu = function (otherStateToSet, cb) {\n if (otherStateToSet === void 0) {\n otherStateToSet = {};\n }\n\n otherStateToSet = pickState(otherStateToSet);\n\n _this.internalSetState(function (_ref9) {\n var isOpen = _ref9.isOpen;\n return (0,esm_extends["default"])({\n isOpen: !isOpen\n }, isOpen && {\n highlightedIndex: _this.props.defaultHighlightedIndex\n }, otherStateToSet);\n }, function () {\n var _this$getState7 = _this.getState(),\n isOpen = _this$getState7.isOpen,\n highlightedIndex = _this$getState7.highlightedIndex;\n\n if (isOpen) {\n if (_this.getItemCount() > 0 && typeof highlightedIndex === \'number\') {\n _this.setHighlightedIndex(highlightedIndex, otherStateToSet);\n }\n }\n\n cbToCb(cb)();\n });\n };\n\n _this.openMenu = function (cb) {\n _this.internalSetState({\n isOpen: true\n }, cb);\n };\n\n _this.closeMenu = function (cb) {\n _this.internalSetState({\n isOpen: false\n }, cb);\n };\n\n _this.updateStatus = debounce(function () {\n var state = _this.getState();\n\n var item = _this.items[state.highlightedIndex];\n\n var resultCount = _this.getItemCount();\n\n var status = _this.props.getA11yStatusMessage((0,esm_extends["default"])({\n itemToString: _this.props.itemToString,\n previousResultCount: _this.previousResultCount,\n resultCount: resultCount,\n highlightedItem: item\n }, state));\n\n _this.previousResultCount = resultCount;\n setStatus(status, _this.props.environment.document);\n }, 200);\n\n var _this$props = _this.props,\n defaultHighlightedIndex = _this$props.defaultHighlightedIndex,\n _this$props$initialHi = _this$props.initialHighlightedIndex,\n _highlightedIndex = _this$props$initialHi === void 0 ? defaultHighlightedIndex : _this$props$initialHi,\n defaultIsOpen = _this$props.defaultIsOpen,\n _this$props$initialIs = _this$props.initialIsOpen,\n _isOpen = _this$props$initialIs === void 0 ? defaultIsOpen : _this$props$initialIs,\n _this$props$initialIn = _this$props.initialInputValue,\n _inputValue = _this$props$initialIn === void 0 ? \'\' : _this$props$initialIn,\n _this$props$initialSe = _this$props.initialSelectedItem,\n _selectedItem = _this$props$initialSe === void 0 ? null : _this$props$initialSe;\n\n var _state = _this.getState({\n highlightedIndex: _highlightedIndex,\n isOpen: _isOpen,\n inputValue: _inputValue,\n selectedItem: _selectedItem\n });\n\n if (_state.selectedItem != null && _this.props.initialInputValue === undefined) {\n _state.inputValue = _this.props.itemToString(_state.selectedItem);\n }\n\n _this.state = _state;\n return _this;\n }\n\n var _proto = Downshift.prototype;\n\n /**\n * Clear all running timeouts\n */\n _proto.internalClearTimeouts = function internalClearTimeouts() {\n this.timeoutIds.forEach(function (id) {\n clearTimeout(id);\n });\n this.timeoutIds = [];\n }\n /**\n * Gets the state based on internal state or props\n * If a state value is passed via props, then that\n * is the value given, otherwise it\'s retrieved from\n * stateToMerge\n *\n * @param {Object} stateToMerge defaults to this.state\n * @return {Object} the state\n */\n ;\n\n _proto.getState = function getState$1(stateToMerge) {\n if (stateToMerge === void 0) {\n stateToMerge = this.state;\n }\n\n return getState(stateToMerge, this.props);\n };\n\n _proto.getItemCount = function getItemCount() {\n // things read better this way. They\'re in priority order:\n // 1. `this.itemCount`\n // 2. `this.props.itemCount`\n // 3. `this.items.length`\n var itemCount = this.items.length;\n\n if (this.itemCount != null) {\n itemCount = this.itemCount;\n } else if (this.props.itemCount !== undefined) {\n itemCount = this.props.itemCount;\n }\n\n return itemCount;\n };\n\n _proto.getItemNodeFromIndex = function getItemNodeFromIndex(index) {\n return this.props.environment.document.getElementById(this.getItemId(index));\n };\n\n _proto.scrollHighlightedItemIntoView = function scrollHighlightedItemIntoView() {\n /* istanbul ignore else (react-native) */\n {\n var node = this.getItemNodeFromIndex(this.getState().highlightedIndex);\n this.props.scrollIntoView(node, this._menuNode);\n }\n };\n\n _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) {\n var _this6 = this;\n\n var itemCount = this.getItemCount();\n\n var _this$getState8 = this.getState(),\n highlightedIndex = _this$getState8.highlightedIndex;\n\n if (itemCount > 0) {\n var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) {\n return _this6.getItemNodeFromIndex(index);\n });\n this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet);\n }\n };\n\n _proto.getStateAndHelpers = function getStateAndHelpers() {\n var _this$getState9 = this.getState(),\n highlightedIndex = _this$getState9.highlightedIndex,\n inputValue = _this$getState9.inputValue,\n selectedItem = _this$getState9.selectedItem,\n isOpen = _this$getState9.isOpen;\n\n var itemToString = this.props.itemToString;\n var id = this.id;\n var getRootProps = this.getRootProps,\n getToggleButtonProps = this.getToggleButtonProps,\n getLabelProps = this.getLabelProps,\n getMenuProps = this.getMenuProps,\n getInputProps = this.getInputProps,\n getItemProps = this.getItemProps,\n openMenu = this.openMenu,\n closeMenu = this.closeMenu,\n toggleMenu = this.toggleMenu,\n selectItem = this.selectItem,\n selectItemAtIndex = this.selectItemAtIndex,\n selectHighlightedItem = this.selectHighlightedItem,\n setHighlightedIndex = this.setHighlightedIndex,\n clearSelection = this.clearSelection,\n clearItems = this.clearItems,\n reset = this.reset,\n setItemCount = this.setItemCount,\n unsetItemCount = this.unsetItemCount,\n setState = this.internalSetState;\n return {\n // prop getters\n getRootProps: getRootProps,\n getToggleButtonProps: getToggleButtonProps,\n getLabelProps: getLabelProps,\n getMenuProps: getMenuProps,\n getInputProps: getInputProps,\n getItemProps: getItemProps,\n // actions\n reset: reset,\n openMenu: openMenu,\n closeMenu: closeMenu,\n toggleMenu: toggleMenu,\n selectItem: selectItem,\n selectItemAtIndex: selectItemAtIndex,\n selectHighlightedItem: selectHighlightedItem,\n setHighlightedIndex: setHighlightedIndex,\n clearSelection: clearSelection,\n clearItems: clearItems,\n setItemCount: setItemCount,\n unsetItemCount: unsetItemCount,\n setState: setState,\n // props\n itemToString: itemToString,\n // derived\n id: id,\n // state\n highlightedIndex: highlightedIndex,\n inputValue: inputValue,\n isOpen: isOpen,\n selectedItem: selectedItem\n };\n } //////////////////////////// ROOT\n ;\n\n _proto.componentDidMount = function componentDidMount() {\n var _this7 = this;\n\n /* istanbul ignore if (react-native) */\n if (false) {}\n /* istanbul ignore if (react-native) */\n\n\n {\n // this.isMouseDown helps us track whether the mouse is currently held down.\n // This is useful when the user clicks on an item in the list, but holds the mouse\n // down long enough for the list to disappear (because the blur event fires on the input)\n // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should\n // trigger hiding the menu.\n var onMouseDown = function onMouseDown() {\n _this7.isMouseDown = true;\n };\n\n var onMouseUp = function onMouseUp(event) {\n _this7.isMouseDown = false; // if the target element or the activeElement is within a downshift node\n // then we don\'t want to reset downshift\n\n var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment);\n\n if (!contextWithinDownshift && _this7.getState().isOpen) {\n _this7.reset({\n type: mouseUp\n }, function () {\n return _this7.props.onOuterClick(_this7.getStateAndHelpers());\n });\n }\n }; // Touching an element in iOS gives focus and hover states, but touching out of\n // the element will remove hover, and persist the focus state, resulting in the\n // blur event not being triggered.\n // this.isTouchMove helps us track whether the user is tapping or swiping on a touch screen.\n // If the user taps outside of Downshift, the component should be reset,\n // but not if the user is swiping\n\n\n var onTouchStart = function onTouchStart() {\n _this7.isTouchMove = false;\n };\n\n var onTouchMove = function onTouchMove() {\n _this7.isTouchMove = true;\n };\n\n var onTouchEnd = function onTouchEnd(event) {\n var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment, false);\n\n if (!_this7.isTouchMove && !contextWithinDownshift && _this7.getState().isOpen) {\n _this7.reset({\n type: touchEnd\n }, function () {\n return _this7.props.onOuterClick(_this7.getStateAndHelpers());\n });\n }\n };\n\n var environment = this.props.environment;\n environment.addEventListener(\'mousedown\', onMouseDown);\n environment.addEventListener(\'mouseup\', onMouseUp);\n environment.addEventListener(\'touchstart\', onTouchStart);\n environment.addEventListener(\'touchmove\', onTouchMove);\n environment.addEventListener(\'touchend\', onTouchEnd);\n\n this.cleanup = function () {\n _this7.internalClearTimeouts();\n\n _this7.updateStatus.cancel();\n\n environment.removeEventListener(\'mousedown\', onMouseDown);\n environment.removeEventListener(\'mouseup\', onMouseUp);\n environment.removeEventListener(\'touchstart\', onTouchStart);\n environment.removeEventListener(\'touchmove\', onTouchMove);\n environment.removeEventListener(\'touchend\', onTouchEnd);\n };\n }\n };\n\n _proto.shouldScroll = function shouldScroll(prevState, prevProps) {\n var _ref10 = this.props.highlightedIndex === undefined ? this.getState() : this.props,\n currentHighlightedIndex = _ref10.highlightedIndex;\n\n var _ref11 = prevProps.highlightedIndex === undefined ? prevState : prevProps,\n prevHighlightedIndex = _ref11.highlightedIndex;\n\n var scrollWhenOpen = currentHighlightedIndex && this.getState().isOpen && !prevState.isOpen;\n var scrollWhenNavigating = currentHighlightedIndex !== prevHighlightedIndex;\n return scrollWhenOpen || scrollWhenNavigating;\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (false) {}\n\n if (isControlledProp(this.props, \'selectedItem\') && this.props.selectedItemChanged(prevProps.selectedItem, this.props.selectedItem)) {\n this.internalSetState({\n type: controlledPropUpdatedSelectedItem,\n inputValue: this.props.itemToString(this.props.selectedItem)\n });\n }\n\n if (!this.avoidScrolling && this.shouldScroll(prevState, prevProps)) {\n this.scrollHighlightedItemIntoView();\n }\n /* istanbul ignore else (react-native) */\n\n\n {\n this.updateStatus();\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cleanup(); // avoids memory leak\n };\n\n _proto.render = function render() {\n var children = unwrapArray(this.props.children, noop); // because the items are rerendered every time we call the children\n // we clear this out each render and it will be populated again as\n // getItemProps is called.\n\n this.clearItems(); // we reset this so we know whether the user calls getRootProps during\n // this render. If they do then we don\'t need to do anything,\n // if they don\'t then we need to clone the element they return and\n // apply the props for them.\n\n this.getRootProps.called = false;\n this.getRootProps.refKey = undefined;\n this.getRootProps.suppressRefError = undefined; // we do something similar for getMenuProps\n\n this.getMenuProps.called = false;\n this.getMenuProps.refKey = undefined;\n this.getMenuProps.suppressRefError = undefined; // we do something similar for getLabelProps\n\n this.getLabelProps.called = false; // and something similar for getInputProps\n\n this.getInputProps.called = false;\n var element = unwrapArray(children(this.getStateAndHelpers()));\n\n if (!element) {\n return null;\n }\n\n if (this.getRootProps.called || this.props.suppressRefError) {\n if (false) {}\n\n return element;\n } else if (isDOMElement(element)) {\n // they didn\'t apply the root props, but we can clone\n // this and apply the props ourselves\n return /*#__PURE__*/(0,external_React_.cloneElement)(element, this.getRootProps(getElementProps(element)));\n }\n /* istanbul ignore else */\n\n\n if (false) {}\n /* istanbul ignore next */\n\n\n return undefined;\n };\n\n return Downshift;\n }(external_React_.Component);\n\n Downshift.defaultProps = {\n defaultHighlightedIndex: null,\n defaultIsOpen: false,\n getA11yStatusMessage: getA11yStatusMessage$1,\n itemToString: function itemToString(i) {\n if (i == null) {\n return \'\';\n }\n\n if (false) {}\n\n return String(i);\n },\n onStateChange: noop,\n onInputValueChange: noop,\n onUserAction: noop,\n onChange: noop,\n onSelect: noop,\n onOuterClick: noop,\n selectedItemChanged: function selectedItemChanged(prevItem, item) {\n return prevItem !== item;\n },\n environment:\n /* istanbul ignore next (ssr) */\n typeof window === \'undefined\' ? {} : window,\n stateReducer: function stateReducer(state, stateToSet) {\n return stateToSet;\n },\n suppressRefError: false,\n scrollIntoView: scrollIntoView\n };\n Downshift.stateChangeTypes = stateChangeTypes$3;\n return Downshift;\n}();\n\n false ? 0 : void 0;\nvar Downshift$1 = Downshift;\n\nfunction validateGetMenuPropsCalledCorrectly(node, _ref12) {\n var refKey = _ref12.refKey;\n\n if (!node) {\n // eslint-disable-next-line no-console\n console.error("downshift: The ref prop \\"" + refKey + "\\" from getMenuProps was not applied correctly on your menu element.");\n }\n}\n\nfunction validateGetRootPropsCalledCorrectly(element, _ref13) {\n var refKey = _ref13.refKey;\n var refKeySpecified = refKey !== \'ref\';\n var isComposite = !isDOMElement(element);\n\n if (isComposite && !refKeySpecified && !isForwardRef(element)) {\n // eslint-disable-next-line no-console\n console.error(\'downshift: You returned a non-DOM element. You must specify a refKey in getRootProps\');\n } else if (!isComposite && refKeySpecified) {\n // eslint-disable-next-line no-console\n console.error("downshift: You returned a DOM element. You should not specify a refKey in getRootProps. You specified \\"" + refKey + "\\"");\n }\n\n if (!isForwardRef(element) && !getElementProps(element)[refKey]) {\n // eslint-disable-next-line no-console\n console.error("downshift: You must apply the ref prop \\"" + refKey + "\\" from getRootProps onto your root element.");\n }\n}\n\nvar _excluded$3 = ["isInitialMount", "highlightedIndex", "items", "environment"];\nvar dropdownDefaultStateValues = {\n highlightedIndex: -1,\n isOpen: false,\n selectedItem: null,\n inputValue: \'\'\n};\n\nfunction callOnChangeProps(action, state, newState) {\n var props = action.props,\n type = action.type;\n var changes = {};\n Object.keys(state).forEach(function (key) {\n invokeOnChangeHandler(key, action, state, newState);\n\n if (newState[key] !== state[key]) {\n changes[key] = newState[key];\n }\n });\n\n if (props.onStateChange && Object.keys(changes).length) {\n props.onStateChange((0,esm_extends["default"])({\n type: type\n }, changes));\n }\n}\n\nfunction invokeOnChangeHandler(key, action, state, newState) {\n var props = action.props,\n type = action.type;\n var handler = "on" + capitalizeString(key) + "Change";\n\n if (props[handler] && newState[key] !== undefined && newState[key] !== state[key]) {\n props[handler]((0,esm_extends["default"])({\n type: type\n }, newState));\n }\n}\n/**\n * Default state reducer that returns the changes.\n *\n * @param {Object} s state.\n * @param {Object} a action with changes.\n * @returns {Object} changes.\n */\n\n\nfunction stateReducer(s, a) {\n return a.changes;\n}\n/**\n * Returns a message to be added to aria-live region when item is selected.\n *\n * @param {Object} selectionParameters Parameters required to build the message.\n * @returns {string} The a11y message.\n */\n\n\nfunction getA11ySelectionMessage(selectionParameters) {\n var selectedItem = selectionParameters.selectedItem,\n itemToStringLocal = selectionParameters.itemToString;\n return selectedItem ? itemToStringLocal(selectedItem) + " has been selected." : \'\';\n}\n/**\n * Debounced call for updating the a11y message.\n */\n\n\nvar updateA11yStatus = debounce(function (getA11yMessage, document) {\n setStatus(getA11yMessage(), document);\n}, 200); // istanbul ignore next\n\nvar useIsomorphicLayoutEffect = typeof window !== \'undefined\' && typeof window.document !== \'undefined\' && typeof window.document.createElement !== \'undefined\' ? external_React_.useLayoutEffect : external_React_.useEffect;\n\nfunction useElementIds(_ref) {\n var _ref$id = _ref.id,\n id = _ref$id === void 0 ? "downshift-" + generateId() : _ref$id,\n labelId = _ref.labelId,\n menuId = _ref.menuId,\n getItemId = _ref.getItemId,\n toggleButtonId = _ref.toggleButtonId,\n inputId = _ref.inputId;\n var elementIdsRef = (0,external_React_.useRef)({\n labelId: labelId || id + "-label",\n menuId: menuId || id + "-menu",\n getItemId: getItemId || function (index) {\n return id + "-item-" + index;\n },\n toggleButtonId: toggleButtonId || id + "-toggle-button",\n inputId: inputId || id + "-input"\n });\n return elementIdsRef.current;\n}\n\nfunction getItemIndex(index, item, items) {\n if (index !== undefined) {\n return index;\n }\n\n if (items.length === 0) {\n return -1;\n }\n\n return items.indexOf(item);\n}\n\nfunction itemToString(item) {\n return item ? String(item) : \'\';\n}\n\nfunction isAcceptedCharacterKey(key) {\n return /^\\S{1}$/.test(key);\n}\n\nfunction capitalizeString(string) {\n return "" + string.slice(0, 1).toUpperCase() + string.slice(1);\n}\n\nfunction useLatestRef(val) {\n var ref = (0,external_React_.useRef)(val); // technically this is not "concurrent mode safe" because we\'re manipulating\n // the value during render (so it\'s not idempotent). However, the places this\n // hook is used is to support memoizing callbacks which will be called\n // *during* render, so we need the latest values *during* render.\n // If not for this, then we\'d probably want to use useLayoutEffect instead.\n\n ref.current = val;\n return ref;\n}\n/**\n * Computes the controlled state using a the previous state, props,\n * two reducers, one from downshift and an optional one from the user.\n * Also calls the onChange handlers for state values that have changed.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @returns {Array} An array with the state and an action dispatcher.\n */\n\n\nfunction useEnhancedReducer(reducer, initialState, props) {\n var prevStateRef = (0,external_React_.useRef)();\n var actionRef = (0,external_React_.useRef)();\n var enhancedReducer = (0,external_React_.useCallback)(function (state, action) {\n actionRef.current = action;\n state = getState(state, action.props);\n var changes = reducer(state, action);\n var newState = action.props.stateReducer(state, (0,esm_extends["default"])({}, action, {\n changes: changes\n }));\n return newState;\n }, [reducer]);\n\n var _useReducer = (0,external_React_.useReducer)(enhancedReducer, initialState),\n state = _useReducer[0],\n dispatch = _useReducer[1];\n\n var propsRef = useLatestRef(props);\n var dispatchWithProps = (0,external_React_.useCallback)(function (action) {\n return dispatch((0,esm_extends["default"])({\n props: propsRef.current\n }, action));\n }, [propsRef]);\n var action = actionRef.current;\n (0,external_React_.useEffect)(function () {\n if (action && prevStateRef.current && prevStateRef.current !== state) {\n callOnChangeProps(action, getState(prevStateRef.current, action.props), state);\n }\n\n prevStateRef.current = state;\n }, [state, props, action]);\n return [state, dispatchWithProps];\n}\n/**\n * Wraps the useEnhancedReducer and applies the controlled prop values before\n * returning the new state.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @returns {Array} An array with the state and an action dispatcher.\n */\n\n\nfunction useControlledReducer$1(reducer, initialState, props) {\n var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props),\n state = _useEnhancedReducer[0],\n dispatch = _useEnhancedReducer[1];\n\n return [getState(state, props), dispatch];\n}\n\nvar defaultProps$3 = {\n itemToString: itemToString,\n stateReducer: stateReducer,\n getA11ySelectionMessage: getA11ySelectionMessage,\n scrollIntoView: scrollIntoView,\n circularNavigation: false,\n environment:\n /* istanbul ignore next (ssr) */\n typeof window === \'undefined\' ? {} : window\n};\n\nfunction getDefaultValue$1(props, propKey, defaultStateValues) {\n if (defaultStateValues === void 0) {\n defaultStateValues = dropdownDefaultStateValues;\n }\n\n var defaultPropKey = "default" + capitalizeString(propKey);\n\n if (defaultPropKey in props) {\n return props[defaultPropKey];\n }\n\n return defaultStateValues[propKey];\n}\n\nfunction getInitialValue$1(props, propKey, defaultStateValues) {\n if (defaultStateValues === void 0) {\n defaultStateValues = dropdownDefaultStateValues;\n }\n\n if (propKey in props) {\n return props[propKey];\n }\n\n var initialPropKey = "initial" + capitalizeString(propKey);\n\n if (initialPropKey in props) {\n return props[initialPropKey];\n }\n\n return getDefaultValue$1(props, propKey, defaultStateValues);\n}\n\nfunction getInitialState$2(props) {\n var selectedItem = getInitialValue$1(props, \'selectedItem\');\n var isOpen = getInitialValue$1(props, \'isOpen\');\n var highlightedIndex = getInitialValue$1(props, \'highlightedIndex\');\n var inputValue = getInitialValue$1(props, \'inputValue\');\n return {\n highlightedIndex: highlightedIndex < 0 && selectedItem && isOpen ? props.items.indexOf(selectedItem) : highlightedIndex,\n isOpen: isOpen,\n selectedItem: selectedItem,\n inputValue: inputValue\n };\n}\n\nfunction getHighlightedIndexOnOpen(props, state, offset, getItemNodeFromIndex) {\n var items = props.items,\n initialHighlightedIndex = props.initialHighlightedIndex,\n defaultHighlightedIndex = props.defaultHighlightedIndex;\n var selectedItem = state.selectedItem,\n highlightedIndex = state.highlightedIndex;\n\n if (items.length === 0) {\n return -1;\n } // initialHighlightedIndex will give value to highlightedIndex on initial state only.\n\n\n if (initialHighlightedIndex !== undefined && highlightedIndex === initialHighlightedIndex) {\n return initialHighlightedIndex;\n }\n\n if (defaultHighlightedIndex !== undefined) {\n return defaultHighlightedIndex;\n }\n\n if (selectedItem) {\n if (offset === 0) {\n return items.indexOf(selectedItem);\n }\n\n return getNextWrappingIndex(offset, items.indexOf(selectedItem), items.length, getItemNodeFromIndex, false);\n }\n\n if (offset === 0) {\n return -1;\n }\n\n return offset < 0 ? items.length - 1 : 0;\n}\n/**\n * Reuse the movement tracking of mouse and touch events.\n *\n * @param {boolean} isOpen Whether the dropdown is open or not.\n * @param {Array} downshiftElementRefs Downshift element refs to track movement (toggleButton, menu etc.)\n * @param {Object} environment Environment where component/hook exists.\n * @param {Function} handleBlur Handler on blur from mouse or touch.\n * @returns {Object} Ref containing whether mouseDown or touchMove event is happening\n */\n\n\nfunction useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) {\n var mouseAndTouchTrackersRef = (0,external_React_.useRef)({\n isMouseDown: false,\n isTouchMove: false\n });\n (0,external_React_.useEffect)(function () {\n // The same strategy for checking if a click occurred inside or outside downsift\n // as in downshift.js.\n var onMouseDown = function onMouseDown() {\n mouseAndTouchTrackersRef.current.isMouseDown = true;\n };\n\n var onMouseUp = function onMouseUp(event) {\n mouseAndTouchTrackersRef.current.isMouseDown = false;\n\n if (isOpen && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) {\n return ref.current;\n }), environment)) {\n handleBlur();\n }\n };\n\n var onTouchStart = function onTouchStart() {\n mouseAndTouchTrackersRef.current.isTouchMove = false;\n };\n\n var onTouchMove = function onTouchMove() {\n mouseAndTouchTrackersRef.current.isTouchMove = true;\n };\n\n var onTouchEnd = function onTouchEnd(event) {\n if (isOpen && !mouseAndTouchTrackersRef.current.isTouchMove && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) {\n return ref.current;\n }), environment, false)) {\n handleBlur();\n }\n };\n\n environment.addEventListener(\'mousedown\', onMouseDown);\n environment.addEventListener(\'mouseup\', onMouseUp);\n environment.addEventListener(\'touchstart\', onTouchStart);\n environment.addEventListener(\'touchmove\', onTouchMove);\n environment.addEventListener(\'touchend\', onTouchEnd);\n return function cleanup() {\n environment.removeEventListener(\'mousedown\', onMouseDown);\n environment.removeEventListener(\'mouseup\', onMouseUp);\n environment.removeEventListener(\'touchstart\', onTouchStart);\n environment.removeEventListener(\'touchmove\', onTouchMove);\n environment.removeEventListener(\'touchend\', onTouchEnd);\n }; // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, environment]);\n return mouseAndTouchTrackersRef;\n}\n/* istanbul ignore next */\n// eslint-disable-next-line import/no-mutable-exports\n\n\nvar useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {\n return noop;\n};\n/**\n * Custom hook that checks if getter props are called correctly.\n *\n * @param {...any} propKeys Getter prop names to be handled.\n * @returns {Function} Setter function called inside getter props to set call information.\n */\n\n/* istanbul ignore next */\n\n\nif (false) {}\n\nfunction useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {\n var isInitialMount = _ref2.isInitialMount,\n highlightedIndex = _ref2.highlightedIndex,\n items = _ref2.items,\n environment = _ref2.environment,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref2, _excluded$3);\n\n // Sets a11y status message on changes in state.\n (0,external_React_.useEffect)(function () {\n if (isInitialMount || false) {\n return;\n }\n\n updateA11yStatus(function () {\n return getA11yMessage((0,esm_extends["default"])({\n highlightedIndex: highlightedIndex,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length\n }, rest));\n }, environment.document); // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencyArray);\n}\n\nfunction useScrollIntoView(_ref3) {\n var highlightedIndex = _ref3.highlightedIndex,\n isOpen = _ref3.isOpen,\n itemRefs = _ref3.itemRefs,\n getItemNodeFromIndex = _ref3.getItemNodeFromIndex,\n menuElement = _ref3.menuElement,\n scrollIntoViewProp = _ref3.scrollIntoView;\n // used not to scroll on highlight by mouse.\n var shouldScrollRef = (0,external_React_.useRef)(true); // Scroll on highlighted item if change comes from keyboard.\n\n useIsomorphicLayoutEffect(function () {\n if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) {\n return;\n }\n\n if (shouldScrollRef.current === false) {\n shouldScrollRef.current = true;\n } else {\n scrollIntoViewProp(getItemNodeFromIndex(highlightedIndex), menuElement);\n } // eslint-disable-next-line react-hooks/exhaustive-deps\n\n }, [highlightedIndex]);\n return shouldScrollRef;\n} // eslint-disable-next-line import/no-mutable-exports\n\n\nvar useControlPropsValidator = noop;\n/* istanbul ignore next */\n\nif (false) {}\n\n/* eslint-disable complexity */\n\nfunction downshiftCommonReducer(state, action, stateChangeTypes) {\n var type = action.type,\n props = action.props;\n var changes;\n\n switch (type) {\n case stateChangeTypes.ItemMouseMove:\n changes = {\n highlightedIndex: action.index\n };\n break;\n\n case stateChangeTypes.MenuMouseLeave:\n changes = {\n highlightedIndex: -1\n };\n break;\n\n case stateChangeTypes.ToggleButtonClick:\n case stateChangeTypes.FunctionToggleMenu:\n changes = {\n isOpen: !state.isOpen,\n highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)\n };\n break;\n\n case stateChangeTypes.FunctionOpenMenu:\n changes = {\n isOpen: true,\n highlightedIndex: getHighlightedIndexOnOpen(props, state, 0)\n };\n break;\n\n case stateChangeTypes.FunctionCloseMenu:\n changes = {\n isOpen: false\n };\n break;\n\n case stateChangeTypes.FunctionSetHighlightedIndex:\n changes = {\n highlightedIndex: action.highlightedIndex\n };\n break;\n\n case stateChangeTypes.FunctionSetInputValue:\n changes = {\n inputValue: action.inputValue\n };\n break;\n\n case stateChangeTypes.FunctionReset:\n changes = {\n highlightedIndex: getDefaultValue$1(props, \'highlightedIndex\'),\n isOpen: getDefaultValue$1(props, \'isOpen\'),\n selectedItem: getDefaultValue$1(props, \'selectedItem\'),\n inputValue: getDefaultValue$1(props, \'inputValue\')\n };\n break;\n\n default:\n throw new Error(\'Reducer called without proper action type.\');\n }\n\n return (0,esm_extends["default"])({}, state, changes);\n}\n/* eslint-enable complexity */\n\nfunction getItemIndexByCharacterKey(_a) {\n var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, getItemNodeFromIndex = _a.getItemNodeFromIndex;\n var lowerCasedKeysSoFar = keysSoFar.toLowerCase();\n for (var index = 0; index < items.length; index++) {\n var offsetIndex = (index + highlightedIndex + 1) % items.length;\n var item = items[offsetIndex];\n if (item !== undefined &&\n itemToString(item)\n .toLowerCase()\n .startsWith(lowerCasedKeysSoFar)) {\n var element = getItemNodeFromIndex(offsetIndex);\n if (!(element === null || element === void 0 ? void 0 : element.hasAttribute(\'disabled\'))) {\n return offsetIndex;\n }\n }\n }\n return highlightedIndex;\n}\nvar propTypes$2 = {\n items: (prop_types_default()).array.isRequired,\n itemToString: (prop_types_default()).func,\n getA11yStatusMessage: (prop_types_default()).func,\n getA11ySelectionMessage: (prop_types_default()).func,\n circularNavigation: (prop_types_default()).bool,\n highlightedIndex: (prop_types_default()).number,\n defaultHighlightedIndex: (prop_types_default()).number,\n initialHighlightedIndex: (prop_types_default()).number,\n isOpen: (prop_types_default()).bool,\n defaultIsOpen: (prop_types_default()).bool,\n initialIsOpen: (prop_types_default()).bool,\n selectedItem: (prop_types_default()).any,\n initialSelectedItem: (prop_types_default()).any,\n defaultSelectedItem: (prop_types_default()).any,\n id: (prop_types_default()).string,\n labelId: (prop_types_default()).string,\n menuId: (prop_types_default()).string,\n getItemId: (prop_types_default()).func,\n toggleButtonId: (prop_types_default()).string,\n stateReducer: (prop_types_default()).func,\n onSelectedItemChange: (prop_types_default()).func,\n onHighlightedIndexChange: (prop_types_default()).func,\n onStateChange: (prop_types_default()).func,\n onIsOpenChange: (prop_types_default()).func,\n environment: prop_types_default().shape({\n addEventListener: (prop_types_default()).func,\n removeEventListener: (prop_types_default()).func,\n document: prop_types_default().shape({\n getElementById: (prop_types_default()).func,\n activeElement: (prop_types_default()).any,\n body: (prop_types_default()).any\n })\n })\n};\n/**\n * Default implementation for status message. Only added when menu is open.\n * Will specift if there are results in the list, and if so, how many,\n * and what keys are relevant.\n *\n * @param {Object} param the downshift state and other relevant properties\n * @return {String} the a11y status message\n */\nfunction getA11yStatusMessage(_a) {\n var isOpen = _a.isOpen, resultCount = _a.resultCount, previousResultCount = _a.previousResultCount;\n if (!isOpen) {\n return \'\';\n }\n if (!resultCount) {\n return \'No results are available.\';\n }\n if (resultCount !== previousResultCount) {\n return resultCount + " result" + (resultCount === 1 ? \' is\' : \'s are\') + " available, use up and down arrow keys to navigate. Press Enter or Space Bar keys to select.";\n }\n return \'\';\n}\nvar defaultProps$2 = __assign(__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage });\n// eslint-disable-next-line import/no-mutable-exports\nvar validatePropTypes$2 = noop;\n/* istanbul ignore next */\nif (false) {}\n\nvar MenuKeyDownArrowDown = false ? 0 : 0;\nvar MenuKeyDownArrowUp = false ? 0 : 1;\nvar MenuKeyDownEscape = false ? 0 : 2;\nvar MenuKeyDownHome = false ? 0 : 3;\nvar MenuKeyDownEnd = false ? 0 : 4;\nvar MenuKeyDownEnter = false ? 0 : 5;\nvar MenuKeyDownSpaceButton = false ? 0 : 6;\nvar MenuKeyDownCharacter = false ? 0 : 7;\nvar MenuBlur = false ? 0 : 8;\nvar MenuMouseLeave$1 = false ? 0 : 9;\nvar ItemMouseMove$1 = false ? 0 : 10;\nvar ItemClick$1 = false ? 0 : 11;\nvar ToggleButtonClick$1 = false ? 0 : 12;\nvar ToggleButtonKeyDownArrowDown = false ? 0 : 13;\nvar ToggleButtonKeyDownArrowUp = false ? 0 : 14;\nvar ToggleButtonKeyDownCharacter = false ? 0 : 15;\nvar FunctionToggleMenu$1 = false ? 0 : 16;\nvar FunctionOpenMenu$1 = false ? 0 : 17;\nvar FunctionCloseMenu$1 = false ? 0 : 18;\nvar FunctionSetHighlightedIndex$1 = false ? 0 : 19;\nvar FunctionSelectItem$1 = false ? 0 : 20;\nvar FunctionSetInputValue$1 = false ? 0 : 21;\nvar FunctionReset$2 = false ? 0 : 22;\n\nvar stateChangeTypes$2 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n MenuKeyDownArrowDown: MenuKeyDownArrowDown,\n MenuKeyDownArrowUp: MenuKeyDownArrowUp,\n MenuKeyDownEscape: MenuKeyDownEscape,\n MenuKeyDownHome: MenuKeyDownHome,\n MenuKeyDownEnd: MenuKeyDownEnd,\n MenuKeyDownEnter: MenuKeyDownEnter,\n MenuKeyDownSpaceButton: MenuKeyDownSpaceButton,\n MenuKeyDownCharacter: MenuKeyDownCharacter,\n MenuBlur: MenuBlur,\n MenuMouseLeave: MenuMouseLeave$1,\n ItemMouseMove: ItemMouseMove$1,\n ItemClick: ItemClick$1,\n ToggleButtonClick: ToggleButtonClick$1,\n ToggleButtonKeyDownArrowDown: ToggleButtonKeyDownArrowDown,\n ToggleButtonKeyDownArrowUp: ToggleButtonKeyDownArrowUp,\n ToggleButtonKeyDownCharacter: ToggleButtonKeyDownCharacter,\n FunctionToggleMenu: FunctionToggleMenu$1,\n FunctionOpenMenu: FunctionOpenMenu$1,\n FunctionCloseMenu: FunctionCloseMenu$1,\n FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1,\n FunctionSelectItem: FunctionSelectItem$1,\n FunctionSetInputValue: FunctionSetInputValue$1,\n FunctionReset: FunctionReset$2\n});\n\n/* eslint-disable complexity */\n\nfunction downshiftSelectReducer(state, action) {\n var type = action.type,\n props = action.props,\n shiftKey = action.shiftKey;\n var changes;\n\n switch (type) {\n case ItemClick$1:\n changes = {\n isOpen: getDefaultValue$1(props, \'isOpen\'),\n highlightedIndex: getDefaultValue$1(props, \'highlightedIndex\'),\n selectedItem: props.items[action.index]\n };\n break;\n\n case ToggleButtonKeyDownCharacter:\n {\n var lowercasedKey = action.key;\n var inputValue = "" + state.inputValue + lowercasedKey;\n var itemIndex = getItemIndexByCharacterKey({\n keysSoFar: inputValue,\n highlightedIndex: state.selectedItem ? props.items.indexOf(state.selectedItem) : -1,\n items: props.items,\n itemToString: props.itemToString,\n getItemNodeFromIndex: action.getItemNodeFromIndex\n });\n changes = (0,esm_extends["default"])({\n inputValue: inputValue\n }, itemIndex >= 0 && {\n selectedItem: props.items[itemIndex]\n });\n }\n break;\n\n case ToggleButtonKeyDownArrowDown:\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex),\n isOpen: true\n };\n break;\n\n case ToggleButtonKeyDownArrowUp:\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex),\n isOpen: true\n };\n break;\n\n case MenuKeyDownEnter:\n case MenuKeyDownSpaceButton:\n changes = (0,esm_extends["default"])({\n isOpen: getDefaultValue$1(props, \'isOpen\'),\n highlightedIndex: getDefaultValue$1(props, \'highlightedIndex\')\n }, state.highlightedIndex >= 0 && {\n selectedItem: props.items[state.highlightedIndex]\n });\n break;\n\n case MenuKeyDownHome:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false)\n };\n break;\n\n case MenuKeyDownEnd:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false)\n };\n break;\n\n case MenuKeyDownEscape:\n changes = {\n isOpen: false,\n highlightedIndex: -1\n };\n break;\n\n case MenuBlur:\n changes = {\n isOpen: false,\n highlightedIndex: -1\n };\n break;\n\n case MenuKeyDownCharacter:\n {\n var _lowercasedKey = action.key;\n\n var _inputValue = "" + state.inputValue + _lowercasedKey;\n\n var highlightedIndex = getItemIndexByCharacterKey({\n keysSoFar: _inputValue,\n highlightedIndex: state.highlightedIndex,\n items: props.items,\n itemToString: props.itemToString,\n getItemNodeFromIndex: action.getItemNodeFromIndex\n });\n changes = (0,esm_extends["default"])({\n inputValue: _inputValue\n }, highlightedIndex >= 0 && {\n highlightedIndex: highlightedIndex\n });\n }\n break;\n\n case MenuKeyDownArrowDown:\n changes = {\n highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation)\n };\n break;\n\n case MenuKeyDownArrowUp:\n changes = {\n highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation)\n };\n break;\n\n case FunctionSelectItem$1:\n changes = {\n selectedItem: action.selectedItem\n };\n break;\n\n default:\n return downshiftCommonReducer(state, action, stateChangeTypes$2);\n }\n\n return (0,esm_extends["default"])({}, state, changes);\n}\n/* eslint-enable complexity */\n\nvar _excluded$2 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"],\n _excluded2$2 = ["onClick", "onKeyDown", "refKey", "ref"],\n _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "refKey", "ref"];\nuseSelect.stateChangeTypes = stateChangeTypes$2;\n\nfunction useSelect(userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n\n validatePropTypes$2(userProps, useSelect); // Props defaults and destructuring.\n\n var props = (0,esm_extends["default"])({}, defaultProps$2, userProps);\n\n var items = props.items,\n scrollIntoView = props.scrollIntoView,\n environment = props.environment,\n initialIsOpen = props.initialIsOpen,\n defaultIsOpen = props.defaultIsOpen,\n itemToString = props.itemToString,\n getA11ySelectionMessage = props.getA11ySelectionMessage,\n getA11yStatusMessage = props.getA11yStatusMessage; // Initial state depending on controlled props.\n\n var initialState = getInitialState$2(props);\n\n var _useControlledReducer = useControlledReducer$1(downshiftSelectReducer, initialState, props),\n state = _useControlledReducer[0],\n dispatch = _useControlledReducer[1];\n\n var isOpen = state.isOpen,\n highlightedIndex = state.highlightedIndex,\n selectedItem = state.selectedItem,\n inputValue = state.inputValue; // Element efs.\n\n var toggleButtonRef = (0,external_React_.useRef)(null);\n var menuRef = (0,external_React_.useRef)(null);\n var itemRefs = (0,external_React_.useRef)({}); // used not to trigger menu blur action in some scenarios.\n\n var shouldBlurRef = (0,external_React_.useRef)(true); // used to keep the inputValue clearTimeout object between renders.\n\n var clearTimeoutRef = (0,external_React_.useRef)(null); // prevent id re-generation between renders.\n\n var elementIds = useElementIds(props); // used to keep track of how many items we had on previous cycle.\n\n var previousResultCountRef = (0,external_React_.useRef)();\n var isInitialMountRef = (0,external_React_.useRef)(true); // utility callback to get item element.\n\n var latest = useLatestRef({\n state: state,\n props: props\n }); // Some utils.\n\n var getItemNodeFromIndex = (0,external_React_.useCallback)(function (index) {\n return itemRefs.current[elementIds.getItemId(index)];\n }, [elementIds]); // Effects.\n // Sets a11y status message on changes in state.\n\n useA11yMessageSetter(getA11yStatusMessage, [isOpen, highlightedIndex, inputValue, items], (0,esm_extends["default"])({\n isInitialMount: isInitialMountRef.current,\n previousResultCount: previousResultCountRef.current,\n items: items,\n environment: environment,\n itemToString: itemToString\n }, state)); // Sets a11y status message on changes in selectedItem.\n\n useA11yMessageSetter(getA11ySelectionMessage, [selectedItem], (0,esm_extends["default"])({\n isInitialMount: isInitialMountRef.current,\n previousResultCount: previousResultCountRef.current,\n items: items,\n environment: environment,\n itemToString: itemToString\n }, state)); // Scroll on highlighted item if change comes from keyboard.\n\n var shouldScrollRef = useScrollIntoView({\n menuElement: menuRef.current,\n highlightedIndex: highlightedIndex,\n isOpen: isOpen,\n itemRefs: itemRefs,\n scrollIntoView: scrollIntoView,\n getItemNodeFromIndex: getItemNodeFromIndex\n }); // Sets cleanup for the keysSoFar callback, debounded after 500ms.\n\n (0,external_React_.useEffect)(function () {\n // init the clean function here as we need access to dispatch.\n clearTimeoutRef.current = debounce(function (outerDispatch) {\n outerDispatch({\n type: FunctionSetInputValue$1,\n inputValue: \'\'\n });\n }, 500); // Cancel any pending debounced calls on mount\n\n return function () {\n clearTimeoutRef.current.cancel();\n };\n }, []); // Invokes the keysSoFar callback set up above.\n\n (0,external_React_.useEffect)(function () {\n if (!inputValue) {\n return;\n }\n\n clearTimeoutRef.current(dispatch);\n }, [dispatch, inputValue]);\n useControlPropsValidator({\n isInitialMount: isInitialMountRef.current,\n props: props,\n state: state\n });\n /* Controls the focus on the menu or the toggle button. */\n\n (0,external_React_.useEffect)(function () {\n // Don\'t focus menu on first render.\n if (isInitialMountRef.current) {\n // Unless it was initialised as open.\n if ((initialIsOpen || defaultIsOpen || isOpen) && menuRef.current) {\n menuRef.current.focus();\n }\n\n return;\n } // Focus menu on open.\n\n\n if (isOpen) {\n // istanbul ignore else\n if (menuRef.current) {\n menuRef.current.focus();\n }\n\n return;\n } // Focus toggleButton on close, but not if it was closed with (Shift+)Tab.\n\n\n if (environment.document.activeElement === menuRef.current) {\n // istanbul ignore else\n if (toggleButtonRef.current) {\n shouldBlurRef.current = false;\n toggleButtonRef.current.focus();\n }\n } // eslint-disable-next-line react-hooks/exhaustive-deps\n\n }, [isOpen]);\n (0,external_React_.useEffect)(function () {\n if (isInitialMountRef.current) {\n return;\n }\n\n previousResultCountRef.current = items.length;\n }); // Add mouse/touch events to document.\n\n var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [menuRef, toggleButtonRef], environment, function () {\n dispatch({\n type: MenuBlur\n });\n });\n var setGetterPropCallInfo = useGetterPropsCalledChecker(\'getMenuProps\', \'getToggleButtonProps\'); // Make initial ref false.\n\n (0,external_React_.useEffect)(function () {\n isInitialMountRef.current = false;\n }, []); // Reset itemRefs on close.\n\n (0,external_React_.useEffect)(function () {\n if (!isOpen) {\n itemRefs.current = {};\n }\n }, [isOpen]); // Event handler functions.\n\n var toggleButtonKeyDownHandlers = (0,external_React_.useMemo)(function () {\n return {\n ArrowDown: function ArrowDown(event) {\n event.preventDefault();\n dispatch({\n type: ToggleButtonKeyDownArrowDown,\n getItemNodeFromIndex: getItemNodeFromIndex,\n shiftKey: event.shiftKey\n });\n },\n ArrowUp: function ArrowUp(event) {\n event.preventDefault();\n dispatch({\n type: ToggleButtonKeyDownArrowUp,\n getItemNodeFromIndex: getItemNodeFromIndex,\n shiftKey: event.shiftKey\n });\n }\n };\n }, [dispatch, getItemNodeFromIndex]);\n var menuKeyDownHandlers = (0,external_React_.useMemo)(function () {\n return {\n ArrowDown: function ArrowDown(event) {\n event.preventDefault();\n dispatch({\n type: MenuKeyDownArrowDown,\n getItemNodeFromIndex: getItemNodeFromIndex,\n shiftKey: event.shiftKey\n });\n },\n ArrowUp: function ArrowUp(event) {\n event.preventDefault();\n dispatch({\n type: MenuKeyDownArrowUp,\n getItemNodeFromIndex: getItemNodeFromIndex,\n shiftKey: event.shiftKey\n });\n },\n Home: function Home(event) {\n event.preventDefault();\n dispatch({\n type: MenuKeyDownHome,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n },\n End: function End(event) {\n event.preventDefault();\n dispatch({\n type: MenuKeyDownEnd,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n },\n Escape: function Escape() {\n dispatch({\n type: MenuKeyDownEscape\n });\n },\n Enter: function Enter(event) {\n event.preventDefault();\n dispatch({\n type: MenuKeyDownEnter\n });\n },\n \' \': function _(event) {\n event.preventDefault();\n dispatch({\n type: MenuKeyDownSpaceButton\n });\n }\n };\n }, [dispatch, getItemNodeFromIndex]); // Action functions.\n\n var toggleMenu = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionToggleMenu$1\n });\n }, [dispatch]);\n var closeMenu = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionCloseMenu$1\n });\n }, [dispatch]);\n var openMenu = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionOpenMenu$1\n });\n }, [dispatch]);\n var setHighlightedIndex = (0,external_React_.useCallback)(function (newHighlightedIndex) {\n dispatch({\n type: FunctionSetHighlightedIndex$1,\n highlightedIndex: newHighlightedIndex\n });\n }, [dispatch]);\n var selectItem = (0,external_React_.useCallback)(function (newSelectedItem) {\n dispatch({\n type: FunctionSelectItem$1,\n selectedItem: newSelectedItem\n });\n }, [dispatch]);\n var reset = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionReset$2\n });\n }, [dispatch]);\n var setInputValue = (0,external_React_.useCallback)(function (newInputValue) {\n dispatch({\n type: FunctionSetInputValue$1,\n inputValue: newInputValue\n });\n }, [dispatch]); // Getter functions.\n\n var getLabelProps = (0,external_React_.useCallback)(function (labelProps) {\n return (0,esm_extends["default"])({\n id: elementIds.labelId,\n htmlFor: elementIds.toggleButtonId\n }, labelProps);\n }, [elementIds]);\n var getMenuProps = (0,external_React_.useCallback)(function (_temp, _temp2) {\n var _extends2;\n\n var _ref = _temp === void 0 ? {} : _temp,\n onMouseLeave = _ref.onMouseLeave,\n _ref$refKey = _ref.refKey,\n refKey = _ref$refKey === void 0 ? \'ref\' : _ref$refKey,\n onKeyDown = _ref.onKeyDown,\n onBlur = _ref.onBlur,\n ref = _ref.ref,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref, _excluded$2);\n\n var _ref2 = _temp2 === void 0 ? {} : _temp2,\n _ref2$suppressRefErro = _ref2.suppressRefError,\n suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro;\n\n var latestState = latest.current.state;\n\n var menuHandleKeyDown = function menuHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n\n if (key && menuKeyDownHandlers[key]) {\n menuKeyDownHandlers[key](event);\n } else if (isAcceptedCharacterKey(key)) {\n dispatch({\n type: MenuKeyDownCharacter,\n key: key,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n }\n };\n\n var menuHandleBlur = function menuHandleBlur() {\n // if the blur was a result of selection, we don\'t trigger this action.\n if (shouldBlurRef.current === false) {\n shouldBlurRef.current = true;\n return;\n }\n\n var shouldBlur = !mouseAndTouchTrackersRef.current.isMouseDown;\n /* istanbul ignore else */\n\n if (shouldBlur) {\n dispatch({\n type: MenuBlur\n });\n }\n };\n\n var menuHandleMouseLeave = function menuHandleMouseLeave() {\n dispatch({\n type: MenuMouseLeave$1\n });\n };\n\n setGetterPropCallInfo(\'getMenuProps\', suppressRefError, refKey, menuRef);\n return (0,esm_extends["default"])((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) {\n menuRef.current = menuNode;\n }), _extends2.id = elementIds.menuId, _extends2.role = \'listbox\', _extends2[\'aria-labelledby\'] = elementIds.labelId, _extends2.tabIndex = -1, _extends2), latestState.isOpen && latestState.highlightedIndex > -1 && {\n \'aria-activedescendant\': elementIds.getItemId(latestState.highlightedIndex)\n }, {\n onMouseLeave: callAllEventHandlers(onMouseLeave, menuHandleMouseLeave),\n onKeyDown: callAllEventHandlers(onKeyDown, menuHandleKeyDown),\n onBlur: callAllEventHandlers(onBlur, menuHandleBlur)\n }, rest);\n }, [dispatch, latest, menuKeyDownHandlers, mouseAndTouchTrackersRef, setGetterPropCallInfo, elementIds, getItemNodeFromIndex]);\n var getToggleButtonProps = (0,external_React_.useCallback)(function (_temp3, _temp4) {\n var _extends3;\n\n var _ref3 = _temp3 === void 0 ? {} : _temp3,\n onClick = _ref3.onClick,\n onKeyDown = _ref3.onKeyDown,\n _ref3$refKey = _ref3.refKey,\n refKey = _ref3$refKey === void 0 ? \'ref\' : _ref3$refKey,\n ref = _ref3.ref,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref3, _excluded2$2);\n\n var _ref4 = _temp4 === void 0 ? {} : _temp4,\n _ref4$suppressRefErro = _ref4.suppressRefError,\n suppressRefError = _ref4$suppressRefErro === void 0 ? false : _ref4$suppressRefErro;\n\n var toggleButtonHandleClick = function toggleButtonHandleClick() {\n dispatch({\n type: ToggleButtonClick$1\n });\n };\n\n var toggleButtonHandleKeyDown = function toggleButtonHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n\n if (key && toggleButtonKeyDownHandlers[key]) {\n toggleButtonKeyDownHandlers[key](event);\n } else if (isAcceptedCharacterKey(key)) {\n dispatch({\n type: ToggleButtonKeyDownCharacter,\n key: key,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n }\n };\n\n var toggleProps = (0,esm_extends["default"])((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (toggleButtonNode) {\n toggleButtonRef.current = toggleButtonNode;\n }), _extends3.id = elementIds.toggleButtonId, _extends3[\'aria-haspopup\'] = \'listbox\', _extends3[\'aria-expanded\'] = latest.current.state.isOpen, _extends3[\'aria-labelledby\'] = elementIds.labelId + " " + elementIds.toggleButtonId, _extends3), rest);\n\n if (!rest.disabled) {\n toggleProps.onClick = callAllEventHandlers(onClick, toggleButtonHandleClick);\n toggleProps.onKeyDown = callAllEventHandlers(onKeyDown, toggleButtonHandleKeyDown);\n }\n\n setGetterPropCallInfo(\'getToggleButtonProps\', suppressRefError, refKey, toggleButtonRef);\n return toggleProps;\n }, [dispatch, latest, toggleButtonKeyDownHandlers, setGetterPropCallInfo, elementIds, getItemNodeFromIndex]);\n var getItemProps = (0,external_React_.useCallback)(function (_temp5) {\n var _extends4;\n\n var _ref5 = _temp5 === void 0 ? {} : _temp5,\n item = _ref5.item,\n index = _ref5.index,\n onMouseMove = _ref5.onMouseMove,\n onClick = _ref5.onClick,\n _ref5$refKey = _ref5.refKey,\n refKey = _ref5$refKey === void 0 ? \'ref\' : _ref5$refKey,\n ref = _ref5.ref,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref5, _excluded3$1);\n\n var _latest$current = latest.current,\n latestState = _latest$current.state,\n latestProps = _latest$current.props;\n\n var itemHandleMouseMove = function itemHandleMouseMove() {\n if (index === latestState.highlightedIndex) {\n return;\n }\n\n shouldScrollRef.current = false;\n dispatch({\n type: ItemMouseMove$1,\n index: index\n });\n };\n\n var itemHandleClick = function itemHandleClick() {\n dispatch({\n type: ItemClick$1,\n index: index\n });\n };\n\n var itemIndex = getItemIndex(index, item, latestProps.items);\n\n if (itemIndex < 0) {\n throw new Error(\'Pass either item or item index in getItemProps!\');\n }\n\n var itemProps = (0,esm_extends["default"])((_extends4 = {\n role: \'option\',\n \'aria-selected\': "" + (itemIndex === latestState.highlightedIndex),\n id: elementIds.getItemId(itemIndex)\n }, _extends4[refKey] = handleRefs(ref, function (itemNode) {\n if (itemNode) {\n itemRefs.current[elementIds.getItemId(itemIndex)] = itemNode;\n }\n }), _extends4), rest);\n\n if (!rest.disabled) {\n itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove);\n itemProps.onClick = callAllEventHandlers(onClick, itemHandleClick);\n }\n\n return itemProps;\n }, [dispatch, latest, shouldScrollRef, elementIds]);\n return {\n // prop getters.\n getToggleButtonProps: getToggleButtonProps,\n getLabelProps: getLabelProps,\n getMenuProps: getMenuProps,\n getItemProps: getItemProps,\n // actions.\n toggleMenu: toggleMenu,\n openMenu: openMenu,\n closeMenu: closeMenu,\n setHighlightedIndex: setHighlightedIndex,\n selectItem: selectItem,\n reset: reset,\n setInputValue: setInputValue,\n // state.\n highlightedIndex: highlightedIndex,\n isOpen: isOpen,\n selectedItem: selectedItem,\n inputValue: inputValue\n };\n}\n\nvar InputKeyDownArrowDown = false ? 0 : 0;\nvar InputKeyDownArrowUp = false ? 0 : 1;\nvar InputKeyDownEscape = false ? 0 : 2;\nvar InputKeyDownHome = false ? 0 : 3;\nvar InputKeyDownEnd = false ? 0 : 4;\nvar InputKeyDownEnter = false ? 0 : 5;\nvar InputChange = false ? 0 : 6;\nvar InputBlur = false ? 0 : 7;\nvar MenuMouseLeave = false ? 0 : 8;\nvar ItemMouseMove = false ? 0 : 9;\nvar ItemClick = false ? 0 : 10;\nvar ToggleButtonClick = false ? 0 : 11;\nvar FunctionToggleMenu = false ? 0 : 12;\nvar FunctionOpenMenu = false ? 0 : 13;\nvar FunctionCloseMenu = false ? 0 : 14;\nvar FunctionSetHighlightedIndex = false ? 0 : 15;\nvar FunctionSelectItem = false ? 0 : 16;\nvar FunctionSetInputValue = false ? 0 : 17;\nvar FunctionReset$1 = false ? 0 : 18;\nvar ControlledPropUpdatedSelectedItem = false ? 0 : 19;\n\nvar stateChangeTypes$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n InputKeyDownArrowDown: InputKeyDownArrowDown,\n InputKeyDownArrowUp: InputKeyDownArrowUp,\n InputKeyDownEscape: InputKeyDownEscape,\n InputKeyDownHome: InputKeyDownHome,\n InputKeyDownEnd: InputKeyDownEnd,\n InputKeyDownEnter: InputKeyDownEnter,\n InputChange: InputChange,\n InputBlur: InputBlur,\n MenuMouseLeave: MenuMouseLeave,\n ItemMouseMove: ItemMouseMove,\n ItemClick: ItemClick,\n ToggleButtonClick: ToggleButtonClick,\n FunctionToggleMenu: FunctionToggleMenu,\n FunctionOpenMenu: FunctionOpenMenu,\n FunctionCloseMenu: FunctionCloseMenu,\n FunctionSetHighlightedIndex: FunctionSetHighlightedIndex,\n FunctionSelectItem: FunctionSelectItem,\n FunctionSetInputValue: FunctionSetInputValue,\n FunctionReset: FunctionReset$1,\n ControlledPropUpdatedSelectedItem: ControlledPropUpdatedSelectedItem\n});\n\nfunction getInitialState$1(props) {\n var initialState = getInitialState$2(props);\n var selectedItem = initialState.selectedItem;\n var inputValue = initialState.inputValue;\n\n if (inputValue === \'\' && selectedItem && props.defaultInputValue === undefined && props.initialInputValue === undefined && props.inputValue === undefined) {\n inputValue = props.itemToString(selectedItem);\n }\n\n return (0,esm_extends["default"])({}, initialState, {\n inputValue: inputValue\n });\n}\n\nvar propTypes$1 = {\n items: (prop_types_default()).array.isRequired,\n itemToString: (prop_types_default()).func,\n getA11yStatusMessage: (prop_types_default()).func,\n getA11ySelectionMessage: (prop_types_default()).func,\n circularNavigation: (prop_types_default()).bool,\n highlightedIndex: (prop_types_default()).number,\n defaultHighlightedIndex: (prop_types_default()).number,\n initialHighlightedIndex: (prop_types_default()).number,\n isOpen: (prop_types_default()).bool,\n defaultIsOpen: (prop_types_default()).bool,\n initialIsOpen: (prop_types_default()).bool,\n selectedItem: (prop_types_default()).any,\n initialSelectedItem: (prop_types_default()).any,\n defaultSelectedItem: (prop_types_default()).any,\n inputValue: (prop_types_default()).string,\n defaultInputValue: (prop_types_default()).string,\n initialInputValue: (prop_types_default()).string,\n id: (prop_types_default()).string,\n labelId: (prop_types_default()).string,\n menuId: (prop_types_default()).string,\n getItemId: (prop_types_default()).func,\n inputId: (prop_types_default()).string,\n toggleButtonId: (prop_types_default()).string,\n stateReducer: (prop_types_default()).func,\n onSelectedItemChange: (prop_types_default()).func,\n onHighlightedIndexChange: (prop_types_default()).func,\n onStateChange: (prop_types_default()).func,\n onIsOpenChange: (prop_types_default()).func,\n onInputValueChange: (prop_types_default()).func,\n environment: prop_types_default().shape({\n addEventListener: (prop_types_default()).func,\n removeEventListener: (prop_types_default()).func,\n document: prop_types_default().shape({\n getElementById: (prop_types_default()).func,\n activeElement: (prop_types_default()).any,\n body: (prop_types_default()).any\n })\n })\n};\n/**\n * The useCombobox version of useControlledReducer, which also\n * checks if the controlled prop selectedItem changed between\n * renders. If so, it will also update inputValue with its\n * string equivalent. It uses the common useEnhancedReducer to\n * compute the rest of the state.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @returns {Array} An array with the state and an action dispatcher.\n */\n\nfunction useControlledReducer(reducer, initialState, props) {\n var previousSelectedItemRef = (0,external_React_.useRef)();\n\n var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props),\n state = _useEnhancedReducer[0],\n dispatch = _useEnhancedReducer[1]; // ToDo: if needed, make same approach as selectedItemChanged from Downshift.\n\n\n (0,external_React_.useEffect)(function () {\n if (isControlledProp(props, \'selectedItem\')) {\n if (previousSelectedItemRef.current !== props.selectedItem) {\n dispatch({\n type: ControlledPropUpdatedSelectedItem,\n inputValue: props.itemToString(props.selectedItem)\n });\n }\n\n previousSelectedItemRef.current = state.selectedItem === previousSelectedItemRef.current ? props.selectedItem : state.selectedItem;\n }\n });\n return [getState(state, props), dispatch];\n} // eslint-disable-next-line import/no-mutable-exports\n\n\nvar validatePropTypes$1 = noop;\n/* istanbul ignore next */\n\nif (false) {}\n\nvar defaultProps$1 = (0,esm_extends["default"])({}, defaultProps$3, {\n getA11yStatusMessage: getA11yStatusMessage$1,\n circularNavigation: true\n});\n\n/* eslint-disable complexity */\n\nfunction downshiftUseComboboxReducer(state, action) {\n var type = action.type,\n props = action.props,\n shiftKey = action.shiftKey;\n var changes;\n\n switch (type) {\n case ItemClick:\n changes = {\n isOpen: getDefaultValue$1(props, \'isOpen\'),\n highlightedIndex: getDefaultValue$1(props, \'highlightedIndex\'),\n selectedItem: props.items[action.index],\n inputValue: props.itemToString(props.items[action.index])\n };\n break;\n\n case InputKeyDownArrowDown:\n if (state.isOpen) {\n changes = {\n highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation)\n };\n } else {\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex),\n isOpen: props.items.length >= 0\n };\n }\n\n break;\n\n case InputKeyDownArrowUp:\n if (state.isOpen) {\n changes = {\n highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation)\n };\n } else {\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex),\n isOpen: props.items.length >= 0\n };\n }\n\n break;\n\n case InputKeyDownEnter:\n changes = (0,esm_extends["default"])({}, state.isOpen && state.highlightedIndex >= 0 && {\n selectedItem: props.items[state.highlightedIndex],\n isOpen: getDefaultValue$1(props, \'isOpen\'),\n highlightedIndex: getDefaultValue$1(props, \'highlightedIndex\'),\n inputValue: props.itemToString(props.items[state.highlightedIndex])\n });\n break;\n\n case InputKeyDownEscape:\n changes = (0,esm_extends["default"])({\n isOpen: false,\n highlightedIndex: -1\n }, !state.isOpen && {\n selectedItem: null,\n inputValue: \'\'\n });\n break;\n\n case InputKeyDownHome:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false)\n };\n break;\n\n case InputKeyDownEnd:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false)\n };\n break;\n\n case InputBlur:\n changes = (0,esm_extends["default"])({\n isOpen: false,\n highlightedIndex: -1\n }, state.highlightedIndex >= 0 && action.selectItem && {\n selectedItem: props.items[state.highlightedIndex],\n inputValue: props.itemToString(props.items[state.highlightedIndex])\n });\n break;\n\n case InputChange:\n changes = {\n isOpen: true,\n highlightedIndex: getDefaultValue$1(props, \'highlightedIndex\'),\n inputValue: action.inputValue\n };\n break;\n\n case FunctionSelectItem:\n changes = {\n selectedItem: action.selectedItem,\n inputValue: props.itemToString(action.selectedItem)\n };\n break;\n\n case ControlledPropUpdatedSelectedItem:\n changes = {\n inputValue: action.inputValue\n };\n break;\n\n default:\n return downshiftCommonReducer(state, action, stateChangeTypes$1);\n }\n\n return (0,esm_extends["default"])({}, state, changes);\n}\n/* eslint-enable complexity */\n\nvar _excluded$1 = ["onMouseLeave", "refKey", "ref"],\n _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onClick", "onPress"],\n _excluded3 = ["onClick", "onPress", "refKey", "ref"],\n _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "refKey", "ref"],\n _excluded5 = ["refKey", "ref"];\nuseCombobox.stateChangeTypes = stateChangeTypes$1;\n\nfunction useCombobox(userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n\n validatePropTypes$1(userProps, useCombobox); // Props defaults and destructuring.\n\n var props = (0,esm_extends["default"])({}, defaultProps$1, userProps);\n\n var initialIsOpen = props.initialIsOpen,\n defaultIsOpen = props.defaultIsOpen,\n items = props.items,\n scrollIntoView = props.scrollIntoView,\n environment = props.environment,\n getA11yStatusMessage = props.getA11yStatusMessage,\n getA11ySelectionMessage = props.getA11ySelectionMessage,\n itemToString = props.itemToString; // Initial state depending on controlled props.\n\n var initialState = getInitialState$1(props);\n\n var _useControlledReducer = useControlledReducer(downshiftUseComboboxReducer, initialState, props),\n state = _useControlledReducer[0],\n dispatch = _useControlledReducer[1];\n\n var isOpen = state.isOpen,\n highlightedIndex = state.highlightedIndex,\n selectedItem = state.selectedItem,\n inputValue = state.inputValue; // Element refs.\n\n var menuRef = (0,external_React_.useRef)(null);\n var itemRefs = (0,external_React_.useRef)({});\n var inputRef = (0,external_React_.useRef)(null);\n var toggleButtonRef = (0,external_React_.useRef)(null);\n var comboboxRef = (0,external_React_.useRef)(null);\n var isInitialMountRef = (0,external_React_.useRef)(true); // prevent id re-generation between renders.\n\n var elementIds = useElementIds(props); // used to keep track of how many items we had on previous cycle.\n\n var previousResultCountRef = (0,external_React_.useRef)(); // utility callback to get item element.\n\n var latest = useLatestRef({\n state: state,\n props: props\n });\n var getItemNodeFromIndex = (0,external_React_.useCallback)(function (index) {\n return itemRefs.current[elementIds.getItemId(index)];\n }, [elementIds]); // Effects.\n // Sets a11y status message on changes in state.\n\n useA11yMessageSetter(getA11yStatusMessage, [isOpen, highlightedIndex, inputValue, items], (0,esm_extends["default"])({\n isInitialMount: isInitialMountRef.current,\n previousResultCount: previousResultCountRef.current,\n items: items,\n environment: environment,\n itemToString: itemToString\n }, state)); // Sets a11y status message on changes in selectedItem.\n\n useA11yMessageSetter(getA11ySelectionMessage, [selectedItem], (0,esm_extends["default"])({\n isInitialMount: isInitialMountRef.current,\n previousResultCount: previousResultCountRef.current,\n items: items,\n environment: environment,\n itemToString: itemToString\n }, state)); // Scroll on highlighted item if change comes from keyboard.\n\n var shouldScrollRef = useScrollIntoView({\n menuElement: menuRef.current,\n highlightedIndex: highlightedIndex,\n isOpen: isOpen,\n itemRefs: itemRefs,\n scrollIntoView: scrollIntoView,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n useControlPropsValidator({\n isInitialMount: isInitialMountRef.current,\n props: props,\n state: state\n }); // Focus the input on first render if required.\n\n (0,external_React_.useEffect)(function () {\n var focusOnOpen = initialIsOpen || defaultIsOpen || isOpen;\n\n if (focusOnOpen && inputRef.current) {\n inputRef.current.focus();\n } // eslint-disable-next-line react-hooks/exhaustive-deps\n\n }, []);\n (0,external_React_.useEffect)(function () {\n if (isInitialMountRef.current) {\n return;\n }\n\n previousResultCountRef.current = items.length;\n }); // Add mouse/touch events to document.\n\n var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [comboboxRef, menuRef, toggleButtonRef], environment, function () {\n dispatch({\n type: InputBlur,\n selectItem: false\n });\n });\n var setGetterPropCallInfo = useGetterPropsCalledChecker(\'getInputProps\', \'getComboboxProps\', \'getMenuProps\'); // Make initial ref false.\n\n (0,external_React_.useEffect)(function () {\n isInitialMountRef.current = false;\n }, []); // Reset itemRefs on close.\n\n (0,external_React_.useEffect)(function () {\n if (!isOpen) {\n itemRefs.current = {};\n }\n }, [isOpen]);\n /* Event handler functions */\n\n var inputKeyDownHandlers = (0,external_React_.useMemo)(function () {\n return {\n ArrowDown: function ArrowDown(event) {\n event.preventDefault();\n dispatch({\n type: InputKeyDownArrowDown,\n shiftKey: event.shiftKey,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n },\n ArrowUp: function ArrowUp(event) {\n event.preventDefault();\n dispatch({\n type: InputKeyDownArrowUp,\n shiftKey: event.shiftKey,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n },\n Home: function Home(event) {\n if (!latest.current.state.isOpen) {\n return;\n }\n\n event.preventDefault();\n dispatch({\n type: InputKeyDownHome,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n },\n End: function End(event) {\n if (!latest.current.state.isOpen) {\n return;\n }\n\n event.preventDefault();\n dispatch({\n type: InputKeyDownEnd,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n },\n Escape: function Escape() {\n var latestState = latest.current.state;\n\n if (latestState.isOpen || latestState.inputValue || latestState.selectedItem || latestState.highlightedIndex > -1) {\n dispatch({\n type: InputKeyDownEscape\n });\n }\n },\n Enter: function Enter(event) {\n var latestState = latest.current.state; // if closed or no highlighted index, do nothing.\n\n if (!latestState.isOpen || latestState.highlightedIndex < 0 || event.which === 229 // if IME composing, wait for next Enter keydown event.\n ) {\n return;\n }\n\n event.preventDefault();\n dispatch({\n type: InputKeyDownEnter,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n }\n };\n }, [dispatch, latest, getItemNodeFromIndex]); // Getter props.\n\n var getLabelProps = (0,external_React_.useCallback)(function (labelProps) {\n return (0,esm_extends["default"])({\n id: elementIds.labelId,\n htmlFor: elementIds.inputId\n }, labelProps);\n }, [elementIds]);\n var getMenuProps = (0,external_React_.useCallback)(function (_temp, _temp2) {\n var _extends2;\n\n var _ref = _temp === void 0 ? {} : _temp,\n onMouseLeave = _ref.onMouseLeave,\n _ref$refKey = _ref.refKey,\n refKey = _ref$refKey === void 0 ? \'ref\' : _ref$refKey,\n ref = _ref.ref,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref, _excluded$1);\n\n var _ref2 = _temp2 === void 0 ? {} : _temp2,\n _ref2$suppressRefErro = _ref2.suppressRefError,\n suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro;\n\n setGetterPropCallInfo(\'getMenuProps\', suppressRefError, refKey, menuRef);\n return (0,esm_extends["default"])((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) {\n menuRef.current = menuNode;\n }), _extends2.id = elementIds.menuId, _extends2.role = \'listbox\', _extends2[\'aria-labelledby\'] = elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, function () {\n dispatch({\n type: MenuMouseLeave\n });\n }), _extends2), rest);\n }, [dispatch, setGetterPropCallInfo, elementIds]);\n var getItemProps = (0,external_React_.useCallback)(function (_temp3) {\n var _extends3, _ref4;\n\n var _ref3 = _temp3 === void 0 ? {} : _temp3,\n item = _ref3.item,\n index = _ref3.index,\n _ref3$refKey = _ref3.refKey,\n refKey = _ref3$refKey === void 0 ? \'ref\' : _ref3$refKey,\n ref = _ref3.ref,\n onMouseMove = _ref3.onMouseMove,\n onClick = _ref3.onClick;\n _ref3.onPress;\n var rest = (0,objectWithoutPropertiesLoose["default"])(_ref3, _excluded2$1);\n\n var _latest$current = latest.current,\n latestProps = _latest$current.props,\n latestState = _latest$current.state;\n var itemIndex = getItemIndex(index, item, latestProps.items);\n\n if (itemIndex < 0) {\n throw new Error(\'Pass either item or item index in getItemProps!\');\n }\n\n var onSelectKey = \'onClick\';\n var customClickHandler = onClick;\n\n var itemHandleMouseMove = function itemHandleMouseMove() {\n if (index === latestState.highlightedIndex) {\n return;\n }\n\n shouldScrollRef.current = false;\n dispatch({\n type: ItemMouseMove,\n index: index\n });\n };\n\n var itemHandleClick = function itemHandleClick() {\n dispatch({\n type: ItemClick,\n index: index\n });\n\n if (inputRef.current) {\n inputRef.current.focus();\n }\n };\n\n return (0,esm_extends["default"])((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (itemNode) {\n if (itemNode) {\n itemRefs.current[elementIds.getItemId(itemIndex)] = itemNode;\n }\n }), _extends3.role = \'option\', _extends3[\'aria-selected\'] = "" + (itemIndex === latestState.highlightedIndex), _extends3.id = elementIds.getItemId(itemIndex), _extends3), !rest.disabled && (_ref4 = {\n onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove)\n }, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, itemHandleClick), _ref4), rest);\n }, [dispatch, latest, shouldScrollRef, elementIds]);\n var getToggleButtonProps = (0,external_React_.useCallback)(function (_temp4) {\n var _extends4;\n\n var _ref5 = _temp4 === void 0 ? {} : _temp4,\n onClick = _ref5.onClick;\n _ref5.onPress;\n var _ref5$refKey = _ref5.refKey,\n refKey = _ref5$refKey === void 0 ? \'ref\' : _ref5$refKey,\n ref = _ref5.ref,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref5, _excluded3);\n\n var toggleButtonHandleClick = function toggleButtonHandleClick() {\n dispatch({\n type: ToggleButtonClick\n });\n\n if (!latest.current.state.isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n };\n\n return (0,esm_extends["default"])((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (toggleButtonNode) {\n toggleButtonRef.current = toggleButtonNode;\n }), _extends4.id = elementIds.toggleButtonId, _extends4.tabIndex = -1, _extends4), !rest.disabled && (0,esm_extends["default"])({}, {\n onClick: callAllEventHandlers(onClick, toggleButtonHandleClick)\n }), rest);\n }, [dispatch, latest, elementIds]);\n var getInputProps = (0,external_React_.useCallback)(function (_temp5, _temp6) {\n var _extends5;\n\n var _ref6 = _temp5 === void 0 ? {} : _temp5,\n onKeyDown = _ref6.onKeyDown,\n onChange = _ref6.onChange,\n onInput = _ref6.onInput,\n onBlur = _ref6.onBlur;\n _ref6.onChangeText;\n var _ref6$refKey = _ref6.refKey,\n refKey = _ref6$refKey === void 0 ? \'ref\' : _ref6$refKey,\n ref = _ref6.ref,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref6, _excluded4);\n\n var _ref7 = _temp6 === void 0 ? {} : _temp6,\n _ref7$suppressRefErro = _ref7.suppressRefError,\n suppressRefError = _ref7$suppressRefErro === void 0 ? false : _ref7$suppressRefErro;\n\n setGetterPropCallInfo(\'getInputProps\', suppressRefError, refKey, inputRef);\n var latestState = latest.current.state;\n\n var inputHandleKeyDown = function inputHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n\n if (key && inputKeyDownHandlers[key]) {\n inputKeyDownHandlers[key](event);\n }\n };\n\n var inputHandleChange = function inputHandleChange(event) {\n dispatch({\n type: InputChange,\n inputValue: event.target.value\n });\n };\n\n var inputHandleBlur = function inputHandleBlur() {\n /* istanbul ignore else */\n if (latestState.isOpen && !mouseAndTouchTrackersRef.current.isMouseDown) {\n dispatch({\n type: InputBlur,\n selectItem: true\n });\n }\n };\n /* istanbul ignore next (preact) */\n\n\n var onChangeKey = \'onChange\';\n var eventHandlers = {};\n\n if (!rest.disabled) {\n var _eventHandlers;\n\n eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers);\n }\n\n return (0,esm_extends["default"])((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) {\n inputRef.current = inputNode;\n }), _extends5.id = elementIds.inputId, _extends5[\'aria-autocomplete\'] = \'list\', _extends5[\'aria-controls\'] = elementIds.menuId, _extends5), latestState.isOpen && latestState.highlightedIndex > -1 && {\n \'aria-activedescendant\': elementIds.getItemId(latestState.highlightedIndex)\n }, {\n \'aria-labelledby\': elementIds.labelId,\n // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\n // revert back since autocomplete="nope" is ignored on latest Chrome and Opera\n autoComplete: \'off\',\n value: latestState.inputValue\n }, eventHandlers, rest);\n }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo, elementIds]);\n var getComboboxProps = (0,external_React_.useCallback)(function (_temp7, _temp8) {\n var _extends6;\n\n var _ref8 = _temp7 === void 0 ? {} : _temp7,\n _ref8$refKey = _ref8.refKey,\n refKey = _ref8$refKey === void 0 ? \'ref\' : _ref8$refKey,\n ref = _ref8.ref,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref8, _excluded5);\n\n var _ref9 = _temp8 === void 0 ? {} : _temp8,\n _ref9$suppressRefErro = _ref9.suppressRefError,\n suppressRefError = _ref9$suppressRefErro === void 0 ? false : _ref9$suppressRefErro;\n\n setGetterPropCallInfo(\'getComboboxProps\', suppressRefError, refKey, comboboxRef);\n return (0,esm_extends["default"])((_extends6 = {}, _extends6[refKey] = handleRefs(ref, function (comboboxNode) {\n comboboxRef.current = comboboxNode;\n }), _extends6.role = \'combobox\', _extends6[\'aria-haspopup\'] = \'listbox\', _extends6[\'aria-owns\'] = elementIds.menuId, _extends6[\'aria-expanded\'] = latest.current.state.isOpen, _extends6), rest);\n }, [latest, setGetterPropCallInfo, elementIds]); // returns\n\n var toggleMenu = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionToggleMenu\n });\n }, [dispatch]);\n var closeMenu = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionCloseMenu\n });\n }, [dispatch]);\n var openMenu = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionOpenMenu\n });\n }, [dispatch]);\n var setHighlightedIndex = (0,external_React_.useCallback)(function (newHighlightedIndex) {\n dispatch({\n type: FunctionSetHighlightedIndex,\n highlightedIndex: newHighlightedIndex\n });\n }, [dispatch]);\n var selectItem = (0,external_React_.useCallback)(function (newSelectedItem) {\n dispatch({\n type: FunctionSelectItem,\n selectedItem: newSelectedItem\n });\n }, [dispatch]);\n var setInputValue = (0,external_React_.useCallback)(function (newInputValue) {\n dispatch({\n type: FunctionSetInputValue,\n inputValue: newInputValue\n });\n }, [dispatch]);\n var reset = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionReset$1\n });\n }, [dispatch]);\n return {\n // prop getters.\n getItemProps: getItemProps,\n getLabelProps: getLabelProps,\n getMenuProps: getMenuProps,\n getInputProps: getInputProps,\n getComboboxProps: getComboboxProps,\n getToggleButtonProps: getToggleButtonProps,\n // actions.\n toggleMenu: toggleMenu,\n openMenu: openMenu,\n closeMenu: closeMenu,\n setHighlightedIndex: setHighlightedIndex,\n setInputValue: setInputValue,\n selectItem: selectItem,\n reset: reset,\n // state.\n highlightedIndex: highlightedIndex,\n isOpen: isOpen,\n selectedItem: selectedItem,\n inputValue: inputValue\n };\n}\n\nvar defaultStateValues = {\n activeIndex: -1,\n selectedItems: []\n};\n/**\n * Returns the initial value for a state key in the following order:\n * 1. controlled prop, 2. initial prop, 3. default prop, 4. default\n * value from Downshift.\n *\n * @param {Object} props Props passed to the hook.\n * @param {string} propKey Props key to generate the value for.\n * @returns {any} The initial value for that prop.\n */\n\nfunction getInitialValue(props, propKey) {\n return getInitialValue$1(props, propKey, defaultStateValues);\n}\n/**\n * Returns the default value for a state key in the following order:\n * 1. controlled prop, 2. default prop, 3. default value from Downshift.\n *\n * @param {Object} props Props passed to the hook.\n * @param {string} propKey Props key to generate the value for.\n * @returns {any} The initial value for that prop.\n */\n\n\nfunction getDefaultValue(props, propKey) {\n return getDefaultValue$1(props, propKey, defaultStateValues);\n}\n/**\n * Gets the initial state based on the provided props. It uses initial, default\n * and controlled props related to state in order to compute the initial value.\n *\n * @param {Object} props Props passed to the hook.\n * @returns {Object} The initial state.\n */\n\n\nfunction getInitialState(props) {\n var activeIndex = getInitialValue(props, \'activeIndex\');\n var selectedItems = getInitialValue(props, \'selectedItems\');\n return {\n activeIndex: activeIndex,\n selectedItems: selectedItems\n };\n}\n/**\n * Returns true if dropdown keydown operation is permitted. Should not be\n * allowed on keydown with modifier keys (ctrl, alt, shift, meta), on\n * input element with text content that is either highlighted or selection\n * cursor is not at the starting position.\n *\n * @param {KeyboardEvent} event The event from keydown.\n * @returns {boolean} Whether the operation is allowed.\n */\n\n\nfunction isKeyDownOperationPermitted(event) {\n if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {\n return false;\n }\n\n var element = event.target;\n\n if (element instanceof HTMLInputElement && // if element is a text input\n element.value !== \'\' && (element.selectionStart !== 0 || element.selectionEnd !== 0)) {\n return false;\n }\n\n return true;\n}\n/**\n * Returns a message to be added to aria-live region when item is removed.\n *\n * @param {Object} selectionParameters Parameters required to build the message.\n * @returns {string} The a11y message.\n */\n\n\nfunction getA11yRemovalMessage(selectionParameters) {\n var removedSelectedItem = selectionParameters.removedSelectedItem,\n itemToStringLocal = selectionParameters.itemToString;\n return itemToStringLocal(removedSelectedItem) + " has been removed.";\n}\n\nvar propTypes = {\n selectedItems: (prop_types_default()).array,\n initialSelectedItems: (prop_types_default()).array,\n defaultSelectedItems: (prop_types_default()).array,\n itemToString: (prop_types_default()).func,\n getA11yRemovalMessage: (prop_types_default()).func,\n stateReducer: (prop_types_default()).func,\n activeIndex: (prop_types_default()).number,\n initialActiveIndex: (prop_types_default()).number,\n defaultActiveIndex: (prop_types_default()).number,\n onActiveIndexChange: (prop_types_default()).func,\n onSelectedItemsChange: (prop_types_default()).func,\n keyNavigationNext: (prop_types_default()).string,\n keyNavigationPrevious: (prop_types_default()).string,\n environment: prop_types_default().shape({\n addEventListener: (prop_types_default()).func,\n removeEventListener: (prop_types_default()).func,\n document: prop_types_default().shape({\n getElementById: (prop_types_default()).func,\n activeElement: (prop_types_default()).any,\n body: (prop_types_default()).any\n })\n })\n};\nvar defaultProps = {\n itemToString: defaultProps$3.itemToString,\n stateReducer: defaultProps$3.stateReducer,\n environment: defaultProps$3.environment,\n getA11yRemovalMessage: getA11yRemovalMessage,\n keyNavigationNext: \'ArrowRight\',\n keyNavigationPrevious: \'ArrowLeft\'\n}; // eslint-disable-next-line import/no-mutable-exports\n\nvar validatePropTypes = noop;\n/* istanbul ignore next */\n\nif (false) {}\n\nvar SelectedItemClick = false ? 0 : 0;\nvar SelectedItemKeyDownDelete = false ? 0 : 1;\nvar SelectedItemKeyDownBackspace = false ? 0 : 2;\nvar SelectedItemKeyDownNavigationNext = false ? 0 : 3;\nvar SelectedItemKeyDownNavigationPrevious = false ? 0 : 4;\nvar DropdownKeyDownNavigationPrevious = false ? 0 : 5;\nvar DropdownKeyDownBackspace = false ? 0 : 6;\nvar DropdownClick = false ? 0 : 7;\nvar FunctionAddSelectedItem = false ? 0 : 8;\nvar FunctionRemoveSelectedItem = false ? 0 : 9;\nvar FunctionSetSelectedItems = false ? 0 : 10;\nvar FunctionSetActiveIndex = false ? 0 : 11;\nvar FunctionReset = false ? 0 : 12;\n\nvar stateChangeTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n SelectedItemClick: SelectedItemClick,\n SelectedItemKeyDownDelete: SelectedItemKeyDownDelete,\n SelectedItemKeyDownBackspace: SelectedItemKeyDownBackspace,\n SelectedItemKeyDownNavigationNext: SelectedItemKeyDownNavigationNext,\n SelectedItemKeyDownNavigationPrevious: SelectedItemKeyDownNavigationPrevious,\n DropdownKeyDownNavigationPrevious: DropdownKeyDownNavigationPrevious,\n DropdownKeyDownBackspace: DropdownKeyDownBackspace,\n DropdownClick: DropdownClick,\n FunctionAddSelectedItem: FunctionAddSelectedItem,\n FunctionRemoveSelectedItem: FunctionRemoveSelectedItem,\n FunctionSetSelectedItems: FunctionSetSelectedItems,\n FunctionSetActiveIndex: FunctionSetActiveIndex,\n FunctionReset: FunctionReset\n});\n\n/* eslint-disable complexity */\n\nfunction downshiftMultipleSelectionReducer(state, action) {\n var type = action.type,\n index = action.index,\n props = action.props,\n selectedItem = action.selectedItem;\n var activeIndex = state.activeIndex,\n selectedItems = state.selectedItems;\n var changes;\n\n switch (type) {\n case SelectedItemClick:\n changes = {\n activeIndex: index\n };\n break;\n\n case SelectedItemKeyDownNavigationPrevious:\n changes = {\n activeIndex: activeIndex - 1 < 0 ? 0 : activeIndex - 1\n };\n break;\n\n case SelectedItemKeyDownNavigationNext:\n changes = {\n activeIndex: activeIndex + 1 >= selectedItems.length ? -1 : activeIndex + 1\n };\n break;\n\n case SelectedItemKeyDownBackspace:\n case SelectedItemKeyDownDelete:\n {\n var newActiveIndex = activeIndex;\n\n if (selectedItems.length === 1) {\n newActiveIndex = -1;\n } else if (activeIndex === selectedItems.length - 1) {\n newActiveIndex = selectedItems.length - 2;\n }\n\n changes = (0,esm_extends["default"])({\n selectedItems: [].concat(selectedItems.slice(0, activeIndex), selectedItems.slice(activeIndex + 1))\n }, {\n activeIndex: newActiveIndex\n });\n break;\n }\n\n case DropdownKeyDownNavigationPrevious:\n changes = {\n activeIndex: selectedItems.length - 1\n };\n break;\n\n case DropdownKeyDownBackspace:\n changes = {\n selectedItems: selectedItems.slice(0, selectedItems.length - 1)\n };\n break;\n\n case FunctionAddSelectedItem:\n changes = {\n selectedItems: [].concat(selectedItems, [selectedItem])\n };\n break;\n\n case DropdownClick:\n changes = {\n activeIndex: -1\n };\n break;\n\n case FunctionRemoveSelectedItem:\n {\n var _newActiveIndex = activeIndex;\n var selectedItemIndex = selectedItems.indexOf(selectedItem);\n\n if (selectedItems.length === 1) {\n _newActiveIndex = -1;\n } else if (selectedItemIndex === selectedItems.length - 1) {\n _newActiveIndex = selectedItems.length - 2;\n }\n\n changes = (0,esm_extends["default"])({\n selectedItems: [].concat(selectedItems.slice(0, selectedItemIndex), selectedItems.slice(selectedItemIndex + 1))\n }, {\n activeIndex: _newActiveIndex\n });\n break;\n }\n\n case FunctionSetSelectedItems:\n {\n var newSelectedItems = action.selectedItems;\n changes = {\n selectedItems: newSelectedItems\n };\n break;\n }\n\n case FunctionSetActiveIndex:\n {\n var _newActiveIndex2 = action.activeIndex;\n changes = {\n activeIndex: _newActiveIndex2\n };\n break;\n }\n\n case FunctionReset:\n changes = {\n activeIndex: getDefaultValue(props, \'activeIndex\'),\n selectedItems: getDefaultValue(props, \'selectedItems\')\n };\n break;\n\n default:\n throw new Error(\'Reducer called without proper action type.\');\n }\n\n return (0,esm_extends["default"])({}, state, changes);\n}\n\nvar _excluded = ["refKey", "ref", "onClick", "onKeyDown", "selectedItem", "index"],\n _excluded2 = ["refKey", "ref", "onKeyDown", "onClick", "preventKeyAction"];\nuseMultipleSelection.stateChangeTypes = stateChangeTypes;\n\nfunction useMultipleSelection(userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n\n validatePropTypes(userProps, useMultipleSelection); // Props defaults and destructuring.\n\n var props = (0,esm_extends["default"])({}, defaultProps, userProps);\n\n var getA11yRemovalMessage = props.getA11yRemovalMessage,\n itemToString = props.itemToString,\n environment = props.environment,\n keyNavigationNext = props.keyNavigationNext,\n keyNavigationPrevious = props.keyNavigationPrevious; // Reducer init.\n\n var _useControlledReducer = useControlledReducer$1(downshiftMultipleSelectionReducer, getInitialState(props), props),\n state = _useControlledReducer[0],\n dispatch = _useControlledReducer[1];\n\n var activeIndex = state.activeIndex,\n selectedItems = state.selectedItems; // Refs.\n\n var isInitialMountRef = (0,external_React_.useRef)(true);\n var dropdownRef = (0,external_React_.useRef)(null);\n var previousSelectedItemsRef = (0,external_React_.useRef)(selectedItems);\n var selectedItemRefs = (0,external_React_.useRef)();\n selectedItemRefs.current = [];\n var latest = useLatestRef({\n state: state,\n props: props\n }); // Effects.\n\n /* Sets a11y status message on changes in selectedItem. */\n\n (0,external_React_.useEffect)(function () {\n if (isInitialMountRef.current) {\n return;\n }\n\n if (selectedItems.length < previousSelectedItemsRef.current.length) {\n var removedSelectedItem = previousSelectedItemsRef.current.find(function (item) {\n return selectedItems.indexOf(item) < 0;\n });\n setStatus(getA11yRemovalMessage({\n itemToString: itemToString,\n resultCount: selectedItems.length,\n removedSelectedItem: removedSelectedItem,\n activeIndex: activeIndex,\n activeSelectedItem: selectedItems[activeIndex]\n }), environment.document);\n }\n\n previousSelectedItemsRef.current = selectedItems; // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedItems.length]); // Sets focus on active item.\n\n (0,external_React_.useEffect)(function () {\n if (isInitialMountRef.current) {\n return;\n }\n\n if (activeIndex === -1 && dropdownRef.current) {\n dropdownRef.current.focus();\n } else if (selectedItemRefs.current[activeIndex]) {\n selectedItemRefs.current[activeIndex].focus();\n }\n }, [activeIndex]);\n useControlPropsValidator({\n isInitialMount: isInitialMountRef.current,\n props: props,\n state: state\n });\n var setGetterPropCallInfo = useGetterPropsCalledChecker(\'getDropdownProps\'); // Make initial ref false.\n\n (0,external_React_.useEffect)(function () {\n isInitialMountRef.current = false;\n }, []); // Event handler functions.\n\n var selectedItemKeyDownHandlers = (0,external_React_.useMemo)(function () {\n var _ref;\n\n return _ref = {}, _ref[keyNavigationPrevious] = function () {\n dispatch({\n type: SelectedItemKeyDownNavigationPrevious\n });\n }, _ref[keyNavigationNext] = function () {\n dispatch({\n type: SelectedItemKeyDownNavigationNext\n });\n }, _ref.Delete = function Delete() {\n dispatch({\n type: SelectedItemKeyDownDelete\n });\n }, _ref.Backspace = function Backspace() {\n dispatch({\n type: SelectedItemKeyDownBackspace\n });\n }, _ref;\n }, [dispatch, keyNavigationNext, keyNavigationPrevious]);\n var dropdownKeyDownHandlers = (0,external_React_.useMemo)(function () {\n var _ref2;\n\n return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) {\n if (isKeyDownOperationPermitted(event)) {\n dispatch({\n type: DropdownKeyDownNavigationPrevious\n });\n }\n }, _ref2.Backspace = function Backspace(event) {\n if (isKeyDownOperationPermitted(event)) {\n dispatch({\n type: DropdownKeyDownBackspace\n });\n }\n }, _ref2;\n }, [dispatch, keyNavigationPrevious]); // Getter props.\n\n var getSelectedItemProps = (0,external_React_.useCallback)(function (_temp) {\n var _extends2;\n\n var _ref3 = _temp === void 0 ? {} : _temp,\n _ref3$refKey = _ref3.refKey,\n refKey = _ref3$refKey === void 0 ? \'ref\' : _ref3$refKey,\n ref = _ref3.ref,\n onClick = _ref3.onClick,\n onKeyDown = _ref3.onKeyDown,\n selectedItem = _ref3.selectedItem,\n index = _ref3.index,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref3, _excluded);\n\n var latestState = latest.current.state;\n var itemIndex = getItemIndex(index, selectedItem, latestState.selectedItems);\n\n if (itemIndex < 0) {\n throw new Error(\'Pass either selectedItem or index in getSelectedItemProps!\');\n }\n\n var selectedItemHandleClick = function selectedItemHandleClick() {\n dispatch({\n type: SelectedItemClick,\n index: index\n });\n };\n\n var selectedItemHandleKeyDown = function selectedItemHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n\n if (key && selectedItemKeyDownHandlers[key]) {\n selectedItemKeyDownHandlers[key](event);\n }\n };\n\n return (0,esm_extends["default"])((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (selectedItemNode) {\n if (selectedItemNode) {\n selectedItemRefs.current.push(selectedItemNode);\n }\n }), _extends2.tabIndex = index === latestState.activeIndex ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, selectedItemHandleClick), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, selectedItemHandleKeyDown), _extends2), rest);\n }, [dispatch, latest, selectedItemKeyDownHandlers]);\n var getDropdownProps = (0,external_React_.useCallback)(function (_temp2, _temp3) {\n var _extends3;\n\n var _ref4 = _temp2 === void 0 ? {} : _temp2,\n _ref4$refKey = _ref4.refKey,\n refKey = _ref4$refKey === void 0 ? \'ref\' : _ref4$refKey,\n ref = _ref4.ref,\n onKeyDown = _ref4.onKeyDown,\n onClick = _ref4.onClick,\n _ref4$preventKeyActio = _ref4.preventKeyAction,\n preventKeyAction = _ref4$preventKeyActio === void 0 ? false : _ref4$preventKeyActio,\n rest = (0,objectWithoutPropertiesLoose["default"])(_ref4, _excluded2);\n\n var _ref5 = _temp3 === void 0 ? {} : _temp3,\n _ref5$suppressRefErro = _ref5.suppressRefError,\n suppressRefError = _ref5$suppressRefErro === void 0 ? false : _ref5$suppressRefErro;\n\n setGetterPropCallInfo(\'getDropdownProps\', suppressRefError, refKey, dropdownRef);\n\n var dropdownHandleKeyDown = function dropdownHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n\n if (key && dropdownKeyDownHandlers[key]) {\n dropdownKeyDownHandlers[key](event);\n }\n };\n\n var dropdownHandleClick = function dropdownHandleClick() {\n dispatch({\n type: DropdownClick\n });\n };\n\n return (0,esm_extends["default"])((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (dropdownNode) {\n if (dropdownNode) {\n dropdownRef.current = dropdownNode;\n }\n }), _extends3), !preventKeyAction && {\n onKeyDown: callAllEventHandlers(onKeyDown, dropdownHandleKeyDown),\n onClick: callAllEventHandlers(onClick, dropdownHandleClick)\n }, rest);\n }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]); // returns\n\n var addSelectedItem = (0,external_React_.useCallback)(function (selectedItem) {\n dispatch({\n type: FunctionAddSelectedItem,\n selectedItem: selectedItem\n });\n }, [dispatch]);\n var removeSelectedItem = (0,external_React_.useCallback)(function (selectedItem) {\n dispatch({\n type: FunctionRemoveSelectedItem,\n selectedItem: selectedItem\n });\n }, [dispatch]);\n var setSelectedItems = (0,external_React_.useCallback)(function (newSelectedItems) {\n dispatch({\n type: FunctionSetSelectedItems,\n selectedItems: newSelectedItems\n });\n }, [dispatch]);\n var setActiveIndex = (0,external_React_.useCallback)(function (newActiveIndex) {\n dispatch({\n type: FunctionSetActiveIndex,\n activeIndex: newActiveIndex\n });\n }, [dispatch]);\n var reset = (0,external_React_.useCallback)(function () {\n dispatch({\n type: FunctionReset\n });\n }, [dispatch]);\n return {\n getSelectedItemProps: getSelectedItemProps,\n getDropdownProps: getDropdownProps,\n addSelectedItem: addSelectedItem,\n removeSelectedItem: removeSelectedItem,\n setSelectedItems: setSelectedItems,\n setActiveIndex: setActiveIndex,\n reset: reset,\n selectedItems: selectedItems,\n activeIndex: activeIndex\n };\n}\n\n\n\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: external "window.wp.i18n"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: ./static/js/options/helpers/usePopoverMaker.js\nvar usePopoverMaker = __webpack_require__(9144);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-select.js\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\nconst Select = _ref => {\n var _maybeSelectedItem;\n\n let {\n value,\n option,\n option: {\n choices,\n tabletChoices,\n mobileChoices,\n placeholder,\n searchPlaceholder,\n defaultToFirstItem = true,\n search = false,\n inputClassName = \'\',\n selectInputStart,\n appendToBody = false\n },\n onInputValueChange = () => {},\n renderItemFor = item => item.value,\n onChange,\n device = \'desktop\'\n } = _ref;\n const inputRef = (0,external_window_wp_element_.useRef)(null);\n const [tempState, setTempState] = (0,external_window_wp_element_.useState)(null);\n let deviceChoices = choices;\n\n if (device === \'tablet\' && tabletChoices) {\n deviceChoices = tabletChoices;\n }\n\n if (device === \'mobile\' && mobileChoices) {\n deviceChoices = mobileChoices;\n }\n\n const orderedChoices = (0,parse_choices/* maybeTransformUnorderedChoices */.N)(deviceChoices);\n let potentialValue = value || !defaultToFirstItem ? value : parseInt(value, 10) === 0 ? value : (orderedChoices[0] || {}).key;\n const {\n styles,\n popoverProps\n } = (0,usePopoverMaker/* default */.Z)({\n ref: inputRef,\n defaultHeight: 228,\n shouldCalculate: appendToBody\n });\n (0,external_window_wp_element_.useEffect)(() => {\n if (!appendToBody) {\n return;\n }\n\n setTimeout(() => {\n setTempState(Math.round());\n }, 50);\n }, []);\n let maybeSelectedItem = orderedChoices.find(_ref2 => {\n let {\n key\n } = _ref2;\n return key === potentialValue;\n });\n\n if (!maybeSelectedItem) {\n maybeSelectedItem = orderedChoices.find(_ref3 => {\n let {\n key\n } = _ref3;\n return parseInt(key) === parseInt(potentialValue);\n });\n }\n\n return (0,external_window_wp_element_.createElement)(Downshift$1, {\n key: ((_maybeSelectedItem = maybeSelectedItem) === null || _maybeSelectedItem === void 0 ? void 0 : _maybeSelectedItem.key) || \'downshift\',\n onInputValueChange: value => {\n onInputValueChange(value);\n },\n selectedItem: maybeSelectedItem || !defaultToFirstItem ? potentialValue : (orderedChoices[0] || {}).key,\n onChange: selection => {\n onChange(selection);\n },\n itemToString: item => {\n let maybeSelectedItem = orderedChoices.find(_ref4 => {\n let {\n key\n } = _ref4;\n return key === item;\n });\n\n if (!maybeSelectedItem) {\n maybeSelectedItem = orderedChoices.find(_ref5 => {\n let {\n key\n } = _ref5;\n return parseInt(key) === parseInt(item);\n });\n }\n\n return item && maybeSelectedItem ? maybeSelectedItem.value : \'\';\n }\n }, _ref6 => {\n let {\n getInputProps,\n getItemProps,\n getLabelProps,\n getMenuProps,\n isOpen,\n inputValue,\n highlightedIndex,\n selectedItem,\n openMenu,\n toggleMenu,\n setState\n } = _ref6;\n let dropdown = null;\n\n if (isOpen) {\n dropdown = (0,external_window_wp_element_.createElement)("div", _extends({}, getMenuProps(_objectSpread({\n className: classnames_default()(\'ct-select-dropdown\', {\n \'ct-fixed\': appendToBody\n })\n }, appendToBody ? popoverProps : {})), {\n style: appendToBody ? styles : {}\n }), orderedChoices.filter(item => !inputValue || orderedChoices.find(_ref7 => {\n let {\n key\n } = _ref7;\n return key.toString() === selectedItem.toString();\n }) && orderedChoices.find(_ref8 => {\n let {\n key\n } = _ref8;\n return key.toString() === selectedItem.toString();\n }).value === inputValue || item.value.toLowerCase().includes(inputValue.toLowerCase()) || item.key.toString().toLowerCase().includes(inputValue.toString().toLowerCase())).map((item, index) => (0,external_window_wp_element_.createElement)(external_window_wp_element_.Fragment, {\n key: index\n }, item.group && (index === 0 || orderedChoices[index - 1].group !== orderedChoices[index].group) && (0,external_window_wp_element_.createElement)("div", {\n className: "ct-select-dropdown-group",\n key: `${index}-group`\n }, item.group), (0,external_window_wp_element_.createElement)("div", getItemProps({\n key: item.key,\n index,\n item: item.key,\n className: classnames_default()(\'ct-select-dropdown-item\', {\n active: highlightedIndex === index,\n selected: selectedItem === item.key\n })\n }), renderItemFor(item)))));\n\n if (appendToBody) {\n dropdown = (0,external_window_wp_element_.createPortal)(dropdown, document.body);\n }\n }\n\n return (0,external_window_wp_element_.createElement)("div", {\n className: classnames_default()(\'ct-select-input 1\', inputClassName)\n }, selectInputStart && selectInputStart(), (0,external_window_wp_element_.createElement)("input", _extends({}, getInputProps({\n onKeyDown: e => {\n if (e.key === \'ArrowDown\' && search && !isOpen) {\n setState({\n inputValue: \'\'\n });\n }\n },\n onClick: () => {\n toggleMenu();\n setTimeout(() => {\n let popover;\n\n if (appendToBody) {\n popover = document.querySelector(\'body > .ct-select-dropdown.ct-fixed .ct-select-dropdown-item.selected\');\n } else {\n popover = inputRef.current.closest(\'.ct-select-input\').querySelector(\'.ct-select-dropdown .ct-select-dropdown-item.selected\');\n }\n\n if (popover) {\n let popoverTop = popover.parentNode.getBoundingClientRect().top;\n let itemTop = popover.getBoundingClientRect().top;\n popover.parentNode.scrollTop = itemTop - popoverTop;\n }\n });\n setTimeout(() => {\n setTempState(Math.round());\n }, 50);\n\n if (search) {\n setState({\n inputValue: \'\'\n });\n }\n },\n ref: inputRef\n }), {\n placeholder: search && isOpen ? searchPlaceholder || (0,external_window_wp_i18n_.__)(\'Type to search...\', \'blocksy\') : placeholder || (0,external_window_wp_i18n_.__)(\'Select value...\', \'blocksy\'),\n readOnly: search ? !isOpen : true\n })), dropdown);\n });\n};\n\n/* harmony default export */ const ct_select = (Select);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQwNC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQThDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUN4cElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9jb21wdXRlLXNjcm9sbC1pbnRvLXZpZXcvZGlzdC9pbmRleC5tb2R1bGUuanM/MDZiNiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanM/OWFiNCIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9kb3duc2hpZnQvZGlzdC9kb3duc2hpZnQuZXNtLmpzPzMzY2UiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LXNlbGVjdC5qcz84ZTdkIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIHQodCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHQmJm51bGwhPXQmJjE9PT10Lm5vZGVUeXBlfWZ1bmN0aW9uIGUodCxlKXtyZXR1cm4oIWV8fFwiaGlkZGVuXCIhPT10KSYmXCJ2aXNpYmxlXCIhPT10JiZcImNsaXBcIiE9PXR9ZnVuY3Rpb24gbih0LG4pe2lmKHQuY2xpZW50SGVpZ2h0PHQuc2Nyb2xsSGVpZ2h0fHx0LmNsaWVudFdpZHRoPHQuc2Nyb2xsV2lkdGgpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCxudWxsKTtyZXR1cm4gZShyLm92ZXJmbG93WSxuKXx8ZShyLm92ZXJmbG93WCxuKXx8ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7aWYoIXQub3duZXJEb2N1bWVudHx8IXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldylyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIHQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnR9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSh0KTtyZXR1cm4hIWUmJihlLmNsaWVudEhlaWdodDx0LnNjcm9sbEhlaWdodHx8ZS5jbGllbnRXaWR0aDx0LnNjcm9sbFdpZHRoKX0odCl9cmV0dXJuITF9ZnVuY3Rpb24gcih0LGUsbixyLGksbyxsLGQpe3JldHVybiBvPHQmJmw+ZXx8bz50JiZsPGU/MDpvPD10JiZkPD1ufHxsPj1lJiZkPj1uP28tdC1yOmw+ZSYmZDxufHxvPHQmJmQ+bj9sLWUraTowfWV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGUsaSl7dmFyIG89d2luZG93LGw9aS5zY3JvbGxNb2RlLGQ9aS5ibG9jayx1PWkuaW5saW5lLGg9aS5ib3VuZGFyeSxhPWkuc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMsYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBoP2g6ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1ofTtpZighdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0YXJnZXRcIik7Zm9yKHZhciBmPWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxzPVtdLHA9ZTt0KHApJiZjKHApOyl7aWYoKHA9cC5wYXJlbnRFbGVtZW50KT09PWYpe3MucHVzaChwKTticmVha31udWxsIT1wJiZwPT09ZG9jdW1lbnQuYm9keSYmbihwKSYmIW4oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KXx8bnVsbCE9cCYmbihwLGEpJiZzLnB1c2gocCl9Zm9yKHZhciBtPW8udmlzdWFsVmlld3BvcnQ/by52aXN1YWxWaWV3cG9ydC53aWR0aDppbm5lcldpZHRoLGc9by52aXN1YWxWaWV3cG9ydD9vLnZpc3VhbFZpZXdwb3J0LmhlaWdodDppbm5lckhlaWdodCx3PXdpbmRvdy5zY3JvbGxYfHxwYWdlWE9mZnNldCx2PXdpbmRvdy5zY3JvbGxZfHxwYWdlWU9mZnNldCxXPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYj1XLmhlaWdodCxIPVcud2lkdGgseT1XLnRvcCxFPVcucmlnaHQsTT1XLmJvdHRvbSxWPVcubGVmdCx4PVwic3RhcnRcIj09PWR8fFwibmVhcmVzdFwiPT09ZD95OlwiZW5kXCI9PT1kP006eStiLzIsST1cImNlbnRlclwiPT09dT9WK0gvMjpcImVuZFwiPT09dT9FOlYsQz1bXSxUPTA7VDxzLmxlbmd0aDtUKyspe3ZhciBrPXNbVF0sQj1rLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEQ9Qi5oZWlnaHQsTz1CLndpZHRoLFI9Qi50b3AsWD1CLnJpZ2h0LFk9Qi5ib3R0b20sTD1CLmxlZnQ7aWYoXCJpZi1uZWVkZWRcIj09PWwmJnk+PTAmJlY+PTAmJk08PWcmJkU8PW0mJnk+PVImJk08PVkmJlY+PUwmJkU8PVgpcmV0dXJuIEM7dmFyIFM9Z2V0Q29tcHV0ZWRTdHlsZShrKSxqPXBhcnNlSW50KFMuYm9yZGVyTGVmdFdpZHRoLDEwKSxxPXBhcnNlSW50KFMuYm9yZGVyVG9wV2lkdGgsMTApLHo9cGFyc2VJbnQoUy5ib3JkZXJSaWdodFdpZHRoLDEwKSxBPXBhcnNlSW50KFMuYm9yZGVyQm90dG9tV2lkdGgsMTApLEY9MCxHPTAsSj1cIm9mZnNldFdpZHRoXCJpbiBrP2sub2Zmc2V0V2lkdGgtay5jbGllbnRXaWR0aC1qLXo6MCxLPVwib2Zmc2V0SGVpZ2h0XCJpbiBrP2sub2Zmc2V0SGVpZ2h0LWsuY2xpZW50SGVpZ2h0LXEtQTowO2lmKGY9PT1rKUY9XCJzdGFydFwiPT09ZD94OlwiZW5kXCI9PT1kP3gtZzpcIm5lYXJlc3RcIj09PWQ/cih2LHYrZyxnLHEsQSx2K3gsdit4K2IsYik6eC1nLzIsRz1cInN0YXJ0XCI9PT11P0k6XCJjZW50ZXJcIj09PXU/SS1tLzI6XCJlbmRcIj09PXU/SS1tOnIodyx3K20sbSxqLHosdytJLHcrSStILEgpLEY9TWF0aC5tYXgoMCxGK3YpLEc9TWF0aC5tYXgoMCxHK3cpO2Vsc2V7Rj1cInN0YXJ0XCI9PT1kP3gtUi1xOlwiZW5kXCI9PT1kP3gtWStBK0s6XCJuZWFyZXN0XCI9PT1kP3IoUixZLEQscSxBK0sseCx4K2IsYik6eC0oUitELzIpK0svMixHPVwic3RhcnRcIj09PXU/SS1MLWo6XCJjZW50ZXJcIj09PXU/SS0oTCtPLzIpK0ovMjpcImVuZFwiPT09dT9JLVgreitKOnIoTCxYLE8saix6K0osSSxJK0gsSCk7dmFyIE49ay5zY3JvbGxMZWZ0LFA9ay5zY3JvbGxUb3A7eCs9UC0oRj1NYXRoLm1heCgwLE1hdGgubWluKFArRixrLnNjcm9sbEhlaWdodC1EK0spKSksSSs9Ti0oRz1NYXRoLm1heCgwLE1hdGgubWluKE4rRyxrLnNjcm9sbFdpZHRoLU8rSikpKX1DLnB1c2goe2VsOmssdG9wOkYsbGVmdDpHfSl9cmV0dXJuIEN9XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tb2R1bGUuanMubWFwXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuIiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UnO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkJztcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIENvbXBvbmVudCwgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VMYXlvdXRFZmZlY3QsIHVzZVJlZHVjZXIsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0ZvcndhcmRSZWYgfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgY29tcHV0ZVNjcm9sbEludG9WaWV3IGZyb20gJ2NvbXB1dGUtc2Nyb2xsLWludG8tdmlldyc7XG5pbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gJ3RzbGliJztcblxudmFyIGlkQ291bnRlciA9IDA7XG4vKipcbiAqIEFjY2VwdHMgYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgaXQgaWYgaXQncyBhIGZ1bmN0aW9uXG4gKiBvciBhIG5vb3AgZnVuY3Rpb24gaWYgaXQncyBub3QuIFRoaXMgYWxsb3dzIHVzIHRvXG4gKiBhY2NlcHQgYSBjYWxsYmFjaywgYnV0IG5vdCB3b3JyeSBhYm91dCBpdCBpZiBpdCdzIG5vdFxuICogcGFzc2VkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgdGhlIGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gYSBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGNiVG9DYihjYikge1xuICByZXR1cm4gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IgOiBub29wO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cbi8qKlxuICogU2Nyb2xsIG5vZGUgaW50byB2aWV3IGlmIG5lY2Vzc2FyeVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSB0aGUgZWxlbWVudCB0aGF0IHNob3VsZCBzY3JvbGwgaW50byB2aWV3XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtZW51Tm9kZSB0aGUgbWVudSBlbGVtZW50IG9mIHRoZSBjb21wb25lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KG5vZGUsIG1lbnVOb2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBhY3Rpb25zID0gY29tcHV0ZVNjcm9sbEludG9WaWV3KG5vZGUsIHtcbiAgICBib3VuZGFyeTogbWVudU5vZGUsXG4gICAgYmxvY2s6ICduZWFyZXN0JyxcbiAgICBzY3JvbGxNb2RlOiAnaWYtbmVlZGVkJ1xuICB9KTtcbiAgYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGVsID0gX3JlZi5lbCxcbiAgICAgICAgdG9wID0gX3JlZi50b3AsXG4gICAgICAgIGxlZnQgPSBfcmVmLmxlZnQ7XG4gICAgZWwuc2Nyb2xsVG9wID0gdG9wO1xuICAgIGVsLnNjcm9sbExlZnQgPSBsZWZ0O1xuICB9KTtcbn1cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50IHRoZSBwYXJlbnQgbm9kZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY2hpbGQgdGhlIGNoaWxkIG5vZGVcbiAqIEBwYXJhbSB7V2luZG93fSBlbnZpcm9ubWVudCBUaGUgd2luZG93IGNvbnRleHQgd2hlcmUgZG93bnNoaWZ0IHJlbmRlcnMuXG4gKiBAcmV0dXJuIHtCb29sZWFufSB3aGV0aGVyIHRoZSBwYXJlbnQgaXMgdGhlIGNoaWxkIG9yIHRoZSBjaGlsZCBpcyBpbiB0aGUgcGFyZW50XG4gKi9cblxuXG5mdW5jdGlvbiBpc09yQ29udGFpbnNOb2RlKHBhcmVudCwgY2hpbGQsIGVudmlyb25tZW50KSB7XG4gIHZhciByZXN1bHQgPSBwYXJlbnQgPT09IGNoaWxkIHx8IGNoaWxkIGluc3RhbmNlb2YgZW52aXJvbm1lbnQuTm9kZSAmJiBwYXJlbnQuY29udGFpbnMgJiYgcGFyZW50LmNvbnRhaW5zKGNoaWxkKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogU2ltcGxlIGRlYm91bmNlIGltcGxlbWVudGF0aW9uLiBXaWxsIGNhbGwgdGhlIGdpdmVuXG4gKiBmdW5jdGlvbiBvbmNlIGFmdGVyIHRoZSB0aW1lIGdpdmVuIGhhcyBwYXNzZWQgc2luY2VcbiAqIGl0IHdhcyBsYXN0IGNhbGxlZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHRoZSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIHRoZSB0aW1lXG4gKiBAcGFyYW0ge051bWJlcn0gdGltZSB0aGUgdGltZSB0byB3YWl0XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICovXG5cblxuZnVuY3Rpb24gZGVib3VuY2UoZm4sIHRpbWUpIHtcbiAgdmFyIHRpbWVvdXRJZDtcblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgY2FuY2VsKCk7XG4gICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aW1lb3V0SWQgPSBudWxsO1xuICAgICAgZm4uYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9LCB0aW1lKTtcbiAgfVxuXG4gIHdyYXBwZXIuY2FuY2VsID0gY2FuY2VsO1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbi8qKlxuICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNvbXBvc2UgZXZlbnQgaGFuZGxlcnMuXG4gKiBUaGV5IGFyZSBleGVjdXRlZCBpbiBvcmRlciB1bnRpbCBvbmUgb2YgdGhlbSBzZXRzXG4gKiBgZXZlbnQucHJldmVudERvd25zaGlmdERlZmF1bHQgPSB0cnVlYC5cbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZucyB0aGUgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgZXZlbnQgaGFuZGxlciB0byBhZGQgdG8gYW4gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gY2FsbEFsbEV2ZW50SGFuZGxlcnMoKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgZm5zID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgZm5zW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIGFyZ3NbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgfVxuXG4gICAgcmV0dXJuIGZucy5zb21lKGZ1bmN0aW9uIChmbikge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuLmFwcGx5KHZvaWQgMCwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZlbnQucHJldmVudERvd25zaGlmdERlZmF1bHQgfHwgZXZlbnQuaGFzT3duUHJvcGVydHkoJ25hdGl2ZUV2ZW50JykgJiYgZXZlbnQubmF0aXZlRXZlbnQucHJldmVudERvd25zaGlmdERlZmF1bHQ7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlZnMoKSB7XG4gIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgcmVmcyA9IG5ldyBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgIHJlZnNbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJlZnMuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZWYobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJlZikge1xuICAgICAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG4vKipcbiAqIFRoaXMgZ2VuZXJhdGVzIGEgdW5pcXVlIElEIGZvciBhbiBpbnN0YW5jZSBvZiBEb3duc2hpZnRcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaXF1ZSBJRFxuICovXG5cblxuZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHtcbiAgcmV0dXJuIFN0cmluZyhpZENvdW50ZXIrKyk7XG59XG4vKipcbiAqIFJlc2V0cyBpZENvdW50ZXIgdG8gMC4gVXNlZCBmb3IgU1NSLlxuICovXG5cblxuZnVuY3Rpb24gcmVzZXRJZENvdW50ZXIoKSB7XG4gIGlkQ291bnRlciA9IDA7XG59XG4vKipcbiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHN0YXR1cyBtZXNzYWdlLiBPbmx5IGFkZGVkIHdoZW4gbWVudSBpcyBvcGVuLlxuICogV2lsbCBzcGVjaWZ5IGlmIHRoZXJlIGFyZSByZXN1bHRzIGluIHRoZSBsaXN0LCBhbmQgaWYgc28sIGhvdyBtYW55LFxuICogYW5kIHdoYXQga2V5cyBhcmUgcmVsZXZhbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtIHRoZSBkb3duc2hpZnQgc3RhdGUgYW5kIG90aGVyIHJlbGV2YW50IHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGExMXkgc3RhdHVzIG1lc3NhZ2VcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEExMXlTdGF0dXNNZXNzYWdlJDEoX3JlZjIpIHtcbiAgdmFyIGlzT3BlbiA9IF9yZWYyLmlzT3BlbixcbiAgICAgIHJlc3VsdENvdW50ID0gX3JlZjIucmVzdWx0Q291bnQsXG4gICAgICBwcmV2aW91c1Jlc3VsdENvdW50ID0gX3JlZjIucHJldmlvdXNSZXN1bHRDb3VudDtcblxuICBpZiAoIWlzT3Blbikge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICghcmVzdWx0Q291bnQpIHtcbiAgICByZXR1cm4gJ05vIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4nO1xuICB9XG5cbiAgaWYgKHJlc3VsdENvdW50ICE9PSBwcmV2aW91c1Jlc3VsdENvdW50KSB7XG4gICAgcmV0dXJuIHJlc3VsdENvdW50ICsgXCIgcmVzdWx0XCIgKyAocmVzdWx0Q291bnQgPT09IDEgPyAnIGlzJyA6ICdzIGFyZScpICsgXCIgYXZhaWxhYmxlLCB1c2UgdXAgYW5kIGRvd24gYXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4gUHJlc3MgRW50ZXIga2V5IHRvIHNlbGVjdC5cIjtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogVGFrZXMgYW4gYXJndW1lbnQgYW5kIGlmIGl0J3MgYW4gYXJyYXksIHJldHVybnMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgYXJndW1lbnRcbiAqIEBwYXJhbSB7Kn0gYXJnIHRoZSBtYXliZS1hcnJheVxuICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIGlmIGFyZyBpcyBmYWxzZXkgbm90IGRlZmluZWRcbiAqIEByZXR1cm4geyp9IHRoZSBhcmcgb3IgaXQncyBmaXJzdCBpdGVtXG4gKi9cblxuXG5mdW5jdGlvbiB1bndyYXBBcnJheShhcmcsIGRlZmF1bHRWYWx1ZSkge1xuICBhcmcgPSBBcnJheS5pc0FycmF5KGFyZykgP1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAocHJlYWN0KSAqL1xuICBhcmdbMF0gOiBhcmc7XG5cbiAgaWYgKCFhcmcgJiYgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXJnO1xuICB9XG59XG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IChQKXJlYWN0IGVsZW1lbnRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHdoZXRoZXIgaXQncyBhIERPTSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiBpc0RPTUVsZW1lbnQoZWxlbWVudCkge1xuXG5cbiAgcmV0dXJuIHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcnO1xufVxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAoUClyZWFjdCBlbGVtZW50XG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBwcm9wc1xuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudFByb3BzKGVsZW1lbnQpIHtcblxuICByZXR1cm4gZWxlbWVudC5wcm9wcztcbn1cbi8qKlxuICogVGhyb3dzIGEgaGVscGZ1bCBlcnJvciBtZXNzYWdlIGZvciByZXF1aXJlZCBwcm9wZXJ0aWVzLiBVc2VmdWxcbiAqIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0IGluIGRlc3RydWN0dXJpbmcgb3Igb2JqZWN0IHBhcmFtcy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBmbk5hbWUgdGhlIGZ1bmN0aW9uIG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wTmFtZSB0aGUgcHJvcCBuYW1lXG4gKi9cblxuXG5mdW5jdGlvbiByZXF1aXJlZFByb3AoZm5OYW1lLCBwcm9wTmFtZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKFwiVGhlIHByb3BlcnR5IFxcXCJcIiArIHByb3BOYW1lICsgXCJcXFwiIGlzIHJlcXVpcmVkIGluIFxcXCJcIiArIGZuTmFtZSArIFwiXFxcIlwiKTtcbn1cblxudmFyIHN0YXRlS2V5cyA9IFsnaGlnaGxpZ2h0ZWRJbmRleCcsICdpbnB1dFZhbHVlJywgJ2lzT3BlbicsICdzZWxlY3RlZEl0ZW0nLCAndHlwZSddO1xuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgdGhlIHN0YXRlIG9iamVjdFxuICogQHJldHVybiB7T2JqZWN0fSBzdGF0ZSB0aGF0IGlzIHJlbGV2YW50IHRvIGRvd25zaGlmdFxuICovXG5cbmZ1bmN0aW9uIHBpY2tTdGF0ZShzdGF0ZSkge1xuICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgIHN0YXRlID0ge307XG4gIH1cblxuICB2YXIgcmVzdWx0ID0ge307XG4gIHN0YXRlS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgaWYgKHN0YXRlLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICByZXN1bHRba10gPSBzdGF0ZVtrXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBUaGlzIHdpbGwgcGVyZm9ybSBhIHNoYWxsb3cgbWVyZ2Ugb2YgdGhlIGdpdmVuIHN0YXRlIG9iamVjdFxuICogd2l0aCB0aGUgc3RhdGUgY29taW5nIGZyb20gcHJvcHNcbiAqIChmb3IgdGhlIGNvbnRyb2xsZWQgY29tcG9uZW50IHNjZW5hcmlvKVxuICogVGhpcyBpcyB1c2VkIGluIHN0YXRlIHVwZGF0ZXIgZnVuY3Rpb25zIHNvIHRoZXkncmUgcmVmZXJlbmNpbmdcbiAqIHRoZSByaWdodCBzdGF0ZSByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGNvbWVzIGZyb20uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIFRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50L2hvb2suXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BzIHRoYXQgbWF5IGNvbnRhaW4gY29udHJvbGxlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgbWVyZ2VkIGNvbnRyb2xsZWQgc3RhdGUuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTdGF0ZShzdGF0ZSwgcHJvcHMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHN0YXRlKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXZTdGF0ZSwga2V5KSB7XG4gICAgcHJldlN0YXRlW2tleV0gPSBpc0NvbnRyb2xsZWRQcm9wKHByb3BzLCBrZXkpID8gcHJvcHNba2V5XSA6IHN0YXRlW2tleV07XG4gICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgfSwge30pO1xufVxuLyoqXG4gKiBUaGlzIGRldGVybWluZXMgd2hldGhlciBhIHByb3AgaXMgYSBcImNvbnRyb2xsZWQgcHJvcFwiIG1lYW5pbmcgaXQgaXNcbiAqIHN0YXRlIHdoaWNoIGlzIGNvbnRyb2xsZWQgYnkgdGhlIG91dHNpZGUgb2YgdGhpcyBjb21wb25lbnQgcmF0aGVyXG4gKiB0aGFuIHdpdGhpbiB0aGlzIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIHByb3BzIHRoYXQgbWF5IGNvbnRhaW4gY29udHJvbGxlZCB2YWx1ZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHdoZXRoZXIgaXQgaXMgYSBjb250cm9sbGVkIGNvbnRyb2xsZWQgcHJvcFxuICovXG5cblxuZnVuY3Rpb24gaXNDb250cm9sbGVkUHJvcChwcm9wcywga2V5KSB7XG4gIHJldHVybiBwcm9wc1trZXldICE9PSB1bmRlZmluZWQ7XG59XG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlICdrZXknIHByb3BlcnR5IG9mIGEgS2V5Ym9hcmRFdmVudCBpbiBJRS9FZGdlXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgYSBrZXlib2FyZEV2ZW50IG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBrZXlib2FyZCBrZXlcbiAqL1xuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycm93S2V5KGV2ZW50KSB7XG4gIHZhciBrZXkgPSBldmVudC5rZXksXG4gICAgICBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKGllKSAqL1xuXG4gIGlmIChrZXlDb2RlID49IDM3ICYmIGtleUNvZGUgPD0gNDAgJiYga2V5LmluZGV4T2YoJ0Fycm93JykgIT09IDApIHtcbiAgICByZXR1cm4gXCJBcnJvd1wiICsga2V5O1xuICB9XG5cbiAgcmV0dXJuIGtleTtcbn1cbi8qKlxuICogU2ltcGxlIGNoZWNrIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb2JqZWN0IGxpdGVyYWxcbiAqIEBwYXJhbSB7Kn0gb2JqIGFueSB0aGluZ3NcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHdoZXRoZXIgaXQncyBvYmplY3QgbGl0ZXJhbFxuICovXG5cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbmV3IGluZGV4IGluIHRoZSBsaXN0LCBpbiBhIGNpcmN1bGFyIHdheS4gSWYgbmV4dCB2YWx1ZSBpcyBvdXQgb2YgYm9uZHMgZnJvbSB0aGUgdG90YWwsXG4gKiBpdCB3aWxsIHdyYXAgdG8gZWl0aGVyIDAgb3IgaXRlbUNvdW50IC0gMS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbW92ZUFtb3VudCBOdW1iZXIgb2YgcG9zaXRpb25zIHRvIG1vdmUuIE5lZ2F0aXZlIHRvIG1vdmUgYmFja3dhcmRzLCBwb3NpdGl2ZSBmb3J3YXJkcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlSW5kZXggVGhlIGluaXRpYWwgcG9zaXRpb24gdG8gbW92ZSBmcm9tLlxuICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1Db3VudCBUaGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0SXRlbU5vZGVGcm9tSW5kZXggVXNlZCB0byBjaGVjayBpZiBpdGVtIGlzIGRpc2FibGVkLlxuICogQHBhcmFtIHtib29sZWFufSBjaXJjdWxhciBTcGVjaWZ5IGlmIG5hdmlnYXRpb24gaXMgY2lyY3VsYXIuIERlZmF1bHQgaXMgdHJ1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBuZXcgaW5kZXggYWZ0ZXIgdGhlIG1vdmUuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXROZXh0V3JhcHBpbmdJbmRleChtb3ZlQW1vdW50LCBiYXNlSW5kZXgsIGl0ZW1Db3VudCwgZ2V0SXRlbU5vZGVGcm9tSW5kZXgsIGNpcmN1bGFyKSB7XG4gIGlmIChjaXJjdWxhciA9PT0gdm9pZCAwKSB7XG4gICAgY2lyY3VsYXIgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGl0ZW1Db3VudCA9PT0gMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHZhciBpdGVtc0xhc3RJbmRleCA9IGl0ZW1Db3VudCAtIDE7XG5cbiAgaWYgKHR5cGVvZiBiYXNlSW5kZXggIT09ICdudW1iZXInIHx8IGJhc2VJbmRleCA8IDAgfHwgYmFzZUluZGV4ID49IGl0ZW1Db3VudCkge1xuICAgIGJhc2VJbmRleCA9IG1vdmVBbW91bnQgPiAwID8gLTEgOiBpdGVtc0xhc3RJbmRleCArIDE7XG4gIH1cblxuICB2YXIgbmV3SW5kZXggPSBiYXNlSW5kZXggKyBtb3ZlQW1vdW50O1xuXG4gIGlmIChuZXdJbmRleCA8IDApIHtcbiAgICBuZXdJbmRleCA9IGNpcmN1bGFyID8gaXRlbXNMYXN0SW5kZXggOiAwO1xuICB9IGVsc2UgaWYgKG5ld0luZGV4ID4gaXRlbXNMYXN0SW5kZXgpIHtcbiAgICBuZXdJbmRleCA9IGNpcmN1bGFyID8gMCA6IGl0ZW1zTGFzdEluZGV4O1xuICB9XG5cbiAgdmFyIG5vbkRpc2FibGVkTmV3SW5kZXggPSBnZXROZXh0Tm9uRGlzYWJsZWRJbmRleChtb3ZlQW1vdW50LCBuZXdJbmRleCwgaXRlbUNvdW50LCBnZXRJdGVtTm9kZUZyb21JbmRleCwgY2lyY3VsYXIpO1xuXG4gIGlmIChub25EaXNhYmxlZE5ld0luZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBiYXNlSW5kZXggPj0gaXRlbUNvdW50ID8gLTEgOiBiYXNlSW5kZXg7XG4gIH1cblxuICByZXR1cm4gbm9uRGlzYWJsZWROZXdJbmRleDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbmV4dCBpbmRleCBpbiB0aGUgbGlzdCBvZiBhbiBpdGVtIHRoYXQgaXMgbm90IGRpc2FibGVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtb3ZlQW1vdW50IE51bWJlciBvZiBwb3NpdGlvbnMgdG8gbW92ZS4gTmVnYXRpdmUgdG8gbW92ZSBiYWNrd2FyZHMsIHBvc2l0aXZlIGZvcndhcmRzLlxuICogQHBhcmFtIHtudW1iZXJ9IGJhc2VJbmRleCBUaGUgaW5pdGlhbCBwb3NpdGlvbiB0byBtb3ZlIGZyb20uXG4gKiBAcGFyYW0ge251bWJlcn0gaXRlbUNvdW50IFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRJdGVtTm9kZUZyb21JbmRleCBVc2VkIHRvIGNoZWNrIGlmIGl0ZW0gaXMgZGlzYWJsZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNpcmN1bGFyIFNwZWNpZnkgaWYgbmF2aWdhdGlvbiBpcyBjaXJjdWxhci4gRGVmYXVsdCBpcyB0cnVlLlxuICogQHJldHVybnMge251bWJlcn0gVGhlIG5ldyBpbmRleC4gUmV0dXJucyBiYXNlSW5kZXggaWYgaXRlbSBpcyBub3QgZGlzYWJsZWQuIFJldHVybnMgbmV4dCBub24tZGlzYWJsZWQgaXRlbSBvdGhlcndpc2UuIElmIG5vIG5vbi1kaXNhYmxlZCBmb3VuZCBpdCB3aWxsIHJldHVybiAtMS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE5leHROb25EaXNhYmxlZEluZGV4KG1vdmVBbW91bnQsIGJhc2VJbmRleCwgaXRlbUNvdW50LCBnZXRJdGVtTm9kZUZyb21JbmRleCwgY2lyY3VsYXIpIHtcbiAgdmFyIGN1cnJlbnRFbGVtZW50Tm9kZSA9IGdldEl0ZW1Ob2RlRnJvbUluZGV4KGJhc2VJbmRleCk7XG5cbiAgaWYgKCFjdXJyZW50RWxlbWVudE5vZGUgfHwgIWN1cnJlbnRFbGVtZW50Tm9kZS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICByZXR1cm4gYmFzZUluZGV4O1xuICB9XG5cbiAgaWYgKG1vdmVBbW91bnQgPiAwKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSBiYXNlSW5kZXggKyAxOyBpbmRleCA8IGl0ZW1Db3VudDsgaW5kZXgrKykge1xuICAgICAgaWYgKCFnZXRJdGVtTm9kZUZyb21JbmRleChpbmRleCkuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2luZGV4ID0gYmFzZUluZGV4IC0gMTsgX2luZGV4ID49IDA7IF9pbmRleC0tKSB7XG4gICAgICBpZiAoIWdldEl0ZW1Ob2RlRnJvbUluZGV4KF9pbmRleCkuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgIHJldHVybiBfaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNpcmN1bGFyKSB7XG4gICAgcmV0dXJuIG1vdmVBbW91bnQgPiAwID8gZ2V0TmV4dE5vbkRpc2FibGVkSW5kZXgoMSwgMCwgaXRlbUNvdW50LCBnZXRJdGVtTm9kZUZyb21JbmRleCwgZmFsc2UpIDogZ2V0TmV4dE5vbkRpc2FibGVkSW5kZXgoLTEsIGl0ZW1Db3VudCAtIDEsIGl0ZW1Db3VudCwgZ2V0SXRlbU5vZGVGcm9tSW5kZXgsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGV2ZW50IHRhcmdldCBpcyB3aXRoaW4gdGhlIGRvd25zaGlmdCBlbGVtZW50cy5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXQgVGFyZ2V0IHRvIGNoZWNrLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBkb3duc2hpZnRFbGVtZW50cyBUaGUgZWxlbWVudHMgdGhhdCBmb3JtIGRvd25zaGlmdCAobGlzdCwgdG9nZ2xlIGJ1dHRvbiBldGMpLlxuICogQHBhcmFtIHtXaW5kb3d9IGVudmlyb25tZW50IFRoZSB3aW5kb3cgY29udGV4dCB3aGVyZSBkb3duc2hpZnQgcmVuZGVycy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tBY3RpdmVFbGVtZW50IFdoZXRoZXIgdG8gYWxzbyBjaGVjayBhY3RpdmVFbGVtZW50LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGlzIHdpdGhpbiBkb3duc2hpZnQgZWxlbWVudHMuXG4gKi9cblxuXG5mdW5jdGlvbiB0YXJnZXRXaXRoaW5Eb3duc2hpZnQodGFyZ2V0LCBkb3duc2hpZnRFbGVtZW50cywgZW52aXJvbm1lbnQsIGNoZWNrQWN0aXZlRWxlbWVudCkge1xuICBpZiAoY2hlY2tBY3RpdmVFbGVtZW50ID09PSB2b2lkIDApIHtcbiAgICBjaGVja0FjdGl2ZUVsZW1lbnQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGRvd25zaGlmdEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGNvbnRleHROb2RlKSB7XG4gICAgcmV0dXJuIGNvbnRleHROb2RlICYmIChpc09yQ29udGFpbnNOb2RlKGNvbnRleHROb2RlLCB0YXJnZXQsIGVudmlyb25tZW50KSB8fCBjaGVja0FjdGl2ZUVsZW1lbnQgJiYgaXNPckNvbnRhaW5zTm9kZShjb250ZXh0Tm9kZSwgZW52aXJvbm1lbnQuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCwgZW52aXJvbm1lbnQpKTtcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5cblxudmFyIHZhbGlkYXRlQ29udHJvbGxlZFVuY2hhbmdlZCA9IG5vb3A7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YWxpZGF0ZUNvbnRyb2xsZWRVbmNoYW5nZWQgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbnRyb2xsZWRVbmNoYW5nZWQoc3RhdGUsIHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gICAgdmFyIHdhcm5pbmdEZXNjcmlwdGlvbiA9IFwiVGhpcyBwcm9wIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gY29udHJvbGxlZCB0byB1bmNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIERvd25zaGlmdCBlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2dpdGh1Yi5jb20vZG93bnNoaWZ0LWpzL2Rvd25zaGlmdCNjb250cm9sLXByb3BzXCI7XG4gICAgT2JqZWN0LmtleXMoc3RhdGUpLmZvckVhY2goZnVuY3Rpb24gKHByb3BLZXkpIHtcbiAgICAgIGlmIChwcmV2UHJvcHNbcHJvcEtleV0gIT09IHVuZGVmaW5lZCAmJiBuZXh0UHJvcHNbcHJvcEtleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKFwiZG93bnNoaWZ0OiBBIGNvbXBvbmVudCBoYXMgY2hhbmdlZCB0aGUgY29udHJvbGxlZCBwcm9wIFxcXCJcIiArIHByb3BLZXkgKyBcIlxcXCIgdG8gYmUgdW5jb250cm9sbGVkLiBcIiArIHdhcm5pbmdEZXNjcmlwdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKHByZXZQcm9wc1twcm9wS2V5XSA9PT0gdW5kZWZpbmVkICYmIG5leHRQcm9wc1twcm9wS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJkb3duc2hpZnQ6IEEgY29tcG9uZW50IGhhcyBjaGFuZ2VkIHRoZSB1bmNvbnRyb2xsZWQgcHJvcCBcXFwiXCIgKyBwcm9wS2V5ICsgXCJcXFwiIHRvIGJlIGNvbnRyb2xsZWQuIFwiICsgd2FybmluZ0Rlc2NyaXB0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn1cblxudmFyIGNsZWFudXBTdGF0dXMgPSBkZWJvdW5jZShmdW5jdGlvbiAoZG9jdW1lbnRQcm9wKSB7XG4gIGdldFN0YXR1c0Rpdihkb2N1bWVudFByb3ApLnRleHRDb250ZW50ID0gJyc7XG59LCA1MDApO1xuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RhdHVzIHRoZSBzdGF0dXMgbWVzc2FnZVxuICogQHBhcmFtIHtPYmplY3R9IGRvY3VtZW50UHJvcCBkb2N1bWVudCBwYXNzZWQgYnkgdGhlIHVzZXIuXG4gKi9cblxuZnVuY3Rpb24gc2V0U3RhdHVzKHN0YXR1cywgZG9jdW1lbnRQcm9wKSB7XG4gIHZhciBkaXYgPSBnZXRTdGF0dXNEaXYoZG9jdW1lbnRQcm9wKTtcblxuICBpZiAoIXN0YXR1cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGRpdi50ZXh0Q29udGVudCA9IHN0YXR1cztcbiAgY2xlYW51cFN0YXR1cyhkb2N1bWVudFByb3ApO1xufVxuLyoqXG4gKiBHZXQgdGhlIHN0YXR1cyBub2RlIG9yIGNyZWF0ZSBpdCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICogQHBhcmFtIHtPYmplY3R9IGRvY3VtZW50UHJvcCBkb2N1bWVudCBwYXNzZWQgYnkgdGhlIHVzZXIuXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gdGhlIHN0YXR1cyBub2RlLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0U3RhdHVzRGl2KGRvY3VtZW50UHJvcCkge1xuICBpZiAoZG9jdW1lbnRQcm9wID09PSB2b2lkIDApIHtcbiAgICBkb2N1bWVudFByb3AgPSBkb2N1bWVudDtcbiAgfVxuXG4gIHZhciBzdGF0dXNEaXYgPSBkb2N1bWVudFByb3AuZ2V0RWxlbWVudEJ5SWQoJ2ExMXktc3RhdHVzLW1lc3NhZ2UnKTtcblxuICBpZiAoc3RhdHVzRGl2KSB7XG4gICAgcmV0dXJuIHN0YXR1c0RpdjtcbiAgfVxuXG4gIHN0YXR1c0RpdiA9IGRvY3VtZW50UHJvcC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc3RhdHVzRGl2LnNldEF0dHJpYnV0ZSgnaWQnLCAnYTExeS1zdGF0dXMtbWVzc2FnZScpO1xuICBzdGF0dXNEaXYuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xuICBzdGF0dXNEaXYuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAncG9saXRlJyk7XG4gIHN0YXR1c0Rpdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcmVsZXZhbnQnLCAnYWRkaXRpb25zIHRleHQnKTtcbiAgT2JqZWN0LmFzc2lnbihzdGF0dXNEaXYuc3R5bGUsIHtcbiAgICBib3JkZXI6ICcwJyxcbiAgICBjbGlwOiAncmVjdCgwIDAgMCAwKScsXG4gICAgaGVpZ2h0OiAnMXB4JyxcbiAgICBtYXJnaW46ICctMXB4JyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgcGFkZGluZzogJzAnLFxuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHdpZHRoOiAnMXB4J1xuICB9KTtcbiAgZG9jdW1lbnRQcm9wLmJvZHkuYXBwZW5kQ2hpbGQoc3RhdHVzRGl2KTtcbiAgcmV0dXJuIHN0YXR1c0Rpdjtcbn1cblxudmFyIHVua25vd24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19hdXRvY29tcGxldGVfdW5rbm93bl9fJyA6IDA7XG52YXIgbW91c2VVcCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2F1dG9jb21wbGV0ZV9tb3VzZXVwX18nIDogMTtcbnZhciBpdGVtTW91c2VFbnRlciA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2F1dG9jb21wbGV0ZV9pdGVtX21vdXNlZW50ZXJfXycgOiAyO1xudmFyIGtleURvd25BcnJvd1VwID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fYXV0b2NvbXBsZXRlX2tleWRvd25fYXJyb3dfdXBfXycgOiAzO1xudmFyIGtleURvd25BcnJvd0Rvd24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19hdXRvY29tcGxldGVfa2V5ZG93bl9hcnJvd19kb3duX18nIDogNDtcbnZhciBrZXlEb3duRXNjYXBlID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fYXV0b2NvbXBsZXRlX2tleWRvd25fZXNjYXBlX18nIDogNTtcbnZhciBrZXlEb3duRW50ZXIgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19hdXRvY29tcGxldGVfa2V5ZG93bl9lbnRlcl9fJyA6IDY7XG52YXIga2V5RG93bkhvbWUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19hdXRvY29tcGxldGVfa2V5ZG93bl9ob21lX18nIDogNztcbnZhciBrZXlEb3duRW5kID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fYXV0b2NvbXBsZXRlX2tleWRvd25fZW5kX18nIDogODtcbnZhciBjbGlja0l0ZW0gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19hdXRvY29tcGxldGVfY2xpY2tfaXRlbV9fJyA6IDk7XG52YXIgYmx1cklucHV0ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fYXV0b2NvbXBsZXRlX2JsdXJfaW5wdXRfXycgOiAxMDtcbnZhciBjaGFuZ2VJbnB1dCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2F1dG9jb21wbGV0ZV9jaGFuZ2VfaW5wdXRfXycgOiAxMTtcbnZhciBrZXlEb3duU3BhY2VCdXR0b24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19hdXRvY29tcGxldGVfa2V5ZG93bl9zcGFjZV9idXR0b25fXycgOiAxMjtcbnZhciBjbGlja0J1dHRvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2F1dG9jb21wbGV0ZV9jbGlja19idXR0b25fXycgOiAxMztcbnZhciBibHVyQnV0dG9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fYXV0b2NvbXBsZXRlX2JsdXJfYnV0dG9uX18nIDogMTQ7XG52YXIgY29udHJvbGxlZFByb3BVcGRhdGVkU2VsZWN0ZWRJdGVtID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fYXV0b2NvbXBsZXRlX2NvbnRyb2xsZWRfcHJvcF91cGRhdGVkX3NlbGVjdGVkX2l0ZW1fXycgOiAxNTtcbnZhciB0b3VjaEVuZCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2F1dG9jb21wbGV0ZV90b3VjaGVuZF9fJyA6IDE2O1xuXG52YXIgc3RhdGVDaGFuZ2VUeXBlcyQzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIHVua25vd246IHVua25vd24sXG4gIG1vdXNlVXA6IG1vdXNlVXAsXG4gIGl0ZW1Nb3VzZUVudGVyOiBpdGVtTW91c2VFbnRlcixcbiAga2V5RG93bkFycm93VXA6IGtleURvd25BcnJvd1VwLFxuICBrZXlEb3duQXJyb3dEb3duOiBrZXlEb3duQXJyb3dEb3duLFxuICBrZXlEb3duRXNjYXBlOiBrZXlEb3duRXNjYXBlLFxuICBrZXlEb3duRW50ZXI6IGtleURvd25FbnRlcixcbiAga2V5RG93bkhvbWU6IGtleURvd25Ib21lLFxuICBrZXlEb3duRW5kOiBrZXlEb3duRW5kLFxuICBjbGlja0l0ZW06IGNsaWNrSXRlbSxcbiAgYmx1cklucHV0OiBibHVySW5wdXQsXG4gIGNoYW5nZUlucHV0OiBjaGFuZ2VJbnB1dCxcbiAga2V5RG93blNwYWNlQnV0dG9uOiBrZXlEb3duU3BhY2VCdXR0b24sXG4gIGNsaWNrQnV0dG9uOiBjbGlja0J1dHRvbixcbiAgYmx1ckJ1dHRvbjogYmx1ckJ1dHRvbixcbiAgY29udHJvbGxlZFByb3BVcGRhdGVkU2VsZWN0ZWRJdGVtOiBjb250cm9sbGVkUHJvcFVwZGF0ZWRTZWxlY3RlZEl0ZW0sXG4gIHRvdWNoRW5kOiB0b3VjaEVuZFxufSk7XG5cbnZhciBfZXhjbHVkZWQkNCA9IFtcInJlZktleVwiLCBcInJlZlwiXSxcbiAgICBfZXhjbHVkZWQyJDMgPSBbXCJvbkNsaWNrXCIsIFwib25QcmVzc1wiLCBcIm9uS2V5RG93blwiLCBcIm9uS2V5VXBcIiwgXCJvbkJsdXJcIl0sXG4gICAgX2V4Y2x1ZGVkMyQyID0gW1wib25LZXlEb3duXCIsIFwib25CbHVyXCIsIFwib25DaGFuZ2VcIiwgXCJvbklucHV0XCIsIFwib25DaGFuZ2VUZXh0XCJdLFxuICAgIF9leGNsdWRlZDQkMSA9IFtcInJlZktleVwiLCBcInJlZlwiXSxcbiAgICBfZXhjbHVkZWQ1JDEgPSBbXCJvbk1vdXNlTW92ZVwiLCBcIm9uTW91c2VEb3duXCIsIFwib25DbGlja1wiLCBcIm9uUHJlc3NcIiwgXCJpbmRleFwiLCBcIml0ZW1cIl07XG5cbnZhciBEb3duc2hpZnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgRG93bnNoaWZ0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzTG9vc2UoRG93bnNoaWZ0LCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIERvd25zaGlmdChfcHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwodGhpcywgX3Byb3BzKSB8fCB0aGlzOyAvLyBmYW5jeSBkZXN0cnVjdHVyaW5nICsgZGVmYXVsdHMgKyBhbGlhc2VzXG4gICAgICAvLyB0aGlzIGJhc2ljYWxseSBzYXlzIGVhY2ggdmFsdWUgb2Ygc3RhdGUgc2hvdWxkIGVpdGhlciBiZSBzZXQgdG9cbiAgICAgIC8vIHRoZSBpbml0aWFsIHZhbHVlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIG5vdCBwcm92aWRlZFxuXG4gICAgICBfdGhpcy5pZCA9IF90aGlzLnByb3BzLmlkIHx8IFwiZG93bnNoaWZ0LVwiICsgZ2VuZXJhdGVJZCgpO1xuICAgICAgX3RoaXMubWVudUlkID0gX3RoaXMucHJvcHMubWVudUlkIHx8IF90aGlzLmlkICsgXCItbWVudVwiO1xuICAgICAgX3RoaXMubGFiZWxJZCA9IF90aGlzLnByb3BzLmxhYmVsSWQgfHwgX3RoaXMuaWQgKyBcIi1sYWJlbFwiO1xuICAgICAgX3RoaXMuaW5wdXRJZCA9IF90aGlzLnByb3BzLmlucHV0SWQgfHwgX3RoaXMuaWQgKyBcIi1pbnB1dFwiO1xuXG4gICAgICBfdGhpcy5nZXRJdGVtSWQgPSBfdGhpcy5wcm9wcy5nZXRJdGVtSWQgfHwgZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5pZCArIFwiLWl0ZW0tXCIgKyBpbmRleDtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmlucHV0ID0gbnVsbDtcbiAgICAgIF90aGlzLml0ZW1zID0gW107XG4gICAgICBfdGhpcy5pdGVtQ291bnQgPSBudWxsO1xuICAgICAgX3RoaXMucHJldmlvdXNSZXN1bHRDb3VudCA9IDA7XG4gICAgICBfdGhpcy50aW1lb3V0SWRzID0gW107XG5cbiAgICAgIF90aGlzLmludGVybmFsU2V0VGltZW91dCA9IGZ1bmN0aW9uIChmbiwgdGltZSkge1xuICAgICAgICB2YXIgaWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy50aW1lb3V0SWRzID0gX3RoaXMudGltZW91dElkcy5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpICE9PSBpZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9LCB0aW1lKTtcblxuICAgICAgICBfdGhpcy50aW1lb3V0SWRzLnB1c2goaWQpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuc2V0SXRlbUNvdW50ID0gZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgICAgIF90aGlzLml0ZW1Db3VudCA9IGNvdW50O1xuICAgICAgfTtcblxuICAgICAgX3RoaXMudW5zZXRJdGVtQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLml0ZW1Db3VudCA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4ID0gZnVuY3Rpb24gKGhpZ2hsaWdodGVkSW5kZXgsIG90aGVyU3RhdGVUb1NldCkge1xuICAgICAgICBpZiAoaGlnaGxpZ2h0ZWRJbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleCA9IF90aGlzLnByb3BzLmRlZmF1bHRIaWdobGlnaHRlZEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG90aGVyU3RhdGVUb1NldCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgb3RoZXJTdGF0ZVRvU2V0ID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlclN0YXRlVG9TZXQgPSBwaWNrU3RhdGUob3RoZXJTdGF0ZVRvU2V0KTtcblxuICAgICAgICBfdGhpcy5pbnRlcm5hbFNldFN0YXRlKF9leHRlbmRzKHtcbiAgICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBoaWdobGlnaHRlZEluZGV4XG4gICAgICAgIH0sIG90aGVyU3RhdGVUb1NldCkpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuY2xlYXJTZWxlY3Rpb24gPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgX3RoaXMuaW50ZXJuYWxTZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRJdGVtOiBudWxsLFxuICAgICAgICAgIGlucHV0VmFsdWU6ICcnLFxuICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IF90aGlzLnByb3BzLmRlZmF1bHRIaWdobGlnaHRlZEluZGV4LFxuICAgICAgICAgIGlzT3BlbjogX3RoaXMucHJvcHMuZGVmYXVsdElzT3BlblxuICAgICAgICB9LCBjYik7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5zZWxlY3RJdGVtID0gZnVuY3Rpb24gKGl0ZW0sIG90aGVyU3RhdGVUb1NldCwgY2IpIHtcbiAgICAgICAgb3RoZXJTdGF0ZVRvU2V0ID0gcGlja1N0YXRlKG90aGVyU3RhdGVUb1NldCk7XG5cbiAgICAgICAgX3RoaXMuaW50ZXJuYWxTZXRTdGF0ZShfZXh0ZW5kcyh7XG4gICAgICAgICAgaXNPcGVuOiBfdGhpcy5wcm9wcy5kZWZhdWx0SXNPcGVuLFxuICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IF90aGlzLnByb3BzLmRlZmF1bHRIaWdobGlnaHRlZEluZGV4LFxuICAgICAgICAgIHNlbGVjdGVkSXRlbTogaXRlbSxcbiAgICAgICAgICBpbnB1dFZhbHVlOiBfdGhpcy5wcm9wcy5pdGVtVG9TdHJpbmcoaXRlbSlcbiAgICAgICAgfSwgb3RoZXJTdGF0ZVRvU2V0KSwgY2IpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuc2VsZWN0SXRlbUF0SW5kZXggPSBmdW5jdGlvbiAoaXRlbUluZGV4LCBvdGhlclN0YXRlVG9TZXQsIGNiKSB7XG4gICAgICAgIHZhciBpdGVtID0gX3RoaXMuaXRlbXNbaXRlbUluZGV4XTtcblxuICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuc2VsZWN0SXRlbShpdGVtLCBvdGhlclN0YXRlVG9TZXQsIGNiKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLnNlbGVjdEhpZ2hsaWdodGVkSXRlbSA9IGZ1bmN0aW9uIChvdGhlclN0YXRlVG9TZXQsIGNiKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5zZWxlY3RJdGVtQXRJbmRleChfdGhpcy5nZXRTdGF0ZSgpLmhpZ2hsaWdodGVkSW5kZXgsIG90aGVyU3RhdGVUb1NldCwgY2IpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuaW50ZXJuYWxTZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZVRvU2V0LCBjYikge1xuICAgICAgICB2YXIgaXNJdGVtU2VsZWN0ZWQsIG9uQ2hhbmdlQXJnO1xuICAgICAgICB2YXIgb25TdGF0ZUNoYW5nZUFyZyA9IHt9O1xuICAgICAgICB2YXIgaXNTdGF0ZVRvU2V0RnVuY3Rpb24gPSB0eXBlb2Ygc3RhdGVUb1NldCA9PT0gJ2Z1bmN0aW9uJzsgLy8gd2Ugd2FudCB0byBjYWxsIGBvbklucHV0VmFsdWVDaGFuZ2VgIGJlZm9yZSB0aGUgYHNldFN0YXRlYCBjYWxsXG4gICAgICAgIC8vIHNvIHNvbWVvbmUgY29udHJvbGxpbmcgdGhlIGBpbnB1dFZhbHVlYCBzdGF0ZSBnZXRzIG5vdGlmaWVkIG9mXG4gICAgICAgIC8vIHRoZSBpbnB1dCBjaGFuZ2UgYXMgc29vbiBhcyBwb3NzaWJsZS4gVGhpcyBhdm9pZHMgaXNzdWVzIHdpdGhcbiAgICAgICAgLy8gcHJlc2VydmluZyB0aGUgY3Vyc29yIHBvc2l0aW9uLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Rvd25zaGlmdC1qcy9kb3duc2hpZnQvaXNzdWVzLzIxNyBmb3IgbW9yZSBpbmZvLlxuXG4gICAgICAgIGlmICghaXNTdGF0ZVRvU2V0RnVuY3Rpb24gJiYgc3RhdGVUb1NldC5oYXNPd25Qcm9wZXJ0eSgnaW5wdXRWYWx1ZScpKSB7XG4gICAgICAgICAgX3RoaXMucHJvcHMub25JbnB1dFZhbHVlQ2hhbmdlKHN0YXRlVG9TZXQuaW5wdXRWYWx1ZSwgX2V4dGVuZHMoe30sIF90aGlzLmdldFN0YXRlQW5kSGVscGVycygpLCBzdGF0ZVRvU2V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgICAgc3RhdGUgPSBfdGhpcy5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgdmFyIG5ld1N0YXRlVG9TZXQgPSBpc1N0YXRlVG9TZXRGdW5jdGlvbiA/IHN0YXRlVG9TZXQoc3RhdGUpIDogc3RhdGVUb1NldDsgLy8gWW91ciBvd24gZnVuY3Rpb24gdGhhdCBjb3VsZCBtb2RpZnkgdGhlIHN0YXRlIHRoYXQgd2lsbCBiZSBzZXQuXG5cbiAgICAgICAgICBuZXdTdGF0ZVRvU2V0ID0gX3RoaXMucHJvcHMuc3RhdGVSZWR1Y2VyKHN0YXRlLCBuZXdTdGF0ZVRvU2V0KTsgLy8gY2hlY2tzIGlmIGFuIGl0ZW0gaXMgc2VsZWN0ZWQsIHJlZ2FyZGxlc3Mgb2YgaWYgaXQncyBkaWZmZXJlbnQgZnJvbVxuICAgICAgICAgIC8vIHdoYXQgd2FzIHNlbGVjdGVkIGJlZm9yZVxuICAgICAgICAgIC8vIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIG9uU2VsZWN0IGFuZCBvbkNoYW5nZSBjYWxsYmFja3Mgc2hvdWxkIGJlIGNhbGxlZFxuXG4gICAgICAgICAgaXNJdGVtU2VsZWN0ZWQgPSBuZXdTdGF0ZVRvU2V0Lmhhc093blByb3BlcnR5KCdzZWxlY3RlZEl0ZW0nKTsgLy8gdGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb2JqZWN0IHdlIHdhbnQgdG8gY2FsbCB3aXRoIHNldFN0YXRlXG5cbiAgICAgICAgICB2YXIgbmV4dFN0YXRlID0ge307IC8vIHRoaXMgaXMganVzdCB1c2VkIHRvIHRlbGwgd2hldGhlciB0aGUgc3RhdGUgY2hhbmdlZFxuXG4gICAgICAgICAgdmFyIG5leHRGdWxsU3RhdGUgPSB7fTsgLy8gd2UgbmVlZCB0byBjYWxsIG9uIGNoYW5nZSBpZiB0aGUgb3V0c2lkZSB3b3JsZCBpcyBjb250cm9sbGluZyBhbnkgb2Ygb3VyIHN0YXRlXG4gICAgICAgICAgLy8gYW5kIHdlJ3JlIHRyeWluZyB0byB1cGRhdGUgdGhhdCBzdGF0ZS4gT1IgaWYgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBhbmQgd2UncmVcbiAgICAgICAgICAvLyB0cnlpbmcgdG8gdXBkYXRlIHRoZSBzZWxlY3Rpb25cblxuICAgICAgICAgIGlmIChpc0l0ZW1TZWxlY3RlZCAmJiBuZXdTdGF0ZVRvU2V0LnNlbGVjdGVkSXRlbSAhPT0gc3RhdGUuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICBvbkNoYW5nZUFyZyA9IG5ld1N0YXRlVG9TZXQuc2VsZWN0ZWRJdGVtO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld1N0YXRlVG9TZXQudHlwZSA9IG5ld1N0YXRlVG9TZXQudHlwZSB8fCB1bmtub3duO1xuICAgICAgICAgIE9iamVjdC5rZXlzKG5ld1N0YXRlVG9TZXQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgLy8gb25TdGF0ZUNoYW5nZUFyZyBzaG91bGQgb25seSBoYXZlIHRoZSBzdGF0ZSB0aGF0IGlzXG4gICAgICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2luZ1xuICAgICAgICAgICAgaWYgKHN0YXRlW2tleV0gIT09IG5ld1N0YXRlVG9TZXRba2V5XSkge1xuICAgICAgICAgICAgICBvblN0YXRlQ2hhbmdlQXJnW2tleV0gPSBuZXdTdGF0ZVRvU2V0W2tleV07XG4gICAgICAgICAgICB9IC8vIHRoZSB0eXBlIGlzIHVzZWZ1bCBmb3IgdGhlIG9uU3RhdGVDaGFuZ2VBcmdcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSBkb24ndCBhY3R1YWxseSB3YW50IHRvIHNldCBpdCBpbiBpbnRlcm5hbCBzdGF0ZS5cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gdW5kb2N1bWVudGVkIGZlYXR1cmUgZm9yIG5vdy4uLiBOb3QgYWxsIGludGVybmFsU2V0U3RhdGVcbiAgICAgICAgICAgIC8vIGNhbGxzIHN1cHBvcnQgaXQgYW5kIEknbSBub3QgY2VydGFpbiB3ZSB3YW50IHRoZW0gdG8geWV0LlxuICAgICAgICAgICAgLy8gQnV0IGl0IGVuYWJsZXMgdXNlcnMgY29udHJvbGxpbmcgdGhlIGlzT3BlbiBzdGF0ZSB0byBrbm93IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSBpc09wZW4gc3RhdGUgY2hhbmdlcyBkdWUgdG8gbW91c2V1cCBldmVudHMgd2hpY2ggaXMgcXVpdGUgaGFuZHkuXG5cblxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV4dEZ1bGxTdGF0ZVtrZXldID0gbmV3U3RhdGVUb1NldFtrZXldOyAvLyBpZiBpdCdzIGNvbWluZyBmcm9tIHByb3BzLCB0aGVuIHdlIGRvbid0IGNhcmUgdG8gc2V0IGl0IGludGVybmFsbHlcblxuICAgICAgICAgICAgaWYgKCFpc0NvbnRyb2xsZWRQcm9wKF90aGlzLnByb3BzLCBrZXkpKSB7XG4gICAgICAgICAgICAgIG5leHRTdGF0ZVtrZXldID0gbmV3U3RhdGVUb1NldFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pOyAvLyBpZiBzdGF0ZVRvU2V0IGlzIGEgZnVuY3Rpb24sIHRoZW4gd2Ugd2VyZW4ndCBhYmxlIHRvIGNhbGwgb25JbnB1dFZhbHVlQ2hhbmdlXG4gICAgICAgICAgLy8gZWFybGllciwgc28gd2UnbGwgY2FsbCBpdCBub3cgdGhhdCB3ZSBrbm93IHdoYXQgdGhlIGlucHV0VmFsdWUgc3RhdGUgd2lsbCBiZS5cblxuICAgICAgICAgIGlmIChpc1N0YXRlVG9TZXRGdW5jdGlvbiAmJiBuZXdTdGF0ZVRvU2V0Lmhhc093blByb3BlcnR5KCdpbnB1dFZhbHVlJykpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uSW5wdXRWYWx1ZUNoYW5nZShuZXdTdGF0ZVRvU2V0LmlucHV0VmFsdWUsIF9leHRlbmRzKHt9LCBfdGhpcy5nZXRTdGF0ZUFuZEhlbHBlcnMoKSwgbmV3U3RhdGVUb1NldCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBjYWxsIHRoZSBwcm92aWRlZCBjYWxsYmFjayBpZiBpdCdzIGEgZnVuY3Rpb25cbiAgICAgICAgICBjYlRvQ2IoY2IpKCk7IC8vIG9ubHkgY2FsbCB0aGUgb25TdGF0ZUNoYW5nZSBhbmQgb25DaGFuZ2UgY2FsbGJhY2tzIGlmXG4gICAgICAgICAgLy8gd2UgaGF2ZSByZWxldmFudCBpbmZvcm1hdGlvbiB0byBwYXNzIHRoZW0uXG5cbiAgICAgICAgICB2YXIgaGFzTW9yZVN0YXRlVGhhblR5cGUgPSBPYmplY3Qua2V5cyhvblN0YXRlQ2hhbmdlQXJnKS5sZW5ndGggPiAxO1xuXG4gICAgICAgICAgaWYgKGhhc01vcmVTdGF0ZVRoYW5UeXBlKSB7XG4gICAgICAgICAgICBfdGhpcy5wcm9wcy5vblN0YXRlQ2hhbmdlKG9uU3RhdGVDaGFuZ2VBcmcsIF90aGlzLmdldFN0YXRlQW5kSGVscGVycygpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNJdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uU2VsZWN0KHN0YXRlVG9TZXQuc2VsZWN0ZWRJdGVtLCBfdGhpcy5nZXRTdGF0ZUFuZEhlbHBlcnMoKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9uQ2hhbmdlQXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlKG9uQ2hhbmdlQXJnLCBfdGhpcy5nZXRTdGF0ZUFuZEhlbHBlcnMoKSk7XG4gICAgICAgICAgfSAvLyB0aGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYW5kIHRoZXJlZm9yZSBzdWJqZWN0IHRvIGNoYW5nZVxuICAgICAgICAgIC8vIFdlJ2xsIHRyeSB0byBub3QgYnJlYWsgaXQsIGJ1dCBqdXN0IGJlIHdhcm5lZC5cblxuXG4gICAgICAgICAgX3RoaXMucHJvcHMub25Vc2VyQWN0aW9uKG9uU3RhdGVDaGFuZ2VBcmcsIF90aGlzLmdldFN0YXRlQW5kSGVscGVycygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5yb290UmVmID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLl9yb290Tm9kZSA9IG5vZGU7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5nZXRSb290UHJvcHMgPSBmdW5jdGlvbiAoX3RlbXAsIF90ZW1wMikge1xuICAgICAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgICAgICBfcmVmJHJlZktleSA9IF9yZWYucmVmS2V5LFxuICAgICAgICAgICAgcmVmS2V5ID0gX3JlZiRyZWZLZXkgPT09IHZvaWQgMCA/ICdyZWYnIDogX3JlZiRyZWZLZXksXG4gICAgICAgICAgICByZWYgPSBfcmVmLnJlZixcbiAgICAgICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQkNCk7XG5cbiAgICAgICAgdmFyIF9yZWYyID0gX3RlbXAyID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMixcbiAgICAgICAgICAgIF9yZWYyJHN1cHByZXNzUmVmRXJybyA9IF9yZWYyLnN1cHByZXNzUmVmRXJyb3IsXG4gICAgICAgICAgICBzdXBwcmVzc1JlZkVycm9yID0gX3JlZjIkc3VwcHJlc3NSZWZFcnJvID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJHN1cHByZXNzUmVmRXJybztcblxuICAgICAgICAvLyB0aGlzIGlzIHVzZWQgaW4gdGhlIHJlbmRlciB0byBrbm93IHdoZXRoZXIgdGhlIHVzZXIgaGFzIGNhbGxlZCBnZXRSb290UHJvcHMuXG4gICAgICAgIC8vIEl0IHVzZXMgdGhhdCB0byBrbm93IHdoZXRoZXIgdG8gYXBwbHkgdGhlIHByb3BzIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgX3RoaXMuZ2V0Um9vdFByb3BzLmNhbGxlZCA9IHRydWU7XG4gICAgICAgIF90aGlzLmdldFJvb3RQcm9wcy5yZWZLZXkgPSByZWZLZXk7XG4gICAgICAgIF90aGlzLmdldFJvb3RQcm9wcy5zdXBwcmVzc1JlZkVycm9yID0gc3VwcHJlc3NSZWZFcnJvcjtcblxuICAgICAgICB2YXIgX3RoaXMkZ2V0U3RhdGUgPSBfdGhpcy5nZXRTdGF0ZSgpLFxuICAgICAgICAgICAgaXNPcGVuID0gX3RoaXMkZ2V0U3RhdGUuaXNPcGVuO1xuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcygoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltyZWZLZXldID0gaGFuZGxlUmVmcyhyZWYsIF90aGlzLnJvb3RSZWYpLCBfZXh0ZW5kczIucm9sZSA9ICdjb21ib2JveCcsIF9leHRlbmRzMlsnYXJpYS1leHBhbmRlZCddID0gaXNPcGVuLCBfZXh0ZW5kczJbJ2FyaWEtaGFzcG9wdXAnXSA9ICdsaXN0Ym94JywgX2V4dGVuZHMyWydhcmlhLW93bnMnXSA9IGlzT3BlbiA/IF90aGlzLm1lbnVJZCA6IG51bGwsIF9leHRlbmRzMlsnYXJpYS1sYWJlbGxlZGJ5J10gPSBfdGhpcy5sYWJlbElkLCBfZXh0ZW5kczIpLCByZXN0KTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmtleURvd25IYW5kbGVycyA9IHtcbiAgICAgICAgQXJyb3dEb3duOiBmdW5jdGlvbiBBcnJvd0Rvd24oZXZlbnQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5nZXRTdGF0ZSgpLmlzT3Blbikge1xuICAgICAgICAgICAgdmFyIGFtb3VudCA9IGV2ZW50LnNoaWZ0S2V5ID8gNSA6IDE7XG4gICAgICAgICAgICB0aGlzLm1vdmVIaWdobGlnaHRlZEluZGV4KGFtb3VudCwge1xuICAgICAgICAgICAgICB0eXBlOiBrZXlEb3duQXJyb3dEb3duXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNldFN0YXRlKHtcbiAgICAgICAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICAgICAgICB0eXBlOiBrZXlEb3duQXJyb3dEb3duXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBpdGVtQ291bnQgPSBfdGhpczIuZ2V0SXRlbUNvdW50KCk7XG5cbiAgICAgICAgICAgICAgaWYgKGl0ZW1Db3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMyJGdldFN0YXRlID0gX3RoaXMyLmdldFN0YXRlKCksXG4gICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXggPSBfdGhpczIkZ2V0U3RhdGUuaGlnaGxpZ2h0ZWRJbmRleDtcblxuICAgICAgICAgICAgICAgIHZhciBuZXh0SGlnaGxpZ2h0ZWRJbmRleCA9IGdldE5leHRXcmFwcGluZ0luZGV4KDEsIGhpZ2hsaWdodGVkSW5kZXgsIGl0ZW1Db3VudCwgZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLmdldEl0ZW1Ob2RlRnJvbUluZGV4KGluZGV4KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIF90aGlzMi5zZXRIaWdobGlnaHRlZEluZGV4KG5leHRIaWdobGlnaHRlZEluZGV4LCB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBrZXlEb3duQXJyb3dEb3duXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgQXJyb3dVcDogZnVuY3Rpb24gQXJyb3dVcChldmVudCkge1xuICAgICAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmICh0aGlzLmdldFN0YXRlKCkuaXNPcGVuKSB7XG4gICAgICAgICAgICB2YXIgYW1vdW50ID0gZXZlbnQuc2hpZnRLZXkgPyAtNSA6IC0xO1xuICAgICAgICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0ZWRJbmRleChhbW91bnQsIHtcbiAgICAgICAgICAgICAgdHlwZToga2V5RG93bkFycm93VXBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsU2V0U3RhdGUoe1xuICAgICAgICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgICAgICAgIHR5cGU6IGtleURvd25BcnJvd1VwXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBpdGVtQ291bnQgPSBfdGhpczMuZ2V0SXRlbUNvdW50KCk7XG5cbiAgICAgICAgICAgICAgaWYgKGl0ZW1Db3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMzJGdldFN0YXRlID0gX3RoaXMzLmdldFN0YXRlKCksXG4gICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXggPSBfdGhpczMkZ2V0U3RhdGUuaGlnaGxpZ2h0ZWRJbmRleDtcblxuICAgICAgICAgICAgICAgIHZhciBuZXh0SGlnaGxpZ2h0ZWRJbmRleCA9IGdldE5leHRXcmFwcGluZ0luZGV4KC0xLCBoaWdobGlnaHRlZEluZGV4LCBpdGVtQ291bnQsIGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5nZXRJdGVtTm9kZUZyb21JbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBfdGhpczMuc2V0SGlnaGxpZ2h0ZWRJbmRleChuZXh0SGlnaGxpZ2h0ZWRJbmRleCwge1xuICAgICAgICAgICAgICAgICAgdHlwZToga2V5RG93bkFycm93VXBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBFbnRlcjogZnVuY3Rpb24gRW50ZXIoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IDIyOSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfdGhpcyRnZXRTdGF0ZTIgPSB0aGlzLmdldFN0YXRlKCksXG4gICAgICAgICAgICAgIGlzT3BlbiA9IF90aGlzJGdldFN0YXRlMi5pc09wZW4sXG4gICAgICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXggPSBfdGhpcyRnZXRTdGF0ZTIuaGlnaGxpZ2h0ZWRJbmRleDtcblxuICAgICAgICAgIGlmIChpc09wZW4gJiYgaGlnaGxpZ2h0ZWRJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2hpZ2hsaWdodGVkSW5kZXhdO1xuICAgICAgICAgICAgdmFyIGl0ZW1Ob2RlID0gdGhpcy5nZXRJdGVtTm9kZUZyb21JbmRleChoaWdobGlnaHRlZEluZGV4KTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCB8fCBpdGVtTm9kZSAmJiBpdGVtTm9kZS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkSXRlbSh7XG4gICAgICAgICAgICAgIHR5cGU6IGtleURvd25FbnRlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBFc2NhcGU6IGZ1bmN0aW9uIEVzY2FwZShldmVudCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5yZXNldChfZXh0ZW5kcyh7XG4gICAgICAgICAgICB0eXBlOiBrZXlEb3duRXNjYXBlXG4gICAgICAgICAgfSwgIXRoaXMuc3RhdGUuaXNPcGVuICYmIHtcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbTogbnVsbCxcbiAgICAgICAgICAgIGlucHV0VmFsdWU6ICcnXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgX3RoaXMuYnV0dG9uS2V5RG93bkhhbmRsZXJzID0gX2V4dGVuZHMoe30sIF90aGlzLmtleURvd25IYW5kbGVycywge1xuICAgICAgICAnICc6IGZ1bmN0aW9uIF8oZXZlbnQpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMudG9nZ2xlTWVudSh7XG4gICAgICAgICAgICB0eXBlOiBrZXlEb3duU3BhY2VCdXR0b25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5pbnB1dEtleURvd25IYW5kbGVycyA9IF9leHRlbmRzKHt9LCBfdGhpcy5rZXlEb3duSGFuZGxlcnMsIHtcbiAgICAgICAgSG9tZTogZnVuY3Rpb24gSG9tZShldmVudCkge1xuICAgICAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICAgICAgdmFyIF90aGlzJGdldFN0YXRlMyA9IHRoaXMuZ2V0U3RhdGUoKSxcbiAgICAgICAgICAgICAgaXNPcGVuID0gX3RoaXMkZ2V0U3RhdGUzLmlzT3BlbjtcblxuICAgICAgICAgIGlmICghaXNPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB2YXIgaXRlbUNvdW50ID0gdGhpcy5nZXRJdGVtQ291bnQoKTtcblxuICAgICAgICAgIGlmIChpdGVtQ291bnQgPD0gMCB8fCAhaXNPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSAvLyBnZXQgbmV4dCBub24tZGlzYWJsZWQgc3RhcnRpbmcgZG93bndhcmRzIGZyb20gMCBpZiB0aGF0J3MgZGlzYWJsZWQuXG5cblxuICAgICAgICAgIHZhciBuZXdIaWdobGlnaHRlZEluZGV4ID0gZ2V0TmV4dE5vbkRpc2FibGVkSW5kZXgoMSwgMCwgaXRlbUNvdW50LCBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczQuZ2V0SXRlbU5vZGVGcm9tSW5kZXgoaW5kZXgpO1xuICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgobmV3SGlnaGxpZ2h0ZWRJbmRleCwge1xuICAgICAgICAgICAgdHlwZToga2V5RG93bkhvbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgRW5kOiBmdW5jdGlvbiBFbmQoZXZlbnQpIHtcbiAgICAgICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgICAgIHZhciBfdGhpcyRnZXRTdGF0ZTQgPSB0aGlzLmdldFN0YXRlKCksXG4gICAgICAgICAgICAgIGlzT3BlbiA9IF90aGlzJGdldFN0YXRlNC5pc09wZW47XG5cbiAgICAgICAgICBpZiAoIWlzT3Blbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdmFyIGl0ZW1Db3VudCA9IHRoaXMuZ2V0SXRlbUNvdW50KCk7XG5cbiAgICAgICAgICBpZiAoaXRlbUNvdW50IDw9IDAgfHwgIWlzT3Blbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gLy8gZ2V0IG5leHQgbm9uLWRpc2FibGVkIHN0YXJ0aW5nIHVwd2FyZHMgZnJvbSBsYXN0IGluZGV4IGlmIHRoYXQncyBkaXNhYmxlZC5cblxuXG4gICAgICAgICAgdmFyIG5ld0hpZ2hsaWdodGVkSW5kZXggPSBnZXROZXh0Tm9uRGlzYWJsZWRJbmRleCgtMSwgaXRlbUNvdW50IC0gMSwgaXRlbUNvdW50LCBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczUuZ2V0SXRlbU5vZGVGcm9tSW5kZXgoaW5kZXgpO1xuICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgobmV3SGlnaGxpZ2h0ZWRJbmRleCwge1xuICAgICAgICAgICAgdHlwZToga2V5RG93bkVuZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMuZ2V0VG9nZ2xlQnV0dG9uUHJvcHMgPSBmdW5jdGlvbiAoX3RlbXAzKSB7XG4gICAgICAgIHZhciBfcmVmMyA9IF90ZW1wMyA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDMsXG4gICAgICAgICAgICBvbkNsaWNrID0gX3JlZjMub25DbGljaztcbiAgICAgICAgICAgIF9yZWYzLm9uUHJlc3M7XG4gICAgICAgICAgICB2YXIgb25LZXlEb3duID0gX3JlZjMub25LZXlEb3duLFxuICAgICAgICAgICAgb25LZXlVcCA9IF9yZWYzLm9uS2V5VXAsXG4gICAgICAgICAgICBvbkJsdXIgPSBfcmVmMy5vbkJsdXIsXG4gICAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZjMsIF9leGNsdWRlZDIkMyk7XG5cbiAgICAgICAgdmFyIF90aGlzJGdldFN0YXRlNSA9IF90aGlzLmdldFN0YXRlKCksXG4gICAgICAgICAgICBpc09wZW4gPSBfdGhpcyRnZXRTdGF0ZTUuaXNPcGVuO1xuXG4gICAgICAgIHZhciBlbmFibGVkRXZlbnRIYW5kbGVycyA9IHtcbiAgICAgICAgICBvbkNsaWNrOiBjYWxsQWxsRXZlbnRIYW5kbGVycyhvbkNsaWNrLCBfdGhpcy5idXR0b25IYW5kbGVDbGljayksXG4gICAgICAgICAgb25LZXlEb3duOiBjYWxsQWxsRXZlbnRIYW5kbGVycyhvbktleURvd24sIF90aGlzLmJ1dHRvbkhhbmRsZUtleURvd24pLFxuICAgICAgICAgIG9uS2V5VXA6IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uS2V5VXAsIF90aGlzLmJ1dHRvbkhhbmRsZUtleVVwKSxcbiAgICAgICAgICBvbkJsdXI6IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uQmx1ciwgX3RoaXMuYnV0dG9uSGFuZGxlQmx1cilcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGV2ZW50SGFuZGxlcnMgPSByZXN0LmRpc2FibGVkID8ge30gOiBlbmFibGVkRXZlbnRIYW5kbGVycztcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICByb2xlOiAnYnV0dG9uJyxcbiAgICAgICAgICAnYXJpYS1sYWJlbCc6IGlzT3BlbiA/ICdjbG9zZSBtZW51JyA6ICdvcGVuIG1lbnUnLFxuICAgICAgICAgICdhcmlhLWhhc3BvcHVwJzogdHJ1ZSxcbiAgICAgICAgICAnZGF0YS10b2dnbGUnOiB0cnVlXG4gICAgICAgIH0sIGV2ZW50SGFuZGxlcnMsIHJlc3QpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuYnV0dG9uSGFuZGxlS2V5VXAgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gUHJldmVudCBjbGljayBldmVudCBmcm9tIGVtaXR0aW5nIGluIEZpcmVmb3hcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmJ1dHRvbkhhbmRsZUtleURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGtleSA9IG5vcm1hbGl6ZUFycm93S2V5KGV2ZW50KTtcblxuICAgICAgICBpZiAoX3RoaXMuYnV0dG9uS2V5RG93bkhhbmRsZXJzW2tleV0pIHtcbiAgICAgICAgICBfdGhpcy5idXR0b25LZXlEb3duSGFuZGxlcnNba2V5XS5jYWxsKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmJ1dHRvbkhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIGhhbmRsZSBvZGQgY2FzZSBmb3IgU2FmYXJpIGFuZCBGaXJlZm94IHdoaWNoXG4gICAgICAgIC8vIGRvbid0IGdpdmUgdGhlIGJ1dHRvbiB0aGUgZm9jdXMgcHJvcGVybHkuXG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmIChjYW4ndCByZWFzb25hYmx5IHRlc3QgdGhpcykgKi9cblxuICAgICAgICBpZiAoX3RoaXMucHJvcHMuZW52aXJvbm1lbnQuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gX3RoaXMucHJvcHMuZW52aXJvbm1lbnQuZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgIGV2ZW50LnRhcmdldC5mb2N1cygpO1xuICAgICAgICB9IC8vIHRvIHNpbXBsaWZ5IHRlc3RpbmcgY29tcG9uZW50cyB0aGF0IHVzZSBkb3duc2hpZnQsIHdlJ2xsIG5vdCB3cmFwIHRoaXMgaW4gYSBzZXRUaW1lb3V0XG4gICAgICAgIC8vIGlmIHRoZSBOT0RFX0VOViBpcyB0ZXN0LiBXaXRoIHRoZSBwcm9wZXIgYnVpbGQgc3lzdGVtLCB0aGlzIHNob3VsZCBiZSBkZWFkIGNvZGUgZWxpbWluYXRlZFxuICAgICAgICAvLyB3aGVuIGJ1aWxkaW5nIGZvciBwcm9kdWN0aW9uIGFuZCBzaG91bGQgdGhlcmVmb3JlIGhhdmUgbm8gaW1wYWN0IG9uIHByb2R1Y3Rpb24gY29kZS5cblxuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICAgICAgX3RoaXMudG9nZ2xlTWVudSh7XG4gICAgICAgICAgICB0eXBlOiBjbGlja0J1dHRvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRvZ2dsZSBvZiBtZW51IG9jY3VycyBhZnRlciB0aGUgcG90ZW50aWFsIGJsdXIgZXZlbnQgaW4gaU9TXG4gICAgICAgICAgX3RoaXMuaW50ZXJuYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy50b2dnbGVNZW51KHtcbiAgICAgICAgICAgICAgdHlwZTogY2xpY2tCdXR0b25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5idXR0b25IYW5kbGVCbHVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBibHVyVGFyZ2V0ID0gZXZlbnQudGFyZ2V0OyAvLyBTYXZlIGJsdXIgdGFyZ2V0IGZvciBjb21wYXJpc29uIHdpdGggYWN0aXZlRWxlbWVudCBsYXRlclxuICAgICAgICAvLyBOZWVkIHNldFRpbWVvdXQsIHNvIHRoYXQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIFRhYiwgdGhlIGFjdGl2ZUVsZW1lbnQgaXMgdGhlIG5leHQgZm9jdXNlZCBlbGVtZW50LCBub3QgYm9keSBlbGVtZW50XG5cbiAgICAgICAgX3RoaXMuaW50ZXJuYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIV90aGlzLmlzTW91c2VEb3duICYmIChfdGhpcy5wcm9wcy5lbnZpcm9ubWVudC5kb2N1bWVudC5hY3RpdmVFbGVtZW50ID09IG51bGwgfHwgX3RoaXMucHJvcHMuZW52aXJvbm1lbnQuZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5pZCAhPT0gX3RoaXMuaW5wdXRJZCkgJiYgX3RoaXMucHJvcHMuZW52aXJvbm1lbnQuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gYmx1clRhcmdldCAvLyBEbyBub3RoaW5nIGlmIHdlIHJlZm9jdXMgdGhlIHNhbWUgZWxlbWVudCBhZ2FpbiAodG8gc29sdmUgaXNzdWUgaW4gU2FmYXJpIG9uIGlPUylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIF90aGlzLnJlc2V0KHtcbiAgICAgICAgICAgICAgdHlwZTogYmx1ckJ1dHRvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmdldExhYmVsUHJvcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgICBodG1sRm9yOiBfdGhpcy5pbnB1dElkLFxuICAgICAgICAgIGlkOiBfdGhpcy5sYWJlbElkXG4gICAgICAgIH0sIHByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmdldElucHV0UHJvcHMgPSBmdW5jdGlvbiAoX3RlbXA0KSB7XG4gICAgICAgIHZhciBfcmVmNCA9IF90ZW1wNCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDQsXG4gICAgICAgICAgICBvbktleURvd24gPSBfcmVmNC5vbktleURvd24sXG4gICAgICAgICAgICBvbkJsdXIgPSBfcmVmNC5vbkJsdXIsXG4gICAgICAgICAgICBvbkNoYW5nZSA9IF9yZWY0Lm9uQ2hhbmdlLFxuICAgICAgICAgICAgb25JbnB1dCA9IF9yZWY0Lm9uSW5wdXQ7XG4gICAgICAgICAgICBfcmVmNC5vbkNoYW5nZVRleHQ7XG4gICAgICAgICAgICB2YXIgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY0LCBfZXhjbHVkZWQzJDIpO1xuXG4gICAgICAgIHZhciBvbkNoYW5nZUtleTtcbiAgICAgICAgdmFyIGV2ZW50SGFuZGxlcnMgPSB7fTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKHByZWFjdCkgKi9cblxuICAgICAgICB7XG4gICAgICAgICAgb25DaGFuZ2VLZXkgPSAnb25DaGFuZ2UnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF90aGlzJGdldFN0YXRlNiA9IF90aGlzLmdldFN0YXRlKCksXG4gICAgICAgICAgICBpbnB1dFZhbHVlID0gX3RoaXMkZ2V0U3RhdGU2LmlucHV0VmFsdWUsXG4gICAgICAgICAgICBpc09wZW4gPSBfdGhpcyRnZXRTdGF0ZTYuaXNPcGVuLFxuICAgICAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleCA9IF90aGlzJGdldFN0YXRlNi5oaWdobGlnaHRlZEluZGV4O1xuXG4gICAgICAgIGlmICghcmVzdC5kaXNhYmxlZCkge1xuICAgICAgICAgIHZhciBfZXZlbnRIYW5kbGVycztcblxuICAgICAgICAgIGV2ZW50SGFuZGxlcnMgPSAoX2V2ZW50SGFuZGxlcnMgPSB7fSwgX2V2ZW50SGFuZGxlcnNbb25DaGFuZ2VLZXldID0gY2FsbEFsbEV2ZW50SGFuZGxlcnMob25DaGFuZ2UsIG9uSW5wdXQsIF90aGlzLmlucHV0SGFuZGxlQ2hhbmdlKSwgX2V2ZW50SGFuZGxlcnMub25LZXlEb3duID0gY2FsbEFsbEV2ZW50SGFuZGxlcnMob25LZXlEb3duLCBfdGhpcy5pbnB1dEhhbmRsZUtleURvd24pLCBfZXZlbnRIYW5kbGVycy5vbkJsdXIgPSBjYWxsQWxsRXZlbnRIYW5kbGVycyhvbkJsdXIsIF90aGlzLmlucHV0SGFuZGxlQmx1ciksIF9ldmVudEhhbmRsZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgICAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogJ2xpc3QnLFxuICAgICAgICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiBpc09wZW4gJiYgdHlwZW9mIGhpZ2hsaWdodGVkSW5kZXggPT09ICdudW1iZXInICYmIGhpZ2hsaWdodGVkSW5kZXggPj0gMCA/IF90aGlzLmdldEl0ZW1JZChoaWdobGlnaHRlZEluZGV4KSA6IG51bGwsXG4gICAgICAgICAgJ2FyaWEtY29udHJvbHMnOiBpc09wZW4gPyBfdGhpcy5tZW51SWQgOiBudWxsLFxuICAgICAgICAgICdhcmlhLWxhYmVsbGVkYnknOiBfdGhpcy5sYWJlbElkLFxuICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NlY3VyaXR5L1NlY3VyaW5nX3lvdXJfc2l0ZS9UdXJuaW5nX29mZl9mb3JtX2F1dG9jb21wbGV0aW9uXG4gICAgICAgICAgLy8gcmV2ZXJ0IGJhY2sgc2luY2UgYXV0b2NvbXBsZXRlPVwibm9wZVwiIGlzIGlnbm9yZWQgb24gbGF0ZXN0IENocm9tZSBhbmQgT3BlcmFcbiAgICAgICAgICBhdXRvQ29tcGxldGU6ICdvZmYnLFxuICAgICAgICAgIHZhbHVlOiBpbnB1dFZhbHVlLFxuICAgICAgICAgIGlkOiBfdGhpcy5pbnB1dElkXG4gICAgICAgIH0sIGV2ZW50SGFuZGxlcnMsIHJlc3QpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuaW5wdXRIYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBrZXkgPSBub3JtYWxpemVBcnJvd0tleShldmVudCk7XG5cbiAgICAgICAgaWYgKGtleSAmJiBfdGhpcy5pbnB1dEtleURvd25IYW5kbGVyc1trZXldKSB7XG4gICAgICAgICAgX3RoaXMuaW5wdXRLZXlEb3duSGFuZGxlcnNba2V5XS5jYWxsKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmlucHV0SGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIF90aGlzLmludGVybmFsU2V0U3RhdGUoe1xuICAgICAgICAgIHR5cGU6IGNoYW5nZUlucHV0LFxuICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgICBpbnB1dFZhbHVlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogX3RoaXMucHJvcHMuZGVmYXVsdEhpZ2hsaWdodGVkSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5pbnB1dEhhbmRsZUJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIE5lZWQgc2V0VGltZW91dCwgc28gdGhhdCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgVGFiLCB0aGUgYWN0aXZlRWxlbWVudCBpcyB0aGUgbmV4dCBmb2N1c2VkIGVsZW1lbnQsIG5vdCB0aGUgYm9keSBlbGVtZW50XG4gICAgICAgIF90aGlzLmludGVybmFsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRvd25zaGlmdEJ1dHRvbklzQWN0aXZlID0gX3RoaXMucHJvcHMuZW52aXJvbm1lbnQuZG9jdW1lbnQgJiYgISFfdGhpcy5wcm9wcy5lbnZpcm9ubWVudC5kb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICEhX3RoaXMucHJvcHMuZW52aXJvbm1lbnQuZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5kYXRhc2V0ICYmIF90aGlzLnByb3BzLmVudmlyb25tZW50LmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuZGF0YXNldC50b2dnbGUgJiYgX3RoaXMuX3Jvb3ROb2RlICYmIF90aGlzLl9yb290Tm9kZS5jb250YWlucyhfdGhpcy5wcm9wcy5lbnZpcm9ubWVudC5kb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgICAgICAgIGlmICghX3RoaXMuaXNNb3VzZURvd24gJiYgIWRvd25zaGlmdEJ1dHRvbklzQWN0aXZlKSB7XG4gICAgICAgICAgICBfdGhpcy5yZXNldCh7XG4gICAgICAgICAgICAgIHR5cGU6IGJsdXJJbnB1dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm1lbnVSZWYgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBfdGhpcy5fbWVudU5vZGUgPSBub2RlO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuZ2V0TWVudVByb3BzID0gZnVuY3Rpb24gKF90ZW1wNSwgX3RlbXA2KSB7XG4gICAgICAgIHZhciBfZXh0ZW5kczM7XG5cbiAgICAgICAgdmFyIF9yZWY1ID0gX3RlbXA1ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNSxcbiAgICAgICAgICAgIF9yZWY1JHJlZktleSA9IF9yZWY1LnJlZktleSxcbiAgICAgICAgICAgIHJlZktleSA9IF9yZWY1JHJlZktleSA9PT0gdm9pZCAwID8gJ3JlZicgOiBfcmVmNSRyZWZLZXksXG4gICAgICAgICAgICByZWYgPSBfcmVmNS5yZWYsXG4gICAgICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY1LCBfZXhjbHVkZWQ0JDEpO1xuXG4gICAgICAgIHZhciBfcmVmNiA9IF90ZW1wNiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDYsXG4gICAgICAgICAgICBfcmVmNiRzdXBwcmVzc1JlZkVycm8gPSBfcmVmNi5zdXBwcmVzc1JlZkVycm9yLFxuICAgICAgICAgICAgc3VwcHJlc3NSZWZFcnJvciA9IF9yZWY2JHN1cHByZXNzUmVmRXJybyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRzdXBwcmVzc1JlZkVycm87XG5cbiAgICAgICAgX3RoaXMuZ2V0TWVudVByb3BzLmNhbGxlZCA9IHRydWU7XG4gICAgICAgIF90aGlzLmdldE1lbnVQcm9wcy5yZWZLZXkgPSByZWZLZXk7XG4gICAgICAgIF90aGlzLmdldE1lbnVQcm9wcy5zdXBwcmVzc1JlZkVycm9yID0gc3VwcHJlc3NSZWZFcnJvcjtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKChfZXh0ZW5kczMgPSB7fSwgX2V4dGVuZHMzW3JlZktleV0gPSBoYW5kbGVSZWZzKHJlZiwgX3RoaXMubWVudVJlZiksIF9leHRlbmRzMy5yb2xlID0gJ2xpc3Rib3gnLCBfZXh0ZW5kczNbJ2FyaWEtbGFiZWxsZWRieSddID0gcHJvcHMgJiYgcHJvcHNbJ2FyaWEtbGFiZWwnXSA/IG51bGwgOiBfdGhpcy5sYWJlbElkLCBfZXh0ZW5kczMuaWQgPSBfdGhpcy5tZW51SWQsIF9leHRlbmRzMyksIHByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmdldEl0ZW1Qcm9wcyA9IGZ1bmN0aW9uIChfdGVtcDcpIHtcbiAgICAgICAgdmFyIF9lbmFibGVkRXZlbnRIYW5kbGVycztcblxuICAgICAgICB2YXIgX3JlZjcgPSBfdGVtcDcgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA3LFxuICAgICAgICAgICAgb25Nb3VzZU1vdmUgPSBfcmVmNy5vbk1vdXNlTW92ZSxcbiAgICAgICAgICAgIG9uTW91c2VEb3duID0gX3JlZjcub25Nb3VzZURvd24sXG4gICAgICAgICAgICBvbkNsaWNrID0gX3JlZjcub25DbGljaztcbiAgICAgICAgICAgIF9yZWY3Lm9uUHJlc3M7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBfcmVmNy5pbmRleCxcbiAgICAgICAgICAgIF9yZWY3JGl0ZW0gPSBfcmVmNy5pdGVtLFxuICAgICAgICAgICAgaXRlbSA9IF9yZWY3JGl0ZW0gPT09IHZvaWQgMCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgP1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICB1bmRlZmluZWQgOiByZXF1aXJlZFByb3AoJ2dldEl0ZW1Qcm9wcycsICdpdGVtJykgOiBfcmVmNyRpdGVtLFxuICAgICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY3LCBfZXhjbHVkZWQ1JDEpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgX3RoaXMuaXRlbXMucHVzaChpdGVtKTtcblxuICAgICAgICAgIGluZGV4ID0gX3RoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5pdGVtc1tpbmRleF0gPSBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9uU2VsZWN0S2V5ID0gJ29uQ2xpY2snO1xuICAgICAgICB2YXIgY3VzdG9tQ2xpY2tIYW5kbGVyID0gb25DbGljaztcbiAgICAgICAgdmFyIGVuYWJsZWRFdmVudEhhbmRsZXJzID0gKF9lbmFibGVkRXZlbnRIYW5kbGVycyA9IHtcbiAgICAgICAgICAvLyBvbk1vdXNlTW92ZSBpcyB1c2VkIG92ZXIgb25Nb3VzZUVudGVyIGhlcmUuIG9uTW91c2VNb3ZlXG4gICAgICAgICAgLy8gaXMgb25seSB0cmlnZ2VyZWQgb24gYWN0dWFsIG1vdXNlIG1vdmVtZW50IHdoaWxlIG9uTW91c2VFbnRlclxuICAgICAgICAgIC8vIGNhbiBmaXJlIG9uIERPTSBjaGFuZ2VzLCBpbnRlcnJ1cHRpbmcga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICAgIG9uTW91c2VNb3ZlOiBjYWxsQWxsRXZlbnRIYW5kbGVycyhvbk1vdXNlTW92ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBfdGhpcy5nZXRTdGF0ZSgpLmhpZ2hsaWdodGVkSW5kZXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KGluZGV4LCB7XG4gICAgICAgICAgICAgIHR5cGU6IGl0ZW1Nb3VzZUVudGVyXG4gICAgICAgICAgICB9KTsgLy8gV2UgbmV2ZXIgd2FudCB0byBtYW51YWxseSBzY3JvbGwgd2hlbiBjaGFuZ2luZyBzdGF0ZSBiYXNlZFxuICAgICAgICAgICAgLy8gb24gYG9uTW91c2VNb3ZlYCBiZWNhdXNlIHdlIHdpbGwgYmUgbW92aW5nIHRoZSBlbGVtZW50IG91dFxuICAgICAgICAgICAgLy8gZnJvbSB1bmRlciB0aGUgdXNlciB3aGljaCBpcyBjdXJyZW50bHkgc2Nyb2xsaW5nL21vdmluZyB0aGVcbiAgICAgICAgICAgIC8vIGN1cnNvclxuXG5cbiAgICAgICAgICAgIF90aGlzLmF2b2lkU2Nyb2xsaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgX3RoaXMuaW50ZXJuYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmF2b2lkU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAyNTApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uTW91c2VEb3duOiBjYWxsQWxsRXZlbnRIYW5kbGVycyhvbk1vdXNlRG93biwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBhY3RpdmVFbGVtZW50IGZyb20gYmVpbmcgY2hhbmdlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGl0ZW0gc28gaXQgY2FuIHJlbWFpbiB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIC8vIHdoaWNoIGlzIGEgbW9yZSBjb21tb24gdXNlIGNhc2UuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0sIF9lbmFibGVkRXZlbnRIYW5kbGVyc1tvblNlbGVjdEtleV0gPSBjYWxsQWxsRXZlbnRIYW5kbGVycyhjdXN0b21DbGlja0hhbmRsZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5zZWxlY3RJdGVtQXRJbmRleChpbmRleCwge1xuICAgICAgICAgICAgdHlwZTogY2xpY2tJdGVtXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLCBfZW5hYmxlZEV2ZW50SGFuZGxlcnMpOyAvLyBQYXNzaW5nIGRvd24gdGhlIG9uTW91c2VEb3duIGhhbmRsZXIgdG8gcHJldmVudCByZWRpcmVjdFxuICAgICAgICAvLyBvZiB0aGUgYWN0aXZlRWxlbWVudCBpZiBjbGlja2luZyBvbiBkaXNhYmxlZCBpdGVtc1xuXG4gICAgICAgIHZhciBldmVudEhhbmRsZXJzID0gcmVzdC5kaXNhYmxlZCA/IHtcbiAgICAgICAgICBvbk1vdXNlRG93bjogZW5hYmxlZEV2ZW50SGFuZGxlcnMub25Nb3VzZURvd25cbiAgICAgICAgfSA6IGVuYWJsZWRFdmVudEhhbmRsZXJzO1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICAgIGlkOiBfdGhpcy5nZXRJdGVtSWQoaW5kZXgpLFxuICAgICAgICAgIHJvbGU6ICdvcHRpb24nLFxuICAgICAgICAgICdhcmlhLXNlbGVjdGVkJzogX3RoaXMuZ2V0U3RhdGUoKS5oaWdobGlnaHRlZEluZGV4ID09PSBpbmRleFxuICAgICAgICB9LCBldmVudEhhbmRsZXJzLCByZXN0KTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmNsZWFySXRlbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLml0ZW1zID0gW107XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5yZXNldCA9IGZ1bmN0aW9uIChvdGhlclN0YXRlVG9TZXQsIGNiKSB7XG4gICAgICAgIGlmIChvdGhlclN0YXRlVG9TZXQgPT09IHZvaWQgMCkge1xuICAgICAgICAgIG90aGVyU3RhdGVUb1NldCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXJTdGF0ZVRvU2V0ID0gcGlja1N0YXRlKG90aGVyU3RhdGVUb1NldCk7XG5cbiAgICAgICAgX3RoaXMuaW50ZXJuYWxTZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjgpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ZWRJdGVtID0gX3JlZjguc2VsZWN0ZWRJdGVtO1xuICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgICAgICBpc09wZW46IF90aGlzLnByb3BzLmRlZmF1bHRJc09wZW4sXG4gICAgICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBfdGhpcy5wcm9wcy5kZWZhdWx0SGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgICAgICAgIGlucHV0VmFsdWU6IF90aGlzLnByb3BzLml0ZW1Ub1N0cmluZyhzZWxlY3RlZEl0ZW0pXG4gICAgICAgICAgfSwgb3RoZXJTdGF0ZVRvU2V0KTtcbiAgICAgICAgfSwgY2IpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMudG9nZ2xlTWVudSA9IGZ1bmN0aW9uIChvdGhlclN0YXRlVG9TZXQsIGNiKSB7XG4gICAgICAgIGlmIChvdGhlclN0YXRlVG9TZXQgPT09IHZvaWQgMCkge1xuICAgICAgICAgIG90aGVyU3RhdGVUb1NldCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXJTdGF0ZVRvU2V0ID0gcGlja1N0YXRlKG90aGVyU3RhdGVUb1NldCk7XG5cbiAgICAgICAgX3RoaXMuaW50ZXJuYWxTZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjkpIHtcbiAgICAgICAgICB2YXIgaXNPcGVuID0gX3JlZjkuaXNPcGVuO1xuICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgICAgICBpc09wZW46ICFpc09wZW5cbiAgICAgICAgICB9LCBpc09wZW4gJiYge1xuICAgICAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogX3RoaXMucHJvcHMuZGVmYXVsdEhpZ2hsaWdodGVkSW5kZXhcbiAgICAgICAgICB9LCBvdGhlclN0YXRlVG9TZXQpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGdldFN0YXRlNyA9IF90aGlzLmdldFN0YXRlKCksXG4gICAgICAgICAgICAgIGlzT3BlbiA9IF90aGlzJGdldFN0YXRlNy5pc09wZW4sXG4gICAgICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXggPSBfdGhpcyRnZXRTdGF0ZTcuaGlnaGxpZ2h0ZWRJbmRleDtcblxuICAgICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5nZXRJdGVtQ291bnQoKSA+IDAgJiYgdHlwZW9mIGhpZ2hsaWdodGVkSW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIF90aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgoaGlnaGxpZ2h0ZWRJbmRleCwgb3RoZXJTdGF0ZVRvU2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYlRvQ2IoY2IpKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMub3Blbk1lbnUgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgX3RoaXMuaW50ZXJuYWxTZXRTdGF0ZSh7XG4gICAgICAgICAgaXNPcGVuOiB0cnVlXG4gICAgICAgIH0sIGNiKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmNsb3NlTWVudSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICBfdGhpcy5pbnRlcm5hbFNldFN0YXRlKHtcbiAgICAgICAgICBpc09wZW46IGZhbHNlXG4gICAgICAgIH0sIGNiKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLnVwZGF0ZVN0YXR1cyA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gX3RoaXMuZ2V0U3RhdGUoKTtcblxuICAgICAgICB2YXIgaXRlbSA9IF90aGlzLml0ZW1zW3N0YXRlLmhpZ2hsaWdodGVkSW5kZXhdO1xuXG4gICAgICAgIHZhciByZXN1bHRDb3VudCA9IF90aGlzLmdldEl0ZW1Db3VudCgpO1xuXG4gICAgICAgIHZhciBzdGF0dXMgPSBfdGhpcy5wcm9wcy5nZXRBMTF5U3RhdHVzTWVzc2FnZShfZXh0ZW5kcyh7XG4gICAgICAgICAgaXRlbVRvU3RyaW5nOiBfdGhpcy5wcm9wcy5pdGVtVG9TdHJpbmcsXG4gICAgICAgICAgcHJldmlvdXNSZXN1bHRDb3VudDogX3RoaXMucHJldmlvdXNSZXN1bHRDb3VudCxcbiAgICAgICAgICByZXN1bHRDb3VudDogcmVzdWx0Q291bnQsXG4gICAgICAgICAgaGlnaGxpZ2h0ZWRJdGVtOiBpdGVtXG4gICAgICAgIH0sIHN0YXRlKSk7XG5cbiAgICAgICAgX3RoaXMucHJldmlvdXNSZXN1bHRDb3VudCA9IHJlc3VsdENvdW50O1xuICAgICAgICBzZXRTdGF0dXMoc3RhdHVzLCBfdGhpcy5wcm9wcy5lbnZpcm9ubWVudC5kb2N1bWVudCk7XG4gICAgICB9LCAyMDApO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBkZWZhdWx0SGlnaGxpZ2h0ZWRJbmRleCA9IF90aGlzJHByb3BzLmRlZmF1bHRIaWdobGlnaHRlZEluZGV4LFxuICAgICAgICAgIF90aGlzJHByb3BzJGluaXRpYWxIaSA9IF90aGlzJHByb3BzLmluaXRpYWxIaWdobGlnaHRlZEluZGV4LFxuICAgICAgICAgIF9oaWdobGlnaHRlZEluZGV4ID0gX3RoaXMkcHJvcHMkaW5pdGlhbEhpID09PSB2b2lkIDAgPyBkZWZhdWx0SGlnaGxpZ2h0ZWRJbmRleCA6IF90aGlzJHByb3BzJGluaXRpYWxIaSxcbiAgICAgICAgICBkZWZhdWx0SXNPcGVuID0gX3RoaXMkcHJvcHMuZGVmYXVsdElzT3BlbixcbiAgICAgICAgICBfdGhpcyRwcm9wcyRpbml0aWFsSXMgPSBfdGhpcyRwcm9wcy5pbml0aWFsSXNPcGVuLFxuICAgICAgICAgIF9pc09wZW4gPSBfdGhpcyRwcm9wcyRpbml0aWFsSXMgPT09IHZvaWQgMCA/IGRlZmF1bHRJc09wZW4gOiBfdGhpcyRwcm9wcyRpbml0aWFsSXMsXG4gICAgICAgICAgX3RoaXMkcHJvcHMkaW5pdGlhbEluID0gX3RoaXMkcHJvcHMuaW5pdGlhbElucHV0VmFsdWUsXG4gICAgICAgICAgX2lucHV0VmFsdWUgPSBfdGhpcyRwcm9wcyRpbml0aWFsSW4gPT09IHZvaWQgMCA/ICcnIDogX3RoaXMkcHJvcHMkaW5pdGlhbEluLFxuICAgICAgICAgIF90aGlzJHByb3BzJGluaXRpYWxTZSA9IF90aGlzJHByb3BzLmluaXRpYWxTZWxlY3RlZEl0ZW0sXG4gICAgICAgICAgX3NlbGVjdGVkSXRlbSA9IF90aGlzJHByb3BzJGluaXRpYWxTZSA9PT0gdm9pZCAwID8gbnVsbCA6IF90aGlzJHByb3BzJGluaXRpYWxTZTtcblxuICAgICAgdmFyIF9zdGF0ZSA9IF90aGlzLmdldFN0YXRlKHtcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogX2hpZ2hsaWdodGVkSW5kZXgsXG4gICAgICAgIGlzT3BlbjogX2lzT3BlbixcbiAgICAgICAgaW5wdXRWYWx1ZTogX2lucHV0VmFsdWUsXG4gICAgICAgIHNlbGVjdGVkSXRlbTogX3NlbGVjdGVkSXRlbVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChfc3RhdGUuc2VsZWN0ZWRJdGVtICE9IG51bGwgJiYgX3RoaXMucHJvcHMuaW5pdGlhbElucHV0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBfc3RhdGUuaW5wdXRWYWx1ZSA9IF90aGlzLnByb3BzLml0ZW1Ub1N0cmluZyhfc3RhdGUuc2VsZWN0ZWRJdGVtKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc3RhdGUgPSBfc3RhdGU7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90byA9IERvd25zaGlmdC5wcm90b3R5cGU7XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgcnVubmluZyB0aW1lb3V0c1xuICAgICAqL1xuICAgIF9wcm90by5pbnRlcm5hbENsZWFyVGltZW91dHMgPSBmdW5jdGlvbiBpbnRlcm5hbENsZWFyVGltZW91dHMoKSB7XG4gICAgICB0aGlzLnRpbWVvdXRJZHMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50aW1lb3V0SWRzID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YXRlIGJhc2VkIG9uIGludGVybmFsIHN0YXRlIG9yIHByb3BzXG4gICAgICogSWYgYSBzdGF0ZSB2YWx1ZSBpcyBwYXNzZWQgdmlhIHByb3BzLCB0aGVuIHRoYXRcbiAgICAgKiBpcyB0aGUgdmFsdWUgZ2l2ZW4sIG90aGVyd2lzZSBpdCdzIHJldHJpZXZlZCBmcm9tXG4gICAgICogc3RhdGVUb01lcmdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGVUb01lcmdlIGRlZmF1bHRzIHRvIHRoaXMuc3RhdGVcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBzdGF0ZVxuICAgICAqL1xuICAgIDtcblxuICAgIF9wcm90by5nZXRTdGF0ZSA9IGZ1bmN0aW9uIGdldFN0YXRlJDEoc3RhdGVUb01lcmdlKSB7XG4gICAgICBpZiAoc3RhdGVUb01lcmdlID09PSB2b2lkIDApIHtcbiAgICAgICAgc3RhdGVUb01lcmdlID0gdGhpcy5zdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGdldFN0YXRlKHN0YXRlVG9NZXJnZSwgdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF9wcm90by5nZXRJdGVtQ291bnQgPSBmdW5jdGlvbiBnZXRJdGVtQ291bnQoKSB7XG4gICAgICAvLyB0aGluZ3MgcmVhZCBiZXR0ZXIgdGhpcyB3YXkuIFRoZXkncmUgaW4gcHJpb3JpdHkgb3JkZXI6XG4gICAgICAvLyAxLiBgdGhpcy5pdGVtQ291bnRgXG4gICAgICAvLyAyLiBgdGhpcy5wcm9wcy5pdGVtQ291bnRgXG4gICAgICAvLyAzLiBgdGhpcy5pdGVtcy5sZW5ndGhgXG4gICAgICB2YXIgaXRlbUNvdW50ID0gdGhpcy5pdGVtcy5sZW5ndGg7XG5cbiAgICAgIGlmICh0aGlzLml0ZW1Db3VudCAhPSBudWxsKSB7XG4gICAgICAgIGl0ZW1Db3VudCA9IHRoaXMuaXRlbUNvdW50O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLml0ZW1Db3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGl0ZW1Db3VudCA9IHRoaXMucHJvcHMuaXRlbUNvdW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbUNvdW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0SXRlbU5vZGVGcm9tSW5kZXggPSBmdW5jdGlvbiBnZXRJdGVtTm9kZUZyb21JbmRleChpbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuZW52aXJvbm1lbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRJdGVtSWQoaW5kZXgpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNjcm9sbEhpZ2hsaWdodGVkSXRlbUludG9WaWV3ID0gZnVuY3Rpb24gc2Nyb2xsSGlnaGxpZ2h0ZWRJdGVtSW50b1ZpZXcoKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAocmVhY3QtbmF0aXZlKSAqL1xuICAgICAge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZ2V0SXRlbU5vZGVGcm9tSW5kZXgodGhpcy5nZXRTdGF0ZSgpLmhpZ2hsaWdodGVkSW5kZXgpO1xuICAgICAgICB0aGlzLnByb3BzLnNjcm9sbEludG9WaWV3KG5vZGUsIHRoaXMuX21lbnVOb2RlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLm1vdmVIaWdobGlnaHRlZEluZGV4ID0gZnVuY3Rpb24gbW92ZUhpZ2hsaWdodGVkSW5kZXgoYW1vdW50LCBvdGhlclN0YXRlVG9TZXQpIHtcbiAgICAgIHZhciBfdGhpczYgPSB0aGlzO1xuXG4gICAgICB2YXIgaXRlbUNvdW50ID0gdGhpcy5nZXRJdGVtQ291bnQoKTtcblxuICAgICAgdmFyIF90aGlzJGdldFN0YXRlOCA9IHRoaXMuZ2V0U3RhdGUoKSxcbiAgICAgICAgICBoaWdobGlnaHRlZEluZGV4ID0gX3RoaXMkZ2V0U3RhdGU4LmhpZ2hsaWdodGVkSW5kZXg7XG5cbiAgICAgIGlmIChpdGVtQ291bnQgPiAwKSB7XG4gICAgICAgIHZhciBuZXh0SGlnaGxpZ2h0ZWRJbmRleCA9IGdldE5leHRXcmFwcGluZ0luZGV4KGFtb3VudCwgaGlnaGxpZ2h0ZWRJbmRleCwgaXRlbUNvdW50LCBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXM2LmdldEl0ZW1Ob2RlRnJvbUluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleChuZXh0SGlnaGxpZ2h0ZWRJbmRleCwgb3RoZXJTdGF0ZVRvU2V0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmdldFN0YXRlQW5kSGVscGVycyA9IGZ1bmN0aW9uIGdldFN0YXRlQW5kSGVscGVycygpIHtcbiAgICAgIHZhciBfdGhpcyRnZXRTdGF0ZTkgPSB0aGlzLmdldFN0YXRlKCksXG4gICAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleCA9IF90aGlzJGdldFN0YXRlOS5oaWdobGlnaHRlZEluZGV4LFxuICAgICAgICAgIGlucHV0VmFsdWUgPSBfdGhpcyRnZXRTdGF0ZTkuaW5wdXRWYWx1ZSxcbiAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBfdGhpcyRnZXRTdGF0ZTkuc2VsZWN0ZWRJdGVtLFxuICAgICAgICAgIGlzT3BlbiA9IF90aGlzJGdldFN0YXRlOS5pc09wZW47XG5cbiAgICAgIHZhciBpdGVtVG9TdHJpbmcgPSB0aGlzLnByb3BzLml0ZW1Ub1N0cmluZztcbiAgICAgIHZhciBpZCA9IHRoaXMuaWQ7XG4gICAgICB2YXIgZ2V0Um9vdFByb3BzID0gdGhpcy5nZXRSb290UHJvcHMsXG4gICAgICAgICAgZ2V0VG9nZ2xlQnV0dG9uUHJvcHMgPSB0aGlzLmdldFRvZ2dsZUJ1dHRvblByb3BzLFxuICAgICAgICAgIGdldExhYmVsUHJvcHMgPSB0aGlzLmdldExhYmVsUHJvcHMsXG4gICAgICAgICAgZ2V0TWVudVByb3BzID0gdGhpcy5nZXRNZW51UHJvcHMsXG4gICAgICAgICAgZ2V0SW5wdXRQcm9wcyA9IHRoaXMuZ2V0SW5wdXRQcm9wcyxcbiAgICAgICAgICBnZXRJdGVtUHJvcHMgPSB0aGlzLmdldEl0ZW1Qcm9wcyxcbiAgICAgICAgICBvcGVuTWVudSA9IHRoaXMub3Blbk1lbnUsXG4gICAgICAgICAgY2xvc2VNZW51ID0gdGhpcy5jbG9zZU1lbnUsXG4gICAgICAgICAgdG9nZ2xlTWVudSA9IHRoaXMudG9nZ2xlTWVudSxcbiAgICAgICAgICBzZWxlY3RJdGVtID0gdGhpcy5zZWxlY3RJdGVtLFxuICAgICAgICAgIHNlbGVjdEl0ZW1BdEluZGV4ID0gdGhpcy5zZWxlY3RJdGVtQXRJbmRleCxcbiAgICAgICAgICBzZWxlY3RIaWdobGlnaHRlZEl0ZW0gPSB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkSXRlbSxcbiAgICAgICAgICBzZXRIaWdobGlnaHRlZEluZGV4ID0gdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4LFxuICAgICAgICAgIGNsZWFyU2VsZWN0aW9uID0gdGhpcy5jbGVhclNlbGVjdGlvbixcbiAgICAgICAgICBjbGVhckl0ZW1zID0gdGhpcy5jbGVhckl0ZW1zLFxuICAgICAgICAgIHJlc2V0ID0gdGhpcy5yZXNldCxcbiAgICAgICAgICBzZXRJdGVtQ291bnQgPSB0aGlzLnNldEl0ZW1Db3VudCxcbiAgICAgICAgICB1bnNldEl0ZW1Db3VudCA9IHRoaXMudW5zZXRJdGVtQ291bnQsXG4gICAgICAgICAgc2V0U3RhdGUgPSB0aGlzLmludGVybmFsU2V0U3RhdGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAvLyBwcm9wIGdldHRlcnNcbiAgICAgICAgZ2V0Um9vdFByb3BzOiBnZXRSb290UHJvcHMsXG4gICAgICAgIGdldFRvZ2dsZUJ1dHRvblByb3BzOiBnZXRUb2dnbGVCdXR0b25Qcm9wcyxcbiAgICAgICAgZ2V0TGFiZWxQcm9wczogZ2V0TGFiZWxQcm9wcyxcbiAgICAgICAgZ2V0TWVudVByb3BzOiBnZXRNZW51UHJvcHMsXG4gICAgICAgIGdldElucHV0UHJvcHM6IGdldElucHV0UHJvcHMsXG4gICAgICAgIGdldEl0ZW1Qcm9wczogZ2V0SXRlbVByb3BzLFxuICAgICAgICAvLyBhY3Rpb25zXG4gICAgICAgIHJlc2V0OiByZXNldCxcbiAgICAgICAgb3Blbk1lbnU6IG9wZW5NZW51LFxuICAgICAgICBjbG9zZU1lbnU6IGNsb3NlTWVudSxcbiAgICAgICAgdG9nZ2xlTWVudTogdG9nZ2xlTWVudSxcbiAgICAgICAgc2VsZWN0SXRlbTogc2VsZWN0SXRlbSxcbiAgICAgICAgc2VsZWN0SXRlbUF0SW5kZXg6IHNlbGVjdEl0ZW1BdEluZGV4LFxuICAgICAgICBzZWxlY3RIaWdobGlnaHRlZEl0ZW06IHNlbGVjdEhpZ2hsaWdodGVkSXRlbSxcbiAgICAgICAgc2V0SGlnaGxpZ2h0ZWRJbmRleDogc2V0SGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgICAgY2xlYXJTZWxlY3Rpb246IGNsZWFyU2VsZWN0aW9uLFxuICAgICAgICBjbGVhckl0ZW1zOiBjbGVhckl0ZW1zLFxuICAgICAgICBzZXRJdGVtQ291bnQ6IHNldEl0ZW1Db3VudCxcbiAgICAgICAgdW5zZXRJdGVtQ291bnQ6IHVuc2V0SXRlbUNvdW50LFxuICAgICAgICBzZXRTdGF0ZTogc2V0U3RhdGUsXG4gICAgICAgIC8vIHByb3BzXG4gICAgICAgIGl0ZW1Ub1N0cmluZzogaXRlbVRvU3RyaW5nLFxuICAgICAgICAvLyBkZXJpdmVkXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgLy8gc3RhdGVcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgICAgaW5wdXRWYWx1ZTogaW5wdXRWYWx1ZSxcbiAgICAgICAgaXNPcGVuOiBpc09wZW4sXG4gICAgICAgIHNlbGVjdGVkSXRlbTogc2VsZWN0ZWRJdGVtXG4gICAgICB9O1xuICAgIH0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBST09UXG4gICAgO1xuXG4gICAgX3Byb3RvLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmIChyZWFjdC1uYXRpdmUpICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhZmFsc2UgJiYgdGhpcy5nZXRNZW51UHJvcHMuY2FsbGVkICYmICF0aGlzLmdldE1lbnVQcm9wcy5zdXBwcmVzc1JlZkVycm9yKSB7XG4gICAgICAgIHZhbGlkYXRlR2V0TWVudVByb3BzQ2FsbGVkQ29ycmVjdGx5KHRoaXMuX21lbnVOb2RlLCB0aGlzLmdldE1lbnVQcm9wcyk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKHJlYWN0LW5hdGl2ZSkgKi9cblxuXG4gICAgICB7XG4gICAgICAgIC8vIHRoaXMuaXNNb3VzZURvd24gaGVscHMgdXMgdHJhY2sgd2hldGhlciB0aGUgbW91c2UgaXMgY3VycmVudGx5IGhlbGQgZG93bi5cbiAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYW4gaXRlbSBpbiB0aGUgbGlzdCwgYnV0IGhvbGRzIHRoZSBtb3VzZVxuICAgICAgICAvLyBkb3duIGxvbmcgZW5vdWdoIGZvciB0aGUgbGlzdCB0byBkaXNhcHBlYXIgKGJlY2F1c2UgdGhlIGJsdXIgZXZlbnQgZmlyZXMgb24gdGhlIGlucHV0KVxuICAgICAgICAvLyB0aGlzLmlzTW91c2VEb3duIGlzIHVzZWQgaW4gdGhlIGJsdXIgaGFuZGxlciBvbiB0aGUgaW5wdXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJsdXIgZXZlbnQgc2hvdWxkXG4gICAgICAgIC8vIHRyaWdnZXIgaGlkaW5nIHRoZSBtZW51LlxuICAgICAgICB2YXIgb25Nb3VzZURvd24gPSBmdW5jdGlvbiBvbk1vdXNlRG93bigpIHtcbiAgICAgICAgICBfdGhpczcuaXNNb3VzZURvd24gPSB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnQpIHtcbiAgICAgICAgICBfdGhpczcuaXNNb3VzZURvd24gPSBmYWxzZTsgLy8gaWYgdGhlIHRhcmdldCBlbGVtZW50IG9yIHRoZSBhY3RpdmVFbGVtZW50IGlzIHdpdGhpbiBhIGRvd25zaGlmdCBub2RlXG4gICAgICAgICAgLy8gdGhlbiB3ZSBkb24ndCB3YW50IHRvIHJlc2V0IGRvd25zaGlmdFxuXG4gICAgICAgICAgdmFyIGNvbnRleHRXaXRoaW5Eb3duc2hpZnQgPSB0YXJnZXRXaXRoaW5Eb3duc2hpZnQoZXZlbnQudGFyZ2V0LCBbX3RoaXM3Ll9yb290Tm9kZSwgX3RoaXM3Ll9tZW51Tm9kZV0sIF90aGlzNy5wcm9wcy5lbnZpcm9ubWVudCk7XG5cbiAgICAgICAgICBpZiAoIWNvbnRleHRXaXRoaW5Eb3duc2hpZnQgJiYgX3RoaXM3LmdldFN0YXRlKCkuaXNPcGVuKSB7XG4gICAgICAgICAgICBfdGhpczcucmVzZXQoe1xuICAgICAgICAgICAgICB0eXBlOiBtb3VzZVVwXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczcucHJvcHMub25PdXRlckNsaWNrKF90aGlzNy5nZXRTdGF0ZUFuZEhlbHBlcnMoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07IC8vIFRvdWNoaW5nIGFuIGVsZW1lbnQgaW4gaU9TIGdpdmVzIGZvY3VzIGFuZCBob3ZlciBzdGF0ZXMsIGJ1dCB0b3VjaGluZyBvdXQgb2ZcbiAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2lsbCByZW1vdmUgaG92ZXIsIGFuZCBwZXJzaXN0IHRoZSBmb2N1cyBzdGF0ZSwgcmVzdWx0aW5nIGluIHRoZVxuICAgICAgICAvLyBibHVyIGV2ZW50IG5vdCBiZWluZyB0cmlnZ2VyZWQuXG4gICAgICAgIC8vIHRoaXMuaXNUb3VjaE1vdmUgaGVscHMgdXMgdHJhY2sgd2hldGhlciB0aGUgdXNlciBpcyB0YXBwaW5nIG9yIHN3aXBpbmcgb24gYSB0b3VjaCBzY3JlZW4uXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIHRhcHMgb3V0c2lkZSBvZiBEb3duc2hpZnQsIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHJlc2V0LFxuICAgICAgICAvLyBidXQgbm90IGlmIHRoZSB1c2VyIGlzIHN3aXBpbmdcblxuXG4gICAgICAgIHZhciBvblRvdWNoU3RhcnQgPSBmdW5jdGlvbiBvblRvdWNoU3RhcnQoKSB7XG4gICAgICAgICAgX3RoaXM3LmlzVG91Y2hNb3ZlID0gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoKSB7XG4gICAgICAgICAgX3RoaXM3LmlzVG91Y2hNb3ZlID0gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgb25Ub3VjaEVuZCA9IGZ1bmN0aW9uIG9uVG91Y2hFbmQoZXZlbnQpIHtcbiAgICAgICAgICB2YXIgY29udGV4dFdpdGhpbkRvd25zaGlmdCA9IHRhcmdldFdpdGhpbkRvd25zaGlmdChldmVudC50YXJnZXQsIFtfdGhpczcuX3Jvb3ROb2RlLCBfdGhpczcuX21lbnVOb2RlXSwgX3RoaXM3LnByb3BzLmVudmlyb25tZW50LCBmYWxzZSk7XG5cbiAgICAgICAgICBpZiAoIV90aGlzNy5pc1RvdWNoTW92ZSAmJiAhY29udGV4dFdpdGhpbkRvd25zaGlmdCAmJiBfdGhpczcuZ2V0U3RhdGUoKS5pc09wZW4pIHtcbiAgICAgICAgICAgIF90aGlzNy5yZXNldCh7XG4gICAgICAgICAgICAgIHR5cGU6IHRvdWNoRW5kXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczcucHJvcHMub25PdXRlckNsaWNrKF90aGlzNy5nZXRTdGF0ZUFuZEhlbHBlcnMoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5wcm9wcy5lbnZpcm9ubWVudDtcbiAgICAgICAgZW52aXJvbm1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24pO1xuICAgICAgICBlbnZpcm9ubWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZW52aXJvbm1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gICAgICAgIGVudmlyb25tZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlKTtcbiAgICAgICAgZW52aXJvbm1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoRW5kKTtcblxuICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXM3LmludGVybmFsQ2xlYXJUaW1lb3V0cygpO1xuXG4gICAgICAgICAgX3RoaXM3LnVwZGF0ZVN0YXR1cy5jYW5jZWwoKTtcblxuICAgICAgICAgIGVudmlyb25tZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICAgICAgICBlbnZpcm9ubWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgICBlbnZpcm9ubWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0KTtcbiAgICAgICAgICBlbnZpcm9ubWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSk7XG4gICAgICAgICAgZW52aXJvbm1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoRW5kKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnNob3VsZFNjcm9sbCA9IGZ1bmN0aW9uIHNob3VsZFNjcm9sbChwcmV2U3RhdGUsIHByZXZQcm9wcykge1xuICAgICAgdmFyIF9yZWYxMCA9IHRoaXMucHJvcHMuaGlnaGxpZ2h0ZWRJbmRleCA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXRTdGF0ZSgpIDogdGhpcy5wcm9wcyxcbiAgICAgICAgICBjdXJyZW50SGlnaGxpZ2h0ZWRJbmRleCA9IF9yZWYxMC5oaWdobGlnaHRlZEluZGV4O1xuXG4gICAgICB2YXIgX3JlZjExID0gcHJldlByb3BzLmhpZ2hsaWdodGVkSW5kZXggPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IHByZXZQcm9wcyxcbiAgICAgICAgICBwcmV2SGlnaGxpZ2h0ZWRJbmRleCA9IF9yZWYxMS5oaWdobGlnaHRlZEluZGV4O1xuXG4gICAgICB2YXIgc2Nyb2xsV2hlbk9wZW4gPSBjdXJyZW50SGlnaGxpZ2h0ZWRJbmRleCAmJiB0aGlzLmdldFN0YXRlKCkuaXNPcGVuICYmICFwcmV2U3RhdGUuaXNPcGVuO1xuICAgICAgdmFyIHNjcm9sbFdoZW5OYXZpZ2F0aW5nID0gY3VycmVudEhpZ2hsaWdodGVkSW5kZXggIT09IHByZXZIaWdobGlnaHRlZEluZGV4O1xuICAgICAgcmV0dXJuIHNjcm9sbFdoZW5PcGVuIHx8IHNjcm9sbFdoZW5OYXZpZ2F0aW5nO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YWxpZGF0ZUNvbnRyb2xsZWRVbmNoYW5nZWQodGhpcy5zdGF0ZSwgcHJldlByb3BzLCB0aGlzLnByb3BzKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmIChyZWFjdC1uYXRpdmUpICovXG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0TWVudVByb3BzLmNhbGxlZCAmJiAhdGhpcy5nZXRNZW51UHJvcHMuc3VwcHJlc3NSZWZFcnJvcikge1xuICAgICAgICAgIHZhbGlkYXRlR2V0TWVudVByb3BzQ2FsbGVkQ29ycmVjdGx5KHRoaXMuX21lbnVOb2RlLCB0aGlzLmdldE1lbnVQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQ29udHJvbGxlZFByb3AodGhpcy5wcm9wcywgJ3NlbGVjdGVkSXRlbScpICYmIHRoaXMucHJvcHMuc2VsZWN0ZWRJdGVtQ2hhbmdlZChwcmV2UHJvcHMuc2VsZWN0ZWRJdGVtLCB0aGlzLnByb3BzLnNlbGVjdGVkSXRlbSkpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNldFN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBjb250cm9sbGVkUHJvcFVwZGF0ZWRTZWxlY3RlZEl0ZW0sXG4gICAgICAgICAgaW5wdXRWYWx1ZTogdGhpcy5wcm9wcy5pdGVtVG9TdHJpbmcodGhpcy5wcm9wcy5zZWxlY3RlZEl0ZW0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuYXZvaWRTY3JvbGxpbmcgJiYgdGhpcy5zaG91bGRTY3JvbGwocHJldlN0YXRlLCBwcmV2UHJvcHMpKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsSGlnaGxpZ2h0ZWRJdGVtSW50b1ZpZXcoKTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIChyZWFjdC1uYXRpdmUpICovXG5cblxuICAgICAge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuY2xlYW51cCgpOyAvLyBhdm9pZHMgbWVtb3J5IGxlYWtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHVud3JhcEFycmF5KHRoaXMucHJvcHMuY2hpbGRyZW4sIG5vb3ApOyAvLyBiZWNhdXNlIHRoZSBpdGVtcyBhcmUgcmVyZW5kZXJlZCBldmVyeSB0aW1lIHdlIGNhbGwgdGhlIGNoaWxkcmVuXG4gICAgICAvLyB3ZSBjbGVhciB0aGlzIG91dCBlYWNoIHJlbmRlciBhbmQgaXQgd2lsbCBiZSBwb3B1bGF0ZWQgYWdhaW4gYXNcbiAgICAgIC8vIGdldEl0ZW1Qcm9wcyBpcyBjYWxsZWQuXG5cbiAgICAgIHRoaXMuY2xlYXJJdGVtcygpOyAvLyB3ZSByZXNldCB0aGlzIHNvIHdlIGtub3cgd2hldGhlciB0aGUgdXNlciBjYWxscyBnZXRSb290UHJvcHMgZHVyaW5nXG4gICAgICAvLyB0aGlzIHJlbmRlci4gSWYgdGhleSBkbyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcsXG4gICAgICAvLyBpZiB0aGV5IGRvbid0IHRoZW4gd2UgbmVlZCB0byBjbG9uZSB0aGUgZWxlbWVudCB0aGV5IHJldHVybiBhbmRcbiAgICAgIC8vIGFwcGx5IHRoZSBwcm9wcyBmb3IgdGhlbS5cblxuICAgICAgdGhpcy5nZXRSb290UHJvcHMuY2FsbGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmdldFJvb3RQcm9wcy5yZWZLZXkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmdldFJvb3RQcm9wcy5zdXBwcmVzc1JlZkVycm9yID0gdW5kZWZpbmVkOyAvLyB3ZSBkbyBzb21ldGhpbmcgc2ltaWxhciBmb3IgZ2V0TWVudVByb3BzXG5cbiAgICAgIHRoaXMuZ2V0TWVudVByb3BzLmNhbGxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5nZXRNZW51UHJvcHMucmVmS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5nZXRNZW51UHJvcHMuc3VwcHJlc3NSZWZFcnJvciA9IHVuZGVmaW5lZDsgLy8gd2UgZG8gc29tZXRoaW5nIHNpbWlsYXIgZm9yIGdldExhYmVsUHJvcHNcblxuICAgICAgdGhpcy5nZXRMYWJlbFByb3BzLmNhbGxlZCA9IGZhbHNlOyAvLyBhbmQgc29tZXRoaW5nIHNpbWlsYXIgZm9yIGdldElucHV0UHJvcHNcblxuICAgICAgdGhpcy5nZXRJbnB1dFByb3BzLmNhbGxlZCA9IGZhbHNlO1xuICAgICAgdmFyIGVsZW1lbnQgPSB1bndyYXBBcnJheShjaGlsZHJlbih0aGlzLmdldFN0YXRlQW5kSGVscGVycygpKSk7XG5cbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2V0Um9vdFByb3BzLmNhbGxlZCB8fCB0aGlzLnByb3BzLnN1cHByZXNzUmVmRXJyb3IpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuZ2V0Um9vdFByb3BzLnN1cHByZXNzUmVmRXJyb3IgJiYgIXRoaXMucHJvcHMuc3VwcHJlc3NSZWZFcnJvcikge1xuICAgICAgICAgIHZhbGlkYXRlR2V0Um9vdFByb3BzQ2FsbGVkQ29ycmVjdGx5KGVsZW1lbnQsIHRoaXMuZ2V0Um9vdFByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSBlbHNlIGlmIChpc0RPTUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgLy8gdGhleSBkaWRuJ3QgYXBwbHkgdGhlIHJvb3QgcHJvcHMsIGJ1dCB3ZSBjYW4gY2xvbmVcbiAgICAgICAgLy8gdGhpcyBhbmQgYXBwbHkgdGhlIHByb3BzIG91cnNlbHZlc1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChlbGVtZW50LCB0aGlzLmdldFJvb3RQcm9wcyhnZXRFbGVtZW50UHJvcHMoZWxlbWVudCkpKTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgLy8gdGhleSBkaWRuJ3QgYXBwbHkgdGhlIHJvb3QgcHJvcHMsIGJ1dCB0aGV5IG5lZWQgdG9cbiAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGNhbid0IHF1ZXJ5IGFyb3VuZCB0aGUgYXV0b2NvbXBsZXRlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZG93bnNoaWZ0OiBJZiB5b3UgcmV0dXJuIGEgbm9uLURPTSBlbGVtZW50LCB5b3UgbXVzdCBhcHBseSB0aGUgZ2V0Um9vdFByb3BzIGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIHJldHVybiBEb3duc2hpZnQ7XG4gIH0oQ29tcG9uZW50KTtcblxuICBEb3duc2hpZnQuZGVmYXVsdFByb3BzID0ge1xuICAgIGRlZmF1bHRIaWdobGlnaHRlZEluZGV4OiBudWxsLFxuICAgIGRlZmF1bHRJc09wZW46IGZhbHNlLFxuICAgIGdldEExMXlTdGF0dXNNZXNzYWdlOiBnZXRBMTF5U3RhdHVzTWVzc2FnZSQxLFxuICAgIGl0ZW1Ub1N0cmluZzogZnVuY3Rpb24gaXRlbVRvU3RyaW5nKGkpIHtcbiAgICAgIGlmIChpID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBpc1BsYWluT2JqZWN0KGkpICYmICFpLmhhc093blByb3BlcnR5KCd0b1N0cmluZycpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybignZG93bnNoaWZ0OiBBbiBvYmplY3Qgd2FzIHBhc3NlZCB0byB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgaXRlbVRvU3RyaW5nYC4gWW91IHNob3VsZCBwcm9iYWJseSBwcm92aWRlIHlvdXIgb3duIGBpdGVtVG9TdHJpbmdgIGltcGxlbWVudGF0aW9uLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGBpdGVtVG9TdHJpbmdgIEFQSSBkb2N1bWVudGF0aW9uLicsICdUaGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZDonLCBpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFN0cmluZyhpKTtcbiAgICB9LFxuICAgIG9uU3RhdGVDaGFuZ2U6IG5vb3AsXG4gICAgb25JbnB1dFZhbHVlQ2hhbmdlOiBub29wLFxuICAgIG9uVXNlckFjdGlvbjogbm9vcCxcbiAgICBvbkNoYW5nZTogbm9vcCxcbiAgICBvblNlbGVjdDogbm9vcCxcbiAgICBvbk91dGVyQ2xpY2s6IG5vb3AsXG4gICAgc2VsZWN0ZWRJdGVtQ2hhbmdlZDogZnVuY3Rpb24gc2VsZWN0ZWRJdGVtQ2hhbmdlZChwcmV2SXRlbSwgaXRlbSkge1xuICAgICAgcmV0dXJuIHByZXZJdGVtICE9PSBpdGVtO1xuICAgIH0sXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKHNzcikgKi9cbiAgICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IHt9IDogd2luZG93LFxuICAgIHN0YXRlUmVkdWNlcjogZnVuY3Rpb24gc3RhdGVSZWR1Y2VyKHN0YXRlLCBzdGF0ZVRvU2V0KSB7XG4gICAgICByZXR1cm4gc3RhdGVUb1NldDtcbiAgICB9LFxuICAgIHN1cHByZXNzUmVmRXJyb3I6IGZhbHNlLFxuICAgIHNjcm9sbEludG9WaWV3OiBzY3JvbGxJbnRvVmlld1xuICB9O1xuICBEb3duc2hpZnQuc3RhdGVDaGFuZ2VUeXBlcyA9IHN0YXRlQ2hhbmdlVHlwZXMkMztcbiAgcmV0dXJuIERvd25zaGlmdDtcbn0oKTtcblxucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRG93bnNoaWZ0LnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jLFxuICBkZWZhdWx0SGlnaGxpZ2h0ZWRJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgZGVmYXVsdElzT3BlbjogUHJvcFR5cGVzLmJvb2wsXG4gIGluaXRpYWxIaWdobGlnaHRlZEluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBpbml0aWFsU2VsZWN0ZWRJdGVtOiBQcm9wVHlwZXMuYW55LFxuICBpbml0aWFsSW5wdXRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgaW5pdGlhbElzT3BlbjogUHJvcFR5cGVzLmJvb2wsXG4gIGdldEExMXlTdGF0dXNNZXNzYWdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgaXRlbVRvU3RyaW5nOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvblNlbGVjdDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uU3RhdGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvbklucHV0VmFsdWVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvblVzZXJBY3Rpb246IFByb3BUeXBlcy5mdW5jLFxuICBvbk91dGVyQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICBzZWxlY3RlZEl0ZW1DaGFuZ2VkOiBQcm9wVHlwZXMuZnVuYyxcbiAgc3RhdGVSZWR1Y2VyOiBQcm9wVHlwZXMuZnVuYyxcbiAgaXRlbUNvdW50OiBQcm9wVHlwZXMubnVtYmVyLFxuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgZW52aXJvbm1lbnQ6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZG9jdW1lbnQ6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBnZXRFbGVtZW50QnlJZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBhY3RpdmVFbGVtZW50OiBQcm9wVHlwZXMuYW55LFxuICAgICAgYm9keTogUHJvcFR5cGVzLmFueVxuICAgIH0pXG4gIH0pLFxuICBzdXBwcmVzc1JlZkVycm9yOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2Nyb2xsSW50b1ZpZXc6IFByb3BUeXBlcy5mdW5jLFxuICAvLyB0aGluZ3Mgd2Uga2VlcCBpbiBzdGF0ZSBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHNcbiAgLy8gYnV0IGNhbiBhY2NlcHQgYXMgcHJvcHMgZm9yIGNvbnRyb2xsZWQgY29tcG9uZW50c1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLXVudXNlZC1wcm9wLXR5cGVzICovXG4gIHNlbGVjdGVkSXRlbTogUHJvcFR5cGVzLmFueSxcbiAgaXNPcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgaW5wdXRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgaGlnaGxpZ2h0ZWRJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgbGFiZWxJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgaW5wdXRJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgbWVudUlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBnZXRJdGVtSWQ6IFByb3BUeXBlcy5mdW5jXG4gIC8qIGVzbGludC1lbmFibGUgcmVhY3Qvbm8tdW51c2VkLXByb3AtdHlwZXMgKi9cblxufSA6IHZvaWQgMDtcbnZhciBEb3duc2hpZnQkMSA9IERvd25zaGlmdDtcblxuZnVuY3Rpb24gdmFsaWRhdGVHZXRNZW51UHJvcHNDYWxsZWRDb3JyZWN0bHkobm9kZSwgX3JlZjEyKSB7XG4gIHZhciByZWZLZXkgPSBfcmVmMTIucmVmS2V5O1xuXG4gIGlmICghbm9kZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihcImRvd25zaGlmdDogVGhlIHJlZiBwcm9wIFxcXCJcIiArIHJlZktleSArIFwiXFxcIiBmcm9tIGdldE1lbnVQcm9wcyB3YXMgbm90IGFwcGxpZWQgY29ycmVjdGx5IG9uIHlvdXIgbWVudSBlbGVtZW50LlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdldFJvb3RQcm9wc0NhbGxlZENvcnJlY3RseShlbGVtZW50LCBfcmVmMTMpIHtcbiAgdmFyIHJlZktleSA9IF9yZWYxMy5yZWZLZXk7XG4gIHZhciByZWZLZXlTcGVjaWZpZWQgPSByZWZLZXkgIT09ICdyZWYnO1xuICB2YXIgaXNDb21wb3NpdGUgPSAhaXNET01FbGVtZW50KGVsZW1lbnQpO1xuXG4gIGlmIChpc0NvbXBvc2l0ZSAmJiAhcmVmS2V5U3BlY2lmaWVkICYmICFpc0ZvcndhcmRSZWYoZWxlbWVudCkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoJ2Rvd25zaGlmdDogWW91IHJldHVybmVkIGEgbm9uLURPTSBlbGVtZW50LiBZb3UgbXVzdCBzcGVjaWZ5IGEgcmVmS2V5IGluIGdldFJvb3RQcm9wcycpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2l0ZSAmJiByZWZLZXlTcGVjaWZpZWQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoXCJkb3duc2hpZnQ6IFlvdSByZXR1cm5lZCBhIERPTSBlbGVtZW50LiBZb3Ugc2hvdWxkIG5vdCBzcGVjaWZ5IGEgcmVmS2V5IGluIGdldFJvb3RQcm9wcy4gWW91IHNwZWNpZmllZCBcXFwiXCIgKyByZWZLZXkgKyBcIlxcXCJcIik7XG4gIH1cblxuICBpZiAoIWlzRm9yd2FyZFJlZihlbGVtZW50KSAmJiAhZ2V0RWxlbWVudFByb3BzKGVsZW1lbnQpW3JlZktleV0pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoXCJkb3duc2hpZnQ6IFlvdSBtdXN0IGFwcGx5IHRoZSByZWYgcHJvcCBcXFwiXCIgKyByZWZLZXkgKyBcIlxcXCIgZnJvbSBnZXRSb290UHJvcHMgb250byB5b3VyIHJvb3QgZWxlbWVudC5cIik7XG4gIH1cbn1cblxudmFyIF9leGNsdWRlZCQzID0gW1wiaXNJbml0aWFsTW91bnRcIiwgXCJoaWdobGlnaHRlZEluZGV4XCIsIFwiaXRlbXNcIiwgXCJlbnZpcm9ubWVudFwiXTtcbnZhciBkcm9wZG93bkRlZmF1bHRTdGF0ZVZhbHVlcyA9IHtcbiAgaGlnaGxpZ2h0ZWRJbmRleDogLTEsXG4gIGlzT3BlbjogZmFsc2UsXG4gIHNlbGVjdGVkSXRlbTogbnVsbCxcbiAgaW5wdXRWYWx1ZTogJydcbn07XG5cbmZ1bmN0aW9uIGNhbGxPbkNoYW5nZVByb3BzKGFjdGlvbiwgc3RhdGUsIG5ld1N0YXRlKSB7XG4gIHZhciBwcm9wcyA9IGFjdGlvbi5wcm9wcyxcbiAgICAgIHR5cGUgPSBhY3Rpb24udHlwZTtcbiAgdmFyIGNoYW5nZXMgPSB7fTtcbiAgT2JqZWN0LmtleXMoc3RhdGUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGludm9rZU9uQ2hhbmdlSGFuZGxlcihrZXksIGFjdGlvbiwgc3RhdGUsIG5ld1N0YXRlKTtcblxuICAgIGlmIChuZXdTdGF0ZVtrZXldICE9PSBzdGF0ZVtrZXldKSB7XG4gICAgICBjaGFuZ2VzW2tleV0gPSBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHByb3BzLm9uU3RhdGVDaGFuZ2UgJiYgT2JqZWN0LmtleXMoY2hhbmdlcykubGVuZ3RoKSB7XG4gICAgcHJvcHMub25TdGF0ZUNoYW5nZShfZXh0ZW5kcyh7XG4gICAgICB0eXBlOiB0eXBlXG4gICAgfSwgY2hhbmdlcykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZU9uQ2hhbmdlSGFuZGxlcihrZXksIGFjdGlvbiwgc3RhdGUsIG5ld1N0YXRlKSB7XG4gIHZhciBwcm9wcyA9IGFjdGlvbi5wcm9wcyxcbiAgICAgIHR5cGUgPSBhY3Rpb24udHlwZTtcbiAgdmFyIGhhbmRsZXIgPSBcIm9uXCIgKyBjYXBpdGFsaXplU3RyaW5nKGtleSkgKyBcIkNoYW5nZVwiO1xuXG4gIGlmIChwcm9wc1toYW5kbGVyXSAmJiBuZXdTdGF0ZVtrZXldICE9PSB1bmRlZmluZWQgJiYgbmV3U3RhdGVba2V5XSAhPT0gc3RhdGVba2V5XSkge1xuICAgIHByb3BzW2hhbmRsZXJdKF9leHRlbmRzKHtcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9LCBuZXdTdGF0ZSkpO1xuICB9XG59XG4vKipcbiAqIERlZmF1bHQgc3RhdGUgcmVkdWNlciB0aGF0IHJldHVybnMgdGhlIGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHMgc3RhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gYSBhY3Rpb24gd2l0aCBjaGFuZ2VzLlxuICogQHJldHVybnMge09iamVjdH0gY2hhbmdlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0YXRlUmVkdWNlcihzLCBhKSB7XG4gIHJldHVybiBhLmNoYW5nZXM7XG59XG4vKipcbiAqIFJldHVybnMgYSBtZXNzYWdlIHRvIGJlIGFkZGVkIHRvIGFyaWEtbGl2ZSByZWdpb24gd2hlbiBpdGVtIGlzIHNlbGVjdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxlY3Rpb25QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYTExeSBtZXNzYWdlLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0QTExeVNlbGVjdGlvbk1lc3NhZ2Uoc2VsZWN0aW9uUGFyYW1ldGVycykge1xuICB2YXIgc2VsZWN0ZWRJdGVtID0gc2VsZWN0aW9uUGFyYW1ldGVycy5zZWxlY3RlZEl0ZW0sXG4gICAgICBpdGVtVG9TdHJpbmdMb2NhbCA9IHNlbGVjdGlvblBhcmFtZXRlcnMuaXRlbVRvU3RyaW5nO1xuICByZXR1cm4gc2VsZWN0ZWRJdGVtID8gaXRlbVRvU3RyaW5nTG9jYWwoc2VsZWN0ZWRJdGVtKSArIFwiIGhhcyBiZWVuIHNlbGVjdGVkLlwiIDogJyc7XG59XG4vKipcbiAqIERlYm91bmNlZCBjYWxsIGZvciB1cGRhdGluZyB0aGUgYTExeSBtZXNzYWdlLlxuICovXG5cblxudmFyIHVwZGF0ZUExMXlTdGF0dXMgPSBkZWJvdW5jZShmdW5jdGlvbiAoZ2V0QTExeU1lc3NhZ2UsIGRvY3VtZW50KSB7XG4gIHNldFN0YXR1cyhnZXRBMTF5TWVzc2FnZSgpLCBkb2N1bWVudCk7XG59LCAyMDApOyAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgPyB1c2VMYXlvdXRFZmZlY3QgOiB1c2VFZmZlY3Q7XG5cbmZ1bmN0aW9uIHVzZUVsZW1lbnRJZHMoX3JlZikge1xuICB2YXIgX3JlZiRpZCA9IF9yZWYuaWQsXG4gICAgICBpZCA9IF9yZWYkaWQgPT09IHZvaWQgMCA/IFwiZG93bnNoaWZ0LVwiICsgZ2VuZXJhdGVJZCgpIDogX3JlZiRpZCxcbiAgICAgIGxhYmVsSWQgPSBfcmVmLmxhYmVsSWQsXG4gICAgICBtZW51SWQgPSBfcmVmLm1lbnVJZCxcbiAgICAgIGdldEl0ZW1JZCA9IF9yZWYuZ2V0SXRlbUlkLFxuICAgICAgdG9nZ2xlQnV0dG9uSWQgPSBfcmVmLnRvZ2dsZUJ1dHRvbklkLFxuICAgICAgaW5wdXRJZCA9IF9yZWYuaW5wdXRJZDtcbiAgdmFyIGVsZW1lbnRJZHNSZWYgPSB1c2VSZWYoe1xuICAgIGxhYmVsSWQ6IGxhYmVsSWQgfHwgaWQgKyBcIi1sYWJlbFwiLFxuICAgIG1lbnVJZDogbWVudUlkIHx8IGlkICsgXCItbWVudVwiLFxuICAgIGdldEl0ZW1JZDogZ2V0SXRlbUlkIHx8IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgcmV0dXJuIGlkICsgXCItaXRlbS1cIiArIGluZGV4O1xuICAgIH0sXG4gICAgdG9nZ2xlQnV0dG9uSWQ6IHRvZ2dsZUJ1dHRvbklkIHx8IGlkICsgXCItdG9nZ2xlLWJ1dHRvblwiLFxuICAgIGlucHV0SWQ6IGlucHV0SWQgfHwgaWQgKyBcIi1pbnB1dFwiXG4gIH0pO1xuICByZXR1cm4gZWxlbWVudElkc1JlZi5jdXJyZW50O1xufVxuXG5mdW5jdGlvbiBnZXRJdGVtSW5kZXgoaW5kZXgsIGl0ZW0sIGl0ZW1zKSB7XG4gIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiBpdGVtcy5pbmRleE9mKGl0ZW0pO1xufVxuXG5mdW5jdGlvbiBpdGVtVG9TdHJpbmcoaXRlbSkge1xuICByZXR1cm4gaXRlbSA/IFN0cmluZyhpdGVtKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBpc0FjY2VwdGVkQ2hhcmFjdGVyS2V5KGtleSkge1xuICByZXR1cm4gL15cXFN7MX0kLy50ZXN0KGtleSk7XG59XG5cbmZ1bmN0aW9uIGNhcGl0YWxpemVTdHJpbmcoc3RyaW5nKSB7XG4gIHJldHVybiBcIlwiICsgc3RyaW5nLnNsaWNlKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSk7XG59XG5cbmZ1bmN0aW9uIHVzZUxhdGVzdFJlZih2YWwpIHtcbiAgdmFyIHJlZiA9IHVzZVJlZih2YWwpOyAvLyB0ZWNobmljYWxseSB0aGlzIGlzIG5vdCBcImNvbmN1cnJlbnQgbW9kZSBzYWZlXCIgYmVjYXVzZSB3ZSdyZSBtYW5pcHVsYXRpbmdcbiAgLy8gdGhlIHZhbHVlIGR1cmluZyByZW5kZXIgKHNvIGl0J3Mgbm90IGlkZW1wb3RlbnQpLiBIb3dldmVyLCB0aGUgcGxhY2VzIHRoaXNcbiAgLy8gaG9vayBpcyB1c2VkIGlzIHRvIHN1cHBvcnQgbWVtb2l6aW5nIGNhbGxiYWNrcyB3aGljaCB3aWxsIGJlIGNhbGxlZFxuICAvLyAqZHVyaW5nKiByZW5kZXIsIHNvIHdlIG5lZWQgdGhlIGxhdGVzdCB2YWx1ZXMgKmR1cmluZyogcmVuZGVyLlxuICAvLyBJZiBub3QgZm9yIHRoaXMsIHRoZW4gd2UnZCBwcm9iYWJseSB3YW50IHRvIHVzZSB1c2VMYXlvdXRFZmZlY3QgaW5zdGVhZC5cblxuICByZWYuY3VycmVudCA9IHZhbDtcbiAgcmV0dXJuIHJlZjtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNvbnRyb2xsZWQgc3RhdGUgdXNpbmcgYSB0aGUgcHJldmlvdXMgc3RhdGUsIHByb3BzLFxuICogdHdvIHJlZHVjZXJzLCBvbmUgZnJvbSBkb3duc2hpZnQgYW5kIGFuIG9wdGlvbmFsIG9uZSBmcm9tIHRoZSB1c2VyLlxuICogQWxzbyBjYWxscyB0aGUgb25DaGFuZ2UgaGFuZGxlcnMgZm9yIHN0YXRlIHZhbHVlcyB0aGF0IGhhdmUgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIFJlZHVjZXIgZnVuY3Rpb24gZnJvbSBkb3duc2hpZnQuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5pdGlhbFN0YXRlIEluaXRpYWwgc3RhdGUgb2YgdGhlIGhvb2suXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIGhvb2sgcHJvcHMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IHdpdGggdGhlIHN0YXRlIGFuZCBhbiBhY3Rpb24gZGlzcGF0Y2hlci5cbiAqL1xuXG5cbmZ1bmN0aW9uIHVzZUVuaGFuY2VkUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsU3RhdGUsIHByb3BzKSB7XG4gIHZhciBwcmV2U3RhdGVSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGFjdGlvblJlZiA9IHVzZVJlZigpO1xuICB2YXIgZW5oYW5jZWRSZWR1Y2VyID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBhY3Rpb25SZWYuY3VycmVudCA9IGFjdGlvbjtcbiAgICBzdGF0ZSA9IGdldFN0YXRlKHN0YXRlLCBhY3Rpb24ucHJvcHMpO1xuICAgIHZhciBjaGFuZ2VzID0gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgICB2YXIgbmV3U3RhdGUgPSBhY3Rpb24ucHJvcHMuc3RhdGVSZWR1Y2VyKHN0YXRlLCBfZXh0ZW5kcyh7fSwgYWN0aW9uLCB7XG4gICAgICBjaGFuZ2VzOiBjaGFuZ2VzXG4gICAgfSkpO1xuICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgfSwgW3JlZHVjZXJdKTtcblxuICB2YXIgX3VzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyKGVuaGFuY2VkUmVkdWNlciwgaW5pdGlhbFN0YXRlKSxcbiAgICAgIHN0YXRlID0gX3VzZVJlZHVjZXJbMF0sXG4gICAgICBkaXNwYXRjaCA9IF91c2VSZWR1Y2VyWzFdO1xuXG4gIHZhciBwcm9wc1JlZiA9IHVzZUxhdGVzdFJlZihwcm9wcyk7XG4gIHZhciBkaXNwYXRjaFdpdGhQcm9wcyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goX2V4dGVuZHMoe1xuICAgICAgcHJvcHM6IHByb3BzUmVmLmN1cnJlbnRcbiAgICB9LCBhY3Rpb24pKTtcbiAgfSwgW3Byb3BzUmVmXSk7XG4gIHZhciBhY3Rpb24gPSBhY3Rpb25SZWYuY3VycmVudDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYWN0aW9uICYmIHByZXZTdGF0ZVJlZi5jdXJyZW50ICYmIHByZXZTdGF0ZVJlZi5jdXJyZW50ICE9PSBzdGF0ZSkge1xuICAgICAgY2FsbE9uQ2hhbmdlUHJvcHMoYWN0aW9uLCBnZXRTdGF0ZShwcmV2U3RhdGVSZWYuY3VycmVudCwgYWN0aW9uLnByb3BzKSwgc3RhdGUpO1xuICAgIH1cblxuICAgIHByZXZTdGF0ZVJlZi5jdXJyZW50ID0gc3RhdGU7XG4gIH0sIFtzdGF0ZSwgcHJvcHMsIGFjdGlvbl0pO1xuICByZXR1cm4gW3N0YXRlLCBkaXNwYXRjaFdpdGhQcm9wc107XG59XG4vKipcbiAqIFdyYXBzIHRoZSB1c2VFbmhhbmNlZFJlZHVjZXIgYW5kIGFwcGxpZXMgdGhlIGNvbnRyb2xsZWQgcHJvcCB2YWx1ZXMgYmVmb3JlXG4gKiByZXR1cm5pbmcgdGhlIG5ldyBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIFJlZHVjZXIgZnVuY3Rpb24gZnJvbSBkb3duc2hpZnQuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5pdGlhbFN0YXRlIEluaXRpYWwgc3RhdGUgb2YgdGhlIGhvb2suXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIGhvb2sgcHJvcHMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IHdpdGggdGhlIHN0YXRlIGFuZCBhbiBhY3Rpb24gZGlzcGF0Y2hlci5cbiAqL1xuXG5cbmZ1bmN0aW9uIHVzZUNvbnRyb2xsZWRSZWR1Y2VyJDEocmVkdWNlciwgaW5pdGlhbFN0YXRlLCBwcm9wcykge1xuICB2YXIgX3VzZUVuaGFuY2VkUmVkdWNlciA9IHVzZUVuaGFuY2VkUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsU3RhdGUsIHByb3BzKSxcbiAgICAgIHN0YXRlID0gX3VzZUVuaGFuY2VkUmVkdWNlclswXSxcbiAgICAgIGRpc3BhdGNoID0gX3VzZUVuaGFuY2VkUmVkdWNlclsxXTtcblxuICByZXR1cm4gW2dldFN0YXRlKHN0YXRlLCBwcm9wcyksIGRpc3BhdGNoXTtcbn1cblxudmFyIGRlZmF1bHRQcm9wcyQzID0ge1xuICBpdGVtVG9TdHJpbmc6IGl0ZW1Ub1N0cmluZyxcbiAgc3RhdGVSZWR1Y2VyOiBzdGF0ZVJlZHVjZXIsXG4gIGdldEExMXlTZWxlY3Rpb25NZXNzYWdlOiBnZXRBMTF5U2VsZWN0aW9uTWVzc2FnZSxcbiAgc2Nyb2xsSW50b1ZpZXc6IHNjcm9sbEludG9WaWV3LFxuICBjaXJjdWxhck5hdmlnYXRpb246IGZhbHNlLFxuICBlbnZpcm9ubWVudDpcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKHNzcikgKi9cbiAgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyB7fSA6IHdpbmRvd1xufTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbHVlJDEocHJvcHMsIHByb3BLZXksIGRlZmF1bHRTdGF0ZVZhbHVlcykge1xuICBpZiAoZGVmYXVsdFN0YXRlVmFsdWVzID09PSB2b2lkIDApIHtcbiAgICBkZWZhdWx0U3RhdGVWYWx1ZXMgPSBkcm9wZG93bkRlZmF1bHRTdGF0ZVZhbHVlcztcbiAgfVxuXG4gIHZhciBkZWZhdWx0UHJvcEtleSA9IFwiZGVmYXVsdFwiICsgY2FwaXRhbGl6ZVN0cmluZyhwcm9wS2V5KTtcblxuICBpZiAoZGVmYXVsdFByb3BLZXkgaW4gcHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHNbZGVmYXVsdFByb3BLZXldO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRTdGF0ZVZhbHVlc1twcm9wS2V5XTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5pdGlhbFZhbHVlJDEocHJvcHMsIHByb3BLZXksIGRlZmF1bHRTdGF0ZVZhbHVlcykge1xuICBpZiAoZGVmYXVsdFN0YXRlVmFsdWVzID09PSB2b2lkIDApIHtcbiAgICBkZWZhdWx0U3RhdGVWYWx1ZXMgPSBkcm9wZG93bkRlZmF1bHRTdGF0ZVZhbHVlcztcbiAgfVxuXG4gIGlmIChwcm9wS2V5IGluIHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzW3Byb3BLZXldO1xuICB9XG5cbiAgdmFyIGluaXRpYWxQcm9wS2V5ID0gXCJpbml0aWFsXCIgKyBjYXBpdGFsaXplU3RyaW5nKHByb3BLZXkpO1xuXG4gIGlmIChpbml0aWFsUHJvcEtleSBpbiBwcm9wcykge1xuICAgIHJldHVybiBwcm9wc1tpbml0aWFsUHJvcEtleV07XG4gIH1cblxuICByZXR1cm4gZ2V0RGVmYXVsdFZhbHVlJDEocHJvcHMsIHByb3BLZXksIGRlZmF1bHRTdGF0ZVZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSQyKHByb3BzKSB7XG4gIHZhciBzZWxlY3RlZEl0ZW0gPSBnZXRJbml0aWFsVmFsdWUkMShwcm9wcywgJ3NlbGVjdGVkSXRlbScpO1xuICB2YXIgaXNPcGVuID0gZ2V0SW5pdGlhbFZhbHVlJDEocHJvcHMsICdpc09wZW4nKTtcbiAgdmFyIGhpZ2hsaWdodGVkSW5kZXggPSBnZXRJbml0aWFsVmFsdWUkMShwcm9wcywgJ2hpZ2hsaWdodGVkSW5kZXgnKTtcbiAgdmFyIGlucHV0VmFsdWUgPSBnZXRJbml0aWFsVmFsdWUkMShwcm9wcywgJ2lucHV0VmFsdWUnKTtcbiAgcmV0dXJuIHtcbiAgICBoaWdobGlnaHRlZEluZGV4OiBoaWdobGlnaHRlZEluZGV4IDwgMCAmJiBzZWxlY3RlZEl0ZW0gJiYgaXNPcGVuID8gcHJvcHMuaXRlbXMuaW5kZXhPZihzZWxlY3RlZEl0ZW0pIDogaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICBpc09wZW46IGlzT3BlbixcbiAgICBzZWxlY3RlZEl0ZW06IHNlbGVjdGVkSXRlbSxcbiAgICBpbnB1dFZhbHVlOiBpbnB1dFZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodGVkSW5kZXhPbk9wZW4ocHJvcHMsIHN0YXRlLCBvZmZzZXQsIGdldEl0ZW1Ob2RlRnJvbUluZGV4KSB7XG4gIHZhciBpdGVtcyA9IHByb3BzLml0ZW1zLFxuICAgICAgaW5pdGlhbEhpZ2hsaWdodGVkSW5kZXggPSBwcm9wcy5pbml0aWFsSGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgIGRlZmF1bHRIaWdobGlnaHRlZEluZGV4ID0gcHJvcHMuZGVmYXVsdEhpZ2hsaWdodGVkSW5kZXg7XG4gIHZhciBzZWxlY3RlZEl0ZW0gPSBzdGF0ZS5zZWxlY3RlZEl0ZW0sXG4gICAgICBoaWdobGlnaHRlZEluZGV4ID0gc3RhdGUuaGlnaGxpZ2h0ZWRJbmRleDtcblxuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IC8vIGluaXRpYWxIaWdobGlnaHRlZEluZGV4IHdpbGwgZ2l2ZSB2YWx1ZSB0byBoaWdobGlnaHRlZEluZGV4IG9uIGluaXRpYWwgc3RhdGUgb25seS5cblxuXG4gIGlmIChpbml0aWFsSGlnaGxpZ2h0ZWRJbmRleCAhPT0gdW5kZWZpbmVkICYmIGhpZ2hsaWdodGVkSW5kZXggPT09IGluaXRpYWxIaWdobGlnaHRlZEluZGV4KSB7XG4gICAgcmV0dXJuIGluaXRpYWxIaWdobGlnaHRlZEluZGV4O1xuICB9XG5cbiAgaWYgKGRlZmF1bHRIaWdobGlnaHRlZEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGVmYXVsdEhpZ2hsaWdodGVkSW5kZXg7XG4gIH1cblxuICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGl0ZW1zLmluZGV4T2Yoc2VsZWN0ZWRJdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0TmV4dFdyYXBwaW5nSW5kZXgob2Zmc2V0LCBpdGVtcy5pbmRleE9mKHNlbGVjdGVkSXRlbSksIGl0ZW1zLmxlbmd0aCwgZ2V0SXRlbU5vZGVGcm9tSW5kZXgsIGZhbHNlKTtcbiAgfVxuXG4gIGlmIChvZmZzZXQgPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0IDwgMCA/IGl0ZW1zLmxlbmd0aCAtIDEgOiAwO1xufVxuLyoqXG4gKiBSZXVzZSB0aGUgbW92ZW1lbnQgdHJhY2tpbmcgb2YgbW91c2UgYW5kIHRvdWNoIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzT3BlbiBXaGV0aGVyIHRoZSBkcm9wZG93biBpcyBvcGVuIG9yIG5vdC5cbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZG93bnNoaWZ0RWxlbWVudFJlZnMgRG93bnNoaWZ0IGVsZW1lbnQgcmVmcyB0byB0cmFjayBtb3ZlbWVudCAodG9nZ2xlQnV0dG9uLCBtZW51IGV0Yy4pXG4gKiBAcGFyYW0ge09iamVjdH0gZW52aXJvbm1lbnQgRW52aXJvbm1lbnQgd2hlcmUgY29tcG9uZW50L2hvb2sgZXhpc3RzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlQmx1ciBIYW5kbGVyIG9uIGJsdXIgZnJvbSBtb3VzZSBvciB0b3VjaC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlZiBjb250YWluaW5nIHdoZXRoZXIgbW91c2VEb3duIG9yIHRvdWNoTW92ZSBldmVudCBpcyBoYXBwZW5pbmdcbiAqL1xuXG5cbmZ1bmN0aW9uIHVzZU1vdXNlQW5kVG91Y2hUcmFja2VyKGlzT3BlbiwgZG93bnNoaWZ0RWxlbWVudFJlZnMsIGVudmlyb25tZW50LCBoYW5kbGVCbHVyKSB7XG4gIHZhciBtb3VzZUFuZFRvdWNoVHJhY2tlcnNSZWYgPSB1c2VSZWYoe1xuICAgIGlzTW91c2VEb3duOiBmYWxzZSxcbiAgICBpc1RvdWNoTW92ZTogZmFsc2VcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIHNhbWUgc3RyYXRlZ3kgZm9yIGNoZWNraW5nIGlmIGEgY2xpY2sgb2NjdXJyZWQgaW5zaWRlIG9yIG91dHNpZGUgZG93bnNpZnRcbiAgICAvLyBhcyBpbiBkb3duc2hpZnQuanMuXG4gICAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oKSB7XG4gICAgICBtb3VzZUFuZFRvdWNoVHJhY2tlcnNSZWYuY3VycmVudC5pc01vdXNlRG93biA9IHRydWU7XG4gICAgfTtcblxuICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnQpIHtcbiAgICAgIG1vdXNlQW5kVG91Y2hUcmFja2Vyc1JlZi5jdXJyZW50LmlzTW91c2VEb3duID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc09wZW4gJiYgIXRhcmdldFdpdGhpbkRvd25zaGlmdChldmVudC50YXJnZXQsIGRvd25zaGlmdEVsZW1lbnRSZWZzLm1hcChmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHJldHVybiByZWYuY3VycmVudDtcbiAgICAgIH0pLCBlbnZpcm9ubWVudCkpIHtcbiAgICAgICAgaGFuZGxlQmx1cigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgb25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KCkge1xuICAgICAgbW91c2VBbmRUb3VjaFRyYWNrZXJzUmVmLmN1cnJlbnQuaXNUb3VjaE1vdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoKSB7XG4gICAgICBtb3VzZUFuZFRvdWNoVHJhY2tlcnNSZWYuY3VycmVudC5pc1RvdWNoTW92ZSA9IHRydWU7XG4gICAgfTtcblxuICAgIHZhciBvblRvdWNoRW5kID0gZnVuY3Rpb24gb25Ub3VjaEVuZChldmVudCkge1xuICAgICAgaWYgKGlzT3BlbiAmJiAhbW91c2VBbmRUb3VjaFRyYWNrZXJzUmVmLmN1cnJlbnQuaXNUb3VjaE1vdmUgJiYgIXRhcmdldFdpdGhpbkRvd25zaGlmdChldmVudC50YXJnZXQsIGRvd25zaGlmdEVsZW1lbnRSZWZzLm1hcChmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHJldHVybiByZWYuY3VycmVudDtcbiAgICAgIH0pLCBlbnZpcm9ubWVudCwgZmFsc2UpKSB7XG4gICAgICAgIGhhbmRsZUJsdXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZW52aXJvbm1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24pO1xuICAgIGVudmlyb25tZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGVudmlyb25tZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQpO1xuICAgIGVudmlyb25tZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlKTtcbiAgICBlbnZpcm9ubWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQpO1xuICAgIHJldHVybiBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgZW52aXJvbm1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24pO1xuICAgICAgZW52aXJvbm1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICBlbnZpcm9ubWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0KTtcbiAgICAgIGVudmlyb25tZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlKTtcbiAgICAgIGVudmlyb25tZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbaXNPcGVuLCBlbnZpcm9ubWVudF0pO1xuICByZXR1cm4gbW91c2VBbmRUb3VjaFRyYWNrZXJzUmVmO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5cblxudmFyIHVzZUdldHRlclByb3BzQ2FsbGVkQ2hlY2tlciA9IGZ1bmN0aW9uIHVzZUdldHRlclByb3BzQ2FsbGVkQ2hlY2tlcigpIHtcbiAgcmV0dXJuIG5vb3A7XG59O1xuLyoqXG4gKiBDdXN0b20gaG9vayB0aGF0IGNoZWNrcyBpZiBnZXR0ZXIgcHJvcHMgYXJlIGNhbGxlZCBjb3JyZWN0bHkuXG4gKlxuICogQHBhcmFtICB7Li4uYW55fSBwcm9wS2V5cyBHZXR0ZXIgcHJvcCBuYW1lcyB0byBiZSBoYW5kbGVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBTZXR0ZXIgZnVuY3Rpb24gY2FsbGVkIGluc2lkZSBnZXR0ZXIgcHJvcHMgdG8gc2V0IGNhbGwgaW5mb3JtYXRpb24uXG4gKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB1c2VHZXR0ZXJQcm9wc0NhbGxlZENoZWNrZXIgPSBmdW5jdGlvbiB1c2VHZXR0ZXJQcm9wc0NhbGxlZENoZWNrZXIoKSB7XG4gICAgdmFyIGlzSW5pdGlhbE1vdW50UmVmID0gdXNlUmVmKHRydWUpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHByb3BLZXlzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgcHJvcEtleXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIGdldHRlclByb3BzQ2FsbGVkUmVmID0gdXNlUmVmKHByb3BLZXlzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwcm9wS2V5KSB7XG4gICAgICBhY2NbcHJvcEtleV0gPSB7fTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgT2JqZWN0LmtleXMoZ2V0dGVyUHJvcHNDYWxsZWRSZWYuY3VycmVudCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcEtleSkge1xuICAgICAgICB2YXIgcHJvcENhbGxJbmZvID0gZ2V0dGVyUHJvcHNDYWxsZWRSZWYuY3VycmVudFtwcm9wS2V5XTtcblxuICAgICAgICBpZiAoaXNJbml0aWFsTW91bnRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGlmICghT2JqZWN0LmtleXMocHJvcENhbGxJbmZvKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZG93bnNoaWZ0OiBZb3UgZm9yZ290IHRvIGNhbGwgdGhlIFwiICsgcHJvcEtleSArIFwiIGdldHRlciBmdW5jdGlvbiBvbiB5b3VyIGNvbXBvbmVudCAvIGVsZW1lbnQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdXBwcmVzc1JlZkVycm9yID0gcHJvcENhbGxJbmZvLnN1cHByZXNzUmVmRXJyb3IsXG4gICAgICAgICAgICByZWZLZXkgPSBwcm9wQ2FsbEluZm8ucmVmS2V5LFxuICAgICAgICAgICAgZWxlbWVudFJlZiA9IHByb3BDYWxsSW5mby5lbGVtZW50UmVmO1xuXG4gICAgICAgIGlmICgoIWVsZW1lbnRSZWYgfHwgIWVsZW1lbnRSZWYuY3VycmVudCkgJiYgIXN1cHByZXNzUmVmRXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJkb3duc2hpZnQ6IFRoZSByZWYgcHJvcCBcXFwiXCIgKyByZWZLZXkgKyBcIlxcXCIgZnJvbSBcIiArIHByb3BLZXkgKyBcIiB3YXMgbm90IGFwcGxpZWQgY29ycmVjdGx5IG9uIHlvdXIgZWxlbWVudC5cIik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaXNJbml0aWFsTW91bnRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0pO1xuICAgIHZhciBzZXRHZXR0ZXJQcm9wQ2FsbEluZm8gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAocHJvcEtleSwgc3VwcHJlc3NSZWZFcnJvciwgcmVmS2V5LCBlbGVtZW50UmVmKSB7XG4gICAgICBnZXR0ZXJQcm9wc0NhbGxlZFJlZi5jdXJyZW50W3Byb3BLZXldID0ge1xuICAgICAgICBzdXBwcmVzc1JlZkVycm9yOiBzdXBwcmVzc1JlZkVycm9yLFxuICAgICAgICByZWZLZXk6IHJlZktleSxcbiAgICAgICAgZWxlbWVudFJlZjogZWxlbWVudFJlZlxuICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHNldEdldHRlclByb3BDYWxsSW5mbztcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlQTExeU1lc3NhZ2VTZXR0ZXIoZ2V0QTExeU1lc3NhZ2UsIGRlcGVuZGVuY3lBcnJheSwgX3JlZjIpIHtcbiAgdmFyIGlzSW5pdGlhbE1vdW50ID0gX3JlZjIuaXNJbml0aWFsTW91bnQsXG4gICAgICBoaWdobGlnaHRlZEluZGV4ID0gX3JlZjIuaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgIGl0ZW1zID0gX3JlZjIuaXRlbXMsXG4gICAgICBlbnZpcm9ubWVudCA9IF9yZWYyLmVudmlyb25tZW50LFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYyLCBfZXhjbHVkZWQkMyk7XG5cbiAgLy8gU2V0cyBhMTF5IHN0YXR1cyBtZXNzYWdlIG9uIGNoYW5nZXMgaW4gc3RhdGUuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzSW5pdGlhbE1vdW50IHx8IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdXBkYXRlQTExeVN0YXR1cyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0QTExeU1lc3NhZ2UoX2V4dGVuZHMoe1xuICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBoaWdobGlnaHRlZEluZGV4LFxuICAgICAgICBoaWdobGlnaHRlZEl0ZW06IGl0ZW1zW2hpZ2hsaWdodGVkSW5kZXhdLFxuICAgICAgICByZXN1bHRDb3VudDogaXRlbXMubGVuZ3RoXG4gICAgICB9LCByZXN0KSk7XG4gICAgfSwgZW52aXJvbm1lbnQuZG9jdW1lbnQpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIGRlcGVuZGVuY3lBcnJheSk7XG59XG5cbmZ1bmN0aW9uIHVzZVNjcm9sbEludG9WaWV3KF9yZWYzKSB7XG4gIHZhciBoaWdobGlnaHRlZEluZGV4ID0gX3JlZjMuaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgIGlzT3BlbiA9IF9yZWYzLmlzT3BlbixcbiAgICAgIGl0ZW1SZWZzID0gX3JlZjMuaXRlbVJlZnMsXG4gICAgICBnZXRJdGVtTm9kZUZyb21JbmRleCA9IF9yZWYzLmdldEl0ZW1Ob2RlRnJvbUluZGV4LFxuICAgICAgbWVudUVsZW1lbnQgPSBfcmVmMy5tZW51RWxlbWVudCxcbiAgICAgIHNjcm9sbEludG9WaWV3UHJvcCA9IF9yZWYzLnNjcm9sbEludG9WaWV3O1xuICAvLyB1c2VkIG5vdCB0byBzY3JvbGwgb24gaGlnaGxpZ2h0IGJ5IG1vdXNlLlxuICB2YXIgc2hvdWxkU2Nyb2xsUmVmID0gdXNlUmVmKHRydWUpOyAvLyBTY3JvbGwgb24gaGlnaGxpZ2h0ZWQgaXRlbSBpZiBjaGFuZ2UgY29tZXMgZnJvbSBrZXlib2FyZC5cblxuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaGlnaGxpZ2h0ZWRJbmRleCA8IDAgfHwgIWlzT3BlbiB8fCAhT2JqZWN0LmtleXMoaXRlbVJlZnMuY3VycmVudCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFNjcm9sbFJlZi5jdXJyZW50ID09PSBmYWxzZSkge1xuICAgICAgc2hvdWxkU2Nyb2xsUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JvbGxJbnRvVmlld1Byb3AoZ2V0SXRlbU5vZGVGcm9tSW5kZXgoaGlnaGxpZ2h0ZWRJbmRleCksIG1lbnVFbGVtZW50KTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcblxuICB9LCBbaGlnaGxpZ2h0ZWRJbmRleF0pO1xuICByZXR1cm4gc2hvdWxkU2Nyb2xsUmVmO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLW11dGFibGUtZXhwb3J0c1xuXG5cbnZhciB1c2VDb250cm9sUHJvcHNWYWxpZGF0b3IgPSBub29wO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdXNlQ29udHJvbFByb3BzVmFsaWRhdG9yID0gZnVuY3Rpb24gdXNlQ29udHJvbFByb3BzVmFsaWRhdG9yKF9yZWY0KSB7XG4gICAgdmFyIGlzSW5pdGlhbE1vdW50ID0gX3JlZjQuaXNJbml0aWFsTW91bnQsXG4gICAgICAgIHByb3BzID0gX3JlZjQucHJvcHMsXG4gICAgICAgIHN0YXRlID0gX3JlZjQuc3RhdGU7XG4gICAgLy8gdXNlZCBmb3IgY2hlY2tpbmcgd2hlbiBwcm9wcyBhcmUgbW92aW5nIGZyb20gY29udHJvbGxlZCB0byB1bmNvbnRyb2xsZWQuXG4gICAgdmFyIHByZXZQcm9wc1JlZiA9IHVzZVJlZihwcm9wcyk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpc0luaXRpYWxNb3VudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRlQ29udHJvbGxlZFVuY2hhbmdlZChzdGF0ZSwgcHJldlByb3BzUmVmLmN1cnJlbnQsIHByb3BzKTtcbiAgICAgIHByZXZQcm9wc1JlZi5jdXJyZW50ID0gcHJvcHM7XG4gICAgfSwgW3N0YXRlLCBwcm9wcywgaXNJbml0aWFsTW91bnRdKTtcbiAgfTtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG5mdW5jdGlvbiBkb3duc2hpZnRDb21tb25SZWR1Y2VyKHN0YXRlLCBhY3Rpb24sIHN0YXRlQ2hhbmdlVHlwZXMpIHtcbiAgdmFyIHR5cGUgPSBhY3Rpb24udHlwZSxcbiAgICAgIHByb3BzID0gYWN0aW9uLnByb3BzO1xuICB2YXIgY2hhbmdlcztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIHN0YXRlQ2hhbmdlVHlwZXMuSXRlbU1vdXNlTW92ZTpcbiAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGFjdGlvbi5pbmRleFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBzdGF0ZUNoYW5nZVR5cGVzLk1lbnVNb3VzZUxlYXZlOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogLTFcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2Ugc3RhdGVDaGFuZ2VUeXBlcy5Ub2dnbGVCdXR0b25DbGljazpcbiAgICBjYXNlIHN0YXRlQ2hhbmdlVHlwZXMuRnVuY3Rpb25Ub2dnbGVNZW51OlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaXNPcGVuOiAhc3RhdGUuaXNPcGVuLFxuICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBzdGF0ZS5pc09wZW4gPyAtMSA6IGdldEhpZ2hsaWdodGVkSW5kZXhPbk9wZW4ocHJvcHMsIHN0YXRlLCAwKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBzdGF0ZUNoYW5nZVR5cGVzLkZ1bmN0aW9uT3Blbk1lbnU6XG4gICAgICBjaGFuZ2VzID0ge1xuICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGdldEhpZ2hsaWdodGVkSW5kZXhPbk9wZW4ocHJvcHMsIHN0YXRlLCAwKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBzdGF0ZUNoYW5nZVR5cGVzLkZ1bmN0aW9uQ2xvc2VNZW51OlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaXNPcGVuOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBzdGF0ZUNoYW5nZVR5cGVzLkZ1bmN0aW9uU2V0SGlnaGxpZ2h0ZWRJbmRleDpcbiAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGFjdGlvbi5oaWdobGlnaHRlZEluZGV4XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHN0YXRlQ2hhbmdlVHlwZXMuRnVuY3Rpb25TZXRJbnB1dFZhbHVlOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaW5wdXRWYWx1ZTogYWN0aW9uLmlucHV0VmFsdWVcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2Ugc3RhdGVDaGFuZ2VUeXBlcy5GdW5jdGlvblJlc2V0OlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogZ2V0RGVmYXVsdFZhbHVlJDEocHJvcHMsICdoaWdobGlnaHRlZEluZGV4JyksXG4gICAgICAgIGlzT3BlbjogZ2V0RGVmYXVsdFZhbHVlJDEocHJvcHMsICdpc09wZW4nKSxcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBnZXREZWZhdWx0VmFsdWUkMShwcm9wcywgJ3NlbGVjdGVkSXRlbScpLFxuICAgICAgICBpbnB1dFZhbHVlOiBnZXREZWZhdWx0VmFsdWUkMShwcm9wcywgJ2lucHV0VmFsdWUnKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlciBjYWxsZWQgd2l0aG91dCBwcm9wZXIgYWN0aW9uIHR5cGUuJyk7XG4gIH1cblxuICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCBjaGFuZ2VzKTtcbn1cbi8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuXG5mdW5jdGlvbiBnZXRJdGVtSW5kZXhCeUNoYXJhY3RlcktleShfYSkge1xuICAgIHZhciBrZXlzU29GYXIgPSBfYS5rZXlzU29GYXIsIGhpZ2hsaWdodGVkSW5kZXggPSBfYS5oaWdobGlnaHRlZEluZGV4LCBpdGVtcyA9IF9hLml0ZW1zLCBpdGVtVG9TdHJpbmcgPSBfYS5pdGVtVG9TdHJpbmcsIGdldEl0ZW1Ob2RlRnJvbUluZGV4ID0gX2EuZ2V0SXRlbU5vZGVGcm9tSW5kZXg7XG4gICAgdmFyIGxvd2VyQ2FzZWRLZXlzU29GYXIgPSBrZXlzU29GYXIudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgaXRlbXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBvZmZzZXRJbmRleCA9IChpbmRleCArIGhpZ2hsaWdodGVkSW5kZXggKyAxKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tvZmZzZXRJbmRleF07XG4gICAgICAgIGlmIChpdGVtICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGl0ZW1Ub1N0cmluZyhpdGVtKVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgobG93ZXJDYXNlZEtleXNTb0ZhcikpIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZ2V0SXRlbU5vZGVGcm9tSW5kZXgob2Zmc2V0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKCEoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0SW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhpZ2hsaWdodGVkSW5kZXg7XG59XG52YXIgcHJvcFR5cGVzJDIgPSB7XG4gICAgaXRlbXM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICAgIGl0ZW1Ub1N0cmluZzogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZ2V0QTExeVN0YXR1c01lc3NhZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIGdldEExMXlTZWxlY3Rpb25NZXNzYWdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBjaXJjdWxhck5hdmlnYXRpb246IFByb3BUeXBlcy5ib29sLFxuICAgIGhpZ2hsaWdodGVkSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgZGVmYXVsdEhpZ2hsaWdodGVkSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgaW5pdGlhbEhpZ2hsaWdodGVkSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgaXNPcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkZWZhdWx0SXNPcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpbml0aWFsSXNPcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBzZWxlY3RlZEl0ZW06IFByb3BUeXBlcy5hbnksXG4gICAgaW5pdGlhbFNlbGVjdGVkSXRlbTogUHJvcFR5cGVzLmFueSxcbiAgICBkZWZhdWx0U2VsZWN0ZWRJdGVtOiBQcm9wVHlwZXMuYW55LFxuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGxhYmVsSWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgbWVudUlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGdldEl0ZW1JZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgdG9nZ2xlQnV0dG9uSWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgc3RhdGVSZWR1Y2VyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvblNlbGVjdGVkSXRlbUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25IaWdobGlnaHRlZEluZGV4Q2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvblN0YXRlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbklzT3BlbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZW52aXJvbm1lbnQ6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgZG9jdW1lbnQ6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICBnZXRFbGVtZW50QnlJZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgICAgICBhY3RpdmVFbGVtZW50OiBQcm9wVHlwZXMuYW55LFxuICAgICAgICAgICAgYm9keTogUHJvcFR5cGVzLmFueVxuICAgICAgICB9KVxuICAgIH0pXG59O1xuLyoqXG4gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzdGF0dXMgbWVzc2FnZS4gT25seSBhZGRlZCB3aGVuIG1lbnUgaXMgb3Blbi5cbiAqIFdpbGwgc3BlY2lmdCBpZiB0aGVyZSBhcmUgcmVzdWx0cyBpbiB0aGUgbGlzdCwgYW5kIGlmIHNvLCBob3cgbWFueSxcbiAqIGFuZCB3aGF0IGtleXMgYXJlIHJlbGV2YW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbSB0aGUgZG93bnNoaWZ0IHN0YXRlIGFuZCBvdGhlciByZWxldmFudCBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBhMTF5IHN0YXR1cyBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGdldEExMXlTdGF0dXNNZXNzYWdlKF9hKSB7XG4gICAgdmFyIGlzT3BlbiA9IF9hLmlzT3BlbiwgcmVzdWx0Q291bnQgPSBfYS5yZXN1bHRDb3VudCwgcHJldmlvdXNSZXN1bHRDb3VudCA9IF9hLnByZXZpb3VzUmVzdWx0Q291bnQ7XG4gICAgaWYgKCFpc09wZW4pIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdENvdW50KSB7XG4gICAgICAgIHJldHVybiAnTm8gcmVzdWx0cyBhcmUgYXZhaWxhYmxlLic7XG4gICAgfVxuICAgIGlmIChyZXN1bHRDb3VudCAhPT0gcHJldmlvdXNSZXN1bHRDb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0Q291bnQgKyBcIiByZXN1bHRcIiArIChyZXN1bHRDb3VudCA9PT0gMSA/ICcgaXMnIDogJ3MgYXJlJykgKyBcIiBhdmFpbGFibGUsIHVzZSB1cCBhbmQgZG93biBhcnJvdyBrZXlzIHRvIG5hdmlnYXRlLiBQcmVzcyBFbnRlciBvciBTcGFjZSBCYXIga2V5cyB0byBzZWxlY3QuXCI7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbnZhciBkZWZhdWx0UHJvcHMkMiA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBkZWZhdWx0UHJvcHMkMyksIHsgZ2V0QTExeVN0YXR1c01lc3NhZ2U6IGdldEExMXlTdGF0dXNNZXNzYWdlIH0pO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1tdXRhYmxlLWV4cG9ydHNcbnZhciB2YWxpZGF0ZVByb3BUeXBlcyQyID0gbm9vcDtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzJDIgPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGVyKSB7XG4gICAgICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMkMiwgb3B0aW9ucywgJ3Byb3AnLCBjYWxsZXIubmFtZSk7XG4gICAgfTtcbn1cblxudmFyIE1lbnVLZXlEb3duQXJyb3dEb3duID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fbWVudV9rZXlkb3duX2Fycm93X2Rvd25fXycgOiAwO1xudmFyIE1lbnVLZXlEb3duQXJyb3dVcCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX21lbnVfa2V5ZG93bl9hcnJvd191cF9fJyA6IDE7XG52YXIgTWVudUtleURvd25Fc2NhcGUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19tZW51X2tleWRvd25fZXNjYXBlX18nIDogMjtcbnZhciBNZW51S2V5RG93bkhvbWUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19tZW51X2tleWRvd25faG9tZV9fJyA6IDM7XG52YXIgTWVudUtleURvd25FbmQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19tZW51X2tleWRvd25fZW5kX18nIDogNDtcbnZhciBNZW51S2V5RG93bkVudGVyID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fbWVudV9rZXlkb3duX2VudGVyX18nIDogNTtcbnZhciBNZW51S2V5RG93blNwYWNlQnV0dG9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fbWVudV9rZXlkb3duX3NwYWNlX2J1dHRvbl9fJyA6IDY7XG52YXIgTWVudUtleURvd25DaGFyYWN0ZXIgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19tZW51X2tleWRvd25fY2hhcmFjdGVyX18nIDogNztcbnZhciBNZW51Qmx1ciA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX21lbnVfYmx1cl9fJyA6IDg7XG52YXIgTWVudU1vdXNlTGVhdmUkMSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX21lbnVfbW91c2VfbGVhdmVfXycgOiA5O1xudmFyIEl0ZW1Nb3VzZU1vdmUkMSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2l0ZW1fbW91c2VfbW92ZV9fJyA6IDEwO1xudmFyIEl0ZW1DbGljayQxID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19faXRlbV9jbGlja19fJyA6IDExO1xudmFyIFRvZ2dsZUJ1dHRvbkNsaWNrJDEgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX190b2dnbGVidXR0b25fY2xpY2tfXycgOiAxMjtcbnZhciBUb2dnbGVCdXR0b25LZXlEb3duQXJyb3dEb3duID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fdG9nZ2xlYnV0dG9uX2tleWRvd25fYXJyb3dfZG93bl9fJyA6IDEzO1xudmFyIFRvZ2dsZUJ1dHRvbktleURvd25BcnJvd1VwID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fdG9nZ2xlYnV0dG9uX2tleWRvd25fYXJyb3dfdXBfXycgOiAxNDtcbnZhciBUb2dnbGVCdXR0b25LZXlEb3duQ2hhcmFjdGVyID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fdG9nZ2xlYnV0dG9uX2tleWRvd25fY2hhcmFjdGVyX18nIDogMTU7XG52YXIgRnVuY3Rpb25Ub2dnbGVNZW51JDEgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl90b2dnbGVfbWVudV9fJyA6IDE2O1xudmFyIEZ1bmN0aW9uT3Blbk1lbnUkMSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2Z1bmN0aW9uX29wZW5fbWVudV9fJyA6IDE3O1xudmFyIEZ1bmN0aW9uQ2xvc2VNZW51JDEgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9jbG9zZV9tZW51X18nIDogMTg7XG52YXIgRnVuY3Rpb25TZXRIaWdobGlnaHRlZEluZGV4JDEgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9zZXRfaGlnaGxpZ2h0ZWRfaW5kZXhfXycgOiAxOTtcbnZhciBGdW5jdGlvblNlbGVjdEl0ZW0kMSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2Z1bmN0aW9uX3NlbGVjdF9pdGVtX18nIDogMjA7XG52YXIgRnVuY3Rpb25TZXRJbnB1dFZhbHVlJDEgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9zZXRfaW5wdXRfdmFsdWVfXycgOiAyMTtcbnZhciBGdW5jdGlvblJlc2V0JDIgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9yZXNldF9fJyA6IDIyO1xuXG52YXIgc3RhdGVDaGFuZ2VUeXBlcyQyID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIE1lbnVLZXlEb3duQXJyb3dEb3duOiBNZW51S2V5RG93bkFycm93RG93bixcbiAgTWVudUtleURvd25BcnJvd1VwOiBNZW51S2V5RG93bkFycm93VXAsXG4gIE1lbnVLZXlEb3duRXNjYXBlOiBNZW51S2V5RG93bkVzY2FwZSxcbiAgTWVudUtleURvd25Ib21lOiBNZW51S2V5RG93bkhvbWUsXG4gIE1lbnVLZXlEb3duRW5kOiBNZW51S2V5RG93bkVuZCxcbiAgTWVudUtleURvd25FbnRlcjogTWVudUtleURvd25FbnRlcixcbiAgTWVudUtleURvd25TcGFjZUJ1dHRvbjogTWVudUtleURvd25TcGFjZUJ1dHRvbixcbiAgTWVudUtleURvd25DaGFyYWN0ZXI6IE1lbnVLZXlEb3duQ2hhcmFjdGVyLFxuICBNZW51Qmx1cjogTWVudUJsdXIsXG4gIE1lbnVNb3VzZUxlYXZlOiBNZW51TW91c2VMZWF2ZSQxLFxuICBJdGVtTW91c2VNb3ZlOiBJdGVtTW91c2VNb3ZlJDEsXG4gIEl0ZW1DbGljazogSXRlbUNsaWNrJDEsXG4gIFRvZ2dsZUJ1dHRvbkNsaWNrOiBUb2dnbGVCdXR0b25DbGljayQxLFxuICBUb2dnbGVCdXR0b25LZXlEb3duQXJyb3dEb3duOiBUb2dnbGVCdXR0b25LZXlEb3duQXJyb3dEb3duLFxuICBUb2dnbGVCdXR0b25LZXlEb3duQXJyb3dVcDogVG9nZ2xlQnV0dG9uS2V5RG93bkFycm93VXAsXG4gIFRvZ2dsZUJ1dHRvbktleURvd25DaGFyYWN0ZXI6IFRvZ2dsZUJ1dHRvbktleURvd25DaGFyYWN0ZXIsXG4gIEZ1bmN0aW9uVG9nZ2xlTWVudTogRnVuY3Rpb25Ub2dnbGVNZW51JDEsXG4gIEZ1bmN0aW9uT3Blbk1lbnU6IEZ1bmN0aW9uT3Blbk1lbnUkMSxcbiAgRnVuY3Rpb25DbG9zZU1lbnU6IEZ1bmN0aW9uQ2xvc2VNZW51JDEsXG4gIEZ1bmN0aW9uU2V0SGlnaGxpZ2h0ZWRJbmRleDogRnVuY3Rpb25TZXRIaWdobGlnaHRlZEluZGV4JDEsXG4gIEZ1bmN0aW9uU2VsZWN0SXRlbTogRnVuY3Rpb25TZWxlY3RJdGVtJDEsXG4gIEZ1bmN0aW9uU2V0SW5wdXRWYWx1ZTogRnVuY3Rpb25TZXRJbnB1dFZhbHVlJDEsXG4gIEZ1bmN0aW9uUmVzZXQ6IEZ1bmN0aW9uUmVzZXQkMlxufSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cblxuZnVuY3Rpb24gZG93bnNoaWZ0U2VsZWN0UmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIHZhciB0eXBlID0gYWN0aW9uLnR5cGUsXG4gICAgICBwcm9wcyA9IGFjdGlvbi5wcm9wcyxcbiAgICAgIHNoaWZ0S2V5ID0gYWN0aW9uLnNoaWZ0S2V5O1xuICB2YXIgY2hhbmdlcztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEl0ZW1DbGljayQxOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaXNPcGVuOiBnZXREZWZhdWx0VmFsdWUkMShwcm9wcywgJ2lzT3BlbicpLFxuICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBnZXREZWZhdWx0VmFsdWUkMShwcm9wcywgJ2hpZ2hsaWdodGVkSW5kZXgnKSxcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBwcm9wcy5pdGVtc1thY3Rpb24uaW5kZXhdXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRvZ2dsZUJ1dHRvbktleURvd25DaGFyYWN0ZXI6XG4gICAgICB7XG4gICAgICAgIHZhciBsb3dlcmNhc2VkS2V5ID0gYWN0aW9uLmtleTtcbiAgICAgICAgdmFyIGlucHV0VmFsdWUgPSBcIlwiICsgc3RhdGUuaW5wdXRWYWx1ZSArIGxvd2VyY2FzZWRLZXk7XG4gICAgICAgIHZhciBpdGVtSW5kZXggPSBnZXRJdGVtSW5kZXhCeUNoYXJhY3RlcktleSh7XG4gICAgICAgICAga2V5c1NvRmFyOiBpbnB1dFZhbHVlLFxuICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IHN0YXRlLnNlbGVjdGVkSXRlbSA/IHByb3BzLml0ZW1zLmluZGV4T2Yoc3RhdGUuc2VsZWN0ZWRJdGVtKSA6IC0xLFxuICAgICAgICAgIGl0ZW1zOiBwcm9wcy5pdGVtcyxcbiAgICAgICAgICBpdGVtVG9TdHJpbmc6IHByb3BzLml0ZW1Ub1N0cmluZyxcbiAgICAgICAgICBnZXRJdGVtTm9kZUZyb21JbmRleDogYWN0aW9uLmdldEl0ZW1Ob2RlRnJvbUluZGV4XG4gICAgICAgIH0pO1xuICAgICAgICBjaGFuZ2VzID0gX2V4dGVuZHMoe1xuICAgICAgICAgIGlucHV0VmFsdWU6IGlucHV0VmFsdWVcbiAgICAgICAgfSwgaXRlbUluZGV4ID49IDAgJiYge1xuICAgICAgICAgIHNlbGVjdGVkSXRlbTogcHJvcHMuaXRlbXNbaXRlbUluZGV4XVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUb2dnbGVCdXR0b25LZXlEb3duQXJyb3dEb3duOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogZ2V0SGlnaGxpZ2h0ZWRJbmRleE9uT3Blbihwcm9wcywgc3RhdGUsIDEsIGFjdGlvbi5nZXRJdGVtTm9kZUZyb21JbmRleCksXG4gICAgICAgIGlzT3BlbjogdHJ1ZVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUb2dnbGVCdXR0b25LZXlEb3duQXJyb3dVcDpcbiAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGdldEhpZ2hsaWdodGVkSW5kZXhPbk9wZW4ocHJvcHMsIHN0YXRlLCAtMSwgYWN0aW9uLmdldEl0ZW1Ob2RlRnJvbUluZGV4KSxcbiAgICAgICAgaXNPcGVuOiB0cnVlXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE1lbnVLZXlEb3duRW50ZXI6XG4gICAgY2FzZSBNZW51S2V5RG93blNwYWNlQnV0dG9uOlxuICAgICAgY2hhbmdlcyA9IF9leHRlbmRzKHtcbiAgICAgICAgaXNPcGVuOiBnZXREZWZhdWx0VmFsdWUkMShwcm9wcywgJ2lzT3BlbicpLFxuICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBnZXREZWZhdWx0VmFsdWUkMShwcm9wcywgJ2hpZ2hsaWdodGVkSW5kZXgnKVxuICAgICAgfSwgc3RhdGUuaGlnaGxpZ2h0ZWRJbmRleCA+PSAwICYmIHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBwcm9wcy5pdGVtc1tzdGF0ZS5oaWdobGlnaHRlZEluZGV4XVxuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTWVudUtleURvd25Ib21lOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogZ2V0TmV4dE5vbkRpc2FibGVkSW5kZXgoMSwgMCwgcHJvcHMuaXRlbXMubGVuZ3RoLCBhY3Rpb24uZ2V0SXRlbU5vZGVGcm9tSW5kZXgsIGZhbHNlKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBNZW51S2V5RG93bkVuZDpcbiAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGdldE5leHROb25EaXNhYmxlZEluZGV4KC0xLCBwcm9wcy5pdGVtcy5sZW5ndGggLSAxLCBwcm9wcy5pdGVtcy5sZW5ndGgsIGFjdGlvbi5nZXRJdGVtTm9kZUZyb21JbmRleCwgZmFsc2UpXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE1lbnVLZXlEb3duRXNjYXBlOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogLTFcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTWVudUJsdXI6XG4gICAgICBjaGFuZ2VzID0ge1xuICAgICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgICBoaWdobGlnaHRlZEluZGV4OiAtMVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBNZW51S2V5RG93bkNoYXJhY3RlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9sb3dlcmNhc2VkS2V5ID0gYWN0aW9uLmtleTtcblxuICAgICAgICB2YXIgX2lucHV0VmFsdWUgPSBcIlwiICsgc3RhdGUuaW5wdXRWYWx1ZSArIF9sb3dlcmNhc2VkS2V5O1xuXG4gICAgICAgIHZhciBoaWdobGlnaHRlZEluZGV4ID0gZ2V0SXRlbUluZGV4QnlDaGFyYWN0ZXJLZXkoe1xuICAgICAgICAgIGtleXNTb0ZhcjogX2lucHV0VmFsdWUsXG4gICAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogc3RhdGUuaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgICAgICBpdGVtczogcHJvcHMuaXRlbXMsXG4gICAgICAgICAgaXRlbVRvU3RyaW5nOiBwcm9wcy5pdGVtVG9TdHJpbmcsXG4gICAgICAgICAgZ2V0SXRlbU5vZGVGcm9tSW5kZXg6IGFjdGlvbi5nZXRJdGVtTm9kZUZyb21JbmRleFxuICAgICAgICB9KTtcbiAgICAgICAgY2hhbmdlcyA9IF9leHRlbmRzKHtcbiAgICAgICAgICBpbnB1dFZhbHVlOiBfaW5wdXRWYWx1ZVxuICAgICAgICB9LCBoaWdobGlnaHRlZEluZGV4ID49IDAgJiYge1xuICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGhpZ2hsaWdodGVkSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTWVudUtleURvd25BcnJvd0Rvd246XG4gICAgICBjaGFuZ2VzID0ge1xuICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBnZXROZXh0V3JhcHBpbmdJbmRleChzaGlmdEtleSA/IDUgOiAxLCBzdGF0ZS5oaWdobGlnaHRlZEluZGV4LCBwcm9wcy5pdGVtcy5sZW5ndGgsIGFjdGlvbi5nZXRJdGVtTm9kZUZyb21JbmRleCwgcHJvcHMuY2lyY3VsYXJOYXZpZ2F0aW9uKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBNZW51S2V5RG93bkFycm93VXA6XG4gICAgICBjaGFuZ2VzID0ge1xuICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBnZXROZXh0V3JhcHBpbmdJbmRleChzaGlmdEtleSA/IC01IDogLTEsIHN0YXRlLmhpZ2hsaWdodGVkSW5kZXgsIHByb3BzLml0ZW1zLmxlbmd0aCwgYWN0aW9uLmdldEl0ZW1Ob2RlRnJvbUluZGV4LCBwcm9wcy5jaXJjdWxhck5hdmlnYXRpb24pXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEZ1bmN0aW9uU2VsZWN0SXRlbSQxOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhY3Rpb24uc2VsZWN0ZWRJdGVtXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRvd25zaGlmdENvbW1vblJlZHVjZXIoc3RhdGUsIGFjdGlvbiwgc3RhdGVDaGFuZ2VUeXBlcyQyKTtcbiAgfVxuXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIGNoYW5nZXMpO1xufVxuLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbnZhciBfZXhjbHVkZWQkMiA9IFtcIm9uTW91c2VMZWF2ZVwiLCBcInJlZktleVwiLCBcIm9uS2V5RG93blwiLCBcIm9uQmx1clwiLCBcInJlZlwiXSxcbiAgICBfZXhjbHVkZWQyJDIgPSBbXCJvbkNsaWNrXCIsIFwib25LZXlEb3duXCIsIFwicmVmS2V5XCIsIFwicmVmXCJdLFxuICAgIF9leGNsdWRlZDMkMSA9IFtcIml0ZW1cIiwgXCJpbmRleFwiLCBcIm9uTW91c2VNb3ZlXCIsIFwib25DbGlja1wiLCBcInJlZktleVwiLCBcInJlZlwiXTtcbnVzZVNlbGVjdC5zdGF0ZUNoYW5nZVR5cGVzID0gc3RhdGVDaGFuZ2VUeXBlcyQyO1xuXG5mdW5jdGlvbiB1c2VTZWxlY3QodXNlclByb3BzKSB7XG4gIGlmICh1c2VyUHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHVzZXJQcm9wcyA9IHt9O1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMkMih1c2VyUHJvcHMsIHVzZVNlbGVjdCk7IC8vIFByb3BzIGRlZmF1bHRzIGFuZCBkZXN0cnVjdHVyaW5nLlxuXG4gIHZhciBwcm9wcyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0UHJvcHMkMiwgdXNlclByb3BzKTtcblxuICB2YXIgaXRlbXMgPSBwcm9wcy5pdGVtcyxcbiAgICAgIHNjcm9sbEludG9WaWV3ID0gcHJvcHMuc2Nyb2xsSW50b1ZpZXcsXG4gICAgICBlbnZpcm9ubWVudCA9IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgaW5pdGlhbElzT3BlbiA9IHByb3BzLmluaXRpYWxJc09wZW4sXG4gICAgICBkZWZhdWx0SXNPcGVuID0gcHJvcHMuZGVmYXVsdElzT3BlbixcbiAgICAgIGl0ZW1Ub1N0cmluZyA9IHByb3BzLml0ZW1Ub1N0cmluZyxcbiAgICAgIGdldEExMXlTZWxlY3Rpb25NZXNzYWdlID0gcHJvcHMuZ2V0QTExeVNlbGVjdGlvbk1lc3NhZ2UsXG4gICAgICBnZXRBMTF5U3RhdHVzTWVzc2FnZSA9IHByb3BzLmdldEExMXlTdGF0dXNNZXNzYWdlOyAvLyBJbml0aWFsIHN0YXRlIGRlcGVuZGluZyBvbiBjb250cm9sbGVkIHByb3BzLlxuXG4gIHZhciBpbml0aWFsU3RhdGUgPSBnZXRJbml0aWFsU3RhdGUkMihwcm9wcyk7XG5cbiAgdmFyIF91c2VDb250cm9sbGVkUmVkdWNlciA9IHVzZUNvbnRyb2xsZWRSZWR1Y2VyJDEoZG93bnNoaWZ0U2VsZWN0UmVkdWNlciwgaW5pdGlhbFN0YXRlLCBwcm9wcyksXG4gICAgICBzdGF0ZSA9IF91c2VDb250cm9sbGVkUmVkdWNlclswXSxcbiAgICAgIGRpc3BhdGNoID0gX3VzZUNvbnRyb2xsZWRSZWR1Y2VyWzFdO1xuXG4gIHZhciBpc09wZW4gPSBzdGF0ZS5pc09wZW4sXG4gICAgICBoaWdobGlnaHRlZEluZGV4ID0gc3RhdGUuaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgIHNlbGVjdGVkSXRlbSA9IHN0YXRlLnNlbGVjdGVkSXRlbSxcbiAgICAgIGlucHV0VmFsdWUgPSBzdGF0ZS5pbnB1dFZhbHVlOyAvLyBFbGVtZW50IGVmcy5cblxuICB2YXIgdG9nZ2xlQnV0dG9uUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgbWVudVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGl0ZW1SZWZzID0gdXNlUmVmKHt9KTsgLy8gdXNlZCBub3QgdG8gdHJpZ2dlciBtZW51IGJsdXIgYWN0aW9uIGluIHNvbWUgc2NlbmFyaW9zLlxuXG4gIHZhciBzaG91bGRCbHVyUmVmID0gdXNlUmVmKHRydWUpOyAvLyB1c2VkIHRvIGtlZXAgdGhlIGlucHV0VmFsdWUgY2xlYXJUaW1lb3V0IG9iamVjdCBiZXR3ZWVuIHJlbmRlcnMuXG5cbiAgdmFyIGNsZWFyVGltZW91dFJlZiA9IHVzZVJlZihudWxsKTsgLy8gcHJldmVudCBpZCByZS1nZW5lcmF0aW9uIGJldHdlZW4gcmVuZGVycy5cblxuICB2YXIgZWxlbWVudElkcyA9IHVzZUVsZW1lbnRJZHMocHJvcHMpOyAvLyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgaXRlbXMgd2UgaGFkIG9uIHByZXZpb3VzIGN5Y2xlLlxuXG4gIHZhciBwcmV2aW91c1Jlc3VsdENvdW50UmVmID0gdXNlUmVmKCk7XG4gIHZhciBpc0luaXRpYWxNb3VudFJlZiA9IHVzZVJlZih0cnVlKTsgLy8gdXRpbGl0eSBjYWxsYmFjayB0byBnZXQgaXRlbSBlbGVtZW50LlxuXG4gIHZhciBsYXRlc3QgPSB1c2VMYXRlc3RSZWYoe1xuICAgIHN0YXRlOiBzdGF0ZSxcbiAgICBwcm9wczogcHJvcHNcbiAgfSk7IC8vIFNvbWUgdXRpbHMuXG5cbiAgdmFyIGdldEl0ZW1Ob2RlRnJvbUluZGV4ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgcmV0dXJuIGl0ZW1SZWZzLmN1cnJlbnRbZWxlbWVudElkcy5nZXRJdGVtSWQoaW5kZXgpXTtcbiAgfSwgW2VsZW1lbnRJZHNdKTsgLy8gRWZmZWN0cy5cbiAgLy8gU2V0cyBhMTF5IHN0YXR1cyBtZXNzYWdlIG9uIGNoYW5nZXMgaW4gc3RhdGUuXG5cbiAgdXNlQTExeU1lc3NhZ2VTZXR0ZXIoZ2V0QTExeVN0YXR1c01lc3NhZ2UsIFtpc09wZW4sIGhpZ2hsaWdodGVkSW5kZXgsIGlucHV0VmFsdWUsIGl0ZW1zXSwgX2V4dGVuZHMoe1xuICAgIGlzSW5pdGlhbE1vdW50OiBpc0luaXRpYWxNb3VudFJlZi5jdXJyZW50LFxuICAgIHByZXZpb3VzUmVzdWx0Q291bnQ6IHByZXZpb3VzUmVzdWx0Q291bnRSZWYuY3VycmVudCxcbiAgICBpdGVtczogaXRlbXMsXG4gICAgZW52aXJvbm1lbnQ6IGVudmlyb25tZW50LFxuICAgIGl0ZW1Ub1N0cmluZzogaXRlbVRvU3RyaW5nXG4gIH0sIHN0YXRlKSk7IC8vIFNldHMgYTExeSBzdGF0dXMgbWVzc2FnZSBvbiBjaGFuZ2VzIGluIHNlbGVjdGVkSXRlbS5cblxuICB1c2VBMTF5TWVzc2FnZVNldHRlcihnZXRBMTF5U2VsZWN0aW9uTWVzc2FnZSwgW3NlbGVjdGVkSXRlbV0sIF9leHRlbmRzKHtcbiAgICBpc0luaXRpYWxNb3VudDogaXNJbml0aWFsTW91bnRSZWYuY3VycmVudCxcbiAgICBwcmV2aW91c1Jlc3VsdENvdW50OiBwcmV2aW91c1Jlc3VsdENvdW50UmVmLmN1cnJlbnQsXG4gICAgaXRlbXM6IGl0ZW1zLFxuICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCxcbiAgICBpdGVtVG9TdHJpbmc6IGl0ZW1Ub1N0cmluZ1xuICB9LCBzdGF0ZSkpOyAvLyBTY3JvbGwgb24gaGlnaGxpZ2h0ZWQgaXRlbSBpZiBjaGFuZ2UgY29tZXMgZnJvbSBrZXlib2FyZC5cblxuICB2YXIgc2hvdWxkU2Nyb2xsUmVmID0gdXNlU2Nyb2xsSW50b1ZpZXcoe1xuICAgIG1lbnVFbGVtZW50OiBtZW51UmVmLmN1cnJlbnQsXG4gICAgaGlnaGxpZ2h0ZWRJbmRleDogaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICBpc09wZW46IGlzT3BlbixcbiAgICBpdGVtUmVmczogaXRlbVJlZnMsXG4gICAgc2Nyb2xsSW50b1ZpZXc6IHNjcm9sbEludG9WaWV3LFxuICAgIGdldEl0ZW1Ob2RlRnJvbUluZGV4OiBnZXRJdGVtTm9kZUZyb21JbmRleFxuICB9KTsgLy8gU2V0cyBjbGVhbnVwIGZvciB0aGUga2V5c1NvRmFyIGNhbGxiYWNrLCBkZWJvdW5kZWQgYWZ0ZXIgNTAwbXMuXG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBpbml0IHRoZSBjbGVhbiBmdW5jdGlvbiBoZXJlIGFzIHdlIG5lZWQgYWNjZXNzIHRvIGRpc3BhdGNoLlxuICAgIGNsZWFyVGltZW91dFJlZi5jdXJyZW50ID0gZGVib3VuY2UoZnVuY3Rpb24gKG91dGVyRGlzcGF0Y2gpIHtcbiAgICAgIG91dGVyRGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBGdW5jdGlvblNldElucHV0VmFsdWUkMSxcbiAgICAgICAgaW5wdXRWYWx1ZTogJydcbiAgICAgIH0pO1xuICAgIH0sIDUwMCk7IC8vIENhbmNlbCBhbnkgcGVuZGluZyBkZWJvdW5jZWQgY2FsbHMgb24gbW91bnRcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhclRpbWVvdXRSZWYuY3VycmVudC5jYW5jZWwoKTtcbiAgICB9O1xuICB9LCBbXSk7IC8vIEludm9rZXMgdGhlIGtleXNTb0ZhciBjYWxsYmFjayBzZXQgdXAgYWJvdmUuXG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWlucHV0VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjbGVhclRpbWVvdXRSZWYuY3VycmVudChkaXNwYXRjaCk7XG4gIH0sIFtkaXNwYXRjaCwgaW5wdXRWYWx1ZV0pO1xuICB1c2VDb250cm9sUHJvcHNWYWxpZGF0b3Ioe1xuICAgIGlzSW5pdGlhbE1vdW50OiBpc0luaXRpYWxNb3VudFJlZi5jdXJyZW50LFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICBzdGF0ZTogc3RhdGVcbiAgfSk7XG4gIC8qIENvbnRyb2xzIHRoZSBmb2N1cyBvbiB0aGUgbWVudSBvciB0aGUgdG9nZ2xlIGJ1dHRvbi4gKi9cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIERvbid0IGZvY3VzIG1lbnUgb24gZmlyc3QgcmVuZGVyLlxuICAgIGlmIChpc0luaXRpYWxNb3VudFJlZi5jdXJyZW50KSB7XG4gICAgICAvLyBVbmxlc3MgaXQgd2FzIGluaXRpYWxpc2VkIGFzIG9wZW4uXG4gICAgICBpZiAoKGluaXRpYWxJc09wZW4gfHwgZGVmYXVsdElzT3BlbiB8fCBpc09wZW4pICYmIG1lbnVSZWYuY3VycmVudCkge1xuICAgICAgICBtZW51UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRm9jdXMgbWVudSBvbiBvcGVuLlxuXG5cbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgICAgaWYgKG1lbnVSZWYuY3VycmVudCkge1xuICAgICAgICBtZW51UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRm9jdXMgdG9nZ2xlQnV0dG9uIG9uIGNsb3NlLCBidXQgbm90IGlmIGl0IHdhcyBjbG9zZWQgd2l0aCAoU2hpZnQrKVRhYi5cblxuXG4gICAgaWYgKGVudmlyb25tZW50LmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IG1lbnVSZWYuY3VycmVudCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgIGlmICh0b2dnbGVCdXR0b25SZWYuY3VycmVudCkge1xuICAgICAgICBzaG91bGRCbHVyUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgdG9nZ2xlQnV0dG9uUmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcblxuICB9LCBbaXNPcGVuXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzSW5pdGlhbE1vdW50UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcmV2aW91c1Jlc3VsdENvdW50UmVmLmN1cnJlbnQgPSBpdGVtcy5sZW5ndGg7XG4gIH0pOyAvLyBBZGQgbW91c2UvdG91Y2ggZXZlbnRzIHRvIGRvY3VtZW50LlxuXG4gIHZhciBtb3VzZUFuZFRvdWNoVHJhY2tlcnNSZWYgPSB1c2VNb3VzZUFuZFRvdWNoVHJhY2tlcihpc09wZW4sIFttZW51UmVmLCB0b2dnbGVCdXR0b25SZWZdLCBlbnZpcm9ubWVudCwgZnVuY3Rpb24gKCkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IE1lbnVCbHVyXG4gICAgfSk7XG4gIH0pO1xuICB2YXIgc2V0R2V0dGVyUHJvcENhbGxJbmZvID0gdXNlR2V0dGVyUHJvcHNDYWxsZWRDaGVja2VyKCdnZXRNZW51UHJvcHMnLCAnZ2V0VG9nZ2xlQnV0dG9uUHJvcHMnKTsgLy8gTWFrZSBpbml0aWFsIHJlZiBmYWxzZS5cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlzSW5pdGlhbE1vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfSwgW10pOyAvLyBSZXNldCBpdGVtUmVmcyBvbiBjbG9zZS5cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghaXNPcGVuKSB7XG4gICAgICBpdGVtUmVmcy5jdXJyZW50ID0ge307XG4gICAgfVxuICB9LCBbaXNPcGVuXSk7IC8vIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zLlxuXG4gIHZhciB0b2dnbGVCdXR0b25LZXlEb3duSGFuZGxlcnMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQXJyb3dEb3duOiBmdW5jdGlvbiBBcnJvd0Rvd24oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IFRvZ2dsZUJ1dHRvbktleURvd25BcnJvd0Rvd24sXG4gICAgICAgICAgZ2V0SXRlbU5vZGVGcm9tSW5kZXg6IGdldEl0ZW1Ob2RlRnJvbUluZGV4LFxuICAgICAgICAgIHNoaWZ0S2V5OiBldmVudC5zaGlmdEtleVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBBcnJvd1VwOiBmdW5jdGlvbiBBcnJvd1VwKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBUb2dnbGVCdXR0b25LZXlEb3duQXJyb3dVcCxcbiAgICAgICAgICBnZXRJdGVtTm9kZUZyb21JbmRleDogZ2V0SXRlbU5vZGVGcm9tSW5kZXgsXG4gICAgICAgICAgc2hpZnRLZXk6IGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtkaXNwYXRjaCwgZ2V0SXRlbU5vZGVGcm9tSW5kZXhdKTtcbiAgdmFyIG1lbnVLZXlEb3duSGFuZGxlcnMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQXJyb3dEb3duOiBmdW5jdGlvbiBBcnJvd0Rvd24oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IE1lbnVLZXlEb3duQXJyb3dEb3duLFxuICAgICAgICAgIGdldEl0ZW1Ob2RlRnJvbUluZGV4OiBnZXRJdGVtTm9kZUZyb21JbmRleCxcbiAgICAgICAgICBzaGlmdEtleTogZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgQXJyb3dVcDogZnVuY3Rpb24gQXJyb3dVcChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogTWVudUtleURvd25BcnJvd1VwLFxuICAgICAgICAgIGdldEl0ZW1Ob2RlRnJvbUluZGV4OiBnZXRJdGVtTm9kZUZyb21JbmRleCxcbiAgICAgICAgICBzaGlmdEtleTogZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgSG9tZTogZnVuY3Rpb24gSG9tZShldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogTWVudUtleURvd25Ib21lLFxuICAgICAgICAgIGdldEl0ZW1Ob2RlRnJvbUluZGV4OiBnZXRJdGVtTm9kZUZyb21JbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBFbmQ6IGZ1bmN0aW9uIEVuZChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogTWVudUtleURvd25FbmQsXG4gICAgICAgICAgZ2V0SXRlbU5vZGVGcm9tSW5kZXg6IGdldEl0ZW1Ob2RlRnJvbUluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIEVzY2FwZTogZnVuY3Rpb24gRXNjYXBlKCkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogTWVudUtleURvd25Fc2NhcGVcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgRW50ZXI6IGZ1bmN0aW9uIEVudGVyKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBNZW51S2V5RG93bkVudGVyXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgICcgJzogZnVuY3Rpb24gXyhldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogTWVudUtleURvd25TcGFjZUJ1dHRvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbZGlzcGF0Y2gsIGdldEl0ZW1Ob2RlRnJvbUluZGV4XSk7IC8vIEFjdGlvbiBmdW5jdGlvbnMuXG5cbiAgdmFyIHRvZ2dsZU1lbnUgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogRnVuY3Rpb25Ub2dnbGVNZW51JDFcbiAgICB9KTtcbiAgfSwgW2Rpc3BhdGNoXSk7XG4gIHZhciBjbG9zZU1lbnUgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogRnVuY3Rpb25DbG9zZU1lbnUkMVxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgdmFyIG9wZW5NZW51ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uT3Blbk1lbnUkMVxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgdmFyIHNldEhpZ2hsaWdodGVkSW5kZXggPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3SGlnaGxpZ2h0ZWRJbmRleCkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uU2V0SGlnaGxpZ2h0ZWRJbmRleCQxLFxuICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogbmV3SGlnaGxpZ2h0ZWRJbmRleFxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgdmFyIHNlbGVjdEl0ZW0gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3U2VsZWN0ZWRJdGVtKSB7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogRnVuY3Rpb25TZWxlY3RJdGVtJDEsXG4gICAgICBzZWxlY3RlZEl0ZW06IG5ld1NlbGVjdGVkSXRlbVxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgdmFyIHJlc2V0ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uUmVzZXQkMlxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgdmFyIHNldElucHV0VmFsdWUgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3SW5wdXRWYWx1ZSkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uU2V0SW5wdXRWYWx1ZSQxLFxuICAgICAgaW5wdXRWYWx1ZTogbmV3SW5wdXRWYWx1ZVxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTsgLy8gR2V0dGVyIGZ1bmN0aW9ucy5cblxuICB2YXIgZ2V0TGFiZWxQcm9wcyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChsYWJlbFByb3BzKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGlkOiBlbGVtZW50SWRzLmxhYmVsSWQsXG4gICAgICBodG1sRm9yOiBlbGVtZW50SWRzLnRvZ2dsZUJ1dHRvbklkXG4gICAgfSwgbGFiZWxQcm9wcyk7XG4gIH0sIFtlbGVtZW50SWRzXSk7XG4gIHZhciBnZXRNZW51UHJvcHMgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoX3RlbXAsIF90ZW1wMikge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBvbk1vdXNlTGVhdmUgPSBfcmVmLm9uTW91c2VMZWF2ZSxcbiAgICAgICAgX3JlZiRyZWZLZXkgPSBfcmVmLnJlZktleSxcbiAgICAgICAgcmVmS2V5ID0gX3JlZiRyZWZLZXkgPT09IHZvaWQgMCA/ICdyZWYnIDogX3JlZiRyZWZLZXksXG4gICAgICAgIG9uS2V5RG93biA9IF9yZWYub25LZXlEb3duLFxuICAgICAgICBvbkJsdXIgPSBfcmVmLm9uQmx1cixcbiAgICAgICAgcmVmID0gX3JlZi5yZWYsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQkMik7XG5cbiAgICB2YXIgX3JlZjIgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBfcmVmMiRzdXBwcmVzc1JlZkVycm8gPSBfcmVmMi5zdXBwcmVzc1JlZkVycm9yLFxuICAgICAgICBzdXBwcmVzc1JlZkVycm9yID0gX3JlZjIkc3VwcHJlc3NSZWZFcnJvID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJHN1cHByZXNzUmVmRXJybztcblxuICAgIHZhciBsYXRlc3RTdGF0ZSA9IGxhdGVzdC5jdXJyZW50LnN0YXRlO1xuXG4gICAgdmFyIG1lbnVIYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gbWVudUhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICAgIHZhciBrZXkgPSBub3JtYWxpemVBcnJvd0tleShldmVudCk7XG5cbiAgICAgIGlmIChrZXkgJiYgbWVudUtleURvd25IYW5kbGVyc1trZXldKSB7XG4gICAgICAgIG1lbnVLZXlEb3duSGFuZGxlcnNba2V5XShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQWNjZXB0ZWRDaGFyYWN0ZXJLZXkoa2V5KSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogTWVudUtleURvd25DaGFyYWN0ZXIsXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgZ2V0SXRlbU5vZGVGcm9tSW5kZXg6IGdldEl0ZW1Ob2RlRnJvbUluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgbWVudUhhbmRsZUJsdXIgPSBmdW5jdGlvbiBtZW51SGFuZGxlQmx1cigpIHtcbiAgICAgIC8vIGlmIHRoZSBibHVyIHdhcyBhIHJlc3VsdCBvZiBzZWxlY3Rpb24sIHdlIGRvbid0IHRyaWdnZXIgdGhpcyBhY3Rpb24uXG4gICAgICBpZiAoc2hvdWxkQmx1clJlZi5jdXJyZW50ID09PSBmYWxzZSkge1xuICAgICAgICBzaG91bGRCbHVyUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzaG91bGRCbHVyID0gIW1vdXNlQW5kVG91Y2hUcmFja2Vyc1JlZi5jdXJyZW50LmlzTW91c2VEb3duO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuICAgICAgaWYgKHNob3VsZEJsdXIpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IE1lbnVCbHVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgbWVudUhhbmRsZU1vdXNlTGVhdmUgPSBmdW5jdGlvbiBtZW51SGFuZGxlTW91c2VMZWF2ZSgpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogTWVudU1vdXNlTGVhdmUkMVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEdldHRlclByb3BDYWxsSW5mbygnZ2V0TWVudVByb3BzJywgc3VwcHJlc3NSZWZFcnJvciwgcmVmS2V5LCBtZW51UmVmKTtcbiAgICByZXR1cm4gX2V4dGVuZHMoKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbcmVmS2V5XSA9IGhhbmRsZVJlZnMocmVmLCBmdW5jdGlvbiAobWVudU5vZGUpIHtcbiAgICAgIG1lbnVSZWYuY3VycmVudCA9IG1lbnVOb2RlO1xuICAgIH0pLCBfZXh0ZW5kczIuaWQgPSBlbGVtZW50SWRzLm1lbnVJZCwgX2V4dGVuZHMyLnJvbGUgPSAnbGlzdGJveCcsIF9leHRlbmRzMlsnYXJpYS1sYWJlbGxlZGJ5J10gPSBlbGVtZW50SWRzLmxhYmVsSWQsIF9leHRlbmRzMi50YWJJbmRleCA9IC0xLCBfZXh0ZW5kczIpLCBsYXRlc3RTdGF0ZS5pc09wZW4gJiYgbGF0ZXN0U3RhdGUuaGlnaGxpZ2h0ZWRJbmRleCA+IC0xICYmIHtcbiAgICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiBlbGVtZW50SWRzLmdldEl0ZW1JZChsYXRlc3RTdGF0ZS5oaWdobGlnaHRlZEluZGV4KVxuICAgIH0sIHtcbiAgICAgIG9uTW91c2VMZWF2ZTogY2FsbEFsbEV2ZW50SGFuZGxlcnMob25Nb3VzZUxlYXZlLCBtZW51SGFuZGxlTW91c2VMZWF2ZSksXG4gICAgICBvbktleURvd246IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uS2V5RG93biwgbWVudUhhbmRsZUtleURvd24pLFxuICAgICAgb25CbHVyOiBjYWxsQWxsRXZlbnRIYW5kbGVycyhvbkJsdXIsIG1lbnVIYW5kbGVCbHVyKVxuICAgIH0sIHJlc3QpO1xuICB9LCBbZGlzcGF0Y2gsIGxhdGVzdCwgbWVudUtleURvd25IYW5kbGVycywgbW91c2VBbmRUb3VjaFRyYWNrZXJzUmVmLCBzZXRHZXR0ZXJQcm9wQ2FsbEluZm8sIGVsZW1lbnRJZHMsIGdldEl0ZW1Ob2RlRnJvbUluZGV4XSk7XG4gIHZhciBnZXRUb2dnbGVCdXR0b25Qcm9wcyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfdGVtcDMsIF90ZW1wNCkge1xuICAgIHZhciBfZXh0ZW5kczM7XG5cbiAgICB2YXIgX3JlZjMgPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzLFxuICAgICAgICBvbkNsaWNrID0gX3JlZjMub25DbGljayxcbiAgICAgICAgb25LZXlEb3duID0gX3JlZjMub25LZXlEb3duLFxuICAgICAgICBfcmVmMyRyZWZLZXkgPSBfcmVmMy5yZWZLZXksXG4gICAgICAgIHJlZktleSA9IF9yZWYzJHJlZktleSA9PT0gdm9pZCAwID8gJ3JlZicgOiBfcmVmMyRyZWZLZXksXG4gICAgICAgIHJlZiA9IF9yZWYzLnJlZixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYzLCBfZXhjbHVkZWQyJDIpO1xuXG4gICAgdmFyIF9yZWY0ID0gX3RlbXA0ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNCxcbiAgICAgICAgX3JlZjQkc3VwcHJlc3NSZWZFcnJvID0gX3JlZjQuc3VwcHJlc3NSZWZFcnJvcixcbiAgICAgICAgc3VwcHJlc3NSZWZFcnJvciA9IF9yZWY0JHN1cHByZXNzUmVmRXJybyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNCRzdXBwcmVzc1JlZkVycm87XG5cbiAgICB2YXIgdG9nZ2xlQnV0dG9uSGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiB0b2dnbGVCdXR0b25IYW5kbGVDbGljaygpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVG9nZ2xlQnV0dG9uQ2xpY2skMVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciB0b2dnbGVCdXR0b25IYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gdG9nZ2xlQnV0dG9uSGFuZGxlS2V5RG93bihldmVudCkge1xuICAgICAgdmFyIGtleSA9IG5vcm1hbGl6ZUFycm93S2V5KGV2ZW50KTtcblxuICAgICAgaWYgKGtleSAmJiB0b2dnbGVCdXR0b25LZXlEb3duSGFuZGxlcnNba2V5XSkge1xuICAgICAgICB0b2dnbGVCdXR0b25LZXlEb3duSGFuZGxlcnNba2V5XShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQWNjZXB0ZWRDaGFyYWN0ZXJLZXkoa2V5KSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogVG9nZ2xlQnV0dG9uS2V5RG93bkNoYXJhY3RlcixcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICBnZXRJdGVtTm9kZUZyb21JbmRleDogZ2V0SXRlbU5vZGVGcm9tSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciB0b2dnbGVQcm9wcyA9IF9leHRlbmRzKChfZXh0ZW5kczMgPSB7fSwgX2V4dGVuZHMzW3JlZktleV0gPSBoYW5kbGVSZWZzKHJlZiwgZnVuY3Rpb24gKHRvZ2dsZUJ1dHRvbk5vZGUpIHtcbiAgICAgIHRvZ2dsZUJ1dHRvblJlZi5jdXJyZW50ID0gdG9nZ2xlQnV0dG9uTm9kZTtcbiAgICB9KSwgX2V4dGVuZHMzLmlkID0gZWxlbWVudElkcy50b2dnbGVCdXR0b25JZCwgX2V4dGVuZHMzWydhcmlhLWhhc3BvcHVwJ10gPSAnbGlzdGJveCcsIF9leHRlbmRzM1snYXJpYS1leHBhbmRlZCddID0gbGF0ZXN0LmN1cnJlbnQuc3RhdGUuaXNPcGVuLCBfZXh0ZW5kczNbJ2FyaWEtbGFiZWxsZWRieSddID0gZWxlbWVudElkcy5sYWJlbElkICsgXCIgXCIgKyBlbGVtZW50SWRzLnRvZ2dsZUJ1dHRvbklkLCBfZXh0ZW5kczMpLCByZXN0KTtcblxuICAgIGlmICghcmVzdC5kaXNhYmxlZCkge1xuICAgICAgdG9nZ2xlUHJvcHMub25DbGljayA9IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uQ2xpY2ssIHRvZ2dsZUJ1dHRvbkhhbmRsZUNsaWNrKTtcbiAgICAgIHRvZ2dsZVByb3BzLm9uS2V5RG93biA9IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uS2V5RG93biwgdG9nZ2xlQnV0dG9uSGFuZGxlS2V5RG93bik7XG4gICAgfVxuXG4gICAgc2V0R2V0dGVyUHJvcENhbGxJbmZvKCdnZXRUb2dnbGVCdXR0b25Qcm9wcycsIHN1cHByZXNzUmVmRXJyb3IsIHJlZktleSwgdG9nZ2xlQnV0dG9uUmVmKTtcbiAgICByZXR1cm4gdG9nZ2xlUHJvcHM7XG4gIH0sIFtkaXNwYXRjaCwgbGF0ZXN0LCB0b2dnbGVCdXR0b25LZXlEb3duSGFuZGxlcnMsIHNldEdldHRlclByb3BDYWxsSW5mbywgZWxlbWVudElkcywgZ2V0SXRlbU5vZGVGcm9tSW5kZXhdKTtcbiAgdmFyIGdldEl0ZW1Qcm9wcyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfdGVtcDUpIHtcbiAgICB2YXIgX2V4dGVuZHM0O1xuXG4gICAgdmFyIF9yZWY1ID0gX3RlbXA1ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNSxcbiAgICAgICAgaXRlbSA9IF9yZWY1Lml0ZW0sXG4gICAgICAgIGluZGV4ID0gX3JlZjUuaW5kZXgsXG4gICAgICAgIG9uTW91c2VNb3ZlID0gX3JlZjUub25Nb3VzZU1vdmUsXG4gICAgICAgIG9uQ2xpY2sgPSBfcmVmNS5vbkNsaWNrLFxuICAgICAgICBfcmVmNSRyZWZLZXkgPSBfcmVmNS5yZWZLZXksXG4gICAgICAgIHJlZktleSA9IF9yZWY1JHJlZktleSA9PT0gdm9pZCAwID8gJ3JlZicgOiBfcmVmNSRyZWZLZXksXG4gICAgICAgIHJlZiA9IF9yZWY1LnJlZixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY1LCBfZXhjbHVkZWQzJDEpO1xuXG4gICAgdmFyIF9sYXRlc3QkY3VycmVudCA9IGxhdGVzdC5jdXJyZW50LFxuICAgICAgICBsYXRlc3RTdGF0ZSA9IF9sYXRlc3QkY3VycmVudC5zdGF0ZSxcbiAgICAgICAgbGF0ZXN0UHJvcHMgPSBfbGF0ZXN0JGN1cnJlbnQucHJvcHM7XG5cbiAgICB2YXIgaXRlbUhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGl0ZW1IYW5kbGVNb3VzZU1vdmUoKSB7XG4gICAgICBpZiAoaW5kZXggPT09IGxhdGVzdFN0YXRlLmhpZ2hsaWdodGVkSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzaG91bGRTY3JvbGxSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBJdGVtTW91c2VNb3ZlJDEsXG4gICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciBpdGVtSGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBpdGVtSGFuZGxlQ2xpY2soKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IEl0ZW1DbGljayQxLFxuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgaXRlbUluZGV4ID0gZ2V0SXRlbUluZGV4KGluZGV4LCBpdGVtLCBsYXRlc3RQcm9wcy5pdGVtcyk7XG5cbiAgICBpZiAoaXRlbUluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXNzIGVpdGhlciBpdGVtIG9yIGl0ZW0gaW5kZXggaW4gZ2V0SXRlbVByb3BzIScpO1xuICAgIH1cblxuICAgIHZhciBpdGVtUHJvcHMgPSBfZXh0ZW5kcygoX2V4dGVuZHM0ID0ge1xuICAgICAgcm9sZTogJ29wdGlvbicsXG4gICAgICAnYXJpYS1zZWxlY3RlZCc6IFwiXCIgKyAoaXRlbUluZGV4ID09PSBsYXRlc3RTdGF0ZS5oaWdobGlnaHRlZEluZGV4KSxcbiAgICAgIGlkOiBlbGVtZW50SWRzLmdldEl0ZW1JZChpdGVtSW5kZXgpXG4gICAgfSwgX2V4dGVuZHM0W3JlZktleV0gPSBoYW5kbGVSZWZzKHJlZiwgZnVuY3Rpb24gKGl0ZW1Ob2RlKSB7XG4gICAgICBpZiAoaXRlbU5vZGUpIHtcbiAgICAgICAgaXRlbVJlZnMuY3VycmVudFtlbGVtZW50SWRzLmdldEl0ZW1JZChpdGVtSW5kZXgpXSA9IGl0ZW1Ob2RlO1xuICAgICAgfVxuICAgIH0pLCBfZXh0ZW5kczQpLCByZXN0KTtcblxuICAgIGlmICghcmVzdC5kaXNhYmxlZCkge1xuICAgICAgaXRlbVByb3BzLm9uTW91c2VNb3ZlID0gY2FsbEFsbEV2ZW50SGFuZGxlcnMob25Nb3VzZU1vdmUsIGl0ZW1IYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgaXRlbVByb3BzLm9uQ2xpY2sgPSBjYWxsQWxsRXZlbnRIYW5kbGVycyhvbkNsaWNrLCBpdGVtSGFuZGxlQ2xpY2spO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtUHJvcHM7XG4gIH0sIFtkaXNwYXRjaCwgbGF0ZXN0LCBzaG91bGRTY3JvbGxSZWYsIGVsZW1lbnRJZHNdKTtcbiAgcmV0dXJuIHtcbiAgICAvLyBwcm9wIGdldHRlcnMuXG4gICAgZ2V0VG9nZ2xlQnV0dG9uUHJvcHM6IGdldFRvZ2dsZUJ1dHRvblByb3BzLFxuICAgIGdldExhYmVsUHJvcHM6IGdldExhYmVsUHJvcHMsXG4gICAgZ2V0TWVudVByb3BzOiBnZXRNZW51UHJvcHMsXG4gICAgZ2V0SXRlbVByb3BzOiBnZXRJdGVtUHJvcHMsXG4gICAgLy8gYWN0aW9ucy5cbiAgICB0b2dnbGVNZW51OiB0b2dnbGVNZW51LFxuICAgIG9wZW5NZW51OiBvcGVuTWVudSxcbiAgICBjbG9zZU1lbnU6IGNsb3NlTWVudSxcbiAgICBzZXRIaWdobGlnaHRlZEluZGV4OiBzZXRIaWdobGlnaHRlZEluZGV4LFxuICAgIHNlbGVjdEl0ZW06IHNlbGVjdEl0ZW0sXG4gICAgcmVzZXQ6IHJlc2V0LFxuICAgIHNldElucHV0VmFsdWU6IHNldElucHV0VmFsdWUsXG4gICAgLy8gc3RhdGUuXG4gICAgaGlnaGxpZ2h0ZWRJbmRleDogaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICBpc09wZW46IGlzT3BlbixcbiAgICBzZWxlY3RlZEl0ZW06IHNlbGVjdGVkSXRlbSxcbiAgICBpbnB1dFZhbHVlOiBpbnB1dFZhbHVlXG4gIH07XG59XG5cbnZhciBJbnB1dEtleURvd25BcnJvd0Rvd24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19pbnB1dF9rZXlkb3duX2Fycm93X2Rvd25fXycgOiAwO1xudmFyIElucHV0S2V5RG93bkFycm93VXAgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19pbnB1dF9rZXlkb3duX2Fycm93X3VwX18nIDogMTtcbnZhciBJbnB1dEtleURvd25Fc2NhcGUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19pbnB1dF9rZXlkb3duX2VzY2FwZV9fJyA6IDI7XG52YXIgSW5wdXRLZXlEb3duSG9tZSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2lucHV0X2tleWRvd25faG9tZV9fJyA6IDM7XG52YXIgSW5wdXRLZXlEb3duRW5kID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19faW5wdXRfa2V5ZG93bl9lbmRfXycgOiA0O1xudmFyIElucHV0S2V5RG93bkVudGVyID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19faW5wdXRfa2V5ZG93bl9lbnRlcl9fJyA6IDU7XG52YXIgSW5wdXRDaGFuZ2UgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19pbnB1dF9jaGFuZ2VfXycgOiA2O1xudmFyIElucHV0Qmx1ciA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2lucHV0X2JsdXJfXycgOiA3O1xudmFyIE1lbnVNb3VzZUxlYXZlID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fbWVudV9tb3VzZV9sZWF2ZV9fJyA6IDg7XG52YXIgSXRlbU1vdXNlTW92ZSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2l0ZW1fbW91c2VfbW92ZV9fJyA6IDk7XG52YXIgSXRlbUNsaWNrID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19faXRlbV9jbGlja19fJyA6IDEwO1xudmFyIFRvZ2dsZUJ1dHRvbkNsaWNrID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fdG9nZ2xlYnV0dG9uX2NsaWNrX18nIDogMTE7XG52YXIgRnVuY3Rpb25Ub2dnbGVNZW51ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fZnVuY3Rpb25fdG9nZ2xlX21lbnVfXycgOiAxMjtcbnZhciBGdW5jdGlvbk9wZW5NZW51ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fZnVuY3Rpb25fb3Blbl9tZW51X18nIDogMTM7XG52YXIgRnVuY3Rpb25DbG9zZU1lbnUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9jbG9zZV9tZW51X18nIDogMTQ7XG52YXIgRnVuY3Rpb25TZXRIaWdobGlnaHRlZEluZGV4ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fZnVuY3Rpb25fc2V0X2hpZ2hsaWdodGVkX2luZGV4X18nIDogMTU7XG52YXIgRnVuY3Rpb25TZWxlY3RJdGVtID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fZnVuY3Rpb25fc2VsZWN0X2l0ZW1fXycgOiAxNjtcbnZhciBGdW5jdGlvblNldElucHV0VmFsdWUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9zZXRfaW5wdXRfdmFsdWVfXycgOiAxNztcbnZhciBGdW5jdGlvblJlc2V0JDEgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9yZXNldF9fJyA6IDE4O1xudmFyIENvbnRyb2xsZWRQcm9wVXBkYXRlZFNlbGVjdGVkSXRlbSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2NvbnRyb2xsZWRfcHJvcF91cGRhdGVkX3NlbGVjdGVkX2l0ZW1fXycgOiAxOTtcblxudmFyIHN0YXRlQ2hhbmdlVHlwZXMkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBJbnB1dEtleURvd25BcnJvd0Rvd246IElucHV0S2V5RG93bkFycm93RG93bixcbiAgSW5wdXRLZXlEb3duQXJyb3dVcDogSW5wdXRLZXlEb3duQXJyb3dVcCxcbiAgSW5wdXRLZXlEb3duRXNjYXBlOiBJbnB1dEtleURvd25Fc2NhcGUsXG4gIElucHV0S2V5RG93bkhvbWU6IElucHV0S2V5RG93bkhvbWUsXG4gIElucHV0S2V5RG93bkVuZDogSW5wdXRLZXlEb3duRW5kLFxuICBJbnB1dEtleURvd25FbnRlcjogSW5wdXRLZXlEb3duRW50ZXIsXG4gIElucHV0Q2hhbmdlOiBJbnB1dENoYW5nZSxcbiAgSW5wdXRCbHVyOiBJbnB1dEJsdXIsXG4gIE1lbnVNb3VzZUxlYXZlOiBNZW51TW91c2VMZWF2ZSxcbiAgSXRlbU1vdXNlTW92ZTogSXRlbU1vdXNlTW92ZSxcbiAgSXRlbUNsaWNrOiBJdGVtQ2xpY2ssXG4gIFRvZ2dsZUJ1dHRvbkNsaWNrOiBUb2dnbGVCdXR0b25DbGljayxcbiAgRnVuY3Rpb25Ub2dnbGVNZW51OiBGdW5jdGlvblRvZ2dsZU1lbnUsXG4gIEZ1bmN0aW9uT3Blbk1lbnU6IEZ1bmN0aW9uT3Blbk1lbnUsXG4gIEZ1bmN0aW9uQ2xvc2VNZW51OiBGdW5jdGlvbkNsb3NlTWVudSxcbiAgRnVuY3Rpb25TZXRIaWdobGlnaHRlZEluZGV4OiBGdW5jdGlvblNldEhpZ2hsaWdodGVkSW5kZXgsXG4gIEZ1bmN0aW9uU2VsZWN0SXRlbTogRnVuY3Rpb25TZWxlY3RJdGVtLFxuICBGdW5jdGlvblNldElucHV0VmFsdWU6IEZ1bmN0aW9uU2V0SW5wdXRWYWx1ZSxcbiAgRnVuY3Rpb25SZXNldDogRnVuY3Rpb25SZXNldCQxLFxuICBDb250cm9sbGVkUHJvcFVwZGF0ZWRTZWxlY3RlZEl0ZW06IENvbnRyb2xsZWRQcm9wVXBkYXRlZFNlbGVjdGVkSXRlbVxufSk7XG5cbmZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSQxKHByb3BzKSB7XG4gIHZhciBpbml0aWFsU3RhdGUgPSBnZXRJbml0aWFsU3RhdGUkMihwcm9wcyk7XG4gIHZhciBzZWxlY3RlZEl0ZW0gPSBpbml0aWFsU3RhdGUuc2VsZWN0ZWRJdGVtO1xuICB2YXIgaW5wdXRWYWx1ZSA9IGluaXRpYWxTdGF0ZS5pbnB1dFZhbHVlO1xuXG4gIGlmIChpbnB1dFZhbHVlID09PSAnJyAmJiBzZWxlY3RlZEl0ZW0gJiYgcHJvcHMuZGVmYXVsdElucHV0VmFsdWUgPT09IHVuZGVmaW5lZCAmJiBwcm9wcy5pbml0aWFsSW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIHByb3BzLmlucHV0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGlucHV0VmFsdWUgPSBwcm9wcy5pdGVtVG9TdHJpbmcoc2VsZWN0ZWRJdGVtKTtcbiAgfVxuXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgaW5pdGlhbFN0YXRlLCB7XG4gICAgaW5wdXRWYWx1ZTogaW5wdXRWYWx1ZVxuICB9KTtcbn1cblxudmFyIHByb3BUeXBlcyQxID0ge1xuICBpdGVtczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIGl0ZW1Ub1N0cmluZzogUHJvcFR5cGVzLmZ1bmMsXG4gIGdldEExMXlTdGF0dXNNZXNzYWdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgZ2V0QTExeVNlbGVjdGlvbk1lc3NhZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBjaXJjdWxhck5hdmlnYXRpb246IFByb3BUeXBlcy5ib29sLFxuICBoaWdobGlnaHRlZEluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBkZWZhdWx0SGlnaGxpZ2h0ZWRJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgaW5pdGlhbEhpZ2hsaWdodGVkSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gIGlzT3BlbjogUHJvcFR5cGVzLmJvb2wsXG4gIGRlZmF1bHRJc09wZW46IFByb3BUeXBlcy5ib29sLFxuICBpbml0aWFsSXNPcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2VsZWN0ZWRJdGVtOiBQcm9wVHlwZXMuYW55LFxuICBpbml0aWFsU2VsZWN0ZWRJdGVtOiBQcm9wVHlwZXMuYW55LFxuICBkZWZhdWx0U2VsZWN0ZWRJdGVtOiBQcm9wVHlwZXMuYW55LFxuICBpbnB1dFZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBkZWZhdWx0SW5wdXRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgaW5pdGlhbElucHV0VmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsYWJlbElkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBtZW51SWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGdldEl0ZW1JZDogUHJvcFR5cGVzLmZ1bmMsXG4gIGlucHV0SWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHRvZ2dsZUJ1dHRvbklkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBzdGF0ZVJlZHVjZXI6IFByb3BUeXBlcy5mdW5jLFxuICBvblNlbGVjdGVkSXRlbUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uSGlnaGxpZ2h0ZWRJbmRleENoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uU3RhdGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvbklzT3BlbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uSW5wdXRWYWx1ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIGVudmlyb25tZW50OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGFkZEV2ZW50TGlzdGVuZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGRvY3VtZW50OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgZ2V0RWxlbWVudEJ5SWQ6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgYWN0aXZlRWxlbWVudDogUHJvcFR5cGVzLmFueSxcbiAgICAgIGJvZHk6IFByb3BUeXBlcy5hbnlcbiAgICB9KVxuICB9KVxufTtcbi8qKlxuICogVGhlIHVzZUNvbWJvYm94IHZlcnNpb24gb2YgdXNlQ29udHJvbGxlZFJlZHVjZXIsIHdoaWNoIGFsc29cbiAqIGNoZWNrcyBpZiB0aGUgY29udHJvbGxlZCBwcm9wIHNlbGVjdGVkSXRlbSBjaGFuZ2VkIGJldHdlZW5cbiAqIHJlbmRlcnMuIElmIHNvLCBpdCB3aWxsIGFsc28gdXBkYXRlIGlucHV0VmFsdWUgd2l0aCBpdHNcbiAqIHN0cmluZyBlcXVpdmFsZW50LiBJdCB1c2VzIHRoZSBjb21tb24gdXNlRW5oYW5jZWRSZWR1Y2VyIHRvXG4gKiBjb21wdXRlIHRoZSByZXN0IG9mIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIFJlZHVjZXIgZnVuY3Rpb24gZnJvbSBkb3duc2hpZnQuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5pdGlhbFN0YXRlIEluaXRpYWwgc3RhdGUgb2YgdGhlIGhvb2suXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIGhvb2sgcHJvcHMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IHdpdGggdGhlIHN0YXRlIGFuZCBhbiBhY3Rpb24gZGlzcGF0Y2hlci5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb250cm9sbGVkUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsU3RhdGUsIHByb3BzKSB7XG4gIHZhciBwcmV2aW91c1NlbGVjdGVkSXRlbVJlZiA9IHVzZVJlZigpO1xuXG4gIHZhciBfdXNlRW5oYW5jZWRSZWR1Y2VyID0gdXNlRW5oYW5jZWRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSwgcHJvcHMpLFxuICAgICAgc3RhdGUgPSBfdXNlRW5oYW5jZWRSZWR1Y2VyWzBdLFxuICAgICAgZGlzcGF0Y2ggPSBfdXNlRW5oYW5jZWRSZWR1Y2VyWzFdOyAvLyBUb0RvOiBpZiBuZWVkZWQsIG1ha2Ugc2FtZSBhcHByb2FjaCBhcyBzZWxlY3RlZEl0ZW1DaGFuZ2VkIGZyb20gRG93bnNoaWZ0LlxuXG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNDb250cm9sbGVkUHJvcChwcm9wcywgJ3NlbGVjdGVkSXRlbScpKSB7XG4gICAgICBpZiAocHJldmlvdXNTZWxlY3RlZEl0ZW1SZWYuY3VycmVudCAhPT0gcHJvcHMuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBDb250cm9sbGVkUHJvcFVwZGF0ZWRTZWxlY3RlZEl0ZW0sXG4gICAgICAgICAgaW5wdXRWYWx1ZTogcHJvcHMuaXRlbVRvU3RyaW5nKHByb3BzLnNlbGVjdGVkSXRlbSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzU2VsZWN0ZWRJdGVtUmVmLmN1cnJlbnQgPSBzdGF0ZS5zZWxlY3RlZEl0ZW0gPT09IHByZXZpb3VzU2VsZWN0ZWRJdGVtUmVmLmN1cnJlbnQgPyBwcm9wcy5zZWxlY3RlZEl0ZW0gOiBzdGF0ZS5zZWxlY3RlZEl0ZW07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFtnZXRTdGF0ZShzdGF0ZSwgcHJvcHMpLCBkaXNwYXRjaF07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5cblxudmFyIHZhbGlkYXRlUHJvcFR5cGVzJDEgPSBub29wO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFsaWRhdGVQcm9wVHlwZXMkMSA9IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKG9wdGlvbnMsIGNhbGxlcikge1xuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMkMSwgb3B0aW9ucywgJ3Byb3AnLCBjYWxsZXIubmFtZSk7XG4gIH07XG59XG5cbnZhciBkZWZhdWx0UHJvcHMkMSA9IF9leHRlbmRzKHt9LCBkZWZhdWx0UHJvcHMkMywge1xuICBnZXRBMTF5U3RhdHVzTWVzc2FnZTogZ2V0QTExeVN0YXR1c01lc3NhZ2UkMSxcbiAgY2lyY3VsYXJOYXZpZ2F0aW9uOiB0cnVlXG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG5mdW5jdGlvbiBkb3duc2hpZnRVc2VDb21ib2JveFJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICB2YXIgdHlwZSA9IGFjdGlvbi50eXBlLFxuICAgICAgcHJvcHMgPSBhY3Rpb24ucHJvcHMsXG4gICAgICBzaGlmdEtleSA9IGFjdGlvbi5zaGlmdEtleTtcbiAgdmFyIGNoYW5nZXM7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBJdGVtQ2xpY2s6XG4gICAgICBjaGFuZ2VzID0ge1xuICAgICAgICBpc09wZW46IGdldERlZmF1bHRWYWx1ZSQxKHByb3BzLCAnaXNPcGVuJyksXG4gICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGdldERlZmF1bHRWYWx1ZSQxKHByb3BzLCAnaGlnaGxpZ2h0ZWRJbmRleCcpLFxuICAgICAgICBzZWxlY3RlZEl0ZW06IHByb3BzLml0ZW1zW2FjdGlvbi5pbmRleF0sXG4gICAgICAgIGlucHV0VmFsdWU6IHByb3BzLml0ZW1Ub1N0cmluZyhwcm9wcy5pdGVtc1thY3Rpb24uaW5kZXhdKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJbnB1dEtleURvd25BcnJvd0Rvd246XG4gICAgICBpZiAoc3RhdGUuaXNPcGVuKSB7XG4gICAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogZ2V0TmV4dFdyYXBwaW5nSW5kZXgoc2hpZnRLZXkgPyA1IDogMSwgc3RhdGUuaGlnaGxpZ2h0ZWRJbmRleCwgcHJvcHMuaXRlbXMubGVuZ3RoLCBhY3Rpb24uZ2V0SXRlbU5vZGVGcm9tSW5kZXgsIHByb3BzLmNpcmN1bGFyTmF2aWdhdGlvbilcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogZ2V0SGlnaGxpZ2h0ZWRJbmRleE9uT3Blbihwcm9wcywgc3RhdGUsIDEsIGFjdGlvbi5nZXRJdGVtTm9kZUZyb21JbmRleCksXG4gICAgICAgICAgaXNPcGVuOiBwcm9wcy5pdGVtcy5sZW5ndGggPj0gMFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSW5wdXRLZXlEb3duQXJyb3dVcDpcbiAgICAgIGlmIChzdGF0ZS5pc09wZW4pIHtcbiAgICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBnZXROZXh0V3JhcHBpbmdJbmRleChzaGlmdEtleSA/IC01IDogLTEsIHN0YXRlLmhpZ2hsaWdodGVkSW5kZXgsIHByb3BzLml0ZW1zLmxlbmd0aCwgYWN0aW9uLmdldEl0ZW1Ob2RlRnJvbUluZGV4LCBwcm9wcy5jaXJjdWxhck5hdmlnYXRpb24pXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFuZ2VzID0ge1xuICAgICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGdldEhpZ2hsaWdodGVkSW5kZXhPbk9wZW4ocHJvcHMsIHN0YXRlLCAtMSwgYWN0aW9uLmdldEl0ZW1Ob2RlRnJvbUluZGV4KSxcbiAgICAgICAgICBpc09wZW46IHByb3BzLml0ZW1zLmxlbmd0aCA+PSAwXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJbnB1dEtleURvd25FbnRlcjpcbiAgICAgIGNoYW5nZXMgPSBfZXh0ZW5kcyh7fSwgc3RhdGUuaXNPcGVuICYmIHN0YXRlLmhpZ2hsaWdodGVkSW5kZXggPj0gMCAmJiB7XG4gICAgICAgIHNlbGVjdGVkSXRlbTogcHJvcHMuaXRlbXNbc3RhdGUuaGlnaGxpZ2h0ZWRJbmRleF0sXG4gICAgICAgIGlzT3BlbjogZ2V0RGVmYXVsdFZhbHVlJDEocHJvcHMsICdpc09wZW4nKSxcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogZ2V0RGVmYXVsdFZhbHVlJDEocHJvcHMsICdoaWdobGlnaHRlZEluZGV4JyksXG4gICAgICAgIGlucHV0VmFsdWU6IHByb3BzLml0ZW1Ub1N0cmluZyhwcm9wcy5pdGVtc1tzdGF0ZS5oaWdobGlnaHRlZEluZGV4XSlcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElucHV0S2V5RG93bkVzY2FwZTpcbiAgICAgIGNoYW5nZXMgPSBfZXh0ZW5kcyh7XG4gICAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IC0xXG4gICAgICB9LCAhc3RhdGUuaXNPcGVuICYmIHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBudWxsLFxuICAgICAgICBpbnB1dFZhbHVlOiAnJ1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSW5wdXRLZXlEb3duSG9tZTpcbiAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgIGhpZ2hsaWdodGVkSW5kZXg6IGdldE5leHROb25EaXNhYmxlZEluZGV4KDEsIDAsIHByb3BzLml0ZW1zLmxlbmd0aCwgYWN0aW9uLmdldEl0ZW1Ob2RlRnJvbUluZGV4LCBmYWxzZSlcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSW5wdXRLZXlEb3duRW5kOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogZ2V0TmV4dE5vbkRpc2FibGVkSW5kZXgoLTEsIHByb3BzLml0ZW1zLmxlbmd0aCAtIDEsIHByb3BzLml0ZW1zLmxlbmd0aCwgYWN0aW9uLmdldEl0ZW1Ob2RlRnJvbUluZGV4LCBmYWxzZSlcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSW5wdXRCbHVyOlxuICAgICAgY2hhbmdlcyA9IF9leHRlbmRzKHtcbiAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogLTFcbiAgICAgIH0sIHN0YXRlLmhpZ2hsaWdodGVkSW5kZXggPj0gMCAmJiBhY3Rpb24uc2VsZWN0SXRlbSAmJiB7XG4gICAgICAgIHNlbGVjdGVkSXRlbTogcHJvcHMuaXRlbXNbc3RhdGUuaGlnaGxpZ2h0ZWRJbmRleF0sXG4gICAgICAgIGlucHV0VmFsdWU6IHByb3BzLml0ZW1Ub1N0cmluZyhwcm9wcy5pdGVtc1tzdGF0ZS5oaWdobGlnaHRlZEluZGV4XSlcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElucHV0Q2hhbmdlOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICBoaWdobGlnaHRlZEluZGV4OiBnZXREZWZhdWx0VmFsdWUkMShwcm9wcywgJ2hpZ2hsaWdodGVkSW5kZXgnKSxcbiAgICAgICAgaW5wdXRWYWx1ZTogYWN0aW9uLmlucHV0VmFsdWVcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRnVuY3Rpb25TZWxlY3RJdGVtOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhY3Rpb24uc2VsZWN0ZWRJdGVtLFxuICAgICAgICBpbnB1dFZhbHVlOiBwcm9wcy5pdGVtVG9TdHJpbmcoYWN0aW9uLnNlbGVjdGVkSXRlbSlcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udHJvbGxlZFByb3BVcGRhdGVkU2VsZWN0ZWRJdGVtOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgaW5wdXRWYWx1ZTogYWN0aW9uLmlucHV0VmFsdWVcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZG93bnNoaWZ0Q29tbW9uUmVkdWNlcihzdGF0ZSwgYWN0aW9uLCBzdGF0ZUNoYW5nZVR5cGVzJDEpO1xuICB9XG5cbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwgY2hhbmdlcyk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHkgKi9cblxudmFyIF9leGNsdWRlZCQxID0gW1wib25Nb3VzZUxlYXZlXCIsIFwicmVmS2V5XCIsIFwicmVmXCJdLFxuICAgIF9leGNsdWRlZDIkMSA9IFtcIml0ZW1cIiwgXCJpbmRleFwiLCBcInJlZktleVwiLCBcInJlZlwiLCBcIm9uTW91c2VNb3ZlXCIsIFwib25DbGlja1wiLCBcIm9uUHJlc3NcIl0sXG4gICAgX2V4Y2x1ZGVkMyA9IFtcIm9uQ2xpY2tcIiwgXCJvblByZXNzXCIsIFwicmVmS2V5XCIsIFwicmVmXCJdLFxuICAgIF9leGNsdWRlZDQgPSBbXCJvbktleURvd25cIiwgXCJvbkNoYW5nZVwiLCBcIm9uSW5wdXRcIiwgXCJvbkJsdXJcIiwgXCJvbkNoYW5nZVRleHRcIiwgXCJyZWZLZXlcIiwgXCJyZWZcIl0sXG4gICAgX2V4Y2x1ZGVkNSA9IFtcInJlZktleVwiLCBcInJlZlwiXTtcbnVzZUNvbWJvYm94LnN0YXRlQ2hhbmdlVHlwZXMgPSBzdGF0ZUNoYW5nZVR5cGVzJDE7XG5cbmZ1bmN0aW9uIHVzZUNvbWJvYm94KHVzZXJQcm9wcykge1xuICBpZiAodXNlclByb3BzID09PSB2b2lkIDApIHtcbiAgICB1c2VyUHJvcHMgPSB7fTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzJDEodXNlclByb3BzLCB1c2VDb21ib2JveCk7IC8vIFByb3BzIGRlZmF1bHRzIGFuZCBkZXN0cnVjdHVyaW5nLlxuXG4gIHZhciBwcm9wcyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0UHJvcHMkMSwgdXNlclByb3BzKTtcblxuICB2YXIgaW5pdGlhbElzT3BlbiA9IHByb3BzLmluaXRpYWxJc09wZW4sXG4gICAgICBkZWZhdWx0SXNPcGVuID0gcHJvcHMuZGVmYXVsdElzT3BlbixcbiAgICAgIGl0ZW1zID0gcHJvcHMuaXRlbXMsXG4gICAgICBzY3JvbGxJbnRvVmlldyA9IHByb3BzLnNjcm9sbEludG9WaWV3LFxuICAgICAgZW52aXJvbm1lbnQgPSBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgIGdldEExMXlTdGF0dXNNZXNzYWdlID0gcHJvcHMuZ2V0QTExeVN0YXR1c01lc3NhZ2UsXG4gICAgICBnZXRBMTF5U2VsZWN0aW9uTWVzc2FnZSA9IHByb3BzLmdldEExMXlTZWxlY3Rpb25NZXNzYWdlLFxuICAgICAgaXRlbVRvU3RyaW5nID0gcHJvcHMuaXRlbVRvU3RyaW5nOyAvLyBJbml0aWFsIHN0YXRlIGRlcGVuZGluZyBvbiBjb250cm9sbGVkIHByb3BzLlxuXG4gIHZhciBpbml0aWFsU3RhdGUgPSBnZXRJbml0aWFsU3RhdGUkMShwcm9wcyk7XG5cbiAgdmFyIF91c2VDb250cm9sbGVkUmVkdWNlciA9IHVzZUNvbnRyb2xsZWRSZWR1Y2VyKGRvd25zaGlmdFVzZUNvbWJvYm94UmVkdWNlciwgaW5pdGlhbFN0YXRlLCBwcm9wcyksXG4gICAgICBzdGF0ZSA9IF91c2VDb250cm9sbGVkUmVkdWNlclswXSxcbiAgICAgIGRpc3BhdGNoID0gX3VzZUNvbnRyb2xsZWRSZWR1Y2VyWzFdO1xuXG4gIHZhciBpc09wZW4gPSBzdGF0ZS5pc09wZW4sXG4gICAgICBoaWdobGlnaHRlZEluZGV4ID0gc3RhdGUuaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgIHNlbGVjdGVkSXRlbSA9IHN0YXRlLnNlbGVjdGVkSXRlbSxcbiAgICAgIGlucHV0VmFsdWUgPSBzdGF0ZS5pbnB1dFZhbHVlOyAvLyBFbGVtZW50IHJlZnMuXG5cbiAgdmFyIG1lbnVSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBpdGVtUmVmcyA9IHVzZVJlZih7fSk7XG4gIHZhciBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHRvZ2dsZUJ1dHRvblJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGNvbWJvYm94UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgaXNJbml0aWFsTW91bnRSZWYgPSB1c2VSZWYodHJ1ZSk7IC8vIHByZXZlbnQgaWQgcmUtZ2VuZXJhdGlvbiBiZXR3ZWVuIHJlbmRlcnMuXG5cbiAgdmFyIGVsZW1lbnRJZHMgPSB1c2VFbGVtZW50SWRzKHByb3BzKTsgLy8gdXNlZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zIHdlIGhhZCBvbiBwcmV2aW91cyBjeWNsZS5cblxuICB2YXIgcHJldmlvdXNSZXN1bHRDb3VudFJlZiA9IHVzZVJlZigpOyAvLyB1dGlsaXR5IGNhbGxiYWNrIHRvIGdldCBpdGVtIGVsZW1lbnQuXG5cbiAgdmFyIGxhdGVzdCA9IHVzZUxhdGVzdFJlZih7XG4gICAgc3RhdGU6IHN0YXRlLFxuICAgIHByb3BzOiBwcm9wc1xuICB9KTtcbiAgdmFyIGdldEl0ZW1Ob2RlRnJvbUluZGV4ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgcmV0dXJuIGl0ZW1SZWZzLmN1cnJlbnRbZWxlbWVudElkcy5nZXRJdGVtSWQoaW5kZXgpXTtcbiAgfSwgW2VsZW1lbnRJZHNdKTsgLy8gRWZmZWN0cy5cbiAgLy8gU2V0cyBhMTF5IHN0YXR1cyBtZXNzYWdlIG9uIGNoYW5nZXMgaW4gc3RhdGUuXG5cbiAgdXNlQTExeU1lc3NhZ2VTZXR0ZXIoZ2V0QTExeVN0YXR1c01lc3NhZ2UsIFtpc09wZW4sIGhpZ2hsaWdodGVkSW5kZXgsIGlucHV0VmFsdWUsIGl0ZW1zXSwgX2V4dGVuZHMoe1xuICAgIGlzSW5pdGlhbE1vdW50OiBpc0luaXRpYWxNb3VudFJlZi5jdXJyZW50LFxuICAgIHByZXZpb3VzUmVzdWx0Q291bnQ6IHByZXZpb3VzUmVzdWx0Q291bnRSZWYuY3VycmVudCxcbiAgICBpdGVtczogaXRlbXMsXG4gICAgZW52aXJvbm1lbnQ6IGVudmlyb25tZW50LFxuICAgIGl0ZW1Ub1N0cmluZzogaXRlbVRvU3RyaW5nXG4gIH0sIHN0YXRlKSk7IC8vIFNldHMgYTExeSBzdGF0dXMgbWVzc2FnZSBvbiBjaGFuZ2VzIGluIHNlbGVjdGVkSXRlbS5cblxuICB1c2VBMTF5TWVzc2FnZVNldHRlcihnZXRBMTF5U2VsZWN0aW9uTWVzc2FnZSwgW3NlbGVjdGVkSXRlbV0sIF9leHRlbmRzKHtcbiAgICBpc0luaXRpYWxNb3VudDogaXNJbml0aWFsTW91bnRSZWYuY3VycmVudCxcbiAgICBwcmV2aW91c1Jlc3VsdENvdW50OiBwcmV2aW91c1Jlc3VsdENvdW50UmVmLmN1cnJlbnQsXG4gICAgaXRlbXM6IGl0ZW1zLFxuICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCxcbiAgICBpdGVtVG9TdHJpbmc6IGl0ZW1Ub1N0cmluZ1xuICB9LCBzdGF0ZSkpOyAvLyBTY3JvbGwgb24gaGlnaGxpZ2h0ZWQgaXRlbSBpZiBjaGFuZ2UgY29tZXMgZnJvbSBrZXlib2FyZC5cblxuICB2YXIgc2hvdWxkU2Nyb2xsUmVmID0gdXNlU2Nyb2xsSW50b1ZpZXcoe1xuICAgIG1lbnVFbGVtZW50OiBtZW51UmVmLmN1cnJlbnQsXG4gICAgaGlnaGxpZ2h0ZWRJbmRleDogaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICBpc09wZW46IGlzT3BlbixcbiAgICBpdGVtUmVmczogaXRlbVJlZnMsXG4gICAgc2Nyb2xsSW50b1ZpZXc6IHNjcm9sbEludG9WaWV3LFxuICAgIGdldEl0ZW1Ob2RlRnJvbUluZGV4OiBnZXRJdGVtTm9kZUZyb21JbmRleFxuICB9KTtcbiAgdXNlQ29udHJvbFByb3BzVmFsaWRhdG9yKHtcbiAgICBpc0luaXRpYWxNb3VudDogaXNJbml0aWFsTW91bnRSZWYuY3VycmVudCxcbiAgICBwcm9wczogcHJvcHMsXG4gICAgc3RhdGU6IHN0YXRlXG4gIH0pOyAvLyBGb2N1cyB0aGUgaW5wdXQgb24gZmlyc3QgcmVuZGVyIGlmIHJlcXVpcmVkLlxuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZvY3VzT25PcGVuID0gaW5pdGlhbElzT3BlbiB8fCBkZWZhdWx0SXNPcGVuIHx8IGlzT3BlbjtcblxuICAgIGlmIChmb2N1c09uT3BlbiAmJiBpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG5cbiAgfSwgW10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0luaXRpYWxNb3VudFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJldmlvdXNSZXN1bHRDb3VudFJlZi5jdXJyZW50ID0gaXRlbXMubGVuZ3RoO1xuICB9KTsgLy8gQWRkIG1vdXNlL3RvdWNoIGV2ZW50cyB0byBkb2N1bWVudC5cblxuICB2YXIgbW91c2VBbmRUb3VjaFRyYWNrZXJzUmVmID0gdXNlTW91c2VBbmRUb3VjaFRyYWNrZXIoaXNPcGVuLCBbY29tYm9ib3hSZWYsIG1lbnVSZWYsIHRvZ2dsZUJ1dHRvblJlZl0sIGVudmlyb25tZW50LCBmdW5jdGlvbiAoKSB7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogSW5wdXRCbHVyLFxuICAgICAgc2VsZWN0SXRlbTogZmFsc2VcbiAgICB9KTtcbiAgfSk7XG4gIHZhciBzZXRHZXR0ZXJQcm9wQ2FsbEluZm8gPSB1c2VHZXR0ZXJQcm9wc0NhbGxlZENoZWNrZXIoJ2dldElucHV0UHJvcHMnLCAnZ2V0Q29tYm9ib3hQcm9wcycsICdnZXRNZW51UHJvcHMnKTsgLy8gTWFrZSBpbml0aWFsIHJlZiBmYWxzZS5cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlzSW5pdGlhbE1vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfSwgW10pOyAvLyBSZXNldCBpdGVtUmVmcyBvbiBjbG9zZS5cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghaXNPcGVuKSB7XG4gICAgICBpdGVtUmVmcy5jdXJyZW50ID0ge307XG4gICAgfVxuICB9LCBbaXNPcGVuXSk7XG4gIC8qIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zICovXG5cbiAgdmFyIGlucHV0S2V5RG93bkhhbmRsZXJzID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFycm93RG93bjogZnVuY3Rpb24gQXJyb3dEb3duKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBJbnB1dEtleURvd25BcnJvd0Rvd24sXG4gICAgICAgICAgc2hpZnRLZXk6IGV2ZW50LnNoaWZ0S2V5LFxuICAgICAgICAgIGdldEl0ZW1Ob2RlRnJvbUluZGV4OiBnZXRJdGVtTm9kZUZyb21JbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBBcnJvd1VwOiBmdW5jdGlvbiBBcnJvd1VwKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBJbnB1dEtleURvd25BcnJvd1VwLFxuICAgICAgICAgIHNoaWZ0S2V5OiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICBnZXRJdGVtTm9kZUZyb21JbmRleDogZ2V0SXRlbU5vZGVGcm9tSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgSG9tZTogZnVuY3Rpb24gSG9tZShldmVudCkge1xuICAgICAgICBpZiAoIWxhdGVzdC5jdXJyZW50LnN0YXRlLmlzT3Blbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBJbnB1dEtleURvd25Ib21lLFxuICAgICAgICAgIGdldEl0ZW1Ob2RlRnJvbUluZGV4OiBnZXRJdGVtTm9kZUZyb21JbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBFbmQ6IGZ1bmN0aW9uIEVuZChldmVudCkge1xuICAgICAgICBpZiAoIWxhdGVzdC5jdXJyZW50LnN0YXRlLmlzT3Blbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBJbnB1dEtleURvd25FbmQsXG4gICAgICAgICAgZ2V0SXRlbU5vZGVGcm9tSW5kZXg6IGdldEl0ZW1Ob2RlRnJvbUluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIEVzY2FwZTogZnVuY3Rpb24gRXNjYXBlKCkge1xuICAgICAgICB2YXIgbGF0ZXN0U3RhdGUgPSBsYXRlc3QuY3VycmVudC5zdGF0ZTtcblxuICAgICAgICBpZiAobGF0ZXN0U3RhdGUuaXNPcGVuIHx8IGxhdGVzdFN0YXRlLmlucHV0VmFsdWUgfHwgbGF0ZXN0U3RhdGUuc2VsZWN0ZWRJdGVtIHx8IGxhdGVzdFN0YXRlLmhpZ2hsaWdodGVkSW5kZXggPiAtMSkge1xuICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IElucHV0S2V5RG93bkVzY2FwZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgRW50ZXI6IGZ1bmN0aW9uIEVudGVyKGV2ZW50KSB7XG4gICAgICAgIHZhciBsYXRlc3RTdGF0ZSA9IGxhdGVzdC5jdXJyZW50LnN0YXRlOyAvLyBpZiBjbG9zZWQgb3Igbm8gaGlnaGxpZ2h0ZWQgaW5kZXgsIGRvIG5vdGhpbmcuXG5cbiAgICAgICAgaWYgKCFsYXRlc3RTdGF0ZS5pc09wZW4gfHwgbGF0ZXN0U3RhdGUuaGlnaGxpZ2h0ZWRJbmRleCA8IDAgfHwgZXZlbnQud2hpY2ggPT09IDIyOSAvLyBpZiBJTUUgY29tcG9zaW5nLCB3YWl0IGZvciBuZXh0IEVudGVyIGtleWRvd24gZXZlbnQuXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBJbnB1dEtleURvd25FbnRlcixcbiAgICAgICAgICBnZXRJdGVtTm9kZUZyb21JbmRleDogZ2V0SXRlbU5vZGVGcm9tSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2Rpc3BhdGNoLCBsYXRlc3QsIGdldEl0ZW1Ob2RlRnJvbUluZGV4XSk7IC8vIEdldHRlciBwcm9wcy5cblxuICB2YXIgZ2V0TGFiZWxQcm9wcyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChsYWJlbFByb3BzKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGlkOiBlbGVtZW50SWRzLmxhYmVsSWQsXG4gICAgICBodG1sRm9yOiBlbGVtZW50SWRzLmlucHV0SWRcbiAgICB9LCBsYWJlbFByb3BzKTtcbiAgfSwgW2VsZW1lbnRJZHNdKTtcbiAgdmFyIGdldE1lbnVQcm9wcyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfdGVtcCwgX3RlbXAyKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgIG9uTW91c2VMZWF2ZSA9IF9yZWYub25Nb3VzZUxlYXZlLFxuICAgICAgICBfcmVmJHJlZktleSA9IF9yZWYucmVmS2V5LFxuICAgICAgICByZWZLZXkgPSBfcmVmJHJlZktleSA9PT0gdm9pZCAwID8gJ3JlZicgOiBfcmVmJHJlZktleSxcbiAgICAgICAgcmVmID0gX3JlZi5yZWYsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQkMSk7XG5cbiAgICB2YXIgX3JlZjIgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBfcmVmMiRzdXBwcmVzc1JlZkVycm8gPSBfcmVmMi5zdXBwcmVzc1JlZkVycm9yLFxuICAgICAgICBzdXBwcmVzc1JlZkVycm9yID0gX3JlZjIkc3VwcHJlc3NSZWZFcnJvID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJHN1cHByZXNzUmVmRXJybztcblxuICAgIHNldEdldHRlclByb3BDYWxsSW5mbygnZ2V0TWVudVByb3BzJywgc3VwcHJlc3NSZWZFcnJvciwgcmVmS2V5LCBtZW51UmVmKTtcbiAgICByZXR1cm4gX2V4dGVuZHMoKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbcmVmS2V5XSA9IGhhbmRsZVJlZnMocmVmLCBmdW5jdGlvbiAobWVudU5vZGUpIHtcbiAgICAgIG1lbnVSZWYuY3VycmVudCA9IG1lbnVOb2RlO1xuICAgIH0pLCBfZXh0ZW5kczIuaWQgPSBlbGVtZW50SWRzLm1lbnVJZCwgX2V4dGVuZHMyLnJvbGUgPSAnbGlzdGJveCcsIF9leHRlbmRzMlsnYXJpYS1sYWJlbGxlZGJ5J10gPSBlbGVtZW50SWRzLmxhYmVsSWQsIF9leHRlbmRzMi5vbk1vdXNlTGVhdmUgPSBjYWxsQWxsRXZlbnRIYW5kbGVycyhvbk1vdXNlTGVhdmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogTWVudU1vdXNlTGVhdmVcbiAgICAgIH0pO1xuICAgIH0pLCBfZXh0ZW5kczIpLCByZXN0KTtcbiAgfSwgW2Rpc3BhdGNoLCBzZXRHZXR0ZXJQcm9wQ2FsbEluZm8sIGVsZW1lbnRJZHNdKTtcbiAgdmFyIGdldEl0ZW1Qcm9wcyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfdGVtcDMpIHtcbiAgICB2YXIgX2V4dGVuZHMzLCBfcmVmNDtcblxuICAgIHZhciBfcmVmMyA9IF90ZW1wMyA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDMsXG4gICAgICAgIGl0ZW0gPSBfcmVmMy5pdGVtLFxuICAgICAgICBpbmRleCA9IF9yZWYzLmluZGV4LFxuICAgICAgICBfcmVmMyRyZWZLZXkgPSBfcmVmMy5yZWZLZXksXG4gICAgICAgIHJlZktleSA9IF9yZWYzJHJlZktleSA9PT0gdm9pZCAwID8gJ3JlZicgOiBfcmVmMyRyZWZLZXksXG4gICAgICAgIHJlZiA9IF9yZWYzLnJlZixcbiAgICAgICAgb25Nb3VzZU1vdmUgPSBfcmVmMy5vbk1vdXNlTW92ZSxcbiAgICAgICAgb25DbGljayA9IF9yZWYzLm9uQ2xpY2s7XG4gICAgICAgIF9yZWYzLm9uUHJlc3M7XG4gICAgICAgIHZhciByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZjMsIF9leGNsdWRlZDIkMSk7XG5cbiAgICB2YXIgX2xhdGVzdCRjdXJyZW50ID0gbGF0ZXN0LmN1cnJlbnQsXG4gICAgICAgIGxhdGVzdFByb3BzID0gX2xhdGVzdCRjdXJyZW50LnByb3BzLFxuICAgICAgICBsYXRlc3RTdGF0ZSA9IF9sYXRlc3QkY3VycmVudC5zdGF0ZTtcbiAgICB2YXIgaXRlbUluZGV4ID0gZ2V0SXRlbUluZGV4KGluZGV4LCBpdGVtLCBsYXRlc3RQcm9wcy5pdGVtcyk7XG5cbiAgICBpZiAoaXRlbUluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXNzIGVpdGhlciBpdGVtIG9yIGl0ZW0gaW5kZXggaW4gZ2V0SXRlbVByb3BzIScpO1xuICAgIH1cblxuICAgIHZhciBvblNlbGVjdEtleSA9ICdvbkNsaWNrJztcbiAgICB2YXIgY3VzdG9tQ2xpY2tIYW5kbGVyID0gb25DbGljaztcblxuICAgIHZhciBpdGVtSGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gaXRlbUhhbmRsZU1vdXNlTW92ZSgpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gbGF0ZXN0U3RhdGUuaGlnaGxpZ2h0ZWRJbmRleCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNob3VsZFNjcm9sbFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IEl0ZW1Nb3VzZU1vdmUsXG4gICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciBpdGVtSGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBpdGVtSGFuZGxlQ2xpY2soKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IEl0ZW1DbGljayxcbiAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICB9KTtcblxuICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZHMoKF9leHRlbmRzMyA9IHt9LCBfZXh0ZW5kczNbcmVmS2V5XSA9IGhhbmRsZVJlZnMocmVmLCBmdW5jdGlvbiAoaXRlbU5vZGUpIHtcbiAgICAgIGlmIChpdGVtTm9kZSkge1xuICAgICAgICBpdGVtUmVmcy5jdXJyZW50W2VsZW1lbnRJZHMuZ2V0SXRlbUlkKGl0ZW1JbmRleCldID0gaXRlbU5vZGU7XG4gICAgICB9XG4gICAgfSksIF9leHRlbmRzMy5yb2xlID0gJ29wdGlvbicsIF9leHRlbmRzM1snYXJpYS1zZWxlY3RlZCddID0gXCJcIiArIChpdGVtSW5kZXggPT09IGxhdGVzdFN0YXRlLmhpZ2hsaWdodGVkSW5kZXgpLCBfZXh0ZW5kczMuaWQgPSBlbGVtZW50SWRzLmdldEl0ZW1JZChpdGVtSW5kZXgpLCBfZXh0ZW5kczMpLCAhcmVzdC5kaXNhYmxlZCAmJiAoX3JlZjQgPSB7XG4gICAgICBvbk1vdXNlTW92ZTogY2FsbEFsbEV2ZW50SGFuZGxlcnMob25Nb3VzZU1vdmUsIGl0ZW1IYW5kbGVNb3VzZU1vdmUpXG4gICAgfSwgX3JlZjRbb25TZWxlY3RLZXldID0gY2FsbEFsbEV2ZW50SGFuZGxlcnMoY3VzdG9tQ2xpY2tIYW5kbGVyLCBpdGVtSGFuZGxlQ2xpY2spLCBfcmVmNCksIHJlc3QpO1xuICB9LCBbZGlzcGF0Y2gsIGxhdGVzdCwgc2hvdWxkU2Nyb2xsUmVmLCBlbGVtZW50SWRzXSk7XG4gIHZhciBnZXRUb2dnbGVCdXR0b25Qcm9wcyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfdGVtcDQpIHtcbiAgICB2YXIgX2V4dGVuZHM0O1xuXG4gICAgdmFyIF9yZWY1ID0gX3RlbXA0ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNCxcbiAgICAgICAgb25DbGljayA9IF9yZWY1Lm9uQ2xpY2s7XG4gICAgICAgIF9yZWY1Lm9uUHJlc3M7XG4gICAgICAgIHZhciBfcmVmNSRyZWZLZXkgPSBfcmVmNS5yZWZLZXksXG4gICAgICAgIHJlZktleSA9IF9yZWY1JHJlZktleSA9PT0gdm9pZCAwID8gJ3JlZicgOiBfcmVmNSRyZWZLZXksXG4gICAgICAgIHJlZiA9IF9yZWY1LnJlZixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY1LCBfZXhjbHVkZWQzKTtcblxuICAgIHZhciB0b2dnbGVCdXR0b25IYW5kbGVDbGljayA9IGZ1bmN0aW9uIHRvZ2dsZUJ1dHRvbkhhbmRsZUNsaWNrKCkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBUb2dnbGVCdXR0b25DbGlja1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghbGF0ZXN0LmN1cnJlbnQuc3RhdGUuaXNPcGVuICYmIGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZHMoKF9leHRlbmRzNCA9IHt9LCBfZXh0ZW5kczRbcmVmS2V5XSA9IGhhbmRsZVJlZnMocmVmLCBmdW5jdGlvbiAodG9nZ2xlQnV0dG9uTm9kZSkge1xuICAgICAgdG9nZ2xlQnV0dG9uUmVmLmN1cnJlbnQgPSB0b2dnbGVCdXR0b25Ob2RlO1xuICAgIH0pLCBfZXh0ZW5kczQuaWQgPSBlbGVtZW50SWRzLnRvZ2dsZUJ1dHRvbklkLCBfZXh0ZW5kczQudGFiSW5kZXggPSAtMSwgX2V4dGVuZHM0KSwgIXJlc3QuZGlzYWJsZWQgJiYgX2V4dGVuZHMoe30sIHtcbiAgICAgIG9uQ2xpY2s6IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uQ2xpY2ssIHRvZ2dsZUJ1dHRvbkhhbmRsZUNsaWNrKVxuICAgIH0pLCByZXN0KTtcbiAgfSwgW2Rpc3BhdGNoLCBsYXRlc3QsIGVsZW1lbnRJZHNdKTtcbiAgdmFyIGdldElucHV0UHJvcHMgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoX3RlbXA1LCBfdGVtcDYpIHtcbiAgICB2YXIgX2V4dGVuZHM1O1xuXG4gICAgdmFyIF9yZWY2ID0gX3RlbXA1ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNSxcbiAgICAgICAgb25LZXlEb3duID0gX3JlZjYub25LZXlEb3duLFxuICAgICAgICBvbkNoYW5nZSA9IF9yZWY2Lm9uQ2hhbmdlLFxuICAgICAgICBvbklucHV0ID0gX3JlZjYub25JbnB1dCxcbiAgICAgICAgb25CbHVyID0gX3JlZjYub25CbHVyO1xuICAgICAgICBfcmVmNi5vbkNoYW5nZVRleHQ7XG4gICAgICAgIHZhciBfcmVmNiRyZWZLZXkgPSBfcmVmNi5yZWZLZXksXG4gICAgICAgIHJlZktleSA9IF9yZWY2JHJlZktleSA9PT0gdm9pZCAwID8gJ3JlZicgOiBfcmVmNiRyZWZLZXksXG4gICAgICAgIHJlZiA9IF9yZWY2LnJlZixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY2LCBfZXhjbHVkZWQ0KTtcblxuICAgIHZhciBfcmVmNyA9IF90ZW1wNiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDYsXG4gICAgICAgIF9yZWY3JHN1cHByZXNzUmVmRXJybyA9IF9yZWY3LnN1cHByZXNzUmVmRXJyb3IsXG4gICAgICAgIHN1cHByZXNzUmVmRXJyb3IgPSBfcmVmNyRzdXBwcmVzc1JlZkVycm8gPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjckc3VwcHJlc3NSZWZFcnJvO1xuXG4gICAgc2V0R2V0dGVyUHJvcENhbGxJbmZvKCdnZXRJbnB1dFByb3BzJywgc3VwcHJlc3NSZWZFcnJvciwgcmVmS2V5LCBpbnB1dFJlZik7XG4gICAgdmFyIGxhdGVzdFN0YXRlID0gbGF0ZXN0LmN1cnJlbnQuc3RhdGU7XG5cbiAgICB2YXIgaW5wdXRIYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gaW5wdXRIYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgICB2YXIga2V5ID0gbm9ybWFsaXplQXJyb3dLZXkoZXZlbnQpO1xuXG4gICAgICBpZiAoa2V5ICYmIGlucHV0S2V5RG93bkhhbmRsZXJzW2tleV0pIHtcbiAgICAgICAgaW5wdXRLZXlEb3duSGFuZGxlcnNba2V5XShldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBpbnB1dEhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGlucHV0SGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IElucHV0Q2hhbmdlLFxuICAgICAgICBpbnB1dFZhbHVlOiBldmVudC50YXJnZXQudmFsdWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgaW5wdXRIYW5kbGVCbHVyID0gZnVuY3Rpb24gaW5wdXRIYW5kbGVCbHVyKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChsYXRlc3RTdGF0ZS5pc09wZW4gJiYgIW1vdXNlQW5kVG91Y2hUcmFja2Vyc1JlZi5jdXJyZW50LmlzTW91c2VEb3duKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBJbnB1dEJsdXIsXG4gICAgICAgICAgc2VsZWN0SXRlbTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IChwcmVhY3QpICovXG5cblxuICAgIHZhciBvbkNoYW5nZUtleSA9ICdvbkNoYW5nZSc7XG4gICAgdmFyIGV2ZW50SGFuZGxlcnMgPSB7fTtcblxuICAgIGlmICghcmVzdC5kaXNhYmxlZCkge1xuICAgICAgdmFyIF9ldmVudEhhbmRsZXJzO1xuXG4gICAgICBldmVudEhhbmRsZXJzID0gKF9ldmVudEhhbmRsZXJzID0ge30sIF9ldmVudEhhbmRsZXJzW29uQ2hhbmdlS2V5XSA9IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uQ2hhbmdlLCBvbklucHV0LCBpbnB1dEhhbmRsZUNoYW5nZSksIF9ldmVudEhhbmRsZXJzLm9uS2V5RG93biA9IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uS2V5RG93biwgaW5wdXRIYW5kbGVLZXlEb3duKSwgX2V2ZW50SGFuZGxlcnMub25CbHVyID0gY2FsbEFsbEV2ZW50SGFuZGxlcnMob25CbHVyLCBpbnB1dEhhbmRsZUJsdXIpLCBfZXZlbnRIYW5kbGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9leHRlbmRzKChfZXh0ZW5kczUgPSB7fSwgX2V4dGVuZHM1W3JlZktleV0gPSBoYW5kbGVSZWZzKHJlZiwgZnVuY3Rpb24gKGlucHV0Tm9kZSkge1xuICAgICAgaW5wdXRSZWYuY3VycmVudCA9IGlucHV0Tm9kZTtcbiAgICB9KSwgX2V4dGVuZHM1LmlkID0gZWxlbWVudElkcy5pbnB1dElkLCBfZXh0ZW5kczVbJ2FyaWEtYXV0b2NvbXBsZXRlJ10gPSAnbGlzdCcsIF9leHRlbmRzNVsnYXJpYS1jb250cm9scyddID0gZWxlbWVudElkcy5tZW51SWQsIF9leHRlbmRzNSksIGxhdGVzdFN0YXRlLmlzT3BlbiAmJiBsYXRlc3RTdGF0ZS5oaWdobGlnaHRlZEluZGV4ID4gLTEgJiYge1xuICAgICAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6IGVsZW1lbnRJZHMuZ2V0SXRlbUlkKGxhdGVzdFN0YXRlLmhpZ2hsaWdodGVkSW5kZXgpXG4gICAgfSwge1xuICAgICAgJ2FyaWEtbGFiZWxsZWRieSc6IGVsZW1lbnRJZHMubGFiZWxJZCxcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NlY3VyaXR5L1NlY3VyaW5nX3lvdXJfc2l0ZS9UdXJuaW5nX29mZl9mb3JtX2F1dG9jb21wbGV0aW9uXG4gICAgICAvLyByZXZlcnQgYmFjayBzaW5jZSBhdXRvY29tcGxldGU9XCJub3BlXCIgaXMgaWdub3JlZCBvbiBsYXRlc3QgQ2hyb21lIGFuZCBPcGVyYVxuICAgICAgYXV0b0NvbXBsZXRlOiAnb2ZmJyxcbiAgICAgIHZhbHVlOiBsYXRlc3RTdGF0ZS5pbnB1dFZhbHVlXG4gICAgfSwgZXZlbnRIYW5kbGVycywgcmVzdCk7XG4gIH0sIFtkaXNwYXRjaCwgaW5wdXRLZXlEb3duSGFuZGxlcnMsIGxhdGVzdCwgbW91c2VBbmRUb3VjaFRyYWNrZXJzUmVmLCBzZXRHZXR0ZXJQcm9wQ2FsbEluZm8sIGVsZW1lbnRJZHNdKTtcbiAgdmFyIGdldENvbWJvYm94UHJvcHMgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoX3RlbXA3LCBfdGVtcDgpIHtcbiAgICB2YXIgX2V4dGVuZHM2O1xuXG4gICAgdmFyIF9yZWY4ID0gX3RlbXA3ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNyxcbiAgICAgICAgX3JlZjgkcmVmS2V5ID0gX3JlZjgucmVmS2V5LFxuICAgICAgICByZWZLZXkgPSBfcmVmOCRyZWZLZXkgPT09IHZvaWQgMCA/ICdyZWYnIDogX3JlZjgkcmVmS2V5LFxuICAgICAgICByZWYgPSBfcmVmOC5yZWYsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmOCwgX2V4Y2x1ZGVkNSk7XG5cbiAgICB2YXIgX3JlZjkgPSBfdGVtcDggPT09IHZvaWQgMCA/IHt9IDogX3RlbXA4LFxuICAgICAgICBfcmVmOSRzdXBwcmVzc1JlZkVycm8gPSBfcmVmOS5zdXBwcmVzc1JlZkVycm9yLFxuICAgICAgICBzdXBwcmVzc1JlZkVycm9yID0gX3JlZjkkc3VwcHJlc3NSZWZFcnJvID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWY5JHN1cHByZXNzUmVmRXJybztcblxuICAgIHNldEdldHRlclByb3BDYWxsSW5mbygnZ2V0Q29tYm9ib3hQcm9wcycsIHN1cHByZXNzUmVmRXJyb3IsIHJlZktleSwgY29tYm9ib3hSZWYpO1xuICAgIHJldHVybiBfZXh0ZW5kcygoX2V4dGVuZHM2ID0ge30sIF9leHRlbmRzNltyZWZLZXldID0gaGFuZGxlUmVmcyhyZWYsIGZ1bmN0aW9uIChjb21ib2JveE5vZGUpIHtcbiAgICAgIGNvbWJvYm94UmVmLmN1cnJlbnQgPSBjb21ib2JveE5vZGU7XG4gICAgfSksIF9leHRlbmRzNi5yb2xlID0gJ2NvbWJvYm94JywgX2V4dGVuZHM2WydhcmlhLWhhc3BvcHVwJ10gPSAnbGlzdGJveCcsIF9leHRlbmRzNlsnYXJpYS1vd25zJ10gPSBlbGVtZW50SWRzLm1lbnVJZCwgX2V4dGVuZHM2WydhcmlhLWV4cGFuZGVkJ10gPSBsYXRlc3QuY3VycmVudC5zdGF0ZS5pc09wZW4sIF9leHRlbmRzNiksIHJlc3QpO1xuICB9LCBbbGF0ZXN0LCBzZXRHZXR0ZXJQcm9wQ2FsbEluZm8sIGVsZW1lbnRJZHNdKTsgLy8gcmV0dXJuc1xuXG4gIHZhciB0b2dnbGVNZW51ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uVG9nZ2xlTWVudVxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgdmFyIGNsb3NlTWVudSA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBGdW5jdGlvbkNsb3NlTWVudVxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgdmFyIG9wZW5NZW51ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uT3Blbk1lbnVcbiAgICB9KTtcbiAgfSwgW2Rpc3BhdGNoXSk7XG4gIHZhciBzZXRIaWdobGlnaHRlZEluZGV4ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5ld0hpZ2hsaWdodGVkSW5kZXgpIHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBGdW5jdGlvblNldEhpZ2hsaWdodGVkSW5kZXgsXG4gICAgICBoaWdobGlnaHRlZEluZGV4OiBuZXdIaWdobGlnaHRlZEluZGV4XG4gICAgfSk7XG4gIH0sIFtkaXNwYXRjaF0pO1xuICB2YXIgc2VsZWN0SXRlbSA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChuZXdTZWxlY3RlZEl0ZW0pIHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBGdW5jdGlvblNlbGVjdEl0ZW0sXG4gICAgICBzZWxlY3RlZEl0ZW06IG5ld1NlbGVjdGVkSXRlbVxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgdmFyIHNldElucHV0VmFsdWUgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3SW5wdXRWYWx1ZSkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uU2V0SW5wdXRWYWx1ZSxcbiAgICAgIGlucHV0VmFsdWU6IG5ld0lucHV0VmFsdWVcbiAgICB9KTtcbiAgfSwgW2Rpc3BhdGNoXSk7XG4gIHZhciByZXNldCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBGdW5jdGlvblJlc2V0JDFcbiAgICB9KTtcbiAgfSwgW2Rpc3BhdGNoXSk7XG4gIHJldHVybiB7XG4gICAgLy8gcHJvcCBnZXR0ZXJzLlxuICAgIGdldEl0ZW1Qcm9wczogZ2V0SXRlbVByb3BzLFxuICAgIGdldExhYmVsUHJvcHM6IGdldExhYmVsUHJvcHMsXG4gICAgZ2V0TWVudVByb3BzOiBnZXRNZW51UHJvcHMsXG4gICAgZ2V0SW5wdXRQcm9wczogZ2V0SW5wdXRQcm9wcyxcbiAgICBnZXRDb21ib2JveFByb3BzOiBnZXRDb21ib2JveFByb3BzLFxuICAgIGdldFRvZ2dsZUJ1dHRvblByb3BzOiBnZXRUb2dnbGVCdXR0b25Qcm9wcyxcbiAgICAvLyBhY3Rpb25zLlxuICAgIHRvZ2dsZU1lbnU6IHRvZ2dsZU1lbnUsXG4gICAgb3Blbk1lbnU6IG9wZW5NZW51LFxuICAgIGNsb3NlTWVudTogY2xvc2VNZW51LFxuICAgIHNldEhpZ2hsaWdodGVkSW5kZXg6IHNldEhpZ2hsaWdodGVkSW5kZXgsXG4gICAgc2V0SW5wdXRWYWx1ZTogc2V0SW5wdXRWYWx1ZSxcbiAgICBzZWxlY3RJdGVtOiBzZWxlY3RJdGVtLFxuICAgIHJlc2V0OiByZXNldCxcbiAgICAvLyBzdGF0ZS5cbiAgICBoaWdobGlnaHRlZEluZGV4OiBoaWdobGlnaHRlZEluZGV4LFxuICAgIGlzT3BlbjogaXNPcGVuLFxuICAgIHNlbGVjdGVkSXRlbTogc2VsZWN0ZWRJdGVtLFxuICAgIGlucHV0VmFsdWU6IGlucHV0VmFsdWVcbiAgfTtcbn1cblxudmFyIGRlZmF1bHRTdGF0ZVZhbHVlcyA9IHtcbiAgYWN0aXZlSW5kZXg6IC0xLFxuICBzZWxlY3RlZEl0ZW1zOiBbXVxufTtcbi8qKlxuICogUmV0dXJucyB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgYSBzdGF0ZSBrZXkgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjpcbiAqIDEuIGNvbnRyb2xsZWQgcHJvcCwgMi4gaW5pdGlhbCBwcm9wLCAzLiBkZWZhdWx0IHByb3AsIDQuIGRlZmF1bHRcbiAqIHZhbHVlIGZyb20gRG93bnNoaWZ0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wcyBwYXNzZWQgdG8gdGhlIGhvb2suXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcEtleSBQcm9wcyBrZXkgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIGZvci5cbiAqIEByZXR1cm5zIHthbnl9IFRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGF0IHByb3AuXG4gKi9cblxuZnVuY3Rpb24gZ2V0SW5pdGlhbFZhbHVlKHByb3BzLCBwcm9wS2V5KSB7XG4gIHJldHVybiBnZXRJbml0aWFsVmFsdWUkMShwcm9wcywgcHJvcEtleSwgZGVmYXVsdFN0YXRlVmFsdWVzKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBzdGF0ZSBrZXkgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjpcbiAqIDEuIGNvbnRyb2xsZWQgcHJvcCwgMi4gZGVmYXVsdCBwcm9wLCAzLiBkZWZhdWx0IHZhbHVlIGZyb20gRG93bnNoaWZ0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wcyBwYXNzZWQgdG8gdGhlIGhvb2suXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcEtleSBQcm9wcyBrZXkgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIGZvci5cbiAqIEByZXR1cm5zIHthbnl9IFRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGF0IHByb3AuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUocHJvcHMsIHByb3BLZXkpIHtcbiAgcmV0dXJuIGdldERlZmF1bHRWYWx1ZSQxKHByb3BzLCBwcm9wS2V5LCBkZWZhdWx0U3RhdGVWYWx1ZXMpO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBpbml0aWFsIHN0YXRlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwcm9wcy4gSXQgdXNlcyBpbml0aWFsLCBkZWZhdWx0XG4gKiBhbmQgY29udHJvbGxlZCBwcm9wcyByZWxhdGVkIHRvIHN0YXRlIGluIG9yZGVyIHRvIGNvbXB1dGUgdGhlIGluaXRpYWwgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BzIHBhc3NlZCB0byB0aGUgaG9vay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBpbml0aWFsIHN0YXRlLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKHByb3BzKSB7XG4gIHZhciBhY3RpdmVJbmRleCA9IGdldEluaXRpYWxWYWx1ZShwcm9wcywgJ2FjdGl2ZUluZGV4Jyk7XG4gIHZhciBzZWxlY3RlZEl0ZW1zID0gZ2V0SW5pdGlhbFZhbHVlKHByb3BzLCAnc2VsZWN0ZWRJdGVtcycpO1xuICByZXR1cm4ge1xuICAgIGFjdGl2ZUluZGV4OiBhY3RpdmVJbmRleCxcbiAgICBzZWxlY3RlZEl0ZW1zOiBzZWxlY3RlZEl0ZW1zXG4gIH07XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBkcm9wZG93biBrZXlkb3duIG9wZXJhdGlvbiBpcyBwZXJtaXR0ZWQuIFNob3VsZCBub3QgYmVcbiAqIGFsbG93ZWQgb24ga2V5ZG93biB3aXRoIG1vZGlmaWVyIGtleXMgKGN0cmwsIGFsdCwgc2hpZnQsIG1ldGEpLCBvblxuICogaW5wdXQgZWxlbWVudCB3aXRoIHRleHQgY29udGVudCB0aGF0IGlzIGVpdGhlciBoaWdobGlnaHRlZCBvciBzZWxlY3Rpb25cbiAqIGN1cnNvciBpcyBub3QgYXQgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgVGhlIGV2ZW50IGZyb20ga2V5ZG93bi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgYWxsb3dlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzS2V5RG93bk9wZXJhdGlvblBlcm1pdHRlZChldmVudCkge1xuICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LmFsdEtleSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAvLyBpZiBlbGVtZW50IGlzIGEgdGV4dCBpbnB1dFxuICBlbGVtZW50LnZhbHVlICE9PSAnJyAmJiAoZWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPT0gMCB8fCBlbGVtZW50LnNlbGVjdGlvbkVuZCAhPT0gMCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogUmV0dXJucyBhIG1lc3NhZ2UgdG8gYmUgYWRkZWQgdG8gYXJpYS1saXZlIHJlZ2lvbiB3aGVuIGl0ZW0gaXMgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZWN0aW9uUGFyYW1ldGVycyBQYXJhbWV0ZXJzIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBtZXNzYWdlLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGExMXkgbWVzc2FnZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEExMXlSZW1vdmFsTWVzc2FnZShzZWxlY3Rpb25QYXJhbWV0ZXJzKSB7XG4gIHZhciByZW1vdmVkU2VsZWN0ZWRJdGVtID0gc2VsZWN0aW9uUGFyYW1ldGVycy5yZW1vdmVkU2VsZWN0ZWRJdGVtLFxuICAgICAgaXRlbVRvU3RyaW5nTG9jYWwgPSBzZWxlY3Rpb25QYXJhbWV0ZXJzLml0ZW1Ub1N0cmluZztcbiAgcmV0dXJuIGl0ZW1Ub1N0cmluZ0xvY2FsKHJlbW92ZWRTZWxlY3RlZEl0ZW0pICsgXCIgaGFzIGJlZW4gcmVtb3ZlZC5cIjtcbn1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgc2VsZWN0ZWRJdGVtczogUHJvcFR5cGVzLmFycmF5LFxuICBpbml0aWFsU2VsZWN0ZWRJdGVtczogUHJvcFR5cGVzLmFycmF5LFxuICBkZWZhdWx0U2VsZWN0ZWRJdGVtczogUHJvcFR5cGVzLmFycmF5LFxuICBpdGVtVG9TdHJpbmc6IFByb3BUeXBlcy5mdW5jLFxuICBnZXRBMTF5UmVtb3ZhbE1lc3NhZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBzdGF0ZVJlZHVjZXI6IFByb3BUeXBlcy5mdW5jLFxuICBhY3RpdmVJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgaW5pdGlhbEFjdGl2ZUluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBkZWZhdWx0QWN0aXZlSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gIG9uQWN0aXZlSW5kZXhDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvblNlbGVjdGVkSXRlbXNDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBrZXlOYXZpZ2F0aW9uTmV4dDogUHJvcFR5cGVzLnN0cmluZyxcbiAga2V5TmF2aWdhdGlvblByZXZpb3VzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBlbnZpcm9ubWVudDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBhZGRFdmVudExpc3RlbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBkb2N1bWVudDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGdldEVsZW1lbnRCeUlkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIGFjdGl2ZUVsZW1lbnQ6IFByb3BUeXBlcy5hbnksXG4gICAgICBib2R5OiBQcm9wVHlwZXMuYW55XG4gICAgfSlcbiAgfSlcbn07XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBpdGVtVG9TdHJpbmc6IGRlZmF1bHRQcm9wcyQzLml0ZW1Ub1N0cmluZyxcbiAgc3RhdGVSZWR1Y2VyOiBkZWZhdWx0UHJvcHMkMy5zdGF0ZVJlZHVjZXIsXG4gIGVudmlyb25tZW50OiBkZWZhdWx0UHJvcHMkMy5lbnZpcm9ubWVudCxcbiAgZ2V0QTExeVJlbW92YWxNZXNzYWdlOiBnZXRBMTF5UmVtb3ZhbE1lc3NhZ2UsXG4gIGtleU5hdmlnYXRpb25OZXh0OiAnQXJyb3dSaWdodCcsXG4gIGtleU5hdmlnYXRpb25QcmV2aW91czogJ0Fycm93TGVmdCdcbn07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5cbnZhciB2YWxpZGF0ZVByb3BUeXBlcyA9IG5vb3A7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YWxpZGF0ZVByb3BUeXBlcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKG9wdGlvbnMsIGNhbGxlcikge1xuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIG9wdGlvbnMsICdwcm9wJywgY2FsbGVyLm5hbWUpO1xuICB9O1xufVxuXG52YXIgU2VsZWN0ZWRJdGVtQ2xpY2sgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19zZWxlY3RlZF9pdGVtX2NsaWNrX18nIDogMDtcbnZhciBTZWxlY3RlZEl0ZW1LZXlEb3duRGVsZXRlID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fc2VsZWN0ZWRfaXRlbV9rZXlkb3duX2RlbGV0ZV9fJyA6IDE7XG52YXIgU2VsZWN0ZWRJdGVtS2V5RG93bkJhY2tzcGFjZSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX3NlbGVjdGVkX2l0ZW1fa2V5ZG93bl9iYWNrc3BhY2VfXycgOiAyO1xudmFyIFNlbGVjdGVkSXRlbUtleURvd25OYXZpZ2F0aW9uTmV4dCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX3NlbGVjdGVkX2l0ZW1fa2V5ZG93bl9uYXZpZ2F0aW9uX25leHRfXycgOiAzO1xudmFyIFNlbGVjdGVkSXRlbUtleURvd25OYXZpZ2F0aW9uUHJldmlvdXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19zZWxlY3RlZF9pdGVtX2tleWRvd25fbmF2aWdhdGlvbl9wcmV2aW91c19fJyA6IDQ7XG52YXIgRHJvcGRvd25LZXlEb3duTmF2aWdhdGlvblByZXZpb3VzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fZHJvcGRvd25fa2V5ZG93bl9uYXZpZ2F0aW9uX3ByZXZpb3VzX18nIDogNTtcbnZhciBEcm9wZG93bktleURvd25CYWNrc3BhY2UgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19kcm9wZG93bl9rZXlkb3duX2JhY2tzcGFjZV9fJyA6IDY7XG52YXIgRHJvcGRvd25DbGljayA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2Ryb3Bkb3duX2NsaWNrX18nIDogNztcbnZhciBGdW5jdGlvbkFkZFNlbGVjdGVkSXRlbSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2Z1bmN0aW9uX2FkZF9zZWxlY3RlZF9pdGVtX18nIDogODtcbnZhciBGdW5jdGlvblJlbW92ZVNlbGVjdGVkSXRlbSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/ICdfX2Z1bmN0aW9uX3JlbW92ZV9zZWxlY3RlZF9pdGVtX18nIDogOTtcbnZhciBGdW5jdGlvblNldFNlbGVjdGVkSXRlbXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9zZXRfc2VsZWN0ZWRfaXRlbXNfXycgOiAxMDtcbnZhciBGdW5jdGlvblNldEFjdGl2ZUluZGV4ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ19fZnVuY3Rpb25fc2V0X2FjdGl2ZV9pbmRleF9fJyA6IDExO1xudmFyIEZ1bmN0aW9uUmVzZXQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyAnX19mdW5jdGlvbl9yZXNldF9fJyA6IDEyO1xuXG52YXIgc3RhdGVDaGFuZ2VUeXBlcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBTZWxlY3RlZEl0ZW1DbGljazogU2VsZWN0ZWRJdGVtQ2xpY2ssXG4gIFNlbGVjdGVkSXRlbUtleURvd25EZWxldGU6IFNlbGVjdGVkSXRlbUtleURvd25EZWxldGUsXG4gIFNlbGVjdGVkSXRlbUtleURvd25CYWNrc3BhY2U6IFNlbGVjdGVkSXRlbUtleURvd25CYWNrc3BhY2UsXG4gIFNlbGVjdGVkSXRlbUtleURvd25OYXZpZ2F0aW9uTmV4dDogU2VsZWN0ZWRJdGVtS2V5RG93bk5hdmlnYXRpb25OZXh0LFxuICBTZWxlY3RlZEl0ZW1LZXlEb3duTmF2aWdhdGlvblByZXZpb3VzOiBTZWxlY3RlZEl0ZW1LZXlEb3duTmF2aWdhdGlvblByZXZpb3VzLFxuICBEcm9wZG93bktleURvd25OYXZpZ2F0aW9uUHJldmlvdXM6IERyb3Bkb3duS2V5RG93bk5hdmlnYXRpb25QcmV2aW91cyxcbiAgRHJvcGRvd25LZXlEb3duQmFja3NwYWNlOiBEcm9wZG93bktleURvd25CYWNrc3BhY2UsXG4gIERyb3Bkb3duQ2xpY2s6IERyb3Bkb3duQ2xpY2ssXG4gIEZ1bmN0aW9uQWRkU2VsZWN0ZWRJdGVtOiBGdW5jdGlvbkFkZFNlbGVjdGVkSXRlbSxcbiAgRnVuY3Rpb25SZW1vdmVTZWxlY3RlZEl0ZW06IEZ1bmN0aW9uUmVtb3ZlU2VsZWN0ZWRJdGVtLFxuICBGdW5jdGlvblNldFNlbGVjdGVkSXRlbXM6IEZ1bmN0aW9uU2V0U2VsZWN0ZWRJdGVtcyxcbiAgRnVuY3Rpb25TZXRBY3RpdmVJbmRleDogRnVuY3Rpb25TZXRBY3RpdmVJbmRleCxcbiAgRnVuY3Rpb25SZXNldDogRnVuY3Rpb25SZXNldFxufSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cblxuZnVuY3Rpb24gZG93bnNoaWZ0TXVsdGlwbGVTZWxlY3Rpb25SZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgdmFyIHR5cGUgPSBhY3Rpb24udHlwZSxcbiAgICAgIGluZGV4ID0gYWN0aW9uLmluZGV4LFxuICAgICAgcHJvcHMgPSBhY3Rpb24ucHJvcHMsXG4gICAgICBzZWxlY3RlZEl0ZW0gPSBhY3Rpb24uc2VsZWN0ZWRJdGVtO1xuICB2YXIgYWN0aXZlSW5kZXggPSBzdGF0ZS5hY3RpdmVJbmRleCxcbiAgICAgIHNlbGVjdGVkSXRlbXMgPSBzdGF0ZS5zZWxlY3RlZEl0ZW1zO1xuICB2YXIgY2hhbmdlcztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFNlbGVjdGVkSXRlbUNsaWNrOlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgYWN0aXZlSW5kZXg6IGluZGV4XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFNlbGVjdGVkSXRlbUtleURvd25OYXZpZ2F0aW9uUHJldmlvdXM6XG4gICAgICBjaGFuZ2VzID0ge1xuICAgICAgICBhY3RpdmVJbmRleDogYWN0aXZlSW5kZXggLSAxIDwgMCA/IDAgOiBhY3RpdmVJbmRleCAtIDFcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU2VsZWN0ZWRJdGVtS2V5RG93bk5hdmlnYXRpb25OZXh0OlxuICAgICAgY2hhbmdlcyA9IHtcbiAgICAgICAgYWN0aXZlSW5kZXg6IGFjdGl2ZUluZGV4ICsgMSA+PSBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA/IC0xIDogYWN0aXZlSW5kZXggKyAxXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFNlbGVjdGVkSXRlbUtleURvd25CYWNrc3BhY2U6XG4gICAgY2FzZSBTZWxlY3RlZEl0ZW1LZXlEb3duRGVsZXRlOlxuICAgICAge1xuICAgICAgICB2YXIgbmV3QWN0aXZlSW5kZXggPSBhY3RpdmVJbmRleDtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBuZXdBY3RpdmVJbmRleCA9IC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUluZGV4ID09PSBzZWxlY3RlZEl0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBuZXdBY3RpdmVJbmRleCA9IHNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoYW5nZXMgPSBfZXh0ZW5kcyh7XG4gICAgICAgICAgc2VsZWN0ZWRJdGVtczogW10uY29uY2F0KHNlbGVjdGVkSXRlbXMuc2xpY2UoMCwgYWN0aXZlSW5kZXgpLCBzZWxlY3RlZEl0ZW1zLnNsaWNlKGFjdGl2ZUluZGV4ICsgMSkpXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBhY3RpdmVJbmRleDogbmV3QWN0aXZlSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBEcm9wZG93bktleURvd25OYXZpZ2F0aW9uUHJldmlvdXM6XG4gICAgICBjaGFuZ2VzID0ge1xuICAgICAgICBhY3RpdmVJbmRleDogc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERyb3Bkb3duS2V5RG93bkJhY2tzcGFjZTpcbiAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbXM6IHNlbGVjdGVkSXRlbXMuc2xpY2UoMCwgc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBGdW5jdGlvbkFkZFNlbGVjdGVkSXRlbTpcbiAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbXM6IFtdLmNvbmNhdChzZWxlY3RlZEl0ZW1zLCBbc2VsZWN0ZWRJdGVtXSlcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRHJvcGRvd25DbGljazpcbiAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgIGFjdGl2ZUluZGV4OiAtMVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBGdW5jdGlvblJlbW92ZVNlbGVjdGVkSXRlbTpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9uZXdBY3RpdmVJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgICAgICB2YXIgc2VsZWN0ZWRJdGVtSW5kZXggPSBzZWxlY3RlZEl0ZW1zLmluZGV4T2Yoc2VsZWN0ZWRJdGVtKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBfbmV3QWN0aXZlSW5kZXggPSAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEl0ZW1JbmRleCA9PT0gc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgX25ld0FjdGl2ZUluZGV4ID0gc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAyO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhbmdlcyA9IF9leHRlbmRzKHtcbiAgICAgICAgICBzZWxlY3RlZEl0ZW1zOiBbXS5jb25jYXQoc2VsZWN0ZWRJdGVtcy5zbGljZSgwLCBzZWxlY3RlZEl0ZW1JbmRleCksIHNlbGVjdGVkSXRlbXMuc2xpY2Uoc2VsZWN0ZWRJdGVtSW5kZXggKyAxKSlcbiAgICAgICAgfSwge1xuICAgICAgICAgIGFjdGl2ZUluZGV4OiBfbmV3QWN0aXZlSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvblNldFNlbGVjdGVkSXRlbXM6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdTZWxlY3RlZEl0ZW1zID0gYWN0aW9uLnNlbGVjdGVkSXRlbXM7XG4gICAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgICAgc2VsZWN0ZWRJdGVtczogbmV3U2VsZWN0ZWRJdGVtc1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25TZXRBY3RpdmVJbmRleDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9uZXdBY3RpdmVJbmRleDIgPSBhY3Rpb24uYWN0aXZlSW5kZXg7XG4gICAgICAgIGNoYW5nZXMgPSB7XG4gICAgICAgICAgYWN0aXZlSW5kZXg6IF9uZXdBY3RpdmVJbmRleDJcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uUmVzZXQ6XG4gICAgICBjaGFuZ2VzID0ge1xuICAgICAgICBhY3RpdmVJbmRleDogZ2V0RGVmYXVsdFZhbHVlKHByb3BzLCAnYWN0aXZlSW5kZXgnKSxcbiAgICAgICAgc2VsZWN0ZWRJdGVtczogZ2V0RGVmYXVsdFZhbHVlKHByb3BzLCAnc2VsZWN0ZWRJdGVtcycpXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIGNhbGxlZCB3aXRob3V0IHByb3BlciBhY3Rpb24gdHlwZS4nKTtcbiAgfVxuXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIGNoYW5nZXMpO1xufVxuXG52YXIgX2V4Y2x1ZGVkID0gW1wicmVmS2V5XCIsIFwicmVmXCIsIFwib25DbGlja1wiLCBcIm9uS2V5RG93blwiLCBcInNlbGVjdGVkSXRlbVwiLCBcImluZGV4XCJdLFxuICAgIF9leGNsdWRlZDIgPSBbXCJyZWZLZXlcIiwgXCJyZWZcIiwgXCJvbktleURvd25cIiwgXCJvbkNsaWNrXCIsIFwicHJldmVudEtleUFjdGlvblwiXTtcbnVzZU11bHRpcGxlU2VsZWN0aW9uLnN0YXRlQ2hhbmdlVHlwZXMgPSBzdGF0ZUNoYW5nZVR5cGVzO1xuXG5mdW5jdGlvbiB1c2VNdWx0aXBsZVNlbGVjdGlvbih1c2VyUHJvcHMpIHtcbiAgaWYgKHVzZXJQcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgdXNlclByb3BzID0ge307XG4gIH1cblxuICB2YWxpZGF0ZVByb3BUeXBlcyh1c2VyUHJvcHMsIHVzZU11bHRpcGxlU2VsZWN0aW9uKTsgLy8gUHJvcHMgZGVmYXVsdHMgYW5kIGRlc3RydWN0dXJpbmcuXG5cbiAgdmFyIHByb3BzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRQcm9wcywgdXNlclByb3BzKTtcblxuICB2YXIgZ2V0QTExeVJlbW92YWxNZXNzYWdlID0gcHJvcHMuZ2V0QTExeVJlbW92YWxNZXNzYWdlLFxuICAgICAgaXRlbVRvU3RyaW5nID0gcHJvcHMuaXRlbVRvU3RyaW5nLFxuICAgICAgZW52aXJvbm1lbnQgPSBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgIGtleU5hdmlnYXRpb25OZXh0ID0gcHJvcHMua2V5TmF2aWdhdGlvbk5leHQsXG4gICAgICBrZXlOYXZpZ2F0aW9uUHJldmlvdXMgPSBwcm9wcy5rZXlOYXZpZ2F0aW9uUHJldmlvdXM7IC8vIFJlZHVjZXIgaW5pdC5cblxuICB2YXIgX3VzZUNvbnRyb2xsZWRSZWR1Y2VyID0gdXNlQ29udHJvbGxlZFJlZHVjZXIkMShkb3duc2hpZnRNdWx0aXBsZVNlbGVjdGlvblJlZHVjZXIsIGdldEluaXRpYWxTdGF0ZShwcm9wcyksIHByb3BzKSxcbiAgICAgIHN0YXRlID0gX3VzZUNvbnRyb2xsZWRSZWR1Y2VyWzBdLFxuICAgICAgZGlzcGF0Y2ggPSBfdXNlQ29udHJvbGxlZFJlZHVjZXJbMV07XG5cbiAgdmFyIGFjdGl2ZUluZGV4ID0gc3RhdGUuYWN0aXZlSW5kZXgsXG4gICAgICBzZWxlY3RlZEl0ZW1zID0gc3RhdGUuc2VsZWN0ZWRJdGVtczsgLy8gUmVmcy5cblxuICB2YXIgaXNJbml0aWFsTW91bnRSZWYgPSB1c2VSZWYodHJ1ZSk7XG4gIHZhciBkcm9wZG93blJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHByZXZpb3VzU2VsZWN0ZWRJdGVtc1JlZiA9IHVzZVJlZihzZWxlY3RlZEl0ZW1zKTtcbiAgdmFyIHNlbGVjdGVkSXRlbVJlZnMgPSB1c2VSZWYoKTtcbiAgc2VsZWN0ZWRJdGVtUmVmcy5jdXJyZW50ID0gW107XG4gIHZhciBsYXRlc3QgPSB1c2VMYXRlc3RSZWYoe1xuICAgIHN0YXRlOiBzdGF0ZSxcbiAgICBwcm9wczogcHJvcHNcbiAgfSk7IC8vIEVmZmVjdHMuXG5cbiAgLyogU2V0cyBhMTF5IHN0YXR1cyBtZXNzYWdlIG9uIGNoYW5nZXMgaW4gc2VsZWN0ZWRJdGVtLiAqL1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzSW5pdGlhbE1vdW50UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPCBwcmV2aW91c1NlbGVjdGVkSXRlbXNSZWYuY3VycmVudC5sZW5ndGgpIHtcbiAgICAgIHZhciByZW1vdmVkU2VsZWN0ZWRJdGVtID0gcHJldmlvdXNTZWxlY3RlZEl0ZW1zUmVmLmN1cnJlbnQuZmluZChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGl0ZW0pIDwgMDtcbiAgICAgIH0pO1xuICAgICAgc2V0U3RhdHVzKGdldEExMXlSZW1vdmFsTWVzc2FnZSh7XG4gICAgICAgIGl0ZW1Ub1N0cmluZzogaXRlbVRvU3RyaW5nLFxuICAgICAgICByZXN1bHRDb3VudDogc2VsZWN0ZWRJdGVtcy5sZW5ndGgsXG4gICAgICAgIHJlbW92ZWRTZWxlY3RlZEl0ZW06IHJlbW92ZWRTZWxlY3RlZEl0ZW0sXG4gICAgICAgIGFjdGl2ZUluZGV4OiBhY3RpdmVJbmRleCxcbiAgICAgICAgYWN0aXZlU2VsZWN0ZWRJdGVtOiBzZWxlY3RlZEl0ZW1zW2FjdGl2ZUluZGV4XVxuICAgICAgfSksIGVudmlyb25tZW50LmRvY3VtZW50KTtcbiAgICB9XG5cbiAgICBwcmV2aW91c1NlbGVjdGVkSXRlbXNSZWYuY3VycmVudCA9IHNlbGVjdGVkSXRlbXM7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW3NlbGVjdGVkSXRlbXMubGVuZ3RoXSk7IC8vIFNldHMgZm9jdXMgb24gYWN0aXZlIGl0ZW0uXG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNJbml0aWFsTW91bnRSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gLTEgJiYgZHJvcGRvd25SZWYuY3VycmVudCkge1xuICAgICAgZHJvcGRvd25SZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRJdGVtUmVmcy5jdXJyZW50W2FjdGl2ZUluZGV4XSkge1xuICAgICAgc2VsZWN0ZWRJdGVtUmVmcy5jdXJyZW50W2FjdGl2ZUluZGV4XS5mb2N1cygpO1xuICAgIH1cbiAgfSwgW2FjdGl2ZUluZGV4XSk7XG4gIHVzZUNvbnRyb2xQcm9wc1ZhbGlkYXRvcih7XG4gICAgaXNJbml0aWFsTW91bnQ6IGlzSW5pdGlhbE1vdW50UmVmLmN1cnJlbnQsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIHN0YXRlOiBzdGF0ZVxuICB9KTtcbiAgdmFyIHNldEdldHRlclByb3BDYWxsSW5mbyA9IHVzZUdldHRlclByb3BzQ2FsbGVkQ2hlY2tlcignZ2V0RHJvcGRvd25Qcm9wcycpOyAvLyBNYWtlIGluaXRpYWwgcmVmIGZhbHNlLlxuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaXNJbml0aWFsTW91bnRSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9LCBbXSk7IC8vIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zLlxuXG4gIHZhciBzZWxlY3RlZEl0ZW1LZXlEb3duSGFuZGxlcnMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHJldHVybiBfcmVmID0ge30sIF9yZWZba2V5TmF2aWdhdGlvblByZXZpb3VzXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogU2VsZWN0ZWRJdGVtS2V5RG93bk5hdmlnYXRpb25QcmV2aW91c1xuICAgICAgfSk7XG4gICAgfSwgX3JlZltrZXlOYXZpZ2F0aW9uTmV4dF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFNlbGVjdGVkSXRlbUtleURvd25OYXZpZ2F0aW9uTmV4dFxuICAgICAgfSk7XG4gICAgfSwgX3JlZi5EZWxldGUgPSBmdW5jdGlvbiBEZWxldGUoKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFNlbGVjdGVkSXRlbUtleURvd25EZWxldGVcbiAgICAgIH0pO1xuICAgIH0sIF9yZWYuQmFja3NwYWNlID0gZnVuY3Rpb24gQmFja3NwYWNlKCkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBTZWxlY3RlZEl0ZW1LZXlEb3duQmFja3NwYWNlXG4gICAgICB9KTtcbiAgICB9LCBfcmVmO1xuICB9LCBbZGlzcGF0Y2gsIGtleU5hdmlnYXRpb25OZXh0LCBrZXlOYXZpZ2F0aW9uUHJldmlvdXNdKTtcbiAgdmFyIGRyb3Bkb3duS2V5RG93bkhhbmRsZXJzID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYyO1xuXG4gICAgcmV0dXJuIF9yZWYyID0ge30sIF9yZWYyW2tleU5hdmlnYXRpb25QcmV2aW91c10gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChpc0tleURvd25PcGVyYXRpb25QZXJtaXR0ZWQoZXZlbnQpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBEcm9wZG93bktleURvd25OYXZpZ2F0aW9uUHJldmlvdXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgX3JlZjIuQmFja3NwYWNlID0gZnVuY3Rpb24gQmFja3NwYWNlKGV2ZW50KSB7XG4gICAgICBpZiAoaXNLZXlEb3duT3BlcmF0aW9uUGVybWl0dGVkKGV2ZW50KSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogRHJvcGRvd25LZXlEb3duQmFja3NwYWNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIF9yZWYyO1xuICB9LCBbZGlzcGF0Y2gsIGtleU5hdmlnYXRpb25QcmV2aW91c10pOyAvLyBHZXR0ZXIgcHJvcHMuXG5cbiAgdmFyIGdldFNlbGVjdGVkSXRlbVByb3BzID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKF90ZW1wKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcmVmMyA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBfcmVmMyRyZWZLZXkgPSBfcmVmMy5yZWZLZXksXG4gICAgICAgIHJlZktleSA9IF9yZWYzJHJlZktleSA9PT0gdm9pZCAwID8gJ3JlZicgOiBfcmVmMyRyZWZLZXksXG4gICAgICAgIHJlZiA9IF9yZWYzLnJlZixcbiAgICAgICAgb25DbGljayA9IF9yZWYzLm9uQ2xpY2ssXG4gICAgICAgIG9uS2V5RG93biA9IF9yZWYzLm9uS2V5RG93bixcbiAgICAgICAgc2VsZWN0ZWRJdGVtID0gX3JlZjMuc2VsZWN0ZWRJdGVtLFxuICAgICAgICBpbmRleCA9IF9yZWYzLmluZGV4LFxuICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZjMsIF9leGNsdWRlZCk7XG5cbiAgICB2YXIgbGF0ZXN0U3RhdGUgPSBsYXRlc3QuY3VycmVudC5zdGF0ZTtcbiAgICB2YXIgaXRlbUluZGV4ID0gZ2V0SXRlbUluZGV4KGluZGV4LCBzZWxlY3RlZEl0ZW0sIGxhdGVzdFN0YXRlLnNlbGVjdGVkSXRlbXMpO1xuXG4gICAgaWYgKGl0ZW1JbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFzcyBlaXRoZXIgc2VsZWN0ZWRJdGVtIG9yIGluZGV4IGluIGdldFNlbGVjdGVkSXRlbVByb3BzIScpO1xuICAgIH1cblxuICAgIHZhciBzZWxlY3RlZEl0ZW1IYW5kbGVDbGljayA9IGZ1bmN0aW9uIHNlbGVjdGVkSXRlbUhhbmRsZUNsaWNrKCkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBTZWxlY3RlZEl0ZW1DbGljayxcbiAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIHNlbGVjdGVkSXRlbUhhbmRsZUtleURvd24gPSBmdW5jdGlvbiBzZWxlY3RlZEl0ZW1IYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgICB2YXIga2V5ID0gbm9ybWFsaXplQXJyb3dLZXkoZXZlbnQpO1xuXG4gICAgICBpZiAoa2V5ICYmIHNlbGVjdGVkSXRlbUtleURvd25IYW5kbGVyc1trZXldKSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbUtleURvd25IYW5kbGVyc1trZXldKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRzKChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW3JlZktleV0gPSBoYW5kbGVSZWZzKHJlZiwgZnVuY3Rpb24gKHNlbGVjdGVkSXRlbU5vZGUpIHtcbiAgICAgIGlmIChzZWxlY3RlZEl0ZW1Ob2RlKSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbVJlZnMuY3VycmVudC5wdXNoKHNlbGVjdGVkSXRlbU5vZGUpO1xuICAgICAgfVxuICAgIH0pLCBfZXh0ZW5kczIudGFiSW5kZXggPSBpbmRleCA9PT0gbGF0ZXN0U3RhdGUuYWN0aXZlSW5kZXggPyAwIDogLTEsIF9leHRlbmRzMi5vbkNsaWNrID0gY2FsbEFsbEV2ZW50SGFuZGxlcnMob25DbGljaywgc2VsZWN0ZWRJdGVtSGFuZGxlQ2xpY2spLCBfZXh0ZW5kczIub25LZXlEb3duID0gY2FsbEFsbEV2ZW50SGFuZGxlcnMob25LZXlEb3duLCBzZWxlY3RlZEl0ZW1IYW5kbGVLZXlEb3duKSwgX2V4dGVuZHMyKSwgcmVzdCk7XG4gIH0sIFtkaXNwYXRjaCwgbGF0ZXN0LCBzZWxlY3RlZEl0ZW1LZXlEb3duSGFuZGxlcnNdKTtcbiAgdmFyIGdldERyb3Bkb3duUHJvcHMgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoX3RlbXAyLCBfdGVtcDMpIHtcbiAgICB2YXIgX2V4dGVuZHMzO1xuXG4gICAgdmFyIF9yZWY0ID0gX3RlbXAyID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMixcbiAgICAgICAgX3JlZjQkcmVmS2V5ID0gX3JlZjQucmVmS2V5LFxuICAgICAgICByZWZLZXkgPSBfcmVmNCRyZWZLZXkgPT09IHZvaWQgMCA/ICdyZWYnIDogX3JlZjQkcmVmS2V5LFxuICAgICAgICByZWYgPSBfcmVmNC5yZWYsXG4gICAgICAgIG9uS2V5RG93biA9IF9yZWY0Lm9uS2V5RG93bixcbiAgICAgICAgb25DbGljayA9IF9yZWY0Lm9uQ2xpY2ssXG4gICAgICAgIF9yZWY0JHByZXZlbnRLZXlBY3RpbyA9IF9yZWY0LnByZXZlbnRLZXlBY3Rpb24sXG4gICAgICAgIHByZXZlbnRLZXlBY3Rpb24gPSBfcmVmNCRwcmV2ZW50S2V5QWN0aW8gPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjQkcHJldmVudEtleUFjdGlvLFxuICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZjQsIF9leGNsdWRlZDIpO1xuXG4gICAgdmFyIF9yZWY1ID0gX3RlbXAzID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMyxcbiAgICAgICAgX3JlZjUkc3VwcHJlc3NSZWZFcnJvID0gX3JlZjUuc3VwcHJlc3NSZWZFcnJvcixcbiAgICAgICAgc3VwcHJlc3NSZWZFcnJvciA9IF9yZWY1JHN1cHByZXNzUmVmRXJybyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNSRzdXBwcmVzc1JlZkVycm87XG5cbiAgICBzZXRHZXR0ZXJQcm9wQ2FsbEluZm8oJ2dldERyb3Bkb3duUHJvcHMnLCBzdXBwcmVzc1JlZkVycm9yLCByZWZLZXksIGRyb3Bkb3duUmVmKTtcblxuICAgIHZhciBkcm9wZG93bkhhbmRsZUtleURvd24gPSBmdW5jdGlvbiBkcm9wZG93bkhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICAgIHZhciBrZXkgPSBub3JtYWxpemVBcnJvd0tleShldmVudCk7XG5cbiAgICAgIGlmIChrZXkgJiYgZHJvcGRvd25LZXlEb3duSGFuZGxlcnNba2V5XSkge1xuICAgICAgICBkcm9wZG93bktleURvd25IYW5kbGVyc1trZXldKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGRyb3Bkb3duSGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBkcm9wZG93bkhhbmRsZUNsaWNrKCkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBEcm9wZG93bkNsaWNrXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRzKChfZXh0ZW5kczMgPSB7fSwgX2V4dGVuZHMzW3JlZktleV0gPSBoYW5kbGVSZWZzKHJlZiwgZnVuY3Rpb24gKGRyb3Bkb3duTm9kZSkge1xuICAgICAgaWYgKGRyb3Bkb3duTm9kZSkge1xuICAgICAgICBkcm9wZG93blJlZi5jdXJyZW50ID0gZHJvcGRvd25Ob2RlO1xuICAgICAgfVxuICAgIH0pLCBfZXh0ZW5kczMpLCAhcHJldmVudEtleUFjdGlvbiAmJiB7XG4gICAgICBvbktleURvd246IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uS2V5RG93biwgZHJvcGRvd25IYW5kbGVLZXlEb3duKSxcbiAgICAgIG9uQ2xpY2s6IGNhbGxBbGxFdmVudEhhbmRsZXJzKG9uQ2xpY2ssIGRyb3Bkb3duSGFuZGxlQ2xpY2spXG4gICAgfSwgcmVzdCk7XG4gIH0sIFtkaXNwYXRjaCwgZHJvcGRvd25LZXlEb3duSGFuZGxlcnMsIHNldEdldHRlclByb3BDYWxsSW5mb10pOyAvLyByZXR1cm5zXG5cbiAgdmFyIGFkZFNlbGVjdGVkSXRlbSA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChzZWxlY3RlZEl0ZW0pIHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBGdW5jdGlvbkFkZFNlbGVjdGVkSXRlbSxcbiAgICAgIHNlbGVjdGVkSXRlbTogc2VsZWN0ZWRJdGVtXG4gICAgfSk7XG4gIH0sIFtkaXNwYXRjaF0pO1xuICB2YXIgcmVtb3ZlU2VsZWN0ZWRJdGVtID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKHNlbGVjdGVkSXRlbSkge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uUmVtb3ZlU2VsZWN0ZWRJdGVtLFxuICAgICAgc2VsZWN0ZWRJdGVtOiBzZWxlY3RlZEl0ZW1cbiAgICB9KTtcbiAgfSwgW2Rpc3BhdGNoXSk7XG4gIHZhciBzZXRTZWxlY3RlZEl0ZW1zID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5ld1NlbGVjdGVkSXRlbXMpIHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBGdW5jdGlvblNldFNlbGVjdGVkSXRlbXMsXG4gICAgICBzZWxlY3RlZEl0ZW1zOiBuZXdTZWxlY3RlZEl0ZW1zXG4gICAgfSk7XG4gIH0sIFtkaXNwYXRjaF0pO1xuICB2YXIgc2V0QWN0aXZlSW5kZXggPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3QWN0aXZlSW5kZXgpIHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBGdW5jdGlvblNldEFjdGl2ZUluZGV4LFxuICAgICAgYWN0aXZlSW5kZXg6IG5ld0FjdGl2ZUluZGV4XG4gICAgfSk7XG4gIH0sIFtkaXNwYXRjaF0pO1xuICB2YXIgcmVzZXQgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogRnVuY3Rpb25SZXNldFxuICAgIH0pO1xuICB9LCBbZGlzcGF0Y2hdKTtcbiAgcmV0dXJuIHtcbiAgICBnZXRTZWxlY3RlZEl0ZW1Qcm9wczogZ2V0U2VsZWN0ZWRJdGVtUHJvcHMsXG4gICAgZ2V0RHJvcGRvd25Qcm9wczogZ2V0RHJvcGRvd25Qcm9wcyxcbiAgICBhZGRTZWxlY3RlZEl0ZW06IGFkZFNlbGVjdGVkSXRlbSxcbiAgICByZW1vdmVTZWxlY3RlZEl0ZW06IHJlbW92ZVNlbGVjdGVkSXRlbSxcbiAgICBzZXRTZWxlY3RlZEl0ZW1zOiBzZXRTZWxlY3RlZEl0ZW1zLFxuICAgIHNldEFjdGl2ZUluZGV4OiBzZXRBY3RpdmVJbmRleCxcbiAgICByZXNldDogcmVzZXQsXG4gICAgc2VsZWN0ZWRJdGVtczogc2VsZWN0ZWRJdGVtcyxcbiAgICBhY3RpdmVJbmRleDogYWN0aXZlSW5kZXhcbiAgfTtcbn1cblxuZXhwb3J0IHsgRG93bnNoaWZ0JDEgYXMgZGVmYXVsdCwgcmVzZXRJZENvdW50ZXIsIHVzZUNvbWJvYm94LCB1c2VNdWx0aXBsZVNlbGVjdGlvbiwgdXNlU2VsZWN0IH07XG4iLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlUG9ydGFsLCB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VSZWYsIGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgRnJhZ21lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgbWF5YmVUcmFuc2Zvcm1Vbm9yZGVyZWRDaG9pY2VzIH0gZnJvbSAnLi4vaGVscGVycy9wYXJzZS1jaG9pY2VzLmpzJztcbmltcG9ydCBEb3duc2hpZnQgZnJvbSAnZG93bnNoaWZ0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmltcG9ydCB1c2VQb3BvdmVyTWFrZXIgZnJvbSAnLi4vaGVscGVycy91c2VQb3BvdmVyTWFrZXInO1xuXG5jb25zdCBTZWxlY3QgPSBfcmVmID0+IHtcbiAgdmFyIF9tYXliZVNlbGVjdGVkSXRlbTtcblxuICBsZXQge1xuICAgIHZhbHVlLFxuICAgIG9wdGlvbixcbiAgICBvcHRpb246IHtcbiAgICAgIGNob2ljZXMsXG4gICAgICB0YWJsZXRDaG9pY2VzLFxuICAgICAgbW9iaWxlQ2hvaWNlcyxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgc2VhcmNoUGxhY2Vob2xkZXIsXG4gICAgICBkZWZhdWx0VG9GaXJzdEl0ZW0gPSB0cnVlLFxuICAgICAgc2VhcmNoID0gZmFsc2UsXG4gICAgICBpbnB1dENsYXNzTmFtZSA9ICcnLFxuICAgICAgc2VsZWN0SW5wdXRTdGFydCxcbiAgICAgIGFwcGVuZFRvQm9keSA9IGZhbHNlXG4gICAgfSxcbiAgICBvbklucHV0VmFsdWVDaGFuZ2UgPSAoKSA9PiB7fSxcbiAgICByZW5kZXJJdGVtRm9yID0gaXRlbSA9PiBpdGVtLnZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICAgIGRldmljZSA9ICdkZXNrdG9wJ1xuICB9ID0gX3JlZjtcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IFt0ZW1wU3RhdGUsIHNldFRlbXBTdGF0ZV0gPSB1c2VTdGF0ZShudWxsKTtcbiAgbGV0IGRldmljZUNob2ljZXMgPSBjaG9pY2VzO1xuXG4gIGlmIChkZXZpY2UgPT09ICd0YWJsZXQnICYmIHRhYmxldENob2ljZXMpIHtcbiAgICBkZXZpY2VDaG9pY2VzID0gdGFibGV0Q2hvaWNlcztcbiAgfVxuXG4gIGlmIChkZXZpY2UgPT09ICdtb2JpbGUnICYmIG1vYmlsZUNob2ljZXMpIHtcbiAgICBkZXZpY2VDaG9pY2VzID0gbW9iaWxlQ2hvaWNlcztcbiAgfVxuXG4gIGNvbnN0IG9yZGVyZWRDaG9pY2VzID0gbWF5YmVUcmFuc2Zvcm1Vbm9yZGVyZWRDaG9pY2VzKGRldmljZUNob2ljZXMpO1xuICBsZXQgcG90ZW50aWFsVmFsdWUgPSB2YWx1ZSB8fCAhZGVmYXVsdFRvRmlyc3RJdGVtID8gdmFsdWUgOiBwYXJzZUludCh2YWx1ZSwgMTApID09PSAwID8gdmFsdWUgOiAob3JkZXJlZENob2ljZXNbMF0gfHwge30pLmtleTtcbiAgY29uc3Qge1xuICAgIHN0eWxlcyxcbiAgICBwb3BvdmVyUHJvcHNcbiAgfSA9IHVzZVBvcG92ZXJNYWtlcih7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBkZWZhdWx0SGVpZ2h0OiAyMjgsXG4gICAgc2hvdWxkQ2FsY3VsYXRlOiBhcHBlbmRUb0JvZHlcbiAgfSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFhcHBlbmRUb0JvZHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldFRlbXBTdGF0ZShNYXRoLnJvdW5kKCkpO1xuICAgIH0sIDUwKTtcbiAgfSwgW10pO1xuICBsZXQgbWF5YmVTZWxlY3RlZEl0ZW0gPSBvcmRlcmVkQ2hvaWNlcy5maW5kKF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAga2V5XG4gICAgfSA9IF9yZWYyO1xuICAgIHJldHVybiBrZXkgPT09IHBvdGVudGlhbFZhbHVlO1xuICB9KTtcblxuICBpZiAoIW1heWJlU2VsZWN0ZWRJdGVtKSB7XG4gICAgbWF5YmVTZWxlY3RlZEl0ZW0gPSBvcmRlcmVkQ2hvaWNlcy5maW5kKF9yZWYzID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGtleVxuICAgICAgfSA9IF9yZWYzO1xuICAgICAgcmV0dXJuIHBhcnNlSW50KGtleSkgPT09IHBhcnNlSW50KHBvdGVudGlhbFZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KERvd25zaGlmdCwge1xuICAgIGtleTogKChfbWF5YmVTZWxlY3RlZEl0ZW0gPSBtYXliZVNlbGVjdGVkSXRlbSkgPT09IG51bGwgfHwgX21heWJlU2VsZWN0ZWRJdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWF5YmVTZWxlY3RlZEl0ZW0ua2V5KSB8fCAnZG93bnNoaWZ0JyxcbiAgICBvbklucHV0VmFsdWVDaGFuZ2U6IHZhbHVlID0+IHtcbiAgICAgIG9uSW5wdXRWYWx1ZUNoYW5nZSh2YWx1ZSk7XG4gICAgfSxcbiAgICBzZWxlY3RlZEl0ZW06IG1heWJlU2VsZWN0ZWRJdGVtIHx8ICFkZWZhdWx0VG9GaXJzdEl0ZW0gPyBwb3RlbnRpYWxWYWx1ZSA6IChvcmRlcmVkQ2hvaWNlc1swXSB8fCB7fSkua2V5LFxuICAgIG9uQ2hhbmdlOiBzZWxlY3Rpb24gPT4ge1xuICAgICAgb25DaGFuZ2Uoc2VsZWN0aW9uKTtcbiAgICB9LFxuICAgIGl0ZW1Ub1N0cmluZzogaXRlbSA9PiB7XG4gICAgICBsZXQgbWF5YmVTZWxlY3RlZEl0ZW0gPSBvcmRlcmVkQ2hvaWNlcy5maW5kKF9yZWY0ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBrZXlcbiAgICAgICAgfSA9IF9yZWY0O1xuICAgICAgICByZXR1cm4ga2V5ID09PSBpdGVtO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghbWF5YmVTZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgbWF5YmVTZWxlY3RlZEl0ZW0gPSBvcmRlcmVkQ2hvaWNlcy5maW5kKF9yZWY1ID0+IHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAga2V5XG4gICAgICAgICAgfSA9IF9yZWY1O1xuICAgICAgICAgIHJldHVybiBwYXJzZUludChrZXkpID09PSBwYXJzZUludChpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtICYmIG1heWJlU2VsZWN0ZWRJdGVtID8gbWF5YmVTZWxlY3RlZEl0ZW0udmFsdWUgOiAnJztcbiAgICB9XG4gIH0sIF9yZWY2ID0+IHtcbiAgICBsZXQge1xuICAgICAgZ2V0SW5wdXRQcm9wcyxcbiAgICAgIGdldEl0ZW1Qcm9wcyxcbiAgICAgIGdldExhYmVsUHJvcHMsXG4gICAgICBnZXRNZW51UHJvcHMsXG4gICAgICBpc09wZW4sXG4gICAgICBpbnB1dFZhbHVlLFxuICAgICAgaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICAgIHNlbGVjdGVkSXRlbSxcbiAgICAgIG9wZW5NZW51LFxuICAgICAgdG9nZ2xlTWVudSxcbiAgICAgIHNldFN0YXRlXG4gICAgfSA9IF9yZWY2O1xuICAgIGxldCBkcm9wZG93biA9IG51bGw7XG5cbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICBkcm9wZG93biA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGdldE1lbnVQcm9wcyhfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC1zZWxlY3QtZHJvcGRvd24nLCB7XG4gICAgICAgICAgJ2N0LWZpeGVkJzogYXBwZW5kVG9Cb2R5XG4gICAgICAgIH0pXG4gICAgICB9LCBhcHBlbmRUb0JvZHkgPyBwb3BvdmVyUHJvcHMgOiB7fSkpLCB7XG4gICAgICAgIHN0eWxlOiBhcHBlbmRUb0JvZHkgPyBzdHlsZXMgOiB7fVxuICAgICAgfSksIG9yZGVyZWRDaG9pY2VzLmZpbHRlcihpdGVtID0+ICFpbnB1dFZhbHVlIHx8IG9yZGVyZWRDaG9pY2VzLmZpbmQoX3JlZjcgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGtleVxuICAgICAgICB9ID0gX3JlZjc7XG4gICAgICAgIHJldHVybiBrZXkudG9TdHJpbmcoKSA9PT0gc2VsZWN0ZWRJdGVtLnRvU3RyaW5nKCk7XG4gICAgICB9KSAmJiBvcmRlcmVkQ2hvaWNlcy5maW5kKF9yZWY4ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBrZXlcbiAgICAgICAgfSA9IF9yZWY4O1xuICAgICAgICByZXR1cm4ga2V5LnRvU3RyaW5nKCkgPT09IHNlbGVjdGVkSXRlbS50b1N0cmluZygpO1xuICAgICAgfSkudmFsdWUgPT09IGlucHV0VmFsdWUgfHwgaXRlbS52YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGlucHV0VmFsdWUudG9Mb3dlckNhc2UoKSkgfHwgaXRlbS5rZXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGlucHV0VmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSkubWFwKChpdGVtLCBpbmRleCkgPT4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwge1xuICAgICAgICBrZXk6IGluZGV4XG4gICAgICB9LCBpdGVtLmdyb3VwICYmIChpbmRleCA9PT0gMCB8fCBvcmRlcmVkQ2hvaWNlc1tpbmRleCAtIDFdLmdyb3VwICE9PSBvcmRlcmVkQ2hvaWNlc1tpbmRleF0uZ3JvdXApICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiY3Qtc2VsZWN0LWRyb3Bkb3duLWdyb3VwXCIsXG4gICAgICAgIGtleTogYCR7aW5kZXh9LWdyb3VwYFxuICAgICAgfSwgaXRlbS5ncm91cCksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgZ2V0SXRlbVByb3BzKHtcbiAgICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIGl0ZW06IGl0ZW0ua2V5LFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LXNlbGVjdC1kcm9wZG93bi1pdGVtJywge1xuICAgICAgICAgIGFjdGl2ZTogaGlnaGxpZ2h0ZWRJbmRleCA9PT0gaW5kZXgsXG4gICAgICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkSXRlbSA9PT0gaXRlbS5rZXlcbiAgICAgICAgfSlcbiAgICAgIH0pLCByZW5kZXJJdGVtRm9yKGl0ZW0pKSkpKTtcblxuICAgICAgaWYgKGFwcGVuZFRvQm9keSkge1xuICAgICAgICBkcm9wZG93biA9IGNyZWF0ZVBvcnRhbChkcm9wZG93biwgZG9jdW1lbnQuYm9keSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC1zZWxlY3QtaW5wdXQgMScsIGlucHV0Q2xhc3NOYW1lKVxuICAgIH0sIHNlbGVjdElucHV0U3RhcnQgJiYgc2VsZWN0SW5wdXRTdGFydCgpLCBjcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2V4dGVuZHMoe30sIGdldElucHV0UHJvcHMoe1xuICAgICAgb25LZXlEb3duOiBlID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJyAmJiBzZWFyY2ggJiYgIWlzT3Blbikge1xuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGlucHV0VmFsdWU6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgIHRvZ2dsZU1lbnUoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGV0IHBvcG92ZXI7XG5cbiAgICAgICAgICBpZiAoYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgICAgICBwb3BvdmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keSA+IC5jdC1zZWxlY3QtZHJvcGRvd24uY3QtZml4ZWQgLmN0LXNlbGVjdC1kcm9wZG93bi1pdGVtLnNlbGVjdGVkJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIgPSBpbnB1dFJlZi5jdXJyZW50LmNsb3Nlc3QoJy5jdC1zZWxlY3QtaW5wdXQnKS5xdWVyeVNlbGVjdG9yKCcuY3Qtc2VsZWN0LWRyb3Bkb3duIC5jdC1zZWxlY3QtZHJvcGRvd24taXRlbS5zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwb3BvdmVyKSB7XG4gICAgICAgICAgICBsZXQgcG9wb3ZlclRvcCA9IHBvcG92ZXIucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgICAgICBsZXQgaXRlbVRvcCA9IHBvcG92ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgcG9wb3Zlci5wYXJlbnROb2RlLnNjcm9sbFRvcCA9IGl0ZW1Ub3AgLSBwb3BvdmVyVG9wO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHNldFRlbXBTdGF0ZShNYXRoLnJvdW5kKCkpO1xuICAgICAgICB9LCA1MCk7XG5cbiAgICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGlucHV0VmFsdWU6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZWY6IGlucHV0UmVmXG4gICAgfSksIHtcbiAgICAgIHBsYWNlaG9sZGVyOiBzZWFyY2ggJiYgaXNPcGVuID8gc2VhcmNoUGxhY2Vob2xkZXIgfHwgX18oJ1R5cGUgdG8gc2VhcmNoLi4uJywgJ2Jsb2Nrc3knKSA6IHBsYWNlaG9sZGVyIHx8IF9fKCdTZWxlY3QgdmFsdWUuLi4nLCAnYmxvY2tzeScpLFxuICAgICAgcmVhZE9ubHk6IHNlYXJjaCA/ICFpc09wZW4gOiB0cnVlXG4gICAgfSkpLCBkcm9wZG93bik7XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1404\n')},8252:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ Slider)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var simple_linear_scale__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6399);\n/* harmony import */ var simple_linear_scale__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(simple_linear_scale__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _react_outside_click_handler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8204);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nconst clamp = (min, max, value) => Math.max(min, Math.min(max, value));\n\nconst clampMax = (max, value) => Math.min(max, value);\n\nconst round = function (value) {\n let decimalPlaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n // return Math.round(value)\n const multiplier = Math.pow(10, decimalPlaces);\n const rounded = Math.round(value * multiplier + Number.EPSILON) / multiplier;\n return rounded;\n};\n\nvar roundWholeNumbers = function (num, precision) {\n num = parseFloat(num);\n if (!precision) return num;\n return Math.round(num / precision) * precision;\n};\n\nconst UnitsList = _ref => {\n let {\n option,\n onChange,\n is_open,\n toggleOpen,\n currentUnit,\n getNumericValue,\n getAllowedDecimalPlaces\n } = _ref;\n\n const pickUnit = unit => {\n const numericValue = getNumericValue();\n onChange(`${round(clamp(option.units.find(_ref2 => {\n let {\n unit: u\n } = _ref2;\n return u === unit;\n }).min, option.units.find(_ref3 => {\n let {\n unit: u\n } = _ref3;\n return u === unit;\n }).max, numericValue === \'\' ? -Infinity : numericValue), getAllowedDecimalPlaces(unit))}${unit}`);\n };\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {\n onClick: () => toggleOpen(),\n className: "ct-current-value"\n }, currentUnit || \'―\'), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_react_outside_click_handler__WEBPACK_IMPORTED_MODULE_3__["default"], {\n onOutsideClick: () => {\n if (!is_open) {\n return;\n }\n\n toggleOpen();\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", {\n className: "ct-units-list"\n }, option.units.filter(_ref4 => {\n let {\n unit\n } = _ref4;\n return unit !== currentUnit;\n }).reduce((current, el, index) => [...current.slice(0, index % 2 === 0 ? undefined : -1), ...(index % 2 === 0 ? [[el]] : [[current[current.length - 1][0], el]])], []).map(group => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {\n key: group[0].unit\n }, group.map(_ref5 => {\n let {\n unit\n } = _ref5;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {\n key: unit,\n onClick: () => {\n pickUnit(unit);\n toggleOpen();\n }\n }, unit || \'―\');\n }))))));\n};\n\nclass Slider extends _wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n var _this;\n\n super(...arguments);\n _this = this;\n\n _defineProperty(this, "state", {\n is_dragging: false,\n is_open: false\n });\n\n _defineProperty(this, "el", (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createRef)());\n\n _defineProperty(this, "hasUnitsList", () => this.props.option.units && this.props.option.units.length > 1);\n\n _defineProperty(this, "getAllowedDecimalPlaces", function () {\n let properUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n const decimals = _this.props.option.units ? _this.props.option.units.find(_ref6 => {\n let {\n unit\n } = _ref6;\n return unit === (properUnit || _this.getCurrentUnit());\n }).decimals : _this.props.option.decimals;\n return decimals !== 0 && !decimals ? 0 : decimals;\n });\n\n _defineProperty(this, "withDefault", (currentUnit, defaultUnit) => this.props.option.units ? this.props.option.units.find(_ref7 => {\n let {\n unit\n } = _ref7;\n return unit === currentUnit;\n }) ? currentUnit : currentUnit || defaultUnit : currentUnit || defaultUnit);\n\n _defineProperty(this, "getCurrentUnit", () => {\n let defaultUnit = this.props.option.units ? this.props.option.units[0].unit : \'\';\n\n if (this.props.value === \'NaN\' || this.props.value === \'\') {\n return defaultUnit;\n }\n\n return this.props.option.units ? this.withDefault(this.props.value.toString().replace(/[0-9]/g, \'\').replace(/\\-/g, \'\').replace(/\\./g, \'\').replace(\'CT_CSS_SKIP_RULE\', \'\'), this.props.option.units[0].unit) : \'\';\n });\n\n _defineProperty(this, "getMax", () => this.props.option.units ? this.props.option.units.find(_ref8 => {\n let {\n unit\n } = _ref8;\n return unit === this.getCurrentUnit();\n }).max : this.props.option.max);\n\n _defineProperty(this, "getMin", () => {\n return this.props.option.units ? this.props.option.units.find(_ref9 => {\n let {\n unit\n } = _ref9;\n return unit === this.getCurrentUnit();\n }).min : this.props.option.min;\n });\n\n _defineProperty(this, "getNumericValue", function () {\n let {\n forPosition = false\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const maybeValue = parseFloat(_this.props.value, 10);\n\n if (maybeValue === 0) {\n return maybeValue;\n }\n\n if (!maybeValue) {\n if (_this.props.option.defaultPosition && _this.props.option.defaultPosition === \'center\' && forPosition) {\n let min = parseFloat(_this.getMin(), 10);\n let max = parseFloat(_this.getMax(), 10);\n return (max - min) / 2 + min;\n }\n\n return \'\';\n }\n\n return maybeValue;\n });\n\n _defineProperty(this, "handleMove", event => {\n if (!this.state.is_dragging) return;\n this.computeAndSendNewValue(event);\n });\n\n _defineProperty(this, "handleUp", () => {\n this.setState({\n is_dragging: false\n });\n this.detachEvents();\n });\n\n _defineProperty(this, "handleBlur", () => {\n if (this.props.option.value === \'CT_CSS_SKIP_RULE\') {\n if (this.props.value === \'CT_CSS_SKIP_RULE\') {\n return;\n }\n\n if (this.getNumericValue() === \'\') {\n this.props.onChange(\'CT_CSS_SKIP_RULE\');\n return;\n }\n }\n\n if (this.props.value.toString().trim() === \'\') {\n this.props.onChange(this.props.option.value);\n return;\n }\n\n this.props.onChange(`${clamp(parseFloat(this.getMin(), 10), parseFloat(this.getMax(), 10), parseFloat(this.getNumericValue(), 10))}${this.getCurrentUnit()}`);\n });\n\n _defineProperty(this, "handleChange", value => {\n if (this.props.option.value === \'CT_CSS_SKIP_RULE\') {\n if (value.toString().trim() === \'\') {\n this.props.onChange(\'CT_CSS_SKIP_RULE\');\n return;\n }\n }\n\n if (value.toString().trim() === \'\') {\n this.props.onChange(\'\');\n return;\n }\n\n this.props.onChange(`${clampMax(parseFloat(this.getMax(), 10), parseFloat(value || this.getMin()))}${this.getCurrentUnit()}`);\n });\n }\n\n computeAndSendNewValue(_ref10) {\n let {\n pageX,\n shiftKey\n } = _ref10;\n let {\n top,\n left,\n right,\n width\n } = this.el.current.getBoundingClientRect();\n let elLeftOffset = pageX - left - pageXOffset;\n this.props.onChange(`${roundWholeNumbers(round(simple_linear_scale__WEBPACK_IMPORTED_MODULE_2___default()([0, width], [parseFloat(this.getMin(), 10), parseFloat(this.getMax(), 10)], true)(document.body.classList.contains(\'rtl\') ? width - elLeftOffset : elLeftOffset), this.getAllowedDecimalPlaces()), shiftKey ? 10 : 1)}${this.getCurrentUnit()}`);\n }\n\n attachEvents() {\n document.documentElement.addEventListener(\'mousemove\', this.handleMove, true);\n document.documentElement.addEventListener(\'mouseup\', this.handleUp, true);\n }\n\n detachEvents() {\n document.documentElement.removeEventListener(\'mousemove\', this.handleMove, true);\n document.documentElement.removeEventListener(\'mouseup\', this.handleUp, true);\n }\n\n render() {\n const leftValue = `${simple_linear_scale__WEBPACK_IMPORTED_MODULE_2___default()([parseFloat(this.getMin(), 10), parseFloat(this.getMax(), 10)], [0, 100])(clamp(parseFloat(this.getMin(), 10), parseFloat(this.getMax(), 10), parseFloat(this.getNumericValue({\n forPosition: true\n }), 10) === 0 ? 0 : parseFloat(this.getNumericValue({\n forPosition: true\n }), 10) ? parseFloat(this.getNumericValue({\n forPosition: true\n }), 10) : parseFloat(this.getMin(), 10)))}`;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-option-slider"\n }, this.props.beforeOption && this.props.beforeOption(), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n onMouseDown: _ref11 => {\n let {\n pageX,\n pageY\n } = _ref11;\n this.attachEvents();\n this.setState({\n is_dragging: true\n });\n },\n onClick: e => this.computeAndSendNewValue(e),\n ref: this.el,\n className: "ct-slider"\n }, this.props.option.steps ? {\n [\'data-steps\']: \'\'\n } : {}), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n style: {\n width: `${leftValue}%`\n }\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {\n tabIndex: "0",\n onKeyDown: e => {\n const valueForComputation = this.getNumericValue();\n let step = 1 / Math.pow(10, this.getAllowedDecimalPlaces());\n let actualStep = e.shiftKey ? step * 10 : step;\n /**\n * Arrow up or left\n */\n\n if (e.keyCode === 38 || e.keyCode === 39) {\n e.preventDefault();\n this.props.onChange(`${clamp(parseFloat(this.getMin(), 10), parseFloat(this.getMax(), 10), valueForComputation + actualStep)}${this.getCurrentUnit()}`);\n }\n /**\n * Arrow down or right\n */\n\n\n if (e.keyCode === 40 || e.keyCode === 37) {\n e.preventDefault();\n this.props.onChange(`${clamp(parseFloat(this.getMin(), 10), parseFloat(this.getMax(), 10), valueForComputation - actualStep)}${this.getCurrentUnit()}`);\n }\n },\n style: {\n \'--position\': `${leftValue}%`\n }\n }), this.props.option.steps && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("section", {\n className: this.props.option.steps\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("i", {\n className: "minus"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("i", {\n className: "zero"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("i", {\n className: "plus"\n }))), !this.props.option.skipInput && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(\'ct-slider-input\', {\n // [\'ct-unit-changer\']: !!this.props.option.units,\n [\'ct-value-changer\']: true,\n \'no-unit-list\': !this.hasUnitsList(),\n active: this.state.is_open\n })\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("input", _extends({\n type: "number"\n }, this.props.option.ref ? {\n ref: this.props.option.ref\n } : {}, {\n step: 1 / Math.pow(10, this.getAllowedDecimalPlaces()),\n value: this.getNumericValue(),\n onBlur: () => this.handleBlur(),\n onChange: _ref12 => {\n let {\n target: {\n value\n }\n } = _ref12;\n return this.handleChange(value);\n }\n })), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {\n className: "ct-value-divider"\n }), !this.hasUnitsList() && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {\n className: "ct-current-value"\n }, this.withDefault(this.getCurrentUnit(), this.props.option.defaultUnit || \'px\')), this.hasUnitsList() && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(UnitsList, {\n option: this.props.option,\n onChange: this.props.onChange,\n is_open: this.state.is_open,\n toggleOpen: () => this.setState({\n is_open: !this.state.is_open\n }),\n currentUnit: this.getCurrentUnit(),\n getNumericValue: this.getNumericValue,\n getAllowedDecimalPlaces: this.getAllowedDecimalPlaces\n })));\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODI1Mi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3Qtc2xpZGVyLmpzPzM3YzkiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgY3JlYXRlUmVmLCBGcmFnbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBsaW5lYXJTY2FsZSBmcm9tICdzaW1wbGUtbGluZWFyLXNjYWxlJztcbmltcG9ydCBPdXRzaWRlQ2xpY2tIYW5kbGVyIGZyb20gJy4vcmVhY3Qtb3V0c2lkZS1jbGljay1oYW5kbGVyJztcblxuY29uc3QgY2xhbXAgPSAobWluLCBtYXgsIHZhbHVlKSA9PiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcblxuY29uc3QgY2xhbXBNYXggPSAobWF4LCB2YWx1ZSkgPT4gTWF0aC5taW4obWF4LCB2YWx1ZSk7XG5cbmNvbnN0IHJvdW5kID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGxldCBkZWNpbWFsUGxhY2VzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuICAvLyByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSlcbiAgY29uc3QgbXVsdGlwbGllciA9IE1hdGgucG93KDEwLCBkZWNpbWFsUGxhY2VzKTtcbiAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQodmFsdWUgKiBtdWx0aXBsaWVyICsgTnVtYmVyLkVQU0lMT04pIC8gbXVsdGlwbGllcjtcbiAgcmV0dXJuIHJvdW5kZWQ7XG59O1xuXG52YXIgcm91bmRXaG9sZU51bWJlcnMgPSBmdW5jdGlvbiAobnVtLCBwcmVjaXNpb24pIHtcbiAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICBpZiAoIXByZWNpc2lvbikgcmV0dXJuIG51bTtcbiAgcmV0dXJuIE1hdGgucm91bmQobnVtIC8gcHJlY2lzaW9uKSAqIHByZWNpc2lvbjtcbn07XG5cbmNvbnN0IFVuaXRzTGlzdCA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbixcbiAgICBvbkNoYW5nZSxcbiAgICBpc19vcGVuLFxuICAgIHRvZ2dsZU9wZW4sXG4gICAgY3VycmVudFVuaXQsXG4gICAgZ2V0TnVtZXJpY1ZhbHVlLFxuICAgIGdldEFsbG93ZWREZWNpbWFsUGxhY2VzXG4gIH0gPSBfcmVmO1xuXG4gIGNvbnN0IHBpY2tVbml0ID0gdW5pdCA9PiB7XG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gZ2V0TnVtZXJpY1ZhbHVlKCk7XG4gICAgb25DaGFuZ2UoYCR7cm91bmQoY2xhbXAob3B0aW9uLnVuaXRzLmZpbmQoX3JlZjIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgdW5pdDogdVxuICAgICAgfSA9IF9yZWYyO1xuICAgICAgcmV0dXJuIHUgPT09IHVuaXQ7XG4gICAgfSkubWluLCBvcHRpb24udW5pdHMuZmluZChfcmVmMyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB1bml0OiB1XG4gICAgICB9ID0gX3JlZjM7XG4gICAgICByZXR1cm4gdSA9PT0gdW5pdDtcbiAgICB9KS5tYXgsIG51bWVyaWNWYWx1ZSA9PT0gJycgPyAtSW5maW5pdHkgOiBudW1lcmljVmFsdWUpLCBnZXRBbGxvd2VkRGVjaW1hbFBsYWNlcyh1bml0KSl9JHt1bml0fWApO1xuICB9O1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgb25DbGljazogKCkgPT4gdG9nZ2xlT3BlbigpLFxuICAgIGNsYXNzTmFtZTogXCJjdC1jdXJyZW50LXZhbHVlXCJcbiAgfSwgY3VycmVudFVuaXQgfHwgJ+KAlScpLCBjcmVhdGVFbGVtZW50KE91dHNpZGVDbGlja0hhbmRsZXIsIHtcbiAgICBvbk91dHNpZGVDbGljazogKCkgPT4ge1xuICAgICAgaWYgKCFpc19vcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9nZ2xlT3BlbigpO1xuICAgIH1cbiAgfSwgY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdW5pdHMtbGlzdFwiXG4gIH0sIG9wdGlvbi51bml0cy5maWx0ZXIoX3JlZjQgPT4ge1xuICAgIGxldCB7XG4gICAgICB1bml0XG4gICAgfSA9IF9yZWY0O1xuICAgIHJldHVybiB1bml0ICE9PSBjdXJyZW50VW5pdDtcbiAgfSkucmVkdWNlKChjdXJyZW50LCBlbCwgaW5kZXgpID0+IFsuLi5jdXJyZW50LnNsaWNlKDAsIGluZGV4ICUgMiA9PT0gMCA/IHVuZGVmaW5lZCA6IC0xKSwgLi4uKGluZGV4ICUgMiA9PT0gMCA/IFtbZWxdXSA6IFtbY3VycmVudFtjdXJyZW50Lmxlbmd0aCAtIDFdWzBdLCBlbF1dKV0sIFtdKS5tYXAoZ3JvdXAgPT4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBrZXk6IGdyb3VwWzBdLnVuaXRcbiAgfSwgZ3JvdXAubWFwKF9yZWY1ID0+IHtcbiAgICBsZXQge1xuICAgICAgdW5pdFxuICAgIH0gPSBfcmVmNTtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAga2V5OiB1bml0LFxuICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICBwaWNrVW5pdCh1bml0KTtcbiAgICAgICAgdG9nZ2xlT3BlbigpO1xuICAgICAgfVxuICAgIH0sIHVuaXQgfHwgJ+KAlScpO1xuICB9KSkpKSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2xpZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzdGF0ZVwiLCB7XG4gICAgICBpc19kcmFnZ2luZzogZmFsc2UsXG4gICAgICBpc19vcGVuOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZWxcIiwgY3JlYXRlUmVmKCkpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFzVW5pdHNMaXN0XCIsICgpID0+IHRoaXMucHJvcHMub3B0aW9uLnVuaXRzICYmIHRoaXMucHJvcHMub3B0aW9uLnVuaXRzLmxlbmd0aCA+IDEpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0QWxsb3dlZERlY2ltYWxQbGFjZXNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHByb3BlclVuaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICBjb25zdCBkZWNpbWFscyA9IF90aGlzLnByb3BzLm9wdGlvbi51bml0cyA/IF90aGlzLnByb3BzLm9wdGlvbi51bml0cy5maW5kKF9yZWY2ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB1bml0XG4gICAgICAgIH0gPSBfcmVmNjtcbiAgICAgICAgcmV0dXJuIHVuaXQgPT09IChwcm9wZXJVbml0IHx8IF90aGlzLmdldEN1cnJlbnRVbml0KCkpO1xuICAgICAgfSkuZGVjaW1hbHMgOiBfdGhpcy5wcm9wcy5vcHRpb24uZGVjaW1hbHM7XG4gICAgICByZXR1cm4gZGVjaW1hbHMgIT09IDAgJiYgIWRlY2ltYWxzID8gMCA6IGRlY2ltYWxzO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwid2l0aERlZmF1bHRcIiwgKGN1cnJlbnRVbml0LCBkZWZhdWx0VW5pdCkgPT4gdGhpcy5wcm9wcy5vcHRpb24udW5pdHMgPyB0aGlzLnByb3BzLm9wdGlvbi51bml0cy5maW5kKF9yZWY3ID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIHVuaXRcbiAgICAgIH0gPSBfcmVmNztcbiAgICAgIHJldHVybiB1bml0ID09PSBjdXJyZW50VW5pdDtcbiAgICB9KSA/IGN1cnJlbnRVbml0IDogY3VycmVudFVuaXQgfHwgZGVmYXVsdFVuaXQgOiBjdXJyZW50VW5pdCB8fCBkZWZhdWx0VW5pdCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRDdXJyZW50VW5pdFwiLCAoKSA9PiB7XG4gICAgICBsZXQgZGVmYXVsdFVuaXQgPSB0aGlzLnByb3BzLm9wdGlvbi51bml0cyA/IHRoaXMucHJvcHMub3B0aW9uLnVuaXRzWzBdLnVuaXQgOiAnJztcblxuICAgICAgaWYgKHRoaXMucHJvcHMudmFsdWUgPT09ICdOYU4nIHx8IHRoaXMucHJvcHMudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VW5pdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMub3B0aW9uLnVuaXRzID8gdGhpcy53aXRoRGVmYXVsdCh0aGlzLnByb3BzLnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvWzAtOV0vZywgJycpLnJlcGxhY2UoL1xcLS9nLCAnJykucmVwbGFjZSgvXFwuL2csICcnKS5yZXBsYWNlKCdDVF9DU1NfU0tJUF9SVUxFJywgJycpLCB0aGlzLnByb3BzLm9wdGlvbi51bml0c1swXS51bml0KSA6ICcnO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0TWF4XCIsICgpID0+IHRoaXMucHJvcHMub3B0aW9uLnVuaXRzID8gdGhpcy5wcm9wcy5vcHRpb24udW5pdHMuZmluZChfcmVmOCA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB1bml0XG4gICAgICB9ID0gX3JlZjg7XG4gICAgICByZXR1cm4gdW5pdCA9PT0gdGhpcy5nZXRDdXJyZW50VW5pdCgpO1xuICAgIH0pLm1heCA6IHRoaXMucHJvcHMub3B0aW9uLm1heCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRNaW5cIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMub3B0aW9uLnVuaXRzID8gdGhpcy5wcm9wcy5vcHRpb24udW5pdHMuZmluZChfcmVmOSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdW5pdFxuICAgICAgICB9ID0gX3JlZjk7XG4gICAgICAgIHJldHVybiB1bml0ID09PSB0aGlzLmdldEN1cnJlbnRVbml0KCk7XG4gICAgICB9KS5taW4gOiB0aGlzLnByb3BzLm9wdGlvbi5taW47XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXROdW1lcmljVmFsdWVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHtcbiAgICAgICAgZm9yUG9zaXRpb24gPSBmYWxzZVxuICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICBjb25zdCBtYXliZVZhbHVlID0gcGFyc2VGbG9hdChfdGhpcy5wcm9wcy52YWx1ZSwgMTApO1xuXG4gICAgICBpZiAobWF5YmVWYWx1ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbWF5YmVWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFtYXliZVZhbHVlKSB7XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy5vcHRpb24uZGVmYXVsdFBvc2l0aW9uICYmIF90aGlzLnByb3BzLm9wdGlvbi5kZWZhdWx0UG9zaXRpb24gPT09ICdjZW50ZXInICYmIGZvclBvc2l0aW9uKSB7XG4gICAgICAgICAgbGV0IG1pbiA9IHBhcnNlRmxvYXQoX3RoaXMuZ2V0TWluKCksIDEwKTtcbiAgICAgICAgICBsZXQgbWF4ID0gcGFyc2VGbG9hdChfdGhpcy5nZXRNYXgoKSwgMTApO1xuICAgICAgICAgIHJldHVybiAobWF4IC0gbWluKSAvIDIgKyBtaW47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXliZVZhbHVlO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlTW92ZVwiLCBldmVudCA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3RhdGUuaXNfZHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIHRoaXMuY29tcHV0ZUFuZFNlbmROZXdWYWx1ZShldmVudCk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJoYW5kbGVVcFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNfZHJhZ2dpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJoYW5kbGVCbHVyXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnByb3BzLm9wdGlvbi52YWx1ZSA9PT0gJ0NUX0NTU19TS0lQX1JVTEUnKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnZhbHVlID09PSAnQ1RfQ1NTX1NLSVBfUlVMRScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nZXROdW1lcmljVmFsdWUoKSA9PT0gJycpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKCdDVF9DU1NfU0tJUF9SVUxFJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnByb3BzLnZhbHVlLnRvU3RyaW5nKCkudHJpbSgpID09PSAnJykge1xuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMub3B0aW9uLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGAke2NsYW1wKHBhcnNlRmxvYXQodGhpcy5nZXRNaW4oKSwgMTApLCBwYXJzZUZsb2F0KHRoaXMuZ2V0TWF4KCksIDEwKSwgcGFyc2VGbG9hdCh0aGlzLmdldE51bWVyaWNWYWx1ZSgpLCAxMCkpfSR7dGhpcy5nZXRDdXJyZW50VW5pdCgpfWApO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlQ2hhbmdlXCIsIHZhbHVlID0+IHtcbiAgICAgIGlmICh0aGlzLnByb3BzLm9wdGlvbi52YWx1ZSA9PT0gJ0NUX0NTU19TS0lQX1JVTEUnKSB7XG4gICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKCdDVF9DU1NfU0tJUF9SVUxFJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSgnJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShgJHtjbGFtcE1heChwYXJzZUZsb2F0KHRoaXMuZ2V0TWF4KCksIDEwKSwgcGFyc2VGbG9hdCh2YWx1ZSB8fCB0aGlzLmdldE1pbigpKSl9JHt0aGlzLmdldEN1cnJlbnRVbml0KCl9YCk7XG4gICAgfSk7XG4gIH1cblxuICBjb21wdXRlQW5kU2VuZE5ld1ZhbHVlKF9yZWYxMCkge1xuICAgIGxldCB7XG4gICAgICBwYWdlWCxcbiAgICAgIHNoaWZ0S2V5XG4gICAgfSA9IF9yZWYxMDtcbiAgICBsZXQge1xuICAgICAgdG9wLFxuICAgICAgbGVmdCxcbiAgICAgIHJpZ2h0LFxuICAgICAgd2lkdGhcbiAgICB9ID0gdGhpcy5lbC5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBlbExlZnRPZmZzZXQgPSBwYWdlWCAtIGxlZnQgLSBwYWdlWE9mZnNldDtcbiAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGAke3JvdW5kV2hvbGVOdW1iZXJzKHJvdW5kKGxpbmVhclNjYWxlKFswLCB3aWR0aF0sIFtwYXJzZUZsb2F0KHRoaXMuZ2V0TWluKCksIDEwKSwgcGFyc2VGbG9hdCh0aGlzLmdldE1heCgpLCAxMCldLCB0cnVlKShkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygncnRsJykgPyB3aWR0aCAtIGVsTGVmdE9mZnNldCA6IGVsTGVmdE9mZnNldCksIHRoaXMuZ2V0QWxsb3dlZERlY2ltYWxQbGFjZXMoKSksIHNoaWZ0S2V5ID8gMTAgOiAxKX0ke3RoaXMuZ2V0Q3VycmVudFVuaXQoKX1gKTtcbiAgfVxuXG4gIGF0dGFjaEV2ZW50cygpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVNb3ZlLCB0cnVlKTtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuaGFuZGxlVXAsIHRydWUpO1xuICB9XG5cbiAgZGV0YWNoRXZlbnRzKCkge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdmUsIHRydWUpO1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVVcCwgdHJ1ZSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgbGVmdFZhbHVlID0gYCR7bGluZWFyU2NhbGUoW3BhcnNlRmxvYXQodGhpcy5nZXRNaW4oKSwgMTApLCBwYXJzZUZsb2F0KHRoaXMuZ2V0TWF4KCksIDEwKV0sIFswLCAxMDBdKShjbGFtcChwYXJzZUZsb2F0KHRoaXMuZ2V0TWluKCksIDEwKSwgcGFyc2VGbG9hdCh0aGlzLmdldE1heCgpLCAxMCksIHBhcnNlRmxvYXQodGhpcy5nZXROdW1lcmljVmFsdWUoe1xuICAgICAgZm9yUG9zaXRpb246IHRydWVcbiAgICB9KSwgMTApID09PSAwID8gMCA6IHBhcnNlRmxvYXQodGhpcy5nZXROdW1lcmljVmFsdWUoe1xuICAgICAgZm9yUG9zaXRpb246IHRydWVcbiAgICB9KSwgMTApID8gcGFyc2VGbG9hdCh0aGlzLmdldE51bWVyaWNWYWx1ZSh7XG4gICAgICBmb3JQb3NpdGlvbjogdHJ1ZVxuICAgIH0pLCAxMCkgOiBwYXJzZUZsb2F0KHRoaXMuZ2V0TWluKCksIDEwKSkpfWA7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImN0LW9wdGlvbi1zbGlkZXJcIlxuICAgIH0sIHRoaXMucHJvcHMuYmVmb3JlT3B0aW9uICYmIHRoaXMucHJvcHMuYmVmb3JlT3B0aW9uKCksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgb25Nb3VzZURvd246IF9yZWYxMSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgcGFnZVgsXG4gICAgICAgICAgcGFnZVlcbiAgICAgICAgfSA9IF9yZWYxMTtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNfZHJhZ2dpbmc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgb25DbGljazogZSA9PiB0aGlzLmNvbXB1dGVBbmRTZW5kTmV3VmFsdWUoZSksXG4gICAgICByZWY6IHRoaXMuZWwsXG4gICAgICBjbGFzc05hbWU6IFwiY3Qtc2xpZGVyXCJcbiAgICB9LCB0aGlzLnByb3BzLm9wdGlvbi5zdGVwcyA/IHtcbiAgICAgIFsnZGF0YS1zdGVwcyddOiAnJ1xuICAgIH0gOiB7fSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IGAke2xlZnRWYWx1ZX0lYFxuICAgICAgfVxuICAgIH0pLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICB0YWJJbmRleDogXCIwXCIsXG4gICAgICBvbktleURvd246IGUgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUZvckNvbXB1dGF0aW9uID0gdGhpcy5nZXROdW1lcmljVmFsdWUoKTtcbiAgICAgICAgbGV0IHN0ZXAgPSAxIC8gTWF0aC5wb3coMTAsIHRoaXMuZ2V0QWxsb3dlZERlY2ltYWxQbGFjZXMoKSk7XG4gICAgICAgIGxldCBhY3R1YWxTdGVwID0gZS5zaGlmdEtleSA/IHN0ZXAgKiAxMCA6IHN0ZXA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcnJvdyB1cCBvciBsZWZ0XG4gICAgICAgICAqL1xuXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShgJHtjbGFtcChwYXJzZUZsb2F0KHRoaXMuZ2V0TWluKCksIDEwKSwgcGFyc2VGbG9hdCh0aGlzLmdldE1heCgpLCAxMCksIHZhbHVlRm9yQ29tcHV0YXRpb24gKyBhY3R1YWxTdGVwKX0ke3RoaXMuZ2V0Q3VycmVudFVuaXQoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQXJyb3cgZG93biBvciByaWdodFxuICAgICAgICAgKi9cblxuXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDQwIHx8IGUua2V5Q29kZSA9PT0gMzcpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShgJHtjbGFtcChwYXJzZUZsb2F0KHRoaXMuZ2V0TWluKCksIDEwKSwgcGFyc2VGbG9hdCh0aGlzLmdldE1heCgpLCAxMCksIHZhbHVlRm9yQ29tcHV0YXRpb24gLSBhY3R1YWxTdGVwKX0ke3RoaXMuZ2V0Q3VycmVudFVuaXQoKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgICctLXBvc2l0aW9uJzogYCR7bGVmdFZhbHVlfSVgXG4gICAgICB9XG4gICAgfSksIHRoaXMucHJvcHMub3B0aW9uLnN0ZXBzICYmIGNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5vcHRpb24uc3RlcHNcbiAgICB9LCBjcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwibWludXNcIlxuICAgIH0pLCBjcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiemVyb1wiXG4gICAgfSksIGNyZWF0ZUVsZW1lbnQoXCJpXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJwbHVzXCJcbiAgICB9KSkpLCAhdGhpcy5wcm9wcy5vcHRpb24uc2tpcElucHV0ICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC1zbGlkZXItaW5wdXQnLCB7XG4gICAgICAgIC8vIFsnY3QtdW5pdC1jaGFuZ2VyJ106ICEhdGhpcy5wcm9wcy5vcHRpb24udW5pdHMsXG4gICAgICAgIFsnY3QtdmFsdWUtY2hhbmdlciddOiB0cnVlLFxuICAgICAgICAnbm8tdW5pdC1saXN0JzogIXRoaXMuaGFzVW5pdHNMaXN0KCksXG4gICAgICAgIGFjdGl2ZTogdGhpcy5zdGF0ZS5pc19vcGVuXG4gICAgICB9KVxuICAgIH0sIGNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZXh0ZW5kcyh7XG4gICAgICB0eXBlOiBcIm51bWJlclwiXG4gICAgfSwgdGhpcy5wcm9wcy5vcHRpb24ucmVmID8ge1xuICAgICAgcmVmOiB0aGlzLnByb3BzLm9wdGlvbi5yZWZcbiAgICB9IDoge30sIHtcbiAgICAgIHN0ZXA6IDEgLyBNYXRoLnBvdygxMCwgdGhpcy5nZXRBbGxvd2VkRGVjaW1hbFBsYWNlcygpKSxcbiAgICAgIHZhbHVlOiB0aGlzLmdldE51bWVyaWNWYWx1ZSgpLFxuICAgICAgb25CbHVyOiAoKSA9PiB0aGlzLmhhbmRsZUJsdXIoKSxcbiAgICAgIG9uQ2hhbmdlOiBfcmVmMTIgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH0gPSBfcmVmMTI7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSkpLCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiY3QtdmFsdWUtZGl2aWRlclwiXG4gICAgfSksICF0aGlzLmhhc1VuaXRzTGlzdCgpICYmIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjdC1jdXJyZW50LXZhbHVlXCJcbiAgICB9LCB0aGlzLndpdGhEZWZhdWx0KHRoaXMuZ2V0Q3VycmVudFVuaXQoKSwgdGhpcy5wcm9wcy5vcHRpb24uZGVmYXVsdFVuaXQgfHwgJ3B4JykpLCB0aGlzLmhhc1VuaXRzTGlzdCgpICYmIGNyZWF0ZUVsZW1lbnQoVW5pdHNMaXN0LCB7XG4gICAgICBvcHRpb246IHRoaXMucHJvcHMub3B0aW9uLFxuICAgICAgb25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2UsXG4gICAgICBpc19vcGVuOiB0aGlzLnN0YXRlLmlzX29wZW4sXG4gICAgICB0b2dnbGVPcGVuOiAoKSA9PiB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNfb3BlbjogIXRoaXMuc3RhdGUuaXNfb3BlblxuICAgICAgfSksXG4gICAgICBjdXJyZW50VW5pdDogdGhpcy5nZXRDdXJyZW50VW5pdCgpLFxuICAgICAgZ2V0TnVtZXJpY1ZhbHVlOiB0aGlzLmdldE51bWVyaWNWYWx1ZSxcbiAgICAgIGdldEFsbG93ZWREZWNpbWFsUGxhY2VzOiB0aGlzLmdldEFsbG93ZWREZWNpbWFsUGxhY2VzXG4gICAgfSkpKTtcbiAgfVxuXG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8252\n')},1282:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\nconst _excluded = ["class"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\nconst Spacer = _ref => {\n let {\n option: {\n height = 10,\n attr: {\n class: className\n } = {}\n }\n } = _ref,\n attr = _objectWithoutProperties(_ref.option.attr, _excluded);\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(\'ct-spacer\', className)\n }, attr, {\n style: {\n height: `${height}px`\n }\n }));\n};\n\nSpacer.renderingConfig = {\n design: \'none\'\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Spacer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4Mi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3Qtc3BhY2VyLmpzPzE4MGIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgX2V4Y2x1ZGVkID0gW1wiY2xhc3NcIl07XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5jb25zdCBTcGFjZXIgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb246IHtcbiAgICAgIGhlaWdodCA9IDEwLFxuICAgICAgYXR0cjoge1xuICAgICAgICBjbGFzczogY2xhc3NOYW1lXG4gICAgICB9ID0ge31cbiAgICB9XG4gIH0gPSBfcmVmLFxuICAgICAgYXR0ciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLm9wdGlvbi5hdHRyLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LXNwYWNlcicsIGNsYXNzTmFtZSlcbiAgfSwgYXR0ciwge1xuICAgIHN0eWxlOiB7XG4gICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGBcbiAgICB9XG4gIH0pKTtcbn07XG5cblNwYWNlci5yZW5kZXJpbmdDb25maWcgPSB7XG4gIGRlc2lnbjogJ25vbmUnXG59O1xuZXhwb3J0IGRlZmF1bHQgU3BhY2VyOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1282\n')},5286:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _components_InputWithOnlyNumbers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6086);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _react_outside_click_handler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8204);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst Spacing = _ref => {\n let {\n value,\n option,\n onChange\n } = _ref;\n const [isOpen, setIsOpen] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const units = [{\n unit: 'px'\n }, {\n unit: '%'\n }, {\n unit: 'em'\n }, {\n unit: 'rem'\n }, {\n unit: 'pt'\n }];\n\n const withDefault = (currentUnit, defaultUnit) => units.find(_ref2 => {\n let {\n unit\n } = _ref2;\n return unit === currentUnit;\n }) ? currentUnit : currentUnit || units[0].unit;\n\n const getLinkedLeader = () => ['top', 'right', 'bottom', 'left'].find(v => value[v] !== 'auto');\n\n const getCurrentUnit = () => withDefault(value[getLinkedLeader()].toString().replace(/[0-9]/g, '').replace('-', '').replace(/\\./g, ''));\n\n const getNumericValue = function (value) {\n let unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n if (value === 'auto') {\n return value;\n }\n\n return `${parseFloat(value) === 0 ? 0 : parseFloat(value) || ''}${unit}`;\n };\n\n const handleChange = (futureValue, position) => {\n if (value.linked) {\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n top: value.top === 'auto' ? value.top : getNumericValue(futureValue, getCurrentUnit()),\n left: value.left === 'auto' ? value.left : getNumericValue(futureValue, getCurrentUnit()),\n right: value.right === 'auto' ? value.right : getNumericValue(futureValue, getCurrentUnit()),\n bottom: value.bottom === 'auto' ? value.bottom : getNumericValue(futureValue, getCurrentUnit())\n }));\n return;\n }\n\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n [position]: getNumericValue(futureValue, getCurrentUnit())\n }));\n };\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_3___default()('ct-option-spacing', {\n linked: value.linked\n })\n }, ['top', 'right', 'bottom', 'left'].map(side => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", {\n key: side\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_components_InputWithOnlyNumbers__WEBPACK_IMPORTED_MODULE_2__/* [\"default\"] */ .Z, _extends({\n placeholder: \"\",\n value: getNumericValue(value[side]),\n onChange: v => handleChange(v, side)\n }, _objectSpread({\n placeholder: ''\n }, option.inputAttr))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"small\", null, {\n top: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Top', 'blocksy'),\n bottom: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Bottom', 'blocksy'),\n left: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Left', 'blocksy'),\n right: (0,ct_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Right', 'blocksy')\n }[side]))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_3___default()('ct-spacing-controls ct-value-changer', {\n active: isOpen\n })\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"a\", {\n onClick: e => {\n e.preventDefault();\n\n if (value.linked) {\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n linked: false\n }));\n return;\n }\n\n const futureValue = value[getLinkedLeader()];\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n top: value.top !== 'auto' ? futureValue : value.top,\n left: value.left !== 'auto' ? futureValue : value.left,\n bottom: value.bottom !== 'auto' ? futureValue : value.bottom,\n right: value.right !== 'auto' ? futureValue : value.right,\n linked: true\n }));\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"svg\", {\n width: \"10\",\n height: \"10\",\n viewBox: \"0 0 15 15\"\n }, value.linked ? (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"path\", {\n d: \"M12.2,5.5V4.7c0-2.6-2.1-4.7-4.7-4.7S2.8,2.1,2.8,4.7v0.8c-0.9,0-1.6,0.7-1.6,1.6v6.3c0,0.9,0.7,1.6,1.6,1.6h9.5c0.9,0,1.6-0.7,1.6-1.6V7.1C13.8,6.2,13.1,5.5,12.2,5.5z M10.7,5.5H4.3V4.7c0-1.8,1.4-3.2,3.2-3.2s3.2,1.4,3.2,3.2V5.5z\"\n }) : (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"path\", {\n d: \"M12.2,5.5h-1.6H9.9h-5H4.7l0-0.2C4.4,3.5,5.5,1.9,7.3,1.5c1.1-0.2,2.2,0.1,2.8,0.9l1.3-0.9c-1-1.1-2.6-1.8-4.3-1.5C4.5,0.5,2.8,2.9,3.2,5.5H2.8c-0.9,0-1.6,0.7-1.6,1.6v6.3c0,0.9,0.7,1.6,1.6,1.6h9.5c0.9,0,1.6-0.7,1.6-1.6V7.1C13.8,6.2,13.1,5.5,12.2,5.5z\"\n }))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", {\n className: \"ct-value-divider\"\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n onClick: () => setIsOpen(!isOpen),\n className: \"ct-current-value\"\n }, getCurrentUnit() || '―'), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_react_outside_click_handler__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onOutsideClick: () => {\n if (!isOpen) {\n return;\n }\n\n setIsOpen(false);\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"ul\", {\n className: \"ct-units-list\"\n }, units.filter(_ref3 => {\n let {\n unit\n } = _ref3;\n return unit !== getCurrentUnit();\n }).reduce((current, el, index) => [...current.slice(0, index % 2 === 0 ? undefined : -1), ...(index % 2 === 0 ? [[el]] : [[current[current.length - 1][0], el]])], []).map(group => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"li\", {\n key: group[0].unit\n }, group.map(_ref4 => {\n let {\n unit\n } = _ref4;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", {\n key: unit,\n onClick: () => {\n onChange(_objectSpread(_objectSpread({}, value), {}, {\n top: getNumericValue(value.top, unit),\n left: getNumericValue(value.left, unit),\n right: getNumericValue(value.right, unit),\n bottom: getNumericValue(value.bottom, unit)\n }));\n setIsOpen(false);\n }\n }, unit || '―');\n })))))));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Spacing);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI4Ni5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LXNwYWNpbmcuanM/NzdhNCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VTdGF0ZSB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IElucHV0V2l0aE9ubHlOdW1iZXJzIGZyb20gJy4uL2NvbXBvbmVudHMvSW5wdXRXaXRoT25seU51bWJlcnMnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBPdXRzaWRlQ2xpY2tIYW5kbGVyIGZyb20gJy4vcmVhY3Qtb3V0c2lkZS1jbGljay1oYW5kbGVyJztcblxuY29uc3QgU3BhY2luZyA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHZhbHVlLFxuICAgIG9wdGlvbixcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgdW5pdHMgPSBbe1xuICAgIHVuaXQ6ICdweCdcbiAgfSwge1xuICAgIHVuaXQ6ICclJ1xuICB9LCB7XG4gICAgdW5pdDogJ2VtJ1xuICB9LCB7XG4gICAgdW5pdDogJ3JlbSdcbiAgfSwge1xuICAgIHVuaXQ6ICdwdCdcbiAgfV07XG5cbiAgY29uc3Qgd2l0aERlZmF1bHQgPSAoY3VycmVudFVuaXQsIGRlZmF1bHRVbml0KSA9PiB1bml0cy5maW5kKF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAgdW5pdFxuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gdW5pdCA9PT0gY3VycmVudFVuaXQ7XG4gIH0pID8gY3VycmVudFVuaXQgOiBjdXJyZW50VW5pdCB8fCB1bml0c1swXS51bml0O1xuXG4gIGNvbnN0IGdldExpbmtlZExlYWRlciA9ICgpID0+IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uZmluZCh2ID0+IHZhbHVlW3ZdICE9PSAnYXV0bycpO1xuXG4gIGNvbnN0IGdldEN1cnJlbnRVbml0ID0gKCkgPT4gd2l0aERlZmF1bHQodmFsdWVbZ2V0TGlua2VkTGVhZGVyKCldLnRvU3RyaW5nKCkucmVwbGFjZSgvWzAtOV0vZywgJycpLnJlcGxhY2UoJy0nLCAnJykucmVwbGFjZSgvXFwuL2csICcnKSk7XG5cbiAgY29uc3QgZ2V0TnVtZXJpY1ZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgbGV0IHVuaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuXG4gICAgaWYgKHZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cGFyc2VGbG9hdCh2YWx1ZSkgPT09IDAgPyAwIDogcGFyc2VGbG9hdCh2YWx1ZSkgfHwgJyd9JHt1bml0fWA7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGZ1dHVyZVZhbHVlLCBwb3NpdGlvbikgPT4ge1xuICAgIGlmICh2YWx1ZS5saW5rZWQpIHtcbiAgICAgIG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgICB0b3A6IHZhbHVlLnRvcCA9PT0gJ2F1dG8nID8gdmFsdWUudG9wIDogZ2V0TnVtZXJpY1ZhbHVlKGZ1dHVyZVZhbHVlLCBnZXRDdXJyZW50VW5pdCgpKSxcbiAgICAgICAgbGVmdDogdmFsdWUubGVmdCA9PT0gJ2F1dG8nID8gdmFsdWUubGVmdCA6IGdldE51bWVyaWNWYWx1ZShmdXR1cmVWYWx1ZSwgZ2V0Q3VycmVudFVuaXQoKSksXG4gICAgICAgIHJpZ2h0OiB2YWx1ZS5yaWdodCA9PT0gJ2F1dG8nID8gdmFsdWUucmlnaHQgOiBnZXROdW1lcmljVmFsdWUoZnV0dXJlVmFsdWUsIGdldEN1cnJlbnRVbml0KCkpLFxuICAgICAgICBib3R0b206IHZhbHVlLmJvdHRvbSA9PT0gJ2F1dG8nID8gdmFsdWUuYm90dG9tIDogZ2V0TnVtZXJpY1ZhbHVlKGZ1dHVyZVZhbHVlLCBnZXRDdXJyZW50VW5pdCgpKVxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgW3Bvc2l0aW9uXTogZ2V0TnVtZXJpY1ZhbHVlKGZ1dHVyZVZhbHVlLCBnZXRDdXJyZW50VW5pdCgpKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMoJ2N0LW9wdGlvbi1zcGFjaW5nJywge1xuICAgICAgbGlua2VkOiB2YWx1ZS5saW5rZWRcbiAgICB9KVxuICB9LCBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLm1hcChzaWRlID0+IGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBrZXk6IHNpZGVcbiAgfSwgY3JlYXRlRWxlbWVudChJbnB1dFdpdGhPbmx5TnVtYmVycywgX2V4dGVuZHMoe1xuICAgIHBsYWNlaG9sZGVyOiBcIlwiLFxuICAgIHZhbHVlOiBnZXROdW1lcmljVmFsdWUodmFsdWVbc2lkZV0pLFxuICAgIG9uQ2hhbmdlOiB2ID0+IGhhbmRsZUNoYW5nZSh2LCBzaWRlKVxuICB9LCBfb2JqZWN0U3ByZWFkKHtcbiAgICBwbGFjZWhvbGRlcjogJydcbiAgfSwgb3B0aW9uLmlucHV0QXR0cikpKSwgY3JlYXRlRWxlbWVudChcInNtYWxsXCIsIG51bGwsIHtcbiAgICB0b3A6IF9fKCdUb3AnLCAnYmxvY2tzeScpLFxuICAgIGJvdHRvbTogX18oJ0JvdHRvbScsICdibG9ja3N5JyksXG4gICAgbGVmdDogX18oJ0xlZnQnLCAnYmxvY2tzeScpLFxuICAgIHJpZ2h0OiBfXygnUmlnaHQnLCAnYmxvY2tzeScpXG4gIH1bc2lkZV0pKSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzKCdjdC1zcGFjaW5nLWNvbnRyb2xzIGN0LXZhbHVlLWNoYW5nZXInLCB7XG4gICAgICBhY3RpdmU6IGlzT3BlblxuICAgIH0pXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKHZhbHVlLmxpbmtlZCkge1xuICAgICAgICBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgICBsaW5rZWQ6IGZhbHNlXG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmdXR1cmVWYWx1ZSA9IHZhbHVlW2dldExpbmtlZExlYWRlcigpXTtcbiAgICAgIG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgICB0b3A6IHZhbHVlLnRvcCAhPT0gJ2F1dG8nID8gZnV0dXJlVmFsdWUgOiB2YWx1ZS50b3AsXG4gICAgICAgIGxlZnQ6IHZhbHVlLmxlZnQgIT09ICdhdXRvJyA/IGZ1dHVyZVZhbHVlIDogdmFsdWUubGVmdCxcbiAgICAgICAgYm90dG9tOiB2YWx1ZS5ib3R0b20gIT09ICdhdXRvJyA/IGZ1dHVyZVZhbHVlIDogdmFsdWUuYm90dG9tLFxuICAgICAgICByaWdodDogdmFsdWUucmlnaHQgIT09ICdhdXRvJyA/IGZ1dHVyZVZhbHVlIDogdmFsdWUucmlnaHQsXG4gICAgICAgIGxpbmtlZDogdHJ1ZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfSwgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiMTBcIixcbiAgICBoZWlnaHQ6IFwiMTBcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAxNSAxNVwiXG4gIH0sIHZhbHVlLmxpbmtlZCA/IGNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMi4yLDUuNVY0LjdjMC0yLjYtMi4xLTQuNy00LjctNC43UzIuOCwyLjEsMi44LDQuN3YwLjhjLTAuOSwwLTEuNiwwLjctMS42LDEuNnY2LjNjMCwwLjksMC43LDEuNiwxLjYsMS42aDkuNWMwLjksMCwxLjYtMC43LDEuNi0xLjZWNy4xQzEzLjgsNi4yLDEzLjEsNS41LDEyLjIsNS41eiBNMTAuNyw1LjVINC4zVjQuN2MwLTEuOCwxLjQtMy4yLDMuMi0zLjJzMy4yLDEuNCwzLjIsMy4yVjUuNXpcIlxuICB9KSA6IGNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMi4yLDUuNWgtMS42SDkuOWgtNUg0LjdsMC0wLjJDNC40LDMuNSw1LjUsMS45LDcuMywxLjVjMS4xLTAuMiwyLjIsMC4xLDIuOCwwLjlsMS4zLTAuOWMtMS0xLjEtMi42LTEuOC00LjMtMS41QzQuNSwwLjUsMi44LDIuOSwzLjIsNS41SDIuOGMtMC45LDAtMS42LDAuNy0xLjYsMS42djYuM2MwLDAuOSwwLjcsMS42LDEuNiwxLjZoOS41YzAuOSwwLDEuNi0wLjcsMS42LTEuNlY3LjFDMTMuOCw2LjIsMTMuMSw1LjUsMTIuMiw1LjV6XCJcbiAgfSkpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC12YWx1ZS1kaXZpZGVyXCJcbiAgfSksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIG9uQ2xpY2s6ICgpID0+IHNldElzT3BlbighaXNPcGVuKSxcbiAgICBjbGFzc05hbWU6IFwiY3QtY3VycmVudC12YWx1ZVwiXG4gIH0sIGdldEN1cnJlbnRVbml0KCkgfHwgJ+KAlScpLCBjcmVhdGVFbGVtZW50KE91dHNpZGVDbGlja0hhbmRsZXIsIHtcbiAgICBvbk91dHNpZGVDbGljazogKCkgPT4ge1xuICAgICAgaWYgKCFpc09wZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgIH1cbiAgfSwgY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdW5pdHMtbGlzdFwiXG4gIH0sIHVuaXRzLmZpbHRlcihfcmVmMyA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHVuaXRcbiAgICB9ID0gX3JlZjM7XG4gICAgcmV0dXJuIHVuaXQgIT09IGdldEN1cnJlbnRVbml0KCk7XG4gIH0pLnJlZHVjZSgoY3VycmVudCwgZWwsIGluZGV4KSA9PiBbLi4uY3VycmVudC5zbGljZSgwLCBpbmRleCAlIDIgPT09IDAgPyB1bmRlZmluZWQgOiAtMSksIC4uLihpbmRleCAlIDIgPT09IDAgPyBbW2VsXV0gOiBbW2N1cnJlbnRbY3VycmVudC5sZW5ndGggLSAxXVswXSwgZWxdXSldLCBbXSkubWFwKGdyb3VwID0+IGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiBncm91cFswXS51bml0XG4gIH0sIGdyb3VwLm1hcChfcmVmNCA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHVuaXRcbiAgICB9ID0gX3JlZjQ7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGtleTogdW5pdCxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICAgICAgdG9wOiBnZXROdW1lcmljVmFsdWUodmFsdWUudG9wLCB1bml0KSxcbiAgICAgICAgICBsZWZ0OiBnZXROdW1lcmljVmFsdWUodmFsdWUubGVmdCwgdW5pdCksXG4gICAgICAgICAgcmlnaHQ6IGdldE51bWVyaWNWYWx1ZSh2YWx1ZS5yaWdodCwgdW5pdCksXG4gICAgICAgICAgYm90dG9tOiBnZXROdW1lcmljVmFsdWUodmFsdWUuYm90dG9tLCB1bml0KVxuICAgICAgICB9KSk7XG4gICAgICAgIHNldElzT3BlbihmYWxzZSk7XG4gICAgICB9XG4gICAgfSwgdW5pdCB8fCAn4oCVJyk7XG4gIH0pKSkpKSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3BhY2luZzsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5286\n")},9497:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nconst isActive = _ref => {\n let {\n option: {\n behavior = 'words'\n },\n value\n } = _ref;\n return behavior === 'words' ? value === 'yes' : !!value;\n};\n\nconst alternateValueFor = _ref2 => {\n let {\n option = {},\n option: {\n behavior = 'words'\n },\n value\n } = _ref2;\n return isActive({\n option,\n value\n }) ? behavior === 'words' ? 'no' : false : behavior === 'words' ? 'yes' : true;\n};\n\nconst Switch = _ref3 => {\n let {\n value,\n option = {},\n onChange,\n onClick\n } = _ref3;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()({\n [`ct-option-switch`]: true,\n [`ct-active`]: isActive({\n option,\n value\n })\n }),\n onClick: e => {\n onClick && onClick(e);\n onChange(alternateValueFor({\n option,\n value\n }));\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", null));\n};\n\nSwitch.renderingConfig = {\n design: 'inline'\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Switch);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQ5Ny5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3Qtc3dpdGNoLmpzPzM1ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5jb25zdCBpc0FjdGl2ZSA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbjoge1xuICAgICAgYmVoYXZpb3IgPSAnd29yZHMnXG4gICAgfSxcbiAgICB2YWx1ZVxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIGJlaGF2aW9yID09PSAnd29yZHMnID8gdmFsdWUgPT09ICd5ZXMnIDogISF2YWx1ZTtcbn07XG5cbmNvbnN0IGFsdGVybmF0ZVZhbHVlRm9yID0gX3JlZjIgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbiA9IHt9LFxuICAgIG9wdGlvbjoge1xuICAgICAgYmVoYXZpb3IgPSAnd29yZHMnXG4gICAgfSxcbiAgICB2YWx1ZVxuICB9ID0gX3JlZjI7XG4gIHJldHVybiBpc0FjdGl2ZSh7XG4gICAgb3B0aW9uLFxuICAgIHZhbHVlXG4gIH0pID8gYmVoYXZpb3IgPT09ICd3b3JkcycgPyAnbm8nIDogZmFsc2UgOiBiZWhhdmlvciA9PT0gJ3dvcmRzJyA/ICd5ZXMnIDogdHJ1ZTtcbn07XG5cbmNvbnN0IFN3aXRjaCA9IF9yZWYzID0+IHtcbiAgbGV0IHtcbiAgICB2YWx1ZSxcbiAgICBvcHRpb24gPSB7fSxcbiAgICBvbkNoYW5nZSxcbiAgICBvbkNsaWNrXG4gIH0gPSBfcmVmMztcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBbYGN0LW9wdGlvbi1zd2l0Y2hgXTogdHJ1ZSxcbiAgICAgIFtgY3QtYWN0aXZlYF06IGlzQWN0aXZlKHtcbiAgICAgICAgb3B0aW9uLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSlcbiAgICB9KSxcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIG9uQ2xpY2sgJiYgb25DbGljayhlKTtcbiAgICAgIG9uQ2hhbmdlKGFsdGVybmF0ZVZhbHVlRm9yKHtcbiAgICAgICAgb3B0aW9uLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCkpO1xufTtcblxuU3dpdGNoLnJlbmRlcmluZ0NvbmZpZyA9IHtcbiAgZGVzaWduOiAnaW5saW5lJ1xufTtcbmV4cG9ydCBkZWZhdWx0IFN3aXRjaDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9497\n")},7896:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nconst Title = _ref => {\n let {\n option: {\n label = \'\',\n desc = \'\',\n attr = {},\n variation = \'simple\'\n }\n } = _ref;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n className: "ct-title"\n }, _objectSpread({\n \'data-type\': variation\n }, attr || {})), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("h3", null, label), desc && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-option-description",\n dangerouslySetInnerHTML: {\n __html: desc\n }\n })));\n};\n\nTitle.renderingConfig = {\n design: \'none\'\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Title);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzg5Ni5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LXRpdGxlLmpzPzA3ZjUiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IEZyYWdtZW50LCBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuXG5jb25zdCBUaXRsZSA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbjoge1xuICAgICAgbGFiZWwgPSAnJyxcbiAgICAgIGRlc2MgPSAnJyxcbiAgICAgIGF0dHIgPSB7fSxcbiAgICAgIHZhcmlhdGlvbiA9ICdzaW1wbGUnXG4gICAgfVxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogXCJjdC10aXRsZVwiXG4gIH0sIF9vYmplY3RTcHJlYWQoe1xuICAgICdkYXRhLXR5cGUnOiB2YXJpYXRpb25cbiAgfSwgYXR0ciB8fCB7fSkpLCBjcmVhdGVFbGVtZW50KFwiaDNcIiwgbnVsbCwgbGFiZWwpLCBkZXNjICYmIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1vcHRpb24tZGVzY3JpcHRpb25cIixcbiAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgX19odG1sOiBkZXNjXG4gICAgfVxuICB9KSkpO1xufTtcblxuVGl0bGUucmVuZGVyaW5nQ29uZmlnID0ge1xuICBkZXNpZ246ICdub25lJ1xufTtcbmV4cG9ydCBkZWZhdWx0IFRpdGxlOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7896\n')},5183:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ ct_typography)\n});\n\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n;// CONCATENATED MODULE: ./static/js/options/options/typography/default-data.js\n\nconst getDefaultFonts = _ref => {\n let {\n isDefault\n } = _ref;\n return {\n system: {\n type: 'system',\n families: [...(!isDefault ? ['Default'] : []), 'System Default', 'Arial', 'Verdana', 'Trebuchet', 'Georgia', 'Times New Roman', 'Palatino', 'Helvetica', 'Myriad Pro', 'Lucida', 'Gill Sans', 'Impact', 'Serif', 'monospace'].map(family => ({\n source: 'system',\n family,\n display: family === 'System Default' ? (0,external_window_wp_i18n_.__)('System Default', 'blocksy') : family,\n variations: [],\n all_variations: [...(family === 'Default' ? ['Default'] : []), 'n1', 'i1', 'n2', 'i2', 'n3', 'i3', 'n4', 'i4', 'n5', 'i5', 'n6', 'i6', 'n7', 'i7', 'n8', 'i8', 'n9', 'i9']\n }))\n }\n };\n};\n;// CONCATENATED MODULE: ./static/js/options/options/typography/helpers.js\n\nconst fontFamilyToCSSFamily = family => {\n if (family === 'System Default') {\n return \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'\";\n }\n\n return family.replace('ct_typekit_', '');\n};\n\nconst findSourceTypeSettingsFor = (font_family, fonts_list) => Object.values(fonts_list).find(single_font_source => single_font_source.families.map(_ref => {\n let {\n family\n } = _ref;\n return family;\n}).indexOf(font_family) > -1);\n\nconst findSourceTypeFor = (font_family, fonts_list) => {\n let source = findSourceTypeSettingsFor(font_family, fonts_list);\n if (!source) return false;\n return source.type;\n};\nconst findSelectedFontFamily = (font_family, fonts_list) => {\n let source = findSourceTypeSettingsFor(font_family, fonts_list);\n\n if (!source) {\n return null;\n }\n\n return source.families.find(_ref2 => {\n let {\n family\n } = _ref2;\n return family === font_family;\n });\n};\nconst decideVariationToSelect = (newValue, oldValue) => {\n if (newValue.all_variations.indexOf(oldValue.variation) > -1) {\n return oldValue.variation;\n }\n\n if (newValue.all_variations.indexOf('n4') > -1) {\n return 'n4';\n }\n\n return newValue.all_variations[0];\n};\nconst humanizeVariationsShort = variation => {\n var all = {\n n1: '100',\n i1: '100',\n n2: '200',\n i2: '200',\n n3: '300',\n i3: '300',\n n4: '400',\n i4: '400',\n n5: '500',\n i5: '500',\n n6: '600',\n i6: '600',\n n7: '700',\n i7: '700',\n n8: '800',\n i8: '800',\n n9: '900',\n i9: '900',\n Default: (0,external_window_wp_i18n_.__)('Default', 'blocksy')\n };\n return all[variation];\n};\nconst humanizeVariations = variation => {\n var all = {\n n1: (0,external_window_wp_i18n_.__)('Thin 100', 'blocksy'),\n i1: (0,external_window_wp_i18n_.__)('Thin 100 Italic', 'blocksy'),\n n2: (0,external_window_wp_i18n_.__)('Extra-Light 200', 'blocksy'),\n i2: (0,external_window_wp_i18n_.__)('Extra-Light 200 Italic', 'blocksy'),\n n3: (0,external_window_wp_i18n_.__)('Light 300', 'blocksy'),\n i3: (0,external_window_wp_i18n_.__)('Light 300 Italic', 'blocksy'),\n n4: (0,external_window_wp_i18n_.__)('Regular', 'blocksy'),\n i4: (0,external_window_wp_i18n_.__)('Regular 400 Italic', 'blocksy'),\n n5: (0,external_window_wp_i18n_.__)('Medium 500', 'blocksy'),\n i5: (0,external_window_wp_i18n_.__)('Medium 500 Italic', 'blocksy'),\n n6: (0,external_window_wp_i18n_.__)('Semi-Bold 600', 'blocksy'),\n i6: (0,external_window_wp_i18n_.__)('Semi-Bold 600 Italic', 'blocksy'),\n n7: (0,external_window_wp_i18n_.__)('Bold 700', 'blocksy'),\n i7: (0,external_window_wp_i18n_.__)('Bold 700 Italic', 'blocksy'),\n n8: (0,external_window_wp_i18n_.__)('Extra-Bold 800', 'blocksy'),\n i8: (0,external_window_wp_i18n_.__)('Extra-Bold 800 Italic', 'blocksy'),\n n9: (0,external_window_wp_i18n_.__)('Ultra-Bold 900', 'blocksy'),\n i9: (0,external_window_wp_i18n_.__)('Ultra-Bold 900 Italic', 'blocksy'),\n Default: (0,external_window_wp_i18n_.__)('Default Weight', 'blocksy')\n };\n return all[variation];\n};\nconst familyForDisplay = family => {\n if (family.indexOf('ct_font') === 0) {\n return family.replace('ct_font_', '').replace(/([-_][a-z])/gi, $1 => $1.toUpperCase().replace('-', '').replace('_', ''));\n }\n\n if (family.indexOf('ct_typekit') === 0) {\n return family.replace('ct_typekit_', '').replace(/([-_][a-z])/gi, $1 => $1.toUpperCase().replace('-', ' ').replace('_', ' '));\n }\n\n if (family === 'System Default') {\n return (0,external_window_wp_i18n_.__)('System Default', 'blocksy');\n }\n\n if (family === 'Default') {\n return (0,external_window_wp_i18n_.__)('Default', 'blocksy');\n }\n\n return family;\n};\n// EXTERNAL MODULE: ./node_modules/bezier-easing/src/index.js\nvar src = __webpack_require__(3431);\nvar src_default = /*#__PURE__*/__webpack_require__.n(src);\n// EXTERNAL MODULE: ./node_modules/@react-spring/web/dist/react-spring-web.esm.js\nvar react_spring_web_esm = __webpack_require__(1472);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nvar esm_extends = __webpack_require__(7462);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\nvar assertThisInitialized = __webpack_require__(7326);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\nvar inheritsLoose = __webpack_require__(4578);\n;// CONCATENATED MODULE: ./node_modules/memoize-one/dist/memoize-one.esm.js\nvar safeIsNaN = Number.isNaN ||\n function ponyfill(value) {\n return typeof value === 'number' && value !== value;\n };\nfunction isEqual(first, second) {\n if (first === second) {\n return true;\n }\n if (safeIsNaN(first) && safeIsNaN(second)) {\n return true;\n }\n return false;\n}\nfunction areInputsEqual(newInputs, lastInputs) {\n if (newInputs.length !== lastInputs.length) {\n return false;\n }\n for (var i = 0; i < newInputs.length; i++) {\n if (!isEqual(newInputs[i], lastInputs[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction memoizeOne(resultFn, isEqual) {\n if (isEqual === void 0) { isEqual = areInputsEqual; }\n var lastThis;\n var lastArgs = [];\n var lastResult;\n var calledOnce = false;\n function memoized() {\n var newArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n newArgs[_i] = arguments[_i];\n }\n if (calledOnce && lastThis === this && isEqual(newArgs, lastArgs)) {\n return lastResult;\n }\n lastResult = resultFn.apply(this, newArgs);\n calledOnce = true;\n lastThis = this;\n lastArgs = newArgs;\n return lastResult;\n }\n return memoized;\n}\n\n/* harmony default export */ const memoize_one_esm = (memoizeOne);\n\n// EXTERNAL MODULE: external \"React\"\nvar external_React_ = __webpack_require__(7363);\n;// CONCATENATED MODULE: ./node_modules/react-window/dist/index.esm.js\n\n\n\n\n\n\n\n// Animation frame based implementation of setTimeout.\n// Inspired by Joe Lambert, https://gist.github.com/joelambert/1002116#file-requesttimeout-js\nvar hasNativePerformanceNow = typeof performance === 'object' && typeof performance.now === 'function';\nvar now = hasNativePerformanceNow ? function () {\n return performance.now();\n} : function () {\n return Date.now();\n};\nfunction cancelTimeout(timeoutID) {\n cancelAnimationFrame(timeoutID.id);\n}\nfunction requestTimeout(callback, delay) {\n var start = now();\n\n function tick() {\n if (now() - start >= delay) {\n callback.call(null);\n } else {\n timeoutID.id = requestAnimationFrame(tick);\n }\n }\n\n var timeoutID = {\n id: requestAnimationFrame(tick)\n };\n return timeoutID;\n}\n\nvar size = -1; // This utility copied from \"dom-helpers\" package.\n\nfunction getScrollbarSize(recalculate) {\n if (recalculate === void 0) {\n recalculate = false;\n }\n\n if (size === -1 || recalculate) {\n var div = document.createElement('div');\n var style = div.style;\n style.width = '50px';\n style.height = '50px';\n style.overflow = 'scroll';\n document.body.appendChild(div);\n size = div.offsetWidth - div.clientWidth;\n document.body.removeChild(div);\n }\n\n return size;\n}\nvar cachedRTLResult = null; // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\n\nfunction getRTLOffsetType(recalculate) {\n if (recalculate === void 0) {\n recalculate = false;\n }\n\n if (cachedRTLResult === null || recalculate) {\n var outerDiv = document.createElement('div');\n var outerStyle = outerDiv.style;\n outerStyle.width = '50px';\n outerStyle.height = '50px';\n outerStyle.overflow = 'scroll';\n outerStyle.direction = 'rtl';\n var innerDiv = document.createElement('div');\n var innerStyle = innerDiv.style;\n innerStyle.width = '100px';\n innerStyle.height = '100px';\n outerDiv.appendChild(innerDiv);\n document.body.appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = 'positive-descending';\n } else {\n outerDiv.scrollLeft = 1;\n\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = 'negative';\n } else {\n cachedRTLResult = 'positive-ascending';\n }\n }\n\n document.body.removeChild(outerDiv);\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n\nvar IS_SCROLLING_DEBOUNCE_INTERVAL = 150;\n\nvar defaultItemKey = function defaultItemKey(_ref) {\n var columnIndex = _ref.columnIndex,\n data = _ref.data,\n rowIndex = _ref.rowIndex;\n return rowIndex + \":\" + columnIndex;\n}; // In DEV mode, this Set helps us only log a warning once per component instance.\n// This avoids spamming the console every time a render happens.\n\n\nvar devWarningsOverscanCount = null;\nvar devWarningsOverscanRowsColumnsCount = null;\nvar devWarningsTagName = null;\n\nif (false) {}\n\nfunction createGridComponent(_ref2) {\n var _class;\n\n var getColumnOffset = _ref2.getColumnOffset,\n getColumnStartIndexForOffset = _ref2.getColumnStartIndexForOffset,\n getColumnStopIndexForStartIndex = _ref2.getColumnStopIndexForStartIndex,\n getColumnWidth = _ref2.getColumnWidth,\n getEstimatedTotalHeight = _ref2.getEstimatedTotalHeight,\n getEstimatedTotalWidth = _ref2.getEstimatedTotalWidth,\n getOffsetForColumnAndAlignment = _ref2.getOffsetForColumnAndAlignment,\n getOffsetForRowAndAlignment = _ref2.getOffsetForRowAndAlignment,\n getRowHeight = _ref2.getRowHeight,\n getRowOffset = _ref2.getRowOffset,\n getRowStartIndexForOffset = _ref2.getRowStartIndexForOffset,\n getRowStopIndexForStartIndex = _ref2.getRowStopIndexForStartIndex,\n initInstanceProps = _ref2.initInstanceProps,\n shouldResetStyleCacheOnItemSizeChange = _ref2.shouldResetStyleCacheOnItemSizeChange,\n validateProps = _ref2.validateProps;\n return _class = /*#__PURE__*/function (_PureComponent) {\n (0,inheritsLoose/* default */.Z)(Grid, _PureComponent);\n\n // Always use explicit constructor for React components.\n // It produces less code after transpilation. (#26)\n // eslint-disable-next-line no-useless-constructor\n function Grid(props) {\n var _this;\n\n _this = _PureComponent.call(this, props) || this;\n _this._instanceProps = initInstanceProps(_this.props, (0,assertThisInitialized/* default */.Z)(_this));\n _this._resetIsScrollingTimeoutId = null;\n _this._outerRef = void 0;\n _this.state = {\n instance: (0,assertThisInitialized/* default */.Z)(_this),\n isScrolling: false,\n horizontalScrollDirection: 'forward',\n scrollLeft: typeof _this.props.initialScrollLeft === 'number' ? _this.props.initialScrollLeft : 0,\n scrollTop: typeof _this.props.initialScrollTop === 'number' ? _this.props.initialScrollTop : 0,\n scrollUpdateWasRequested: false,\n verticalScrollDirection: 'forward'\n };\n _this._callOnItemsRendered = void 0;\n _this._callOnItemsRendered = memoize_one_esm(function (overscanColumnStartIndex, overscanColumnStopIndex, overscanRowStartIndex, overscanRowStopIndex, visibleColumnStartIndex, visibleColumnStopIndex, visibleRowStartIndex, visibleRowStopIndex) {\n return _this.props.onItemsRendered({\n overscanColumnStartIndex: overscanColumnStartIndex,\n overscanColumnStopIndex: overscanColumnStopIndex,\n overscanRowStartIndex: overscanRowStartIndex,\n overscanRowStopIndex: overscanRowStopIndex,\n visibleColumnStartIndex: visibleColumnStartIndex,\n visibleColumnStopIndex: visibleColumnStopIndex,\n visibleRowStartIndex: visibleRowStartIndex,\n visibleRowStopIndex: visibleRowStopIndex\n });\n });\n _this._callOnScroll = void 0;\n _this._callOnScroll = memoize_one_esm(function (scrollLeft, scrollTop, horizontalScrollDirection, verticalScrollDirection, scrollUpdateWasRequested) {\n return _this.props.onScroll({\n horizontalScrollDirection: horizontalScrollDirection,\n scrollLeft: scrollLeft,\n scrollTop: scrollTop,\n verticalScrollDirection: verticalScrollDirection,\n scrollUpdateWasRequested: scrollUpdateWasRequested\n });\n });\n _this._getItemStyle = void 0;\n\n _this._getItemStyle = function (rowIndex, columnIndex) {\n var _this$props = _this.props,\n columnWidth = _this$props.columnWidth,\n direction = _this$props.direction,\n rowHeight = _this$props.rowHeight;\n\n var itemStyleCache = _this._getItemStyleCache(shouldResetStyleCacheOnItemSizeChange && columnWidth, shouldResetStyleCacheOnItemSizeChange && direction, shouldResetStyleCacheOnItemSizeChange && rowHeight);\n\n var key = rowIndex + \":\" + columnIndex;\n var style;\n\n if (itemStyleCache.hasOwnProperty(key)) {\n style = itemStyleCache[key];\n } else {\n var _offset = getColumnOffset(_this.props, columnIndex, _this._instanceProps);\n\n var isRtl = direction === 'rtl';\n itemStyleCache[key] = style = {\n position: 'absolute',\n left: isRtl ? undefined : _offset,\n right: isRtl ? _offset : undefined,\n top: getRowOffset(_this.props, rowIndex, _this._instanceProps),\n height: getRowHeight(_this.props, rowIndex, _this._instanceProps),\n width: getColumnWidth(_this.props, columnIndex, _this._instanceProps)\n };\n }\n\n return style;\n };\n\n _this._getItemStyleCache = void 0;\n _this._getItemStyleCache = memoize_one_esm(function (_, __, ___) {\n return {};\n });\n\n _this._onScroll = function (event) {\n var _event$currentTarget = event.currentTarget,\n clientHeight = _event$currentTarget.clientHeight,\n clientWidth = _event$currentTarget.clientWidth,\n scrollLeft = _event$currentTarget.scrollLeft,\n scrollTop = _event$currentTarget.scrollTop,\n scrollHeight = _event$currentTarget.scrollHeight,\n scrollWidth = _event$currentTarget.scrollWidth;\n\n _this.setState(function (prevState) {\n if (prevState.scrollLeft === scrollLeft && prevState.scrollTop === scrollTop) {\n // Scroll position may have been updated by cDM/cDU,\n // In which case we don't need to trigger another render,\n // And we don't want to update state.isScrolling.\n return null;\n }\n\n var direction = _this.props.direction; // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // It's also easier for this component if we convert offsets to the same format as they would be in for ltr.\n // So the simplest solution is to determine which browser behavior we're dealing with, and convert based on it.\n\n var calculatedScrollLeft = scrollLeft;\n\n if (direction === 'rtl') {\n switch (getRTLOffsetType()) {\n case 'negative':\n calculatedScrollLeft = -scrollLeft;\n break;\n\n case 'positive-descending':\n calculatedScrollLeft = scrollWidth - clientWidth - scrollLeft;\n break;\n }\n } // Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.\n\n\n calculatedScrollLeft = Math.max(0, Math.min(calculatedScrollLeft, scrollWidth - clientWidth));\n var calculatedScrollTop = Math.max(0, Math.min(scrollTop, scrollHeight - clientHeight));\n return {\n isScrolling: true,\n horizontalScrollDirection: prevState.scrollLeft < scrollLeft ? 'forward' : 'backward',\n scrollLeft: calculatedScrollLeft,\n scrollTop: calculatedScrollTop,\n verticalScrollDirection: prevState.scrollTop < scrollTop ? 'forward' : 'backward',\n scrollUpdateWasRequested: false\n };\n }, _this._resetIsScrollingDebounced);\n };\n\n _this._outerRefSetter = function (ref) {\n var outerRef = _this.props.outerRef;\n _this._outerRef = ref;\n\n if (typeof outerRef === 'function') {\n outerRef(ref);\n } else if (outerRef != null && typeof outerRef === 'object' && outerRef.hasOwnProperty('current')) {\n outerRef.current = ref;\n }\n };\n\n _this._resetIsScrollingDebounced = function () {\n if (_this._resetIsScrollingTimeoutId !== null) {\n cancelTimeout(_this._resetIsScrollingTimeoutId);\n }\n\n _this._resetIsScrollingTimeoutId = requestTimeout(_this._resetIsScrolling, IS_SCROLLING_DEBOUNCE_INTERVAL);\n };\n\n _this._resetIsScrolling = function () {\n _this._resetIsScrollingTimeoutId = null;\n\n _this.setState({\n isScrolling: false\n }, function () {\n // Clear style cache after state update has been committed.\n // This way we don't break pure sCU for items that don't use isScrolling param.\n _this._getItemStyleCache(-1);\n });\n };\n\n return _this;\n }\n\n Grid.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n validateSharedProps(nextProps, prevState);\n validateProps(nextProps);\n return null;\n };\n\n var _proto = Grid.prototype;\n\n _proto.scrollTo = function scrollTo(_ref3) {\n var scrollLeft = _ref3.scrollLeft,\n scrollTop = _ref3.scrollTop;\n\n if (scrollLeft !== undefined) {\n scrollLeft = Math.max(0, scrollLeft);\n }\n\n if (scrollTop !== undefined) {\n scrollTop = Math.max(0, scrollTop);\n }\n\n this.setState(function (prevState) {\n if (scrollLeft === undefined) {\n scrollLeft = prevState.scrollLeft;\n }\n\n if (scrollTop === undefined) {\n scrollTop = prevState.scrollTop;\n }\n\n if (prevState.scrollLeft === scrollLeft && prevState.scrollTop === scrollTop) {\n return null;\n }\n\n return {\n horizontalScrollDirection: prevState.scrollLeft < scrollLeft ? 'forward' : 'backward',\n scrollLeft: scrollLeft,\n scrollTop: scrollTop,\n scrollUpdateWasRequested: true,\n verticalScrollDirection: prevState.scrollTop < scrollTop ? 'forward' : 'backward'\n };\n }, this._resetIsScrollingDebounced);\n };\n\n _proto.scrollToItem = function scrollToItem(_ref4) {\n var _ref4$align = _ref4.align,\n align = _ref4$align === void 0 ? 'auto' : _ref4$align,\n columnIndex = _ref4.columnIndex,\n rowIndex = _ref4.rowIndex;\n var _this$props2 = this.props,\n columnCount = _this$props2.columnCount,\n height = _this$props2.height,\n rowCount = _this$props2.rowCount,\n width = _this$props2.width;\n var _this$state = this.state,\n scrollLeft = _this$state.scrollLeft,\n scrollTop = _this$state.scrollTop;\n var scrollbarSize = getScrollbarSize();\n\n if (columnIndex !== undefined) {\n columnIndex = Math.max(0, Math.min(columnIndex, columnCount - 1));\n }\n\n if (rowIndex !== undefined) {\n rowIndex = Math.max(0, Math.min(rowIndex, rowCount - 1));\n }\n\n var estimatedTotalHeight = getEstimatedTotalHeight(this.props, this._instanceProps);\n var estimatedTotalWidth = getEstimatedTotalWidth(this.props, this._instanceProps); // The scrollbar size should be considered when scrolling an item into view,\n // to ensure it's fully visible.\n // But we only need to account for its size when it's actually visible.\n\n var horizontalScrollbarSize = estimatedTotalWidth > width ? scrollbarSize : 0;\n var verticalScrollbarSize = estimatedTotalHeight > height ? scrollbarSize : 0;\n this.scrollTo({\n scrollLeft: columnIndex !== undefined ? getOffsetForColumnAndAlignment(this.props, columnIndex, align, scrollLeft, this._instanceProps, verticalScrollbarSize) : scrollLeft,\n scrollTop: rowIndex !== undefined ? getOffsetForRowAndAlignment(this.props, rowIndex, align, scrollTop, this._instanceProps, horizontalScrollbarSize) : scrollTop\n });\n };\n\n _proto.componentDidMount = function componentDidMount() {\n var _this$props3 = this.props,\n initialScrollLeft = _this$props3.initialScrollLeft,\n initialScrollTop = _this$props3.initialScrollTop;\n\n if (this._outerRef != null) {\n var outerRef = this._outerRef;\n\n if (typeof initialScrollLeft === 'number') {\n outerRef.scrollLeft = initialScrollLeft;\n }\n\n if (typeof initialScrollTop === 'number') {\n outerRef.scrollTop = initialScrollTop;\n }\n }\n\n this._callPropsCallbacks();\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n var direction = this.props.direction;\n var _this$state2 = this.state,\n scrollLeft = _this$state2.scrollLeft,\n scrollTop = _this$state2.scrollTop,\n scrollUpdateWasRequested = _this$state2.scrollUpdateWasRequested;\n\n if (scrollUpdateWasRequested && this._outerRef != null) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n var outerRef = this._outerRef;\n\n if (direction === 'rtl') {\n switch (getRTLOffsetType()) {\n case 'negative':\n outerRef.scrollLeft = -scrollLeft;\n break;\n\n case 'positive-ascending':\n outerRef.scrollLeft = scrollLeft;\n break;\n\n default:\n var clientWidth = outerRef.clientWidth,\n scrollWidth = outerRef.scrollWidth;\n outerRef.scrollLeft = scrollWidth - clientWidth - scrollLeft;\n break;\n }\n } else {\n outerRef.scrollLeft = Math.max(0, scrollLeft);\n }\n\n outerRef.scrollTop = Math.max(0, scrollTop);\n }\n\n this._callPropsCallbacks();\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this._resetIsScrollingTimeoutId !== null) {\n cancelTimeout(this._resetIsScrollingTimeoutId);\n }\n };\n\n _proto.render = function render() {\n var _this$props4 = this.props,\n children = _this$props4.children,\n className = _this$props4.className,\n columnCount = _this$props4.columnCount,\n direction = _this$props4.direction,\n height = _this$props4.height,\n innerRef = _this$props4.innerRef,\n innerElementType = _this$props4.innerElementType,\n innerTagName = _this$props4.innerTagName,\n itemData = _this$props4.itemData,\n _this$props4$itemKey = _this$props4.itemKey,\n itemKey = _this$props4$itemKey === void 0 ? defaultItemKey : _this$props4$itemKey,\n outerElementType = _this$props4.outerElementType,\n outerTagName = _this$props4.outerTagName,\n rowCount = _this$props4.rowCount,\n style = _this$props4.style,\n useIsScrolling = _this$props4.useIsScrolling,\n width = _this$props4.width;\n var isScrolling = this.state.isScrolling;\n\n var _this$_getHorizontalR = this._getHorizontalRangeToRender(),\n columnStartIndex = _this$_getHorizontalR[0],\n columnStopIndex = _this$_getHorizontalR[1];\n\n var _this$_getVerticalRan = this._getVerticalRangeToRender(),\n rowStartIndex = _this$_getVerticalRan[0],\n rowStopIndex = _this$_getVerticalRan[1];\n\n var items = [];\n\n if (columnCount > 0 && rowCount) {\n for (var _rowIndex = rowStartIndex; _rowIndex <= rowStopIndex; _rowIndex++) {\n for (var _columnIndex = columnStartIndex; _columnIndex <= columnStopIndex; _columnIndex++) {\n items.push((0,external_React_.createElement)(children, {\n columnIndex: _columnIndex,\n data: itemData,\n isScrolling: useIsScrolling ? isScrolling : undefined,\n key: itemKey({\n columnIndex: _columnIndex,\n data: itemData,\n rowIndex: _rowIndex\n }),\n rowIndex: _rowIndex,\n style: this._getItemStyle(_rowIndex, _columnIndex)\n }));\n }\n }\n } // Read this value AFTER items have been created,\n // So their actual sizes (if variable) are taken into consideration.\n\n\n var estimatedTotalHeight = getEstimatedTotalHeight(this.props, this._instanceProps);\n var estimatedTotalWidth = getEstimatedTotalWidth(this.props, this._instanceProps);\n return (0,external_React_.createElement)(outerElementType || outerTagName || 'div', {\n className: className,\n onScroll: this._onScroll,\n ref: this._outerRefSetter,\n style: (0,esm_extends[\"default\"])({\n position: 'relative',\n height: height,\n width: width,\n overflow: 'auto',\n WebkitOverflowScrolling: 'touch',\n willChange: 'transform',\n direction: direction\n }, style)\n }, (0,external_React_.createElement)(innerElementType || innerTagName || 'div', {\n children: items,\n ref: innerRef,\n style: {\n height: estimatedTotalHeight,\n pointerEvents: isScrolling ? 'none' : undefined,\n width: estimatedTotalWidth\n }\n }));\n };\n\n _proto._callPropsCallbacks = function _callPropsCallbacks() {\n var _this$props5 = this.props,\n columnCount = _this$props5.columnCount,\n onItemsRendered = _this$props5.onItemsRendered,\n onScroll = _this$props5.onScroll,\n rowCount = _this$props5.rowCount;\n\n if (typeof onItemsRendered === 'function') {\n if (columnCount > 0 && rowCount > 0) {\n var _this$_getHorizontalR2 = this._getHorizontalRangeToRender(),\n _overscanColumnStartIndex = _this$_getHorizontalR2[0],\n _overscanColumnStopIndex = _this$_getHorizontalR2[1],\n _visibleColumnStartIndex = _this$_getHorizontalR2[2],\n _visibleColumnStopIndex = _this$_getHorizontalR2[3];\n\n var _this$_getVerticalRan2 = this._getVerticalRangeToRender(),\n _overscanRowStartIndex = _this$_getVerticalRan2[0],\n _overscanRowStopIndex = _this$_getVerticalRan2[1],\n _visibleRowStartIndex = _this$_getVerticalRan2[2],\n _visibleRowStopIndex = _this$_getVerticalRan2[3];\n\n this._callOnItemsRendered(_overscanColumnStartIndex, _overscanColumnStopIndex, _overscanRowStartIndex, _overscanRowStopIndex, _visibleColumnStartIndex, _visibleColumnStopIndex, _visibleRowStartIndex, _visibleRowStopIndex);\n }\n }\n\n if (typeof onScroll === 'function') {\n var _this$state3 = this.state,\n _horizontalScrollDirection = _this$state3.horizontalScrollDirection,\n _scrollLeft = _this$state3.scrollLeft,\n _scrollTop = _this$state3.scrollTop,\n _scrollUpdateWasRequested = _this$state3.scrollUpdateWasRequested,\n _verticalScrollDirection = _this$state3.verticalScrollDirection;\n\n this._callOnScroll(_scrollLeft, _scrollTop, _horizontalScrollDirection, _verticalScrollDirection, _scrollUpdateWasRequested);\n }\n } // Lazily create and cache item styles while scrolling,\n // So that pure component sCU will prevent re-renders.\n // We maintain this cache, and pass a style prop rather than index,\n // So that List can clear cached styles and force item re-render if necessary.\n ;\n\n _proto._getHorizontalRangeToRender = function _getHorizontalRangeToRender() {\n var _this$props6 = this.props,\n columnCount = _this$props6.columnCount,\n overscanColumnCount = _this$props6.overscanColumnCount,\n overscanColumnsCount = _this$props6.overscanColumnsCount,\n overscanCount = _this$props6.overscanCount,\n rowCount = _this$props6.rowCount;\n var _this$state4 = this.state,\n horizontalScrollDirection = _this$state4.horizontalScrollDirection,\n isScrolling = _this$state4.isScrolling,\n scrollLeft = _this$state4.scrollLeft;\n var overscanCountResolved = overscanColumnCount || overscanColumnsCount || overscanCount || 1;\n\n if (columnCount === 0 || rowCount === 0) {\n return [0, 0, 0, 0];\n }\n\n var startIndex = getColumnStartIndexForOffset(this.props, scrollLeft, this._instanceProps);\n var stopIndex = getColumnStopIndexForStartIndex(this.props, startIndex, scrollLeft, this._instanceProps); // Overscan by one item in each direction so that tab/focus works.\n // If there isn't at least one extra item, tab loops back around.\n\n var overscanBackward = !isScrolling || horizontalScrollDirection === 'backward' ? Math.max(1, overscanCountResolved) : 1;\n var overscanForward = !isScrolling || horizontalScrollDirection === 'forward' ? Math.max(1, overscanCountResolved) : 1;\n return [Math.max(0, startIndex - overscanBackward), Math.max(0, Math.min(columnCount - 1, stopIndex + overscanForward)), startIndex, stopIndex];\n };\n\n _proto._getVerticalRangeToRender = function _getVerticalRangeToRender() {\n var _this$props7 = this.props,\n columnCount = _this$props7.columnCount,\n overscanCount = _this$props7.overscanCount,\n overscanRowCount = _this$props7.overscanRowCount,\n overscanRowsCount = _this$props7.overscanRowsCount,\n rowCount = _this$props7.rowCount;\n var _this$state5 = this.state,\n isScrolling = _this$state5.isScrolling,\n verticalScrollDirection = _this$state5.verticalScrollDirection,\n scrollTop = _this$state5.scrollTop;\n var overscanCountResolved = overscanRowCount || overscanRowsCount || overscanCount || 1;\n\n if (columnCount === 0 || rowCount === 0) {\n return [0, 0, 0, 0];\n }\n\n var startIndex = getRowStartIndexForOffset(this.props, scrollTop, this._instanceProps);\n var stopIndex = getRowStopIndexForStartIndex(this.props, startIndex, scrollTop, this._instanceProps); // Overscan by one item in each direction so that tab/focus works.\n // If there isn't at least one extra item, tab loops back around.\n\n var overscanBackward = !isScrolling || verticalScrollDirection === 'backward' ? Math.max(1, overscanCountResolved) : 1;\n var overscanForward = !isScrolling || verticalScrollDirection === 'forward' ? Math.max(1, overscanCountResolved) : 1;\n return [Math.max(0, startIndex - overscanBackward), Math.max(0, Math.min(rowCount - 1, stopIndex + overscanForward)), startIndex, stopIndex];\n };\n\n return Grid;\n }(external_React_.PureComponent), _class.defaultProps = {\n direction: 'ltr',\n itemData: undefined,\n useIsScrolling: false\n }, _class;\n}\n\nvar validateSharedProps = function validateSharedProps(_ref5, _ref6) {\n var children = _ref5.children,\n direction = _ref5.direction,\n height = _ref5.height,\n innerTagName = _ref5.innerTagName,\n outerTagName = _ref5.outerTagName,\n overscanColumnsCount = _ref5.overscanColumnsCount,\n overscanCount = _ref5.overscanCount,\n overscanRowsCount = _ref5.overscanRowsCount,\n width = _ref5.width;\n var instance = _ref6.instance;\n\n if (false) {}\n};\n\nvar DEFAULT_ESTIMATED_ITEM_SIZE = 50;\n\nvar getEstimatedTotalHeight = function getEstimatedTotalHeight(_ref, _ref2) {\n var rowCount = _ref.rowCount;\n var rowMetadataMap = _ref2.rowMetadataMap,\n estimatedRowHeight = _ref2.estimatedRowHeight,\n lastMeasuredRowIndex = _ref2.lastMeasuredRowIndex;\n var totalSizeOfMeasuredRows = 0; // Edge case check for when the number of items decreases while a scroll is in progress.\n // https://github.com/bvaughn/react-window/pull/138\n\n if (lastMeasuredRowIndex >= rowCount) {\n lastMeasuredRowIndex = rowCount - 1;\n }\n\n if (lastMeasuredRowIndex >= 0) {\n var itemMetadata = rowMetadataMap[lastMeasuredRowIndex];\n totalSizeOfMeasuredRows = itemMetadata.offset + itemMetadata.size;\n }\n\n var numUnmeasuredItems = rowCount - lastMeasuredRowIndex - 1;\n var totalSizeOfUnmeasuredItems = numUnmeasuredItems * estimatedRowHeight;\n return totalSizeOfMeasuredRows + totalSizeOfUnmeasuredItems;\n};\n\nvar getEstimatedTotalWidth = function getEstimatedTotalWidth(_ref3, _ref4) {\n var columnCount = _ref3.columnCount;\n var columnMetadataMap = _ref4.columnMetadataMap,\n estimatedColumnWidth = _ref4.estimatedColumnWidth,\n lastMeasuredColumnIndex = _ref4.lastMeasuredColumnIndex;\n var totalSizeOfMeasuredRows = 0; // Edge case check for when the number of items decreases while a scroll is in progress.\n // https://github.com/bvaughn/react-window/pull/138\n\n if (lastMeasuredColumnIndex >= columnCount) {\n lastMeasuredColumnIndex = columnCount - 1;\n }\n\n if (lastMeasuredColumnIndex >= 0) {\n var itemMetadata = columnMetadataMap[lastMeasuredColumnIndex];\n totalSizeOfMeasuredRows = itemMetadata.offset + itemMetadata.size;\n }\n\n var numUnmeasuredItems = columnCount - lastMeasuredColumnIndex - 1;\n var totalSizeOfUnmeasuredItems = numUnmeasuredItems * estimatedColumnWidth;\n return totalSizeOfMeasuredRows + totalSizeOfUnmeasuredItems;\n};\n\nvar getItemMetadata = function getItemMetadata(itemType, props, index, instanceProps) {\n var itemMetadataMap, itemSize, lastMeasuredIndex;\n\n if (itemType === 'column') {\n itemMetadataMap = instanceProps.columnMetadataMap;\n itemSize = props.columnWidth;\n lastMeasuredIndex = instanceProps.lastMeasuredColumnIndex;\n } else {\n itemMetadataMap = instanceProps.rowMetadataMap;\n itemSize = props.rowHeight;\n lastMeasuredIndex = instanceProps.lastMeasuredRowIndex;\n }\n\n if (index > lastMeasuredIndex) {\n var offset = 0;\n\n if (lastMeasuredIndex >= 0) {\n var itemMetadata = itemMetadataMap[lastMeasuredIndex];\n offset = itemMetadata.offset + itemMetadata.size;\n }\n\n for (var i = lastMeasuredIndex + 1; i <= index; i++) {\n var size = itemSize(i);\n itemMetadataMap[i] = {\n offset: offset,\n size: size\n };\n offset += size;\n }\n\n if (itemType === 'column') {\n instanceProps.lastMeasuredColumnIndex = index;\n } else {\n instanceProps.lastMeasuredRowIndex = index;\n }\n }\n\n return itemMetadataMap[index];\n};\n\nvar findNearestItem = function findNearestItem(itemType, props, instanceProps, offset) {\n var itemMetadataMap, lastMeasuredIndex;\n\n if (itemType === 'column') {\n itemMetadataMap = instanceProps.columnMetadataMap;\n lastMeasuredIndex = instanceProps.lastMeasuredColumnIndex;\n } else {\n itemMetadataMap = instanceProps.rowMetadataMap;\n lastMeasuredIndex = instanceProps.lastMeasuredRowIndex;\n }\n\n var lastMeasuredItemOffset = lastMeasuredIndex > 0 ? itemMetadataMap[lastMeasuredIndex].offset : 0;\n\n if (lastMeasuredItemOffset >= offset) {\n // If we've already measured items within this range just use a binary search as it's faster.\n return findNearestItemBinarySearch(itemType, props, instanceProps, lastMeasuredIndex, 0, offset);\n } else {\n // If we haven't yet measured this high, fallback to an exponential search with an inner binary search.\n // The exponential search avoids pre-computing sizes for the full set of items as a binary search would.\n // The overall complexity for this approach is O(log n).\n return findNearestItemExponentialSearch(itemType, props, instanceProps, Math.max(0, lastMeasuredIndex), offset);\n }\n};\n\nvar findNearestItemBinarySearch = function findNearestItemBinarySearch(itemType, props, instanceProps, high, low, offset) {\n while (low <= high) {\n var middle = low + Math.floor((high - low) / 2);\n var currentOffset = getItemMetadata(itemType, props, middle, instanceProps).offset;\n\n if (currentOffset === offset) {\n return middle;\n } else if (currentOffset < offset) {\n low = middle + 1;\n } else if (currentOffset > offset) {\n high = middle - 1;\n }\n }\n\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\n\nvar findNearestItemExponentialSearch = function findNearestItemExponentialSearch(itemType, props, instanceProps, index, offset) {\n var itemCount = itemType === 'column' ? props.columnCount : props.rowCount;\n var interval = 1;\n\n while (index < itemCount && getItemMetadata(itemType, props, index, instanceProps).offset < offset) {\n index += interval;\n interval *= 2;\n }\n\n return findNearestItemBinarySearch(itemType, props, instanceProps, Math.min(index, itemCount - 1), Math.floor(index / 2), offset);\n};\n\nvar getOffsetForIndexAndAlignment = function getOffsetForIndexAndAlignment(itemType, props, index, align, scrollOffset, instanceProps, scrollbarSize) {\n var size = itemType === 'column' ? props.width : props.height;\n var itemMetadata = getItemMetadata(itemType, props, index, instanceProps); // Get estimated total size after ItemMetadata is computed,\n // To ensure it reflects actual measurements instead of just estimates.\n\n var estimatedTotalSize = itemType === 'column' ? getEstimatedTotalWidth(props, instanceProps) : getEstimatedTotalHeight(props, instanceProps);\n var maxOffset = Math.max(0, Math.min(estimatedTotalSize - size, itemMetadata.offset));\n var minOffset = Math.max(0, itemMetadata.offset - size + scrollbarSize + itemMetadata.size);\n\n if (align === 'smart') {\n if (scrollOffset >= minOffset - size && scrollOffset <= maxOffset + size) {\n align = 'auto';\n } else {\n align = 'center';\n }\n }\n\n switch (align) {\n case 'start':\n return maxOffset;\n\n case 'end':\n return minOffset;\n\n case 'center':\n return Math.round(minOffset + (maxOffset - minOffset) / 2);\n\n case 'auto':\n default:\n if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {\n return scrollOffset;\n } else if (minOffset > maxOffset) {\n // Because we only take into account the scrollbar size when calculating minOffset\n // this value can be larger than maxOffset when at the end of the list\n return minOffset;\n } else if (scrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n\n }\n};\n\nvar VariableSizeGrid = /*#__PURE__*/createGridComponent({\n getColumnOffset: function getColumnOffset(props, index, instanceProps) {\n return getItemMetadata('column', props, index, instanceProps).offset;\n },\n getColumnStartIndexForOffset: function getColumnStartIndexForOffset(props, scrollLeft, instanceProps) {\n return findNearestItem('column', props, instanceProps, scrollLeft);\n },\n getColumnStopIndexForStartIndex: function getColumnStopIndexForStartIndex(props, startIndex, scrollLeft, instanceProps) {\n var columnCount = props.columnCount,\n width = props.width;\n var itemMetadata = getItemMetadata('column', props, startIndex, instanceProps);\n var maxOffset = scrollLeft + width;\n var offset = itemMetadata.offset + itemMetadata.size;\n var stopIndex = startIndex;\n\n while (stopIndex < columnCount - 1 && offset < maxOffset) {\n stopIndex++;\n offset += getItemMetadata('column', props, stopIndex, instanceProps).size;\n }\n\n return stopIndex;\n },\n getColumnWidth: function getColumnWidth(props, index, instanceProps) {\n return instanceProps.columnMetadataMap[index].size;\n },\n getEstimatedTotalHeight: getEstimatedTotalHeight,\n getEstimatedTotalWidth: getEstimatedTotalWidth,\n getOffsetForColumnAndAlignment: function getOffsetForColumnAndAlignment(props, index, align, scrollOffset, instanceProps, scrollbarSize) {\n return getOffsetForIndexAndAlignment('column', props, index, align, scrollOffset, instanceProps, scrollbarSize);\n },\n getOffsetForRowAndAlignment: function getOffsetForRowAndAlignment(props, index, align, scrollOffset, instanceProps, scrollbarSize) {\n return getOffsetForIndexAndAlignment('row', props, index, align, scrollOffset, instanceProps, scrollbarSize);\n },\n getRowOffset: function getRowOffset(props, index, instanceProps) {\n return getItemMetadata('row', props, index, instanceProps).offset;\n },\n getRowHeight: function getRowHeight(props, index, instanceProps) {\n return instanceProps.rowMetadataMap[index].size;\n },\n getRowStartIndexForOffset: function getRowStartIndexForOffset(props, scrollTop, instanceProps) {\n return findNearestItem('row', props, instanceProps, scrollTop);\n },\n getRowStopIndexForStartIndex: function getRowStopIndexForStartIndex(props, startIndex, scrollTop, instanceProps) {\n var rowCount = props.rowCount,\n height = props.height;\n var itemMetadata = getItemMetadata('row', props, startIndex, instanceProps);\n var maxOffset = scrollTop + height;\n var offset = itemMetadata.offset + itemMetadata.size;\n var stopIndex = startIndex;\n\n while (stopIndex < rowCount - 1 && offset < maxOffset) {\n stopIndex++;\n offset += getItemMetadata('row', props, stopIndex, instanceProps).size;\n }\n\n return stopIndex;\n },\n initInstanceProps: function initInstanceProps(props, instance) {\n var _ref5 = props,\n estimatedColumnWidth = _ref5.estimatedColumnWidth,\n estimatedRowHeight = _ref5.estimatedRowHeight;\n var instanceProps = {\n columnMetadataMap: {},\n estimatedColumnWidth: estimatedColumnWidth || DEFAULT_ESTIMATED_ITEM_SIZE,\n estimatedRowHeight: estimatedRowHeight || DEFAULT_ESTIMATED_ITEM_SIZE,\n lastMeasuredColumnIndex: -1,\n lastMeasuredRowIndex: -1,\n rowMetadataMap: {}\n };\n\n instance.resetAfterColumnIndex = function (columnIndex, shouldForceUpdate) {\n if (shouldForceUpdate === void 0) {\n shouldForceUpdate = true;\n }\n\n instance.resetAfterIndices({\n columnIndex: columnIndex,\n shouldForceUpdate: shouldForceUpdate\n });\n };\n\n instance.resetAfterRowIndex = function (rowIndex, shouldForceUpdate) {\n if (shouldForceUpdate === void 0) {\n shouldForceUpdate = true;\n }\n\n instance.resetAfterIndices({\n rowIndex: rowIndex,\n shouldForceUpdate: shouldForceUpdate\n });\n };\n\n instance.resetAfterIndices = function (_ref6) {\n var columnIndex = _ref6.columnIndex,\n rowIndex = _ref6.rowIndex,\n _ref6$shouldForceUpda = _ref6.shouldForceUpdate,\n shouldForceUpdate = _ref6$shouldForceUpda === void 0 ? true : _ref6$shouldForceUpda;\n\n if (typeof columnIndex === 'number') {\n instanceProps.lastMeasuredColumnIndex = Math.min(instanceProps.lastMeasuredColumnIndex, columnIndex - 1);\n }\n\n if (typeof rowIndex === 'number') {\n instanceProps.lastMeasuredRowIndex = Math.min(instanceProps.lastMeasuredRowIndex, rowIndex - 1);\n } // We could potentially optimize further by only evicting styles after this index,\n // But since styles are only cached while scrolling is in progress-\n // It seems an unnecessary optimization.\n // It's unlikely that resetAfterIndex() will be called while a user is scrolling.\n\n\n instance._getItemStyleCache(-1);\n\n if (shouldForceUpdate) {\n instance.forceUpdate();\n }\n };\n\n return instanceProps;\n },\n shouldResetStyleCacheOnItemSizeChange: false,\n validateProps: function validateProps(_ref7) {\n var columnWidth = _ref7.columnWidth,\n rowHeight = _ref7.rowHeight;\n\n if (false) {}\n }\n});\n\nvar IS_SCROLLING_DEBOUNCE_INTERVAL$1 = 150;\n\nvar defaultItemKey$1 = function defaultItemKey(index, data) {\n return index;\n}; // In DEV mode, this Set helps us only log a warning once per component instance.\n// This avoids spamming the console every time a render happens.\n\n\nvar devWarningsDirection = null;\nvar devWarningsTagName$1 = null;\n\nif (false) {}\n\nfunction createListComponent(_ref) {\n var _class;\n\n var getItemOffset = _ref.getItemOffset,\n getEstimatedTotalSize = _ref.getEstimatedTotalSize,\n getItemSize = _ref.getItemSize,\n getOffsetForIndexAndAlignment = _ref.getOffsetForIndexAndAlignment,\n getStartIndexForOffset = _ref.getStartIndexForOffset,\n getStopIndexForStartIndex = _ref.getStopIndexForStartIndex,\n initInstanceProps = _ref.initInstanceProps,\n shouldResetStyleCacheOnItemSizeChange = _ref.shouldResetStyleCacheOnItemSizeChange,\n validateProps = _ref.validateProps;\n return _class = /*#__PURE__*/function (_PureComponent) {\n (0,inheritsLoose/* default */.Z)(List, _PureComponent);\n\n // Always use explicit constructor for React components.\n // It produces less code after transpilation. (#26)\n // eslint-disable-next-line no-useless-constructor\n function List(props) {\n var _this;\n\n _this = _PureComponent.call(this, props) || this;\n _this._instanceProps = initInstanceProps(_this.props, (0,assertThisInitialized/* default */.Z)(_this));\n _this._outerRef = void 0;\n _this._resetIsScrollingTimeoutId = null;\n _this.state = {\n instance: (0,assertThisInitialized/* default */.Z)(_this),\n isScrolling: false,\n scrollDirection: 'forward',\n scrollOffset: typeof _this.props.initialScrollOffset === 'number' ? _this.props.initialScrollOffset : 0,\n scrollUpdateWasRequested: false\n };\n _this._callOnItemsRendered = void 0;\n _this._callOnItemsRendered = memoize_one_esm(function (overscanStartIndex, overscanStopIndex, visibleStartIndex, visibleStopIndex) {\n return _this.props.onItemsRendered({\n overscanStartIndex: overscanStartIndex,\n overscanStopIndex: overscanStopIndex,\n visibleStartIndex: visibleStartIndex,\n visibleStopIndex: visibleStopIndex\n });\n });\n _this._callOnScroll = void 0;\n _this._callOnScroll = memoize_one_esm(function (scrollDirection, scrollOffset, scrollUpdateWasRequested) {\n return _this.props.onScroll({\n scrollDirection: scrollDirection,\n scrollOffset: scrollOffset,\n scrollUpdateWasRequested: scrollUpdateWasRequested\n });\n });\n _this._getItemStyle = void 0;\n\n _this._getItemStyle = function (index) {\n var _this$props = _this.props,\n direction = _this$props.direction,\n itemSize = _this$props.itemSize,\n layout = _this$props.layout;\n\n var itemStyleCache = _this._getItemStyleCache(shouldResetStyleCacheOnItemSizeChange && itemSize, shouldResetStyleCacheOnItemSizeChange && layout, shouldResetStyleCacheOnItemSizeChange && direction);\n\n var style;\n\n if (itemStyleCache.hasOwnProperty(index)) {\n style = itemStyleCache[index];\n } else {\n var _offset = getItemOffset(_this.props, index, _this._instanceProps);\n\n var size = getItemSize(_this.props, index, _this._instanceProps); // TODO Deprecate direction \"horizontal\"\n\n var isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n var isRtl = direction === 'rtl';\n var offsetHorizontal = isHorizontal ? _offset : 0;\n itemStyleCache[index] = style = {\n position: 'absolute',\n left: isRtl ? undefined : offsetHorizontal,\n right: isRtl ? offsetHorizontal : undefined,\n top: !isHorizontal ? _offset : 0,\n height: !isHorizontal ? size : '100%',\n width: isHorizontal ? size : '100%'\n };\n }\n\n return style;\n };\n\n _this._getItemStyleCache = void 0;\n _this._getItemStyleCache = memoize_one_esm(function (_, __, ___) {\n return {};\n });\n\n _this._onScrollHorizontal = function (event) {\n var _event$currentTarget = event.currentTarget,\n clientWidth = _event$currentTarget.clientWidth,\n scrollLeft = _event$currentTarget.scrollLeft,\n scrollWidth = _event$currentTarget.scrollWidth;\n\n _this.setState(function (prevState) {\n if (prevState.scrollOffset === scrollLeft) {\n // Scroll position may have been updated by cDM/cDU,\n // In which case we don't need to trigger another render,\n // And we don't want to update state.isScrolling.\n return null;\n }\n\n var direction = _this.props.direction;\n var scrollOffset = scrollLeft;\n\n if (direction === 'rtl') {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // It's also easier for this component if we convert offsets to the same format as they would be in for ltr.\n // So the simplest solution is to determine which browser behavior we're dealing with, and convert based on it.\n switch (getRTLOffsetType()) {\n case 'negative':\n scrollOffset = -scrollLeft;\n break;\n\n case 'positive-descending':\n scrollOffset = scrollWidth - clientWidth - scrollLeft;\n break;\n }\n } // Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.\n\n\n scrollOffset = Math.max(0, Math.min(scrollOffset, scrollWidth - clientWidth));\n return {\n isScrolling: true,\n scrollDirection: prevState.scrollOffset < scrollLeft ? 'forward' : 'backward',\n scrollOffset: scrollOffset,\n scrollUpdateWasRequested: false\n };\n }, _this._resetIsScrollingDebounced);\n };\n\n _this._onScrollVertical = function (event) {\n var _event$currentTarget2 = event.currentTarget,\n clientHeight = _event$currentTarget2.clientHeight,\n scrollHeight = _event$currentTarget2.scrollHeight,\n scrollTop = _event$currentTarget2.scrollTop;\n\n _this.setState(function (prevState) {\n if (prevState.scrollOffset === scrollTop) {\n // Scroll position may have been updated by cDM/cDU,\n // In which case we don't need to trigger another render,\n // And we don't want to update state.isScrolling.\n return null;\n } // Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.\n\n\n var scrollOffset = Math.max(0, Math.min(scrollTop, scrollHeight - clientHeight));\n return {\n isScrolling: true,\n scrollDirection: prevState.scrollOffset < scrollOffset ? 'forward' : 'backward',\n scrollOffset: scrollOffset,\n scrollUpdateWasRequested: false\n };\n }, _this._resetIsScrollingDebounced);\n };\n\n _this._outerRefSetter = function (ref) {\n var outerRef = _this.props.outerRef;\n _this._outerRef = ref;\n\n if (typeof outerRef === 'function') {\n outerRef(ref);\n } else if (outerRef != null && typeof outerRef === 'object' && outerRef.hasOwnProperty('current')) {\n outerRef.current = ref;\n }\n };\n\n _this._resetIsScrollingDebounced = function () {\n if (_this._resetIsScrollingTimeoutId !== null) {\n cancelTimeout(_this._resetIsScrollingTimeoutId);\n }\n\n _this._resetIsScrollingTimeoutId = requestTimeout(_this._resetIsScrolling, IS_SCROLLING_DEBOUNCE_INTERVAL$1);\n };\n\n _this._resetIsScrolling = function () {\n _this._resetIsScrollingTimeoutId = null;\n\n _this.setState({\n isScrolling: false\n }, function () {\n // Clear style cache after state update has been committed.\n // This way we don't break pure sCU for items that don't use isScrolling param.\n _this._getItemStyleCache(-1, null);\n });\n };\n\n return _this;\n }\n\n List.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n validateSharedProps$1(nextProps, prevState);\n validateProps(nextProps);\n return null;\n };\n\n var _proto = List.prototype;\n\n _proto.scrollTo = function scrollTo(scrollOffset) {\n scrollOffset = Math.max(0, scrollOffset);\n this.setState(function (prevState) {\n if (prevState.scrollOffset === scrollOffset) {\n return null;\n }\n\n return {\n scrollDirection: prevState.scrollOffset < scrollOffset ? 'forward' : 'backward',\n scrollOffset: scrollOffset,\n scrollUpdateWasRequested: true\n };\n }, this._resetIsScrollingDebounced);\n };\n\n _proto.scrollToItem = function scrollToItem(index, align) {\n if (align === void 0) {\n align = 'auto';\n }\n\n var itemCount = this.props.itemCount;\n var scrollOffset = this.state.scrollOffset;\n index = Math.max(0, Math.min(index, itemCount - 1));\n this.scrollTo(getOffsetForIndexAndAlignment(this.props, index, align, scrollOffset, this._instanceProps));\n };\n\n _proto.componentDidMount = function componentDidMount() {\n var _this$props2 = this.props,\n direction = _this$props2.direction,\n initialScrollOffset = _this$props2.initialScrollOffset,\n layout = _this$props2.layout;\n\n if (typeof initialScrollOffset === 'number' && this._outerRef != null) {\n var outerRef = this._outerRef; // TODO Deprecate direction \"horizontal\"\n\n if (direction === 'horizontal' || layout === 'horizontal') {\n outerRef.scrollLeft = initialScrollOffset;\n } else {\n outerRef.scrollTop = initialScrollOffset;\n }\n }\n\n this._callPropsCallbacks();\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n var _this$props3 = this.props,\n direction = _this$props3.direction,\n layout = _this$props3.layout;\n var _this$state = this.state,\n scrollOffset = _this$state.scrollOffset,\n scrollUpdateWasRequested = _this$state.scrollUpdateWasRequested;\n\n if (scrollUpdateWasRequested && this._outerRef != null) {\n var outerRef = this._outerRef; // TODO Deprecate direction \"horizontal\"\n\n if (direction === 'horizontal' || layout === 'horizontal') {\n if (direction === 'rtl') {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n switch (getRTLOffsetType()) {\n case 'negative':\n outerRef.scrollLeft = -scrollOffset;\n break;\n\n case 'positive-ascending':\n outerRef.scrollLeft = scrollOffset;\n break;\n\n default:\n var clientWidth = outerRef.clientWidth,\n scrollWidth = outerRef.scrollWidth;\n outerRef.scrollLeft = scrollWidth - clientWidth - scrollOffset;\n break;\n }\n } else {\n outerRef.scrollLeft = scrollOffset;\n }\n } else {\n outerRef.scrollTop = scrollOffset;\n }\n }\n\n this._callPropsCallbacks();\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this._resetIsScrollingTimeoutId !== null) {\n cancelTimeout(this._resetIsScrollingTimeoutId);\n }\n };\n\n _proto.render = function render() {\n var _this$props4 = this.props,\n children = _this$props4.children,\n className = _this$props4.className,\n direction = _this$props4.direction,\n height = _this$props4.height,\n innerRef = _this$props4.innerRef,\n innerElementType = _this$props4.innerElementType,\n innerTagName = _this$props4.innerTagName,\n itemCount = _this$props4.itemCount,\n itemData = _this$props4.itemData,\n _this$props4$itemKey = _this$props4.itemKey,\n itemKey = _this$props4$itemKey === void 0 ? defaultItemKey$1 : _this$props4$itemKey,\n layout = _this$props4.layout,\n outerElementType = _this$props4.outerElementType,\n outerTagName = _this$props4.outerTagName,\n style = _this$props4.style,\n useIsScrolling = _this$props4.useIsScrolling,\n width = _this$props4.width;\n var isScrolling = this.state.isScrolling; // TODO Deprecate direction \"horizontal\"\n\n var isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n var onScroll = isHorizontal ? this._onScrollHorizontal : this._onScrollVertical;\n\n var _this$_getRangeToRend = this._getRangeToRender(),\n startIndex = _this$_getRangeToRend[0],\n stopIndex = _this$_getRangeToRend[1];\n\n var items = [];\n\n if (itemCount > 0) {\n for (var _index = startIndex; _index <= stopIndex; _index++) {\n items.push((0,external_React_.createElement)(children, {\n data: itemData,\n key: itemKey(_index, itemData),\n index: _index,\n isScrolling: useIsScrolling ? isScrolling : undefined,\n style: this._getItemStyle(_index)\n }));\n }\n } // Read this value AFTER items have been created,\n // So their actual sizes (if variable) are taken into consideration.\n\n\n var estimatedTotalSize = getEstimatedTotalSize(this.props, this._instanceProps);\n return (0,external_React_.createElement)(outerElementType || outerTagName || 'div', {\n className: className,\n onScroll: onScroll,\n ref: this._outerRefSetter,\n style: (0,esm_extends[\"default\"])({\n position: 'relative',\n height: height,\n width: width,\n overflow: 'auto',\n WebkitOverflowScrolling: 'touch',\n willChange: 'transform',\n direction: direction\n }, style)\n }, (0,external_React_.createElement)(innerElementType || innerTagName || 'div', {\n children: items,\n ref: innerRef,\n style: {\n height: isHorizontal ? '100%' : estimatedTotalSize,\n pointerEvents: isScrolling ? 'none' : undefined,\n width: isHorizontal ? estimatedTotalSize : '100%'\n }\n }));\n };\n\n _proto._callPropsCallbacks = function _callPropsCallbacks() {\n if (typeof this.props.onItemsRendered === 'function') {\n var itemCount = this.props.itemCount;\n\n if (itemCount > 0) {\n var _this$_getRangeToRend2 = this._getRangeToRender(),\n _overscanStartIndex = _this$_getRangeToRend2[0],\n _overscanStopIndex = _this$_getRangeToRend2[1],\n _visibleStartIndex = _this$_getRangeToRend2[2],\n _visibleStopIndex = _this$_getRangeToRend2[3];\n\n this._callOnItemsRendered(_overscanStartIndex, _overscanStopIndex, _visibleStartIndex, _visibleStopIndex);\n }\n }\n\n if (typeof this.props.onScroll === 'function') {\n var _this$state2 = this.state,\n _scrollDirection = _this$state2.scrollDirection,\n _scrollOffset = _this$state2.scrollOffset,\n _scrollUpdateWasRequested = _this$state2.scrollUpdateWasRequested;\n\n this._callOnScroll(_scrollDirection, _scrollOffset, _scrollUpdateWasRequested);\n }\n } // Lazily create and cache item styles while scrolling,\n // So that pure component sCU will prevent re-renders.\n // We maintain this cache, and pass a style prop rather than index,\n // So that List can clear cached styles and force item re-render if necessary.\n ;\n\n _proto._getRangeToRender = function _getRangeToRender() {\n var _this$props5 = this.props,\n itemCount = _this$props5.itemCount,\n overscanCount = _this$props5.overscanCount;\n var _this$state3 = this.state,\n isScrolling = _this$state3.isScrolling,\n scrollDirection = _this$state3.scrollDirection,\n scrollOffset = _this$state3.scrollOffset;\n\n if (itemCount === 0) {\n return [0, 0, 0, 0];\n }\n\n var startIndex = getStartIndexForOffset(this.props, scrollOffset, this._instanceProps);\n var stopIndex = getStopIndexForStartIndex(this.props, startIndex, scrollOffset, this._instanceProps); // Overscan by one item in each direction so that tab/focus works.\n // If there isn't at least one extra item, tab loops back around.\n\n var overscanBackward = !isScrolling || scrollDirection === 'backward' ? Math.max(1, overscanCount) : 1;\n var overscanForward = !isScrolling || scrollDirection === 'forward' ? Math.max(1, overscanCount) : 1;\n return [Math.max(0, startIndex - overscanBackward), Math.max(0, Math.min(itemCount - 1, stopIndex + overscanForward)), startIndex, stopIndex];\n };\n\n return List;\n }(external_React_.PureComponent), _class.defaultProps = {\n direction: 'ltr',\n itemData: undefined,\n layout: 'vertical',\n overscanCount: 2,\n useIsScrolling: false\n }, _class;\n} // NOTE: I considered further wrapping individual items with a pure ListItem component.\n// This would avoid ever calling the render function for the same index more than once,\n// But it would also add the overhead of a lot of components/fibers.\n// I assume people already do this (render function returning a class component),\n// So my doing it would just unnecessarily double the wrappers.\n\nvar validateSharedProps$1 = function validateSharedProps(_ref2, _ref3) {\n var children = _ref2.children,\n direction = _ref2.direction,\n height = _ref2.height,\n layout = _ref2.layout,\n innerTagName = _ref2.innerTagName,\n outerTagName = _ref2.outerTagName,\n width = _ref2.width;\n var instance = _ref3.instance;\n\n if (false) { var isHorizontal; }\n};\n\nvar DEFAULT_ESTIMATED_ITEM_SIZE$1 = 50;\n\nvar getItemMetadata$1 = function getItemMetadata(props, index, instanceProps) {\n var _ref = props,\n itemSize = _ref.itemSize;\n var itemMetadataMap = instanceProps.itemMetadataMap,\n lastMeasuredIndex = instanceProps.lastMeasuredIndex;\n\n if (index > lastMeasuredIndex) {\n var offset = 0;\n\n if (lastMeasuredIndex >= 0) {\n var itemMetadata = itemMetadataMap[lastMeasuredIndex];\n offset = itemMetadata.offset + itemMetadata.size;\n }\n\n for (var i = lastMeasuredIndex + 1; i <= index; i++) {\n var size = itemSize(i);\n itemMetadataMap[i] = {\n offset: offset,\n size: size\n };\n offset += size;\n }\n\n instanceProps.lastMeasuredIndex = index;\n }\n\n return itemMetadataMap[index];\n};\n\nvar findNearestItem$1 = function findNearestItem(props, instanceProps, offset) {\n var itemMetadataMap = instanceProps.itemMetadataMap,\n lastMeasuredIndex = instanceProps.lastMeasuredIndex;\n var lastMeasuredItemOffset = lastMeasuredIndex > 0 ? itemMetadataMap[lastMeasuredIndex].offset : 0;\n\n if (lastMeasuredItemOffset >= offset) {\n // If we've already measured items within this range just use a binary search as it's faster.\n return findNearestItemBinarySearch$1(props, instanceProps, lastMeasuredIndex, 0, offset);\n } else {\n // If we haven't yet measured this high, fallback to an exponential search with an inner binary search.\n // The exponential search avoids pre-computing sizes for the full set of items as a binary search would.\n // The overall complexity for this approach is O(log n).\n return findNearestItemExponentialSearch$1(props, instanceProps, Math.max(0, lastMeasuredIndex), offset);\n }\n};\n\nvar findNearestItemBinarySearch$1 = function findNearestItemBinarySearch(props, instanceProps, high, low, offset) {\n while (low <= high) {\n var middle = low + Math.floor((high - low) / 2);\n var currentOffset = getItemMetadata$1(props, middle, instanceProps).offset;\n\n if (currentOffset === offset) {\n return middle;\n } else if (currentOffset < offset) {\n low = middle + 1;\n } else if (currentOffset > offset) {\n high = middle - 1;\n }\n }\n\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\n\nvar findNearestItemExponentialSearch$1 = function findNearestItemExponentialSearch(props, instanceProps, index, offset) {\n var itemCount = props.itemCount;\n var interval = 1;\n\n while (index < itemCount && getItemMetadata$1(props, index, instanceProps).offset < offset) {\n index += interval;\n interval *= 2;\n }\n\n return findNearestItemBinarySearch$1(props, instanceProps, Math.min(index, itemCount - 1), Math.floor(index / 2), offset);\n};\n\nvar getEstimatedTotalSize = function getEstimatedTotalSize(_ref2, _ref3) {\n var itemCount = _ref2.itemCount;\n var itemMetadataMap = _ref3.itemMetadataMap,\n estimatedItemSize = _ref3.estimatedItemSize,\n lastMeasuredIndex = _ref3.lastMeasuredIndex;\n var totalSizeOfMeasuredItems = 0; // Edge case check for when the number of items decreases while a scroll is in progress.\n // https://github.com/bvaughn/react-window/pull/138\n\n if (lastMeasuredIndex >= itemCount) {\n lastMeasuredIndex = itemCount - 1;\n }\n\n if (lastMeasuredIndex >= 0) {\n var itemMetadata = itemMetadataMap[lastMeasuredIndex];\n totalSizeOfMeasuredItems = itemMetadata.offset + itemMetadata.size;\n }\n\n var numUnmeasuredItems = itemCount - lastMeasuredIndex - 1;\n var totalSizeOfUnmeasuredItems = numUnmeasuredItems * estimatedItemSize;\n return totalSizeOfMeasuredItems + totalSizeOfUnmeasuredItems;\n};\n\nvar VariableSizeList = /*#__PURE__*/createListComponent({\n getItemOffset: function getItemOffset(props, index, instanceProps) {\n return getItemMetadata$1(props, index, instanceProps).offset;\n },\n getItemSize: function getItemSize(props, index, instanceProps) {\n return instanceProps.itemMetadataMap[index].size;\n },\n getEstimatedTotalSize: getEstimatedTotalSize,\n getOffsetForIndexAndAlignment: function getOffsetForIndexAndAlignment(props, index, align, scrollOffset, instanceProps) {\n var direction = props.direction,\n height = props.height,\n layout = props.layout,\n width = props.width; // TODO Deprecate direction \"horizontal\"\n\n var isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n var size = isHorizontal ? width : height;\n var itemMetadata = getItemMetadata$1(props, index, instanceProps); // Get estimated total size after ItemMetadata is computed,\n // To ensure it reflects actual measurements instead of just estimates.\n\n var estimatedTotalSize = getEstimatedTotalSize(props, instanceProps);\n var maxOffset = Math.max(0, Math.min(estimatedTotalSize - size, itemMetadata.offset));\n var minOffset = Math.max(0, itemMetadata.offset - size + itemMetadata.size);\n\n if (align === 'smart') {\n if (scrollOffset >= minOffset - size && scrollOffset <= maxOffset + size) {\n align = 'auto';\n } else {\n align = 'center';\n }\n }\n\n switch (align) {\n case 'start':\n return maxOffset;\n\n case 'end':\n return minOffset;\n\n case 'center':\n return Math.round(minOffset + (maxOffset - minOffset) / 2);\n\n case 'auto':\n default:\n if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {\n return scrollOffset;\n } else if (scrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n\n }\n },\n getStartIndexForOffset: function getStartIndexForOffset(props, offset, instanceProps) {\n return findNearestItem$1(props, instanceProps, offset);\n },\n getStopIndexForStartIndex: function getStopIndexForStartIndex(props, startIndex, scrollOffset, instanceProps) {\n var direction = props.direction,\n height = props.height,\n itemCount = props.itemCount,\n layout = props.layout,\n width = props.width; // TODO Deprecate direction \"horizontal\"\n\n var isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n var size = isHorizontal ? width : height;\n var itemMetadata = getItemMetadata$1(props, startIndex, instanceProps);\n var maxOffset = scrollOffset + size;\n var offset = itemMetadata.offset + itemMetadata.size;\n var stopIndex = startIndex;\n\n while (stopIndex < itemCount - 1 && offset < maxOffset) {\n stopIndex++;\n offset += getItemMetadata$1(props, stopIndex, instanceProps).size;\n }\n\n return stopIndex;\n },\n initInstanceProps: function initInstanceProps(props, instance) {\n var _ref4 = props,\n estimatedItemSize = _ref4.estimatedItemSize;\n var instanceProps = {\n itemMetadataMap: {},\n estimatedItemSize: estimatedItemSize || DEFAULT_ESTIMATED_ITEM_SIZE$1,\n lastMeasuredIndex: -1\n };\n\n instance.resetAfterIndex = function (index, shouldForceUpdate) {\n if (shouldForceUpdate === void 0) {\n shouldForceUpdate = true;\n }\n\n instanceProps.lastMeasuredIndex = Math.min(instanceProps.lastMeasuredIndex, index - 1); // We could potentially optimize further by only evicting styles after this index,\n // But since styles are only cached while scrolling is in progress-\n // It seems an unnecessary optimization.\n // It's unlikely that resetAfterIndex() will be called while a user is scrolling.\n\n instance._getItemStyleCache(-1);\n\n if (shouldForceUpdate) {\n instance.forceUpdate();\n }\n };\n\n return instanceProps;\n },\n shouldResetStyleCacheOnItemSizeChange: false,\n validateProps: function validateProps(_ref5) {\n var itemSize = _ref5.itemSize;\n\n if (false) {}\n }\n});\n\nvar FixedSizeGrid = /*#__PURE__*/createGridComponent({\n getColumnOffset: function getColumnOffset(_ref, index) {\n var columnWidth = _ref.columnWidth;\n return index * columnWidth;\n },\n getColumnWidth: function getColumnWidth(_ref2, index) {\n var columnWidth = _ref2.columnWidth;\n return columnWidth;\n },\n getRowOffset: function getRowOffset(_ref3, index) {\n var rowHeight = _ref3.rowHeight;\n return index * rowHeight;\n },\n getRowHeight: function getRowHeight(_ref4, index) {\n var rowHeight = _ref4.rowHeight;\n return rowHeight;\n },\n getEstimatedTotalHeight: function getEstimatedTotalHeight(_ref5) {\n var rowCount = _ref5.rowCount,\n rowHeight = _ref5.rowHeight;\n return rowHeight * rowCount;\n },\n getEstimatedTotalWidth: function getEstimatedTotalWidth(_ref6) {\n var columnCount = _ref6.columnCount,\n columnWidth = _ref6.columnWidth;\n return columnWidth * columnCount;\n },\n getOffsetForColumnAndAlignment: function getOffsetForColumnAndAlignment(_ref7, columnIndex, align, scrollLeft, instanceProps, scrollbarSize) {\n var columnCount = _ref7.columnCount,\n columnWidth = _ref7.columnWidth,\n width = _ref7.width;\n var lastColumnOffset = Math.max(0, columnCount * columnWidth - width);\n var maxOffset = Math.min(lastColumnOffset, columnIndex * columnWidth);\n var minOffset = Math.max(0, columnIndex * columnWidth - width + scrollbarSize + columnWidth);\n\n if (align === 'smart') {\n if (scrollLeft >= minOffset - width && scrollLeft <= maxOffset + width) {\n align = 'auto';\n } else {\n align = 'center';\n }\n }\n\n switch (align) {\n case 'start':\n return maxOffset;\n\n case 'end':\n return minOffset;\n\n case 'center':\n // \"Centered\" offset is usually the average of the min and max.\n // But near the edges of the list, this doesn't hold true.\n var middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2);\n\n if (middleOffset < Math.ceil(width / 2)) {\n return 0; // near the beginning\n } else if (middleOffset > lastColumnOffset + Math.floor(width / 2)) {\n return lastColumnOffset; // near the end\n } else {\n return middleOffset;\n }\n\n case 'auto':\n default:\n if (scrollLeft >= minOffset && scrollLeft <= maxOffset) {\n return scrollLeft;\n } else if (minOffset > maxOffset) {\n // Because we only take into account the scrollbar size when calculating minOffset\n // this value can be larger than maxOffset when at the end of the list\n return minOffset;\n } else if (scrollLeft < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n\n }\n },\n getOffsetForRowAndAlignment: function getOffsetForRowAndAlignment(_ref8, rowIndex, align, scrollTop, instanceProps, scrollbarSize) {\n var rowHeight = _ref8.rowHeight,\n height = _ref8.height,\n rowCount = _ref8.rowCount;\n var lastRowOffset = Math.max(0, rowCount * rowHeight - height);\n var maxOffset = Math.min(lastRowOffset, rowIndex * rowHeight);\n var minOffset = Math.max(0, rowIndex * rowHeight - height + scrollbarSize + rowHeight);\n\n if (align === 'smart') {\n if (scrollTop >= minOffset - height && scrollTop <= maxOffset + height) {\n align = 'auto';\n } else {\n align = 'center';\n }\n }\n\n switch (align) {\n case 'start':\n return maxOffset;\n\n case 'end':\n return minOffset;\n\n case 'center':\n // \"Centered\" offset is usually the average of the min and max.\n // But near the edges of the list, this doesn't hold true.\n var middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2);\n\n if (middleOffset < Math.ceil(height / 2)) {\n return 0; // near the beginning\n } else if (middleOffset > lastRowOffset + Math.floor(height / 2)) {\n return lastRowOffset; // near the end\n } else {\n return middleOffset;\n }\n\n case 'auto':\n default:\n if (scrollTop >= minOffset && scrollTop <= maxOffset) {\n return scrollTop;\n } else if (minOffset > maxOffset) {\n // Because we only take into account the scrollbar size when calculating minOffset\n // this value can be larger than maxOffset when at the end of the list\n return minOffset;\n } else if (scrollTop < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n\n }\n },\n getColumnStartIndexForOffset: function getColumnStartIndexForOffset(_ref9, scrollLeft) {\n var columnWidth = _ref9.columnWidth,\n columnCount = _ref9.columnCount;\n return Math.max(0, Math.min(columnCount - 1, Math.floor(scrollLeft / columnWidth)));\n },\n getColumnStopIndexForStartIndex: function getColumnStopIndexForStartIndex(_ref10, startIndex, scrollLeft) {\n var columnWidth = _ref10.columnWidth,\n columnCount = _ref10.columnCount,\n width = _ref10.width;\n var left = startIndex * columnWidth;\n var numVisibleColumns = Math.ceil((width + scrollLeft - left) / columnWidth);\n return Math.max(0, Math.min(columnCount - 1, startIndex + numVisibleColumns - 1 // -1 is because stop index is inclusive\n ));\n },\n getRowStartIndexForOffset: function getRowStartIndexForOffset(_ref11, scrollTop) {\n var rowHeight = _ref11.rowHeight,\n rowCount = _ref11.rowCount;\n return Math.max(0, Math.min(rowCount - 1, Math.floor(scrollTop / rowHeight)));\n },\n getRowStopIndexForStartIndex: function getRowStopIndexForStartIndex(_ref12, startIndex, scrollTop) {\n var rowHeight = _ref12.rowHeight,\n rowCount = _ref12.rowCount,\n height = _ref12.height;\n var top = startIndex * rowHeight;\n var numVisibleRows = Math.ceil((height + scrollTop - top) / rowHeight);\n return Math.max(0, Math.min(rowCount - 1, startIndex + numVisibleRows - 1 // -1 is because stop index is inclusive\n ));\n },\n initInstanceProps: function initInstanceProps(props) {// Noop\n },\n shouldResetStyleCacheOnItemSizeChange: true,\n validateProps: function validateProps(_ref13) {\n var columnWidth = _ref13.columnWidth,\n rowHeight = _ref13.rowHeight;\n\n if (false) {}\n }\n});\n\nvar FixedSizeList = /*#__PURE__*/createListComponent({\n getItemOffset: function getItemOffset(_ref, index) {\n var itemSize = _ref.itemSize;\n return index * itemSize;\n },\n getItemSize: function getItemSize(_ref2, index) {\n var itemSize = _ref2.itemSize;\n return itemSize;\n },\n getEstimatedTotalSize: function getEstimatedTotalSize(_ref3) {\n var itemCount = _ref3.itemCount,\n itemSize = _ref3.itemSize;\n return itemSize * itemCount;\n },\n getOffsetForIndexAndAlignment: function getOffsetForIndexAndAlignment(_ref4, index, align, scrollOffset) {\n var direction = _ref4.direction,\n height = _ref4.height,\n itemCount = _ref4.itemCount,\n itemSize = _ref4.itemSize,\n layout = _ref4.layout,\n width = _ref4.width;\n // TODO Deprecate direction \"horizontal\"\n var isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n var size = isHorizontal ? width : height;\n var lastItemOffset = Math.max(0, itemCount * itemSize - size);\n var maxOffset = Math.min(lastItemOffset, index * itemSize);\n var minOffset = Math.max(0, index * itemSize - size + itemSize);\n\n if (align === 'smart') {\n if (scrollOffset >= minOffset - size && scrollOffset <= maxOffset + size) {\n align = 'auto';\n } else {\n align = 'center';\n }\n }\n\n switch (align) {\n case 'start':\n return maxOffset;\n\n case 'end':\n return minOffset;\n\n case 'center':\n {\n // \"Centered\" offset is usually the average of the min and max.\n // But near the edges of the list, this doesn't hold true.\n var middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2);\n\n if (middleOffset < Math.ceil(size / 2)) {\n return 0; // near the beginning\n } else if (middleOffset > lastItemOffset + Math.floor(size / 2)) {\n return lastItemOffset; // near the end\n } else {\n return middleOffset;\n }\n }\n\n case 'auto':\n default:\n if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {\n return scrollOffset;\n } else if (scrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n\n }\n },\n getStartIndexForOffset: function getStartIndexForOffset(_ref5, offset) {\n var itemCount = _ref5.itemCount,\n itemSize = _ref5.itemSize;\n return Math.max(0, Math.min(itemCount - 1, Math.floor(offset / itemSize)));\n },\n getStopIndexForStartIndex: function getStopIndexForStartIndex(_ref6, startIndex, scrollOffset) {\n var direction = _ref6.direction,\n height = _ref6.height,\n itemCount = _ref6.itemCount,\n itemSize = _ref6.itemSize,\n layout = _ref6.layout,\n width = _ref6.width;\n // TODO Deprecate direction \"horizontal\"\n var isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n var offset = startIndex * itemSize;\n var size = isHorizontal ? width : height;\n var numVisibleItems = Math.ceil((size + scrollOffset - offset) / itemSize);\n return Math.max(0, Math.min(itemCount - 1, startIndex + numVisibleItems - 1 // -1 is because stop index is inclusive\n ));\n },\n initInstanceProps: function initInstanceProps(props) {// Noop\n },\n shouldResetStyleCacheOnItemSizeChange: true,\n validateProps: function validateProps(_ref7) {\n var itemSize = _ref7.itemSize;\n\n if (false) {}\n }\n});\n\n// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(prev, next) {\n for (var attribute in prev) {\n if (!(attribute in next)) {\n return true;\n }\n }\n\n for (var _attribute in next) {\n if (prev[_attribute] !== next[_attribute]) {\n return true;\n }\n }\n\n return false;\n}\n\nvar _excluded = (/* unused pure expression or super */ null && ([\"style\"])),\n _excluded2 = (/* unused pure expression or super */ null && ([\"style\"]));\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://reactjs.org/docs/react-api.html#reactmemo\n\nfunction areEqual(prevProps, nextProps) {\n var prevStyle = prevProps.style,\n prevRest = _objectWithoutPropertiesLoose(prevProps, _excluded);\n\n var nextStyle = nextProps.style,\n nextRest = _objectWithoutPropertiesLoose(nextProps, _excluded2);\n\n return !shallowDiffers(prevStyle, nextStyle) && !shallowDiffers(prevRest, nextRest);\n}\n\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://reactjs.org/docs/react-component.html#shouldcomponentupdate\n\nfunction shouldComponentUpdate(nextProps, nextState) {\n return !areEqual(this.props, nextProps) || shallowDiffers(this.state, nextState);\n}\n\n\n//# sourceMappingURL=index.esm.js.map\n\n// EXTERNAL MODULE: ./node_modules/webfontloader/webfontloader.js\nvar webfontloader = __webpack_require__(5933);\nvar webfontloader_default = /*#__PURE__*/__webpack_require__.n(webfontloader);\n;// CONCATENATED MODULE: ./node_modules/react-virtualized-auto-sizer/dist/index.esm.js\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar slicedToArray = function () {\n function sliceIterator(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n}();\n\n/**\n * Detect Element Resize.\n * https://github.com/sdecima/javascript-detect-element-resize\n * Sebastian Decima\n *\n * Forked from version 0.5.3; includes the following modifications:\n * 1) Guard against unsafe 'window' and 'document' references (to support SSR).\n * 2) Defer initialization code via a top-level function wrapper (to support SSR).\n * 3) Avoid unnecessary reflows by not measuring size for scroll events bubbling from children.\n * 4) Add nonce for style element.\n **/\n\n// Check `document` and `window` in case of server-side rendering\nvar windowObject = void 0;\nif (typeof window !== 'undefined') {\n windowObject = window;\n\n // eslint-disable-next-line no-restricted-globals\n} else if (typeof self !== 'undefined') {\n // eslint-disable-next-line no-restricted-globals\n windowObject = self;\n} else {\n windowObject = __webpack_require__.g;\n}\n\nvar cancelFrame = null;\nvar requestFrame = null;\n\nvar TIMEOUT_DURATION = 20;\n\nvar clearTimeoutFn = windowObject.clearTimeout;\nvar setTimeoutFn = windowObject.setTimeout;\n\nvar cancelAnimationFrameFn = windowObject.cancelAnimationFrame || windowObject.mozCancelAnimationFrame || windowObject.webkitCancelAnimationFrame;\n\nvar requestAnimationFrameFn = windowObject.requestAnimationFrame || windowObject.mozRequestAnimationFrame || windowObject.webkitRequestAnimationFrame;\n\nif (cancelAnimationFrameFn == null || requestAnimationFrameFn == null) {\n // For environments that don't support animation frame,\n // fallback to a setTimeout based approach.\n cancelFrame = clearTimeoutFn;\n requestFrame = function requestAnimationFrameViaSetTimeout(callback) {\n return setTimeoutFn(callback, TIMEOUT_DURATION);\n };\n} else {\n // Counter intuitively, environments that support animation frames can be trickier.\n // Chrome's \"Throttle non-visible cross-origin iframes\" flag can prevent rAFs from being called.\n // In this case, we should fallback to a setTimeout() implementation.\n cancelFrame = function cancelFrame(_ref) {\n var _ref2 = slicedToArray(_ref, 2),\n animationFrameID = _ref2[0],\n timeoutID = _ref2[1];\n\n cancelAnimationFrameFn(animationFrameID);\n clearTimeoutFn(timeoutID);\n };\n requestFrame = function requestAnimationFrameWithSetTimeoutFallback(callback) {\n var animationFrameID = requestAnimationFrameFn(function animationFrameCallback() {\n clearTimeoutFn(timeoutID);\n callback();\n });\n\n var timeoutID = setTimeoutFn(function timeoutCallback() {\n cancelAnimationFrameFn(animationFrameID);\n callback();\n }, TIMEOUT_DURATION);\n\n return [animationFrameID, timeoutID];\n };\n}\n\nfunction createDetectElementResize(nonce) {\n var animationKeyframes = void 0;\n var animationName = void 0;\n var animationStartEvent = void 0;\n var animationStyle = void 0;\n var checkTriggers = void 0;\n var resetTriggers = void 0;\n var scrollListener = void 0;\n\n var attachEvent = typeof document !== 'undefined' && document.attachEvent;\n if (!attachEvent) {\n resetTriggers = function resetTriggers(element) {\n var triggers = element.__resizeTriggers__,\n expand = triggers.firstElementChild,\n contract = triggers.lastElementChild,\n expandChild = expand.firstElementChild;\n contract.scrollLeft = contract.scrollWidth;\n contract.scrollTop = contract.scrollHeight;\n expandChild.style.width = expand.offsetWidth + 1 + 'px';\n expandChild.style.height = expand.offsetHeight + 1 + 'px';\n expand.scrollLeft = expand.scrollWidth;\n expand.scrollTop = expand.scrollHeight;\n };\n\n checkTriggers = function checkTriggers(element) {\n return element.offsetWidth !== element.__resizeLast__.width || element.offsetHeight !== element.__resizeLast__.height;\n };\n\n scrollListener = function scrollListener(e) {\n // Don't measure (which forces) reflow for scrolls that happen inside of children!\n if (e.target.className && typeof e.target.className.indexOf === 'function' && e.target.className.indexOf('contract-trigger') < 0 && e.target.className.indexOf('expand-trigger') < 0) {\n return;\n }\n\n var element = this;\n resetTriggers(this);\n if (this.__resizeRAF__) {\n cancelFrame(this.__resizeRAF__);\n }\n this.__resizeRAF__ = requestFrame(function animationFrame() {\n if (checkTriggers(element)) {\n element.__resizeLast__.width = element.offsetWidth;\n element.__resizeLast__.height = element.offsetHeight;\n element.__resizeListeners__.forEach(function forEachResizeListener(fn) {\n fn.call(element, e);\n });\n }\n });\n };\n\n /* Detect CSS Animations support to detect element display/re-attach */\n var animation = false;\n var keyframeprefix = '';\n animationStartEvent = 'animationstart';\n var domPrefixes = 'Webkit Moz O ms'.split(' ');\n var startEvents = 'webkitAnimationStart animationstart oAnimationStart MSAnimationStart'.split(' ');\n var pfx = '';\n {\n var elm = document.createElement('fakeelement');\n if (elm.style.animationName !== undefined) {\n animation = true;\n }\n\n if (animation === false) {\n for (var i = 0; i < domPrefixes.length; i++) {\n if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {\n pfx = domPrefixes[i];\n keyframeprefix = '-' + pfx.toLowerCase() + '-';\n animationStartEvent = startEvents[i];\n animation = true;\n break;\n }\n }\n }\n }\n\n animationName = 'resizeanim';\n animationKeyframes = '@' + keyframeprefix + 'keyframes ' + animationName + ' { from { opacity: 0; } to { opacity: 0; } } ';\n animationStyle = keyframeprefix + 'animation: 1ms ' + animationName + '; ';\n }\n\n var createStyles = function createStyles(doc) {\n if (!doc.getElementById('detectElementResize')) {\n //opacity:0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360\n var css = (animationKeyframes ? animationKeyframes : '') + '.resize-triggers { ' + (animationStyle ? animationStyle : '') + 'visibility: hidden; opacity: 0; } ' + '.resize-triggers, .resize-triggers > div, .contract-trigger:before { content: \" \"; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; z-index: -1; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }',\n head = doc.head || doc.getElementsByTagName('head')[0],\n style = doc.createElement('style');\n\n style.id = 'detectElementResize';\n style.type = 'text/css';\n\n if (nonce != null) {\n style.setAttribute('nonce', nonce);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(doc.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n };\n\n var addResizeListener = function addResizeListener(element, fn) {\n if (attachEvent) {\n element.attachEvent('onresize', fn);\n } else {\n if (!element.__resizeTriggers__) {\n var doc = element.ownerDocument;\n var elementStyle = windowObject.getComputedStyle(element);\n if (elementStyle && elementStyle.position === 'static') {\n element.style.position = 'relative';\n }\n createStyles(doc);\n element.__resizeLast__ = {};\n element.__resizeListeners__ = [];\n (element.__resizeTriggers__ = doc.createElement('div')).className = 'resize-triggers';\n var expandTrigger = doc.createElement('div');\n expandTrigger.className = 'expand-trigger';\n expandTrigger.appendChild(doc.createElement('div'));\n var contractTrigger = doc.createElement('div');\n contractTrigger.className = 'contract-trigger';\n element.__resizeTriggers__.appendChild(expandTrigger);\n element.__resizeTriggers__.appendChild(contractTrigger);\n element.appendChild(element.__resizeTriggers__);\n resetTriggers(element);\n element.addEventListener('scroll', scrollListener, true);\n\n /* Listen for a css animation to detect element display/re-attach */\n if (animationStartEvent) {\n element.__resizeTriggers__.__animationListener__ = function animationListener(e) {\n if (e.animationName === animationName) {\n resetTriggers(element);\n }\n };\n element.__resizeTriggers__.addEventListener(animationStartEvent, element.__resizeTriggers__.__animationListener__);\n }\n }\n element.__resizeListeners__.push(fn);\n }\n };\n\n var removeResizeListener = function removeResizeListener(element, fn) {\n if (attachEvent) {\n element.detachEvent('onresize', fn);\n } else {\n element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n if (!element.__resizeListeners__.length) {\n element.removeEventListener('scroll', scrollListener, true);\n if (element.__resizeTriggers__.__animationListener__) {\n element.__resizeTriggers__.removeEventListener(animationStartEvent, element.__resizeTriggers__.__animationListener__);\n element.__resizeTriggers__.__animationListener__ = null;\n }\n try {\n element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__);\n } catch (e) {\n // Preact compat; see developit/preact-compat/issues/228\n }\n }\n }\n };\n\n return {\n addResizeListener: addResizeListener,\n removeResizeListener: removeResizeListener\n };\n}\n\nvar AutoSizer = function (_React$PureComponent) {\n inherits(AutoSizer, _React$PureComponent);\n\n function AutoSizer() {\n var _ref;\n\n var _temp, _this, _ret;\n\n classCallCheck(this, AutoSizer);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = possibleConstructorReturn(this, (_ref = AutoSizer.__proto__ || Object.getPrototypeOf(AutoSizer)).call.apply(_ref, [this].concat(args))), _this), _this.state = {\n height: _this.props.defaultHeight || 0,\n width: _this.props.defaultWidth || 0\n }, _this._onResize = function () {\n var _this$props = _this.props,\n disableHeight = _this$props.disableHeight,\n disableWidth = _this$props.disableWidth,\n onResize = _this$props.onResize;\n\n\n if (_this._parentNode) {\n // Guard against AutoSizer component being removed from the DOM immediately after being added.\n // This can result in invalid style values which can result in NaN values if we don't handle them.\n // See issue #150 for more context.\n\n var _height = _this._parentNode.offsetHeight || 0;\n var _width = _this._parentNode.offsetWidth || 0;\n\n var _style = window.getComputedStyle(_this._parentNode) || {};\n var paddingLeft = parseInt(_style.paddingLeft, 10) || 0;\n var paddingRight = parseInt(_style.paddingRight, 10) || 0;\n var paddingTop = parseInt(_style.paddingTop, 10) || 0;\n var paddingBottom = parseInt(_style.paddingBottom, 10) || 0;\n\n var newHeight = _height - paddingTop - paddingBottom;\n var newWidth = _width - paddingLeft - paddingRight;\n\n if (!disableHeight && _this.state.height !== newHeight || !disableWidth && _this.state.width !== newWidth) {\n _this.setState({\n height: _height - paddingTop - paddingBottom,\n width: _width - paddingLeft - paddingRight\n });\n\n onResize({ height: _height, width: _width });\n }\n }\n }, _this._setRef = function (autoSizer) {\n _this._autoSizer = autoSizer;\n }, _temp), possibleConstructorReturn(_this, _ret);\n }\n\n createClass(AutoSizer, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var nonce = this.props.nonce;\n\n if (this._autoSizer && this._autoSizer.parentNode && this._autoSizer.parentNode.ownerDocument && this._autoSizer.parentNode.ownerDocument.defaultView && this._autoSizer.parentNode instanceof this._autoSizer.parentNode.ownerDocument.defaultView.HTMLElement) {\n // Delay access of parentNode until mount.\n // This handles edge-cases where the component has already been unmounted before its ref has been set,\n // As well as libraries like react-lite which have a slightly different lifecycle.\n this._parentNode = this._autoSizer.parentNode;\n\n // Defer requiring resize handler in order to support server-side rendering.\n // See issue #41\n this._detectElementResize = createDetectElementResize(nonce);\n this._detectElementResize.addResizeListener(this._parentNode, this._onResize);\n\n this._onResize();\n }\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n if (this._detectElementResize && this._parentNode) {\n this._detectElementResize.removeResizeListener(this._parentNode, this._onResize);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n children = _props.children,\n className = _props.className,\n disableHeight = _props.disableHeight,\n disableWidth = _props.disableWidth,\n style = _props.style;\n var _state = this.state,\n height = _state.height,\n width = _state.width;\n\n // Outer div should not force width/height since that may prevent containers from shrinking.\n // Inner component should overflow and use calculated width/height.\n // See issue #68 for more information.\n\n var outerStyle = { overflow: 'visible' };\n var childParams = {};\n\n // Avoid rendering children before the initial measurements have been collected.\n // At best this would just be wasting cycles.\n var bailoutOnChildren = false;\n\n if (!disableHeight) {\n if (height === 0) {\n bailoutOnChildren = true;\n }\n outerStyle.height = 0;\n childParams.height = height;\n }\n\n if (!disableWidth) {\n if (width === 0) {\n bailoutOnChildren = true;\n }\n outerStyle.width = 0;\n childParams.width = width;\n }\n\n return (0,external_React_.createElement)(\n 'div',\n {\n className: className,\n ref: this._setRef,\n style: _extends({}, outerStyle, style)\n },\n !bailoutOnChildren && children(childParams)\n );\n }\n }]);\n return AutoSizer;\n}(external_React_.PureComponent);\n\nAutoSizer.defaultProps = {\n onResize: function onResize() {},\n disableHeight: false,\n disableWidth: false,\n style: {}\n};\n\n/* harmony default export */ const index_esm = ((/* unused pure expression or super */ null && (AutoSizer)));\n\n;// CONCATENATED MODULE: ./static/js/options/options/typography/FontsList.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\nlet loadedFonts = [];\n\nconst loadGoogleFonts = font_families => {\n if (font_families.length === 0) return;\n loadedFonts = [...loadedFonts, ...font_families.map(_ref => {\n let {\n family\n } = _ref;\n return family;\n })];\n const googleFonts = font_families.map(_ref2 => {\n let {\n family\n } = _ref2;\n return family;\n }).filter(family => family.indexOf('ct_typekit') === -1);\n const typekitFonts = font_families.filter(_ref3 => {\n let {\n family\n } = _ref3;\n return family.indexOf('ct_typekit') > -1;\n });\n\n if (googleFonts.length > 0 || typekitFonts.length > 0) {\n webfontloader_default().load(_objectSpread(_objectSpread(_objectSpread({}, googleFonts.length > 0 ? {\n google: {\n families: googleFonts\n }\n } : {}), typekitFonts.length > 0 ? {\n typekit: {\n id: typekitFonts[0].kit\n }\n } : {}), {}, {\n classes: false,\n text: 'abcdefghijklmnopqrstuvwxyz'\n }));\n }\n};\n\nconst SingleFont = _ref4 => {\n let {\n data: {\n linearFontsList,\n onPickFamily,\n value\n },\n index,\n style\n } = _ref4;\n const family = linearFontsList[index];\n return (0,external_window_wp_element_.createElement)(\"div\", {\n style: style,\n onClick: () => onPickFamily(family),\n className: classnames_default()('ct-typography-single-font', `ct-${family.source}`, {\n active: family.family === value.family\n }),\n key: family.family\n }, (0,external_window_wp_element_.createElement)(\"span\", {\n className: \"ct-font-name\"\n }, familyForDisplay(family.display || family.family)), (0,external_window_wp_element_.createElement)(\"span\", {\n style: {\n fontFamily: fontFamilyToCSSFamily(family.family)\n },\n className: \"ct-font-preview\"\n }, \"Simply dummy text\"));\n};\n\nconst FontsList = _ref5 => {\n let {\n option,\n value,\n onPickFamily,\n typographyList,\n linearFontsList,\n currentView,\n searchTerm\n } = _ref5;\n const listRef = (0,external_window_wp_element_.useRef)(null);\n const timerRef = (0,external_window_wp_element_.useRef)(null);\n const [scrollTimer, setScrollTimer] = (0,external_window_wp_element_.useState)(null);\n (0,external_window_wp_element_.useEffect)(() => {\n if (value.family) {\n listRef.current.scrollToItem(linearFontsList.map(_ref6 => {\n let {\n family\n } = _ref6;\n return family;\n }).indexOf(value.family), 'start');\n }\n }, []);\n\n const onScroll = () => {\n scrollTimer && clearTimeout(scrollTimer);\n setScrollTimer(setTimeout(() => {\n if (!listRef.current) {\n return;\n }\n\n const [overscanStartIndex] = listRef.current._getRangeToRender();\n\n const perPage = 25;\n const totalPages = Math.ceil(linearFontsList.length / perPage);\n const startingPage = Math.ceil((overscanStartIndex + 1) / perPage); // const stopPage = Math.ceil((overscanStopIndex + 1) / perPage)\n\n const pageItems = [...Array(perPage)].map((_, i) => (startingPage - 1) * perPage + i).map(index => linearFontsList[index]).filter(s => !!s).filter(_ref7 => {\n let {\n source,\n family\n } = _ref7;\n return loadedFonts.indexOf(family) === -1 && (source === 'google' || source === 'typekit');\n });\n loadGoogleFonts(pageItems);\n }, 100));\n };\n\n (0,external_window_wp_element_.useEffect)(() => {\n onScroll();\n }, [linearFontsList]);\n return (0,external_window_wp_element_.createElement)(FixedSizeList, {\n height: 360,\n itemCount: linearFontsList.length,\n itemSize: 85,\n ref: listRef,\n onScroll: e => {\n onScroll();\n },\n itemData: {\n linearFontsList,\n onPickFamily,\n value\n },\n onItemsRendered: _ref8 => {\n let {\n overscanStartIndex,\n overscanStopIndex\n } = _ref8;\n },\n className: \"ct-typography-fonts\"\n }, SingleFont);\n};\n\n/* harmony default export */ const typography_FontsList = (FontsList);\n;// CONCATENATED MODULE: ./static/js/options/options/typography/VariationsList.js\nfunction VariationsList_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction VariationsList_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? VariationsList_ownKeys(Object(source), !0).forEach(function (key) { VariationsList_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : VariationsList_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction VariationsList_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst VariationsList = _ref => {\n let {\n option,\n value,\n onChange,\n typographyList,\n props\n } = _ref;\n const selectedFontFamily = findSelectedFontFamily(value.family, typographyList);\n const parentEl = (0,external_window_wp_element_.useRef)(null);\n (0,external_window_wp_element_.useEffect)(() => {\n if (!selectedFontFamily) {\n return;\n }\n\n parentEl.current.scrollTop = (parentEl.current.children[selectedFontFamily.all_variations.indexOf(value.variation)] || parentEl.current.children[0]).offsetTop - parentEl.current.offsetTop;\n }, [selectedFontFamily]);\n return (0,external_window_wp_element_.createElement)(react_spring_web_esm.animated.ul, {\n style: props,\n className: \"ct-typography-variations\",\n ref: parentEl\n }, selectedFontFamily && selectedFontFamily.all_variations.map(variation => (0,external_window_wp_element_.createElement)(\"li\", {\n onClick: () => onChange(VariationsList_objectSpread(VariationsList_objectSpread({}, value), {}, {\n variation\n })),\n className: classnames_default()({\n active: variation === value.variation\n }),\n key: variation\n }, (0,external_window_wp_element_.createElement)(\"span\", {\n className: \"ct-variation-name\",\n \"data-variation\": variation\n }, humanizeVariations(variation)))));\n};\n\n/* harmony default export */ const typography_VariationsList = (VariationsList);\n// EXTERNAL MODULE: ./static/js/options/GenericOptionType.js\nvar GenericOptionType = __webpack_require__(6095);\n;// CONCATENATED MODULE: ./static/js/options/options/typography/FontOptions.js\nfunction FontOptions_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction FontOptions_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? FontOptions_ownKeys(Object(source), !0).forEach(function (key) { FontOptions_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : FontOptions_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction FontOptions_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst FontOptions = _ref => {\n let {\n option,\n value,\n sizeRef,\n onChange,\n props\n } = _ref;\n return (0,external_window_wp_element_.createElement)(react_spring_web_esm.animated.ul, {\n style: props,\n className: \"ct-typography-options\",\n key: \"options\"\n }, (0,external_window_wp_element_.createElement)(\"li\", {\n key: \"size\"\n }, (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value.size,\n values: value,\n id: \"size\",\n option: {\n id: 'size',\n label: (0,external_window_wp_i18n_.__)('Font Size', 'blocksy'),\n type: 'ct-slider',\n value: option.value.size,\n ref: sizeRef,\n responsive: option.typography_responsive || true,\n units: [{\n unit: 'px',\n min: 0,\n max: 200\n }, {\n unit: 'em',\n min: 0,\n max: 50\n }, {\n unit: 'rem',\n min: 0,\n max: 50\n }, {\n unit: 'pt',\n min: 0,\n max: 50\n }, {\n unit: 'vw',\n min: 0,\n max: 100\n }]\n },\n hasRevertButton: true,\n onChange: newValue => onChange(FontOptions_objectSpread(FontOptions_objectSpread({}, value), {}, {\n size: newValue\n }))\n })), (0,external_window_wp_element_.createElement)(\"li\", {\n key: \"line-height\"\n }, (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['line-height'],\n values: value,\n id: \"line-height\",\n option: {\n id: 'line-height',\n label: (0,external_window_wp_i18n_.__)('Line Height', 'blocksy'),\n type: 'ct-slider',\n value: option.value['line-height'],\n responsive: option.typography_responsive || true,\n units: [{\n unit: '',\n min: 0,\n max: 10,\n decimals: 1\n }, {\n unit: 'px',\n min: 0,\n max: 100\n }, {\n unit: 'em',\n min: 0,\n max: 100\n }, {\n unit: 'pt',\n min: 0,\n max: 100\n }, {\n unit: '%',\n min: 0,\n max: 100\n }]\n },\n hasRevertButton: true,\n onChange: newValue => onChange(FontOptions_objectSpread(FontOptions_objectSpread({}, value), {}, {\n 'line-height': newValue\n }))\n })), (0,external_window_wp_element_.createElement)(\"li\", {\n key: \"letter-spacing\"\n }, (0,external_window_wp_element_.createElement)(GenericOptionType/* default */.ZP, {\n value: value['letter-spacing'],\n values: value,\n id: \"letter-spacing\",\n option: {\n id: 'letter-spacing',\n label: (0,external_window_wp_i18n_.__)('Letter Spacing', 'blocksy'),\n type: 'ct-slider',\n value: option.value['letter-spacing'],\n responsive: option.typography_responsive || true,\n defaultPosition: 'center',\n units: [{\n unit: 'em',\n min: -5,\n max: 5,\n decimals: 1\n }, {\n unit: 'px',\n min: -20,\n max: 20,\n decimals: 1\n }, {\n unit: 'rem',\n min: -5,\n max: 5,\n decimals: 1\n }]\n },\n hasRevertButton: true,\n onChange: newValue => onChange(FontOptions_objectSpread(FontOptions_objectSpread({}, value), {}, {\n 'letter-spacing': newValue\n }))\n })), (0,external_window_wp_element_.createElement)(\"li\", {\n key: \"variant\",\n className: \"ct-typography-variant\"\n }, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: classnames_default()('ct-text-transform')\n }, ['capitalize', 'uppercase'].map(variant => (0,external_window_wp_element_.createElement)(\"li\", {\n key: variant,\n onClick: () => onChange(FontOptions_objectSpread(FontOptions_objectSpread({}, value), {}, {\n 'text-transform': value['text-transform'] === variant ? 'none' : variant\n })),\n className: classnames_default()({\n active: variant === value['text-transform']\n }),\n \"data-variant\": variant\n }, (0,external_window_wp_element_.createElement)(\"i\", {\n className: \"ct-tooltip-top\"\n }, {\n capitalize: (0,external_window_wp_i18n_.__)('Capitalize', 'blocksy'),\n uppercase: (0,external_window_wp_i18n_.__)('Uppercase', 'blocksy')\n }[variant])))), (0,external_window_wp_element_.createElement)(\"ul\", {\n className: classnames_default()('ct-text-decoration')\n }, ['line-through', 'underline'].map(variant => (0,external_window_wp_element_.createElement)(\"li\", {\n key: variant,\n onClick: () => onChange(FontOptions_objectSpread(FontOptions_objectSpread({}, value), {}, {\n 'text-decoration': value['text-decoration'] === variant ? 'none' : variant\n })),\n className: classnames_default()({\n active: variant === value['text-decoration']\n }),\n \"data-variant\": variant\n }, (0,external_window_wp_element_.createElement)(\"i\", {\n className: \"ct-tooltip-top\"\n }, {\n 'line-through': (0,external_window_wp_i18n_.__)('Line Through', 'blocksy'),\n underline: (0,external_window_wp_i18n_.__)('Underline', 'blocksy')\n }[variant]))))));\n};\n\n/* harmony default export */ const typography_FontOptions = (FontOptions);\n;// CONCATENATED MODULE: ./static/js/options/options/typography/TypographyModal.js\nfunction TypographyModal_extends() { TypographyModal_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return TypographyModal_extends.apply(this, arguments); }\n\nfunction TypographyModal_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction TypographyModal_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? TypographyModal_ownKeys(Object(source), !0).forEach(function (key) { TypographyModal_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : TypographyModal_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction TypographyModal_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst combineRefs = function () {\n for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {\n refs[_key] = arguments[_key];\n }\n\n return el => {\n refs.map(ref => {\n if (typeof ref === 'function') {\n ref(el);\n } else if (typeof ref === 'object' && ref !== null && ref.hasOwnProperty('current')) {\n ref.current = el;\n } else if (ref === null) {// No-op\n }\n });\n };\n};\n\nfunction fuzzysearch(needle, haystack) {\n var hlen = haystack.length;\n var nlen = needle.length;\n\n if (nlen > hlen) {\n return false;\n }\n\n if (nlen === hlen) {\n return needle === haystack;\n }\n\n outer: for (var i = 0, j = 0; i < nlen; i++) {\n var nch = needle.charCodeAt(i);\n\n while (j < hlen) {\n if (haystack.charCodeAt(j++) === nch) {\n continue outer;\n }\n }\n\n return false;\n }\n\n return true;\n}\n\nconst TypographyModal = _ref => {\n let {\n option,\n value,\n initialView,\n currentView,\n previousView,\n setCurrentView,\n setInititialView,\n onChange,\n wrapperProps = {}\n } = _ref;\n const [typographyList, setTypographyList] = (0,external_window_wp_element_.useState)(getDefaultFonts(option));\n const [isSearch, setIsSearch] = (0,external_window_wp_element_.useState)(false);\n const [searchTerm, setSearchTerm] = (0,external_window_wp_element_.useState)('');\n const direction = (0,external_window_wp_element_.useMemo)(() => {\n if (previousView === '_') {\n return 'static';\n }\n\n if (currentView === 'search' && previousView === 'fonts' || previousView === 'search' && currentView === 'fonts') {\n return 'static';\n }\n\n if (previousView === 'options') {\n return 'right';\n }\n\n if (previousView === 'fonts' && currentView === 'variations') {\n return 'right';\n }\n\n return 'left';\n }, [currentView, previousView]);\n const inputEl = (0,external_window_wp_element_.useRef)(null);\n const sizeEl = (0,external_window_wp_element_.useRef)(null);\n const linearFontsList = Object.keys(typographyList).reduce((currentList, currentSource) => [...currentList, ...(typographyList[currentSource].families || []).filter(_ref2 => {\n let {\n family\n } = _ref2;\n return fuzzysearch(searchTerm.toLowerCase(), family.toLowerCase());\n })], []);\n\n const fetchFontsList = async () => {\n const body = new FormData();\n body.append('action', 'blocksy_get_fonts_list');\n\n try {\n const response = await fetch(ajaxurl, {\n method: 'POST',\n body\n });\n\n if (response.status === 200) {\n const {\n success,\n data\n } = await response.json();\n\n if (success) {\n setTypographyList(TypographyModal_objectSpread(TypographyModal_objectSpread({}, data.fonts), {}, {\n system: TypographyModal_objectSpread(TypographyModal_objectSpread({}, data.fonts.system), {}, {\n families: [...(option.isDefault ? [] : [{\n source: 'system',\n family: 'Default',\n variations: [],\n all_variations: ['Default', 'n1', 'i1', 'n2', 'i2', 'n3', 'i3', 'n4', 'i4', 'n5', 'i5', 'n6', 'i6', 'n7', 'i7', 'n8', 'i8', 'n9', 'i9']\n }]), ...data.fonts.system.families]\n })\n }));\n }\n }\n } catch (e) {}\n };\n\n (0,external_window_wp_element_.useEffect)(() => {\n if (initialView && initialView !== 'done') {\n setSearchTerm('');\n setTimeout(() => {// setInititialView('done')\n });\n }\n\n if (initialView === 'font_size') {\n setTimeout(() => sizeEl.current && sizeEl.current.focus(), 100);\n }\n }, [initialView]);\n (0,external_window_wp_element_.useEffect)(() => {\n fetchFontsList();\n }, []);\n (0,external_window_wp_element_.useEffect)(() => {\n if (currentView === 'search') {\n inputEl.current.focus();\n }\n }, [currentView]);\n\n const pickFontFamily = family => {\n onChange(TypographyModal_objectSpread(TypographyModal_objectSpread({}, value), {}, {\n family: family.family,\n variation: decideVariationToSelect(family, value)\n }));\n };\n\n return (0,external_window_wp_element_.createElement)(react_spring_web_esm.animated.div, TypographyModal_extends({\n className: \"ct-option-modal ct-typography-modal\"\n }, wrapperProps), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-typography-container\"\n }, (0,external_window_wp_element_.createElement)(\"ul\", {\n className: classnames_default()('ct-typography-top', {\n 'ct-switch-panel': currentView !== 'options',\n 'ct-static': previousView === '_'\n })\n }, (0,external_window_wp_element_.createElement)(\"li\", {\n className: \"ct-back\",\n onClick: () => setCurrentView('options')\n }, (0,external_window_wp_element_.createElement)(\"svg\", {\n width: \"10\",\n height: \"10\",\n viewBox: \"0 0 15 15\"\n }, (0,external_window_wp_element_.createElement)(\"path\", {\n d: \"M14.2,6.8H2.6l4-4c0.3-0.3,0.3-0.8,0-1.1c-0.3-0.3-0.8-0.3-1.1,0L0.2,7l0,0c0,0-0.1,0.1-0.1,0.1c0,0,0,0,0,0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1l0,0c0,0,0,0,0,0c0,0,0,0.1,0,0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0,0,0.1c0,0,0,0,0,0.1C0.2,8,0.2,8,0.2,8l5.3,5.3c0.3,0.3,0.8,0.3,1.1,0c0.3-0.3,0.3-0.8,0-1.1l-4-4h11.7c0.4,0,0.8-0.3,0.8-0.8S14.7,6.8,14.2,6.8z\"\n }))), (0,external_window_wp_element_.createElement)(\"li\", {\n className: classnames_default()('ct-font', {\n active: currentView === 'search' || currentView === 'fonts'\n }),\n onClick: () => {\n setCurrentView(currentView === 'fonts' ? 'search' : 'fonts');\n setSearchTerm('');\n }\n }, currentView !== 'search' && (0,external_window_wp_element_.createElement)(\"span\", null, familyForDisplay(value.family)), currentView === 'search' && (0,external_window_wp_element_.createElement)(\"input\", {\n onClick: e => e.stopPropagation(),\n ref: inputEl,\n autoFocus: true,\n value: searchTerm,\n onKeyUp: e => {\n if (e.keyCode == 13) {\n if (linearFontsList.length > 0) {\n pickFontFamily(linearFontsList[0]);\n setCurrentView('options');\n setSearchTerm('');\n }\n }\n },\n onChange: _ref3 => {\n let {\n target: {\n value\n }\n } = _ref3;\n return setSearchTerm(value);\n }\n }), (0,external_window_wp_element_.createElement)(\"svg\", {\n width: \"8\",\n height: \"8\",\n viewBox: \"0 0 15 15\"\n }, currentView === 'search' && (0,external_window_wp_element_.createElement)(\"path\", {\n d: \"M8.9,7.5l4.6-4.6c0.4-0.4,0.4-1,0-1.4c-0.4-0.4-1-0.4-1.4,0L7.5,6.1L2.9,1.5c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4l4.6,4.6l-4.6,4.6c-0.4,0.4-0.4,1,0,1.4c0.4,0.4,1,0.4,1.4,0l4.6-4.6l4.6,4.6c0.4,0.4,1,0.4,1.4,0c0.4-0.4,0.4-1,0-1.4L8.9,7.5z\"\n }), currentView !== 'search' && (0,external_window_wp_element_.createElement)(\"path\", {\n d: \"M14.6,14.6c-0.6,0.6-1.4,0.6-2,0l-2.5-2.5c-1,0.7-2.2,1-3.5,1C2.9,13.1,0,10.2,0,6.6S2.9,0,6.6,0c3.6,0,6.6,2.9,6.6,6.6c0,1.3-0.4,2.5-1,3.5l2.5,2.5C15.1,13.1,15.1,14,14.6,14.6z M6.6,1.9C4,1.9,1.9,4,1.9,6.6s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7C11.3,4,9.2,1.9,6.6,1.9z\"\n }))), (0,external_window_wp_element_.createElement)(\"li\", {\n className: classnames_default()('ct-weight', {\n active: currentView === 'variations'\n }),\n onClick: () => setCurrentView('variations')\n }, (0,external_window_wp_element_.createElement)(\"span\", {\n \"data-variation\": value.variation\n }, humanizeVariationsShort(value.variation)))), (0,external_window_wp_element_.createElement)(react_spring_web_esm.Transition, {\n items: currentView,\n immediate: direction === 'static',\n config: (item, type) => ({\n duration: 210,\n easing: src_default()(0.455, 0.03, 0.515, 0.955)\n }),\n from: {\n transform: direction === 'left' ? 'translateX(100%)' : 'translateX(-100%)',\n position: 'absolute'\n },\n enter: {\n transform: 'translateX(0%)',\n position: 'absolute'\n },\n leave: {\n position: 'absolute',\n transform: direction === 'left' ? 'translateX(-100%)' : 'translateX(100%)'\n }\n }, (props, currentView, transition, key) => {\n if (currentView === 'options') {\n return (0,external_window_wp_element_.createElement)(typography_FontOptions, {\n sizeRef: sizeEl,\n value: value,\n option: option,\n onChange: onChange,\n props: props,\n currentView: currentView\n });\n }\n\n if (currentView === 'fonts' || currentView === 'search') {\n return (0,external_window_wp_element_.createElement)(react_spring_web_esm.animated.div, {\n style: props,\n key: currentView\n }, (0,external_window_wp_element_.createElement)(typography_FontsList, {\n typographyList: typographyList,\n searchTerm: searchTerm,\n linearFontsList: linearFontsList,\n currentView: `${currentView}:${previousView}`,\n onPickFamily: family => {\n pickFontFamily(family); // setCurrentView('options')\n // setSearchTerm('')\n },\n value: value\n }));\n }\n\n if (currentView === 'variations') {\n return (0,external_window_wp_element_.createElement)(typography_VariationsList, {\n currentView: currentView,\n props: props,\n typographyList: typographyList,\n onChange: value => {\n onChange(value); // setCurrentView('options')\n },\n value: value\n });\n }\n })));\n};\n\n/* harmony default export */ const typography_TypographyModal = (TypographyModal);\n// EXTERNAL MODULE: ./static/js/options/options/react-outside-click-handler.js\nvar react_outside_click_handler = __webpack_require__(8204);\n// EXTERNAL MODULE: ./static/js/customizer/components/responsive-controls.js\nvar responsive_controls = __webpack_require__(4616);\n// EXTERNAL MODULE: ./static/js/options/helpers/usePopoverMaker.js\nvar usePopoverMaker = __webpack_require__(9144);\n;// CONCATENATED MODULE: ./static/js/options/options/ct-typography.js\nfunction ct_typography_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction ct_typography_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ct_typography_ownKeys(Object(source), !0).forEach(function (key) { ct_typography_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ct_typography_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction ct_typography_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\n\nconst getLeftForEl = (modal, el) => {\n if (!modal) return;\n if (!el) return;\n let style = getComputedStyle(modal);\n let wrapperLeft = parseFloat(style.left);\n el = el.getBoundingClientRect();\n return {\n '--option-modal-arrow-position': `${el.left + el.width / 2 - wrapperLeft - 6}px`\n };\n};\n\nconst Typography = _ref => {\n let {\n option: {\n label = '',\n desc = '',\n attr = {}\n },\n option,\n value,\n device,\n onChange\n } = _ref;\n // const [isOpen, setIsOpen] = useState(false)\n // options | fonts | variations | search\n const [currentViewCache, setCurrentViewCache] = (0,external_window_wp_element_.useState)('_:_');\n const typographyWrapper = (0,external_window_wp_element_.useRef)();\n let [currentView, previousView] = (0,external_window_wp_element_.useMemo)(() => currentViewCache.split(':'), [currentViewCache]);\n const setCurrentView = (0,external_window_wp_element_.useCallback)(newView => setCurrentViewCache(`${newView}:${currentView}`), [currentView]);\n const [{\n isOpen,\n isTransitioning\n }, setModalState] = (0,external_window_wp_element_.useState)({\n isOpen: false,\n isTransitioning: false\n });\n const {\n styles,\n popoverProps\n } = (0,usePopoverMaker/* default */.Z)({\n ref: typographyWrapper,\n defaultHeight: 430,\n shouldCalculate: isTransitioning || isOpen\n });\n\n const setIsOpen = isOpen => {\n setModalState(state => ct_typography_objectSpread(ct_typography_objectSpread({}, state), {}, {\n isOpen,\n isTransitioning: true\n }));\n };\n\n const stopTransitioning = () => setModalState(state => ct_typography_objectSpread(ct_typography_objectSpread({}, state), {}, {\n isTransitioning: false\n }));\n\n const fontFamilyRef = (0,external_window_wp_element_.useRef)();\n const fontSizeRef = (0,external_window_wp_element_.useRef)();\n const fontWeightRef = (0,external_window_wp_element_.useRef)();\n const dotsRef = (0,external_window_wp_element_.useRef)();\n const arrowLeft = (0,external_window_wp_element_.useMemo)(() => {\n const view = currentView;\n const futureRef = view === 'options' ? fontSizeRef.current : view === 'fonts' ? fontFamilyRef.current : view === 'variations' ? fontWeightRef.current : fontSizeRef.current;\n return popoverProps.ref && popoverProps.ref.current && getLeftForEl(popoverProps.ref.current, futureRef);\n }, [isOpen, currentView, popoverProps.ref, popoverProps.ref && popoverProps.ref.current, fontFamilyRef && fontFamilyRef.current, fontWeightRef && fontWeightRef.current, fontSizeRef && fontSizeRef.current, dotsRef && dotsRef.current]);\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()('ct-typography', {})\n }, (0,external_window_wp_element_.createElement)(react_outside_click_handler[\"default\"], {\n disabled: !isOpen,\n useCapture: false,\n className: \"ct-typohraphy-value\",\n additionalRefs: [popoverProps.ref],\n onOutsideClick: () => {\n setIsOpen(false);\n },\n wrapperProps: {\n ref: typographyWrapper,\n onClick: e => {\n e.preventDefault();\n\n if (isOpen) {\n setCurrentView('options');\n return;\n }\n\n setCurrentViewCache('options:_');\n setIsOpen('options');\n }\n }\n }, (0,external_window_wp_element_.createElement)(\"div\", null, (0,external_window_wp_element_.createElement)(\"span\", {\n onClick: e => {\n e.stopPropagation();\n\n if (isOpen) {\n setCurrentView('fonts');\n return;\n }\n\n setCurrentViewCache('fonts:_');\n setIsOpen('fonts');\n },\n className: \"ct-font\",\n ref: fontFamilyRef\n }, (0,external_window_wp_element_.createElement)(\"span\", null, value.family === 'Default' ? (0,external_window_wp_i18n_.__)('Default Family', 'blocksy') : familyForDisplay(value.family))), (0,external_window_wp_element_.createElement)(\"i\", null, \"/\"), (0,external_window_wp_element_.createElement)(\"span\", {\n onClick: e => {\n e.stopPropagation();\n\n if (isOpen) {\n setCurrentView('options');\n return;\n }\n\n setCurrentViewCache('options:_');\n setIsOpen('font_size');\n },\n ref: fontSizeRef,\n className: \"ct-size\"\n }, (0,external_window_wp_element_.createElement)(\"span\", null, (0,responsive_controls/* maybePromoteScalarValueIntoResponsive */.T)(value['size'])[device] === 'CT_CSS_SKIP_RULE' ? (0,external_window_wp_i18n_.__)('Default Size', 'blocksy') : (0,responsive_controls/* maybePromoteScalarValueIntoResponsive */.T)(value['size'])[device])), (0,external_window_wp_element_.createElement)(\"i\", null, \"/\"), (0,external_window_wp_element_.createElement)(\"span\", {\n ref: fontWeightRef,\n onClick: e => {\n e.stopPropagation();\n\n if (isOpen) {\n setCurrentView('variations');\n return;\n }\n\n setCurrentViewCache('variations:_');\n setIsOpen('variations');\n },\n className: \"ct-weight\"\n }, (0,external_window_wp_element_.createElement)(\"span\", null, humanizeVariations(value.variation)))), (0,external_window_wp_element_.createElement)(\"a\", {\n ref: dotsRef\n })), (isTransitioning || isOpen) && (0,external_window_wp_element_.createPortal)((0,external_window_wp_element_.createElement)(react_spring_web_esm.Transition, {\n items: isOpen,\n onRest: isOpen => {\n stopTransitioning();\n },\n config: {\n duration: 100,\n easing: src_default()(0.25, 0.1, 0.25, 1.0)\n },\n from: isOpen ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n },\n enter: isOpen ? {\n transform: 'scale3d(1, 1, 1)',\n opacity: 1\n } : {\n opacity: 1\n },\n leave: !isOpen ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n }\n }, (style, item) => {\n if (!item) {\n return null;\n }\n\n return (0,external_window_wp_element_.createElement)(typography_TypographyModal, {\n wrapperProps: ct_typography_objectSpread({\n style: ct_typography_objectSpread(ct_typography_objectSpread(ct_typography_objectSpread({}, style), styles), arrowLeft)\n }, popoverProps),\n onChange: onChange,\n value: value,\n option: option,\n initialView: item,\n setInititialView: initialView => setIsOpen(initialView),\n currentView: currentView,\n previousView: previousView,\n setCurrentView: setCurrentView\n });\n /*\n isOpen &&\n ((props) => (\n \t\n \t\t\tsetIsOpen(initialView)\n \t\t}\n \t\tcurrentView={currentView}\n \t\tpreviousView={previousView}\n \t\tsetCurrentView={setCurrentView}\n \t/>\n ))\n */\n }), document.body));\n};\n\n/* harmony default export */ const ct_typography = (Typography);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE4My5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTRDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFrREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzFnRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNyZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUNuU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy90eXBvZ3JhcGh5L2RlZmF1bHQtZGF0YS5qcz84NmVjIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy90eXBvZ3JhcGh5L2hlbHBlcnMuanM/ZTA4ZiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9tZW1vaXplLW9uZS9kaXN0L21lbW9pemUtb25lLmVzbS5qcz81YjBhIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXdpbmRvdy9kaXN0L2luZGV4LmVzbS5qcz84OTFkIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXZpcnR1YWxpemVkLWF1dG8tc2l6ZXIvZGlzdC9pbmRleC5lc20uanM/OGQ4YyIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvdHlwb2dyYXBoeS9Gb250c0xpc3QuanM/MWExYiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvdHlwb2dyYXBoeS9WYXJpYXRpb25zTGlzdC5qcz9mNjg2Iiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy90eXBvZ3JhcGh5L0ZvbnRPcHRpb25zLmpzPzcyMDkiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL3R5cG9ncmFwaHkvVHlwb2dyYXBoeU1vZGFsLmpzPzZhZmIiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2N0LXR5cG9ncmFwaHkuanM/N2NlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRGb250cyA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGlzRGVmYXVsdFxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIHtcbiAgICBzeXN0ZW06IHtcbiAgICAgIHR5cGU6ICdzeXN0ZW0nLFxuICAgICAgZmFtaWxpZXM6IFsuLi4oIWlzRGVmYXVsdCA/IFsnRGVmYXVsdCddIDogW10pLCAnU3lzdGVtIERlZmF1bHQnLCAnQXJpYWwnLCAnVmVyZGFuYScsICdUcmVidWNoZXQnLCAnR2VvcmdpYScsICdUaW1lcyBOZXcgUm9tYW4nLCAnUGFsYXRpbm8nLCAnSGVsdmV0aWNhJywgJ015cmlhZCBQcm8nLCAnTHVjaWRhJywgJ0dpbGwgU2FucycsICdJbXBhY3QnLCAnU2VyaWYnLCAnbW9ub3NwYWNlJ10ubWFwKGZhbWlseSA9PiAoe1xuICAgICAgICBzb3VyY2U6ICdzeXN0ZW0nLFxuICAgICAgICBmYW1pbHksXG4gICAgICAgIGRpc3BsYXk6IGZhbWlseSA9PT0gJ1N5c3RlbSBEZWZhdWx0JyA/IF9fKCdTeXN0ZW0gRGVmYXVsdCcsICdibG9ja3N5JykgOiBmYW1pbHksXG4gICAgICAgIHZhcmlhdGlvbnM6IFtdLFxuICAgICAgICBhbGxfdmFyaWF0aW9uczogWy4uLihmYW1pbHkgPT09ICdEZWZhdWx0JyA/IFsnRGVmYXVsdCddIDogW10pLCAnbjEnLCAnaTEnLCAnbjInLCAnaTInLCAnbjMnLCAnaTMnLCAnbjQnLCAnaTQnLCAnbjUnLCAnaTUnLCAnbjYnLCAnaTYnLCAnbjcnLCAnaTcnLCAnbjgnLCAnaTgnLCAnbjknLCAnaTknXVxuICAgICAgfSkpXG4gICAgfVxuICB9O1xufTsiLCJpbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuZXhwb3J0IGNvbnN0IGZvbnRGYW1pbHlUb0NTU0ZhbWlseSA9IGZhbWlseSA9PiB7XG4gIGlmIChmYW1pbHkgPT09ICdTeXN0ZW0gRGVmYXVsdCcpIHtcbiAgICByZXR1cm4gXCItYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiwgJ0FwcGxlIENvbG9yIEVtb2ppJywgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCdcIjtcbiAgfVxuXG4gIHJldHVybiBmYW1pbHkucmVwbGFjZSgnY3RfdHlwZWtpdF8nLCAnJyk7XG59O1xuXG5jb25zdCBmaW5kU291cmNlVHlwZVNldHRpbmdzRm9yID0gKGZvbnRfZmFtaWx5LCBmb250c19saXN0KSA9PiBPYmplY3QudmFsdWVzKGZvbnRzX2xpc3QpLmZpbmQoc2luZ2xlX2ZvbnRfc291cmNlID0+IHNpbmdsZV9mb250X3NvdXJjZS5mYW1pbGllcy5tYXAoX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZmFtaWx5XG4gIH0gPSBfcmVmO1xuICByZXR1cm4gZmFtaWx5O1xufSkuaW5kZXhPZihmb250X2ZhbWlseSkgPiAtMSk7XG5cbmV4cG9ydCBjb25zdCBmaW5kU291cmNlVHlwZUZvciA9IChmb250X2ZhbWlseSwgZm9udHNfbGlzdCkgPT4ge1xuICBsZXQgc291cmNlID0gZmluZFNvdXJjZVR5cGVTZXR0aW5nc0Zvcihmb250X2ZhbWlseSwgZm9udHNfbGlzdCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBzb3VyY2UudHlwZTtcbn07XG5leHBvcnQgY29uc3QgZmluZFNlbGVjdGVkRm9udEZhbWlseSA9IChmb250X2ZhbWlseSwgZm9udHNfbGlzdCkgPT4ge1xuICBsZXQgc291cmNlID0gZmluZFNvdXJjZVR5cGVTZXR0aW5nc0Zvcihmb250X2ZhbWlseSwgZm9udHNfbGlzdCk7XG5cbiAgaWYgKCFzb3VyY2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBzb3VyY2UuZmFtaWxpZXMuZmluZChfcmVmMiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGZhbWlseVxuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gZmFtaWx5ID09PSBmb250X2ZhbWlseTtcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IGRlY2lkZVZhcmlhdGlvblRvU2VsZWN0ID0gKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xuICBpZiAobmV3VmFsdWUuYWxsX3ZhcmlhdGlvbnMuaW5kZXhPZihvbGRWYWx1ZS52YXJpYXRpb24pID4gLTEpIHtcbiAgICByZXR1cm4gb2xkVmFsdWUudmFyaWF0aW9uO1xuICB9XG5cbiAgaWYgKG5ld1ZhbHVlLmFsbF92YXJpYXRpb25zLmluZGV4T2YoJ240JykgPiAtMSkge1xuICAgIHJldHVybiAnbjQnO1xuICB9XG5cbiAgcmV0dXJuIG5ld1ZhbHVlLmFsbF92YXJpYXRpb25zWzBdO1xufTtcbmV4cG9ydCBjb25zdCBodW1hbml6ZVZhcmlhdGlvbnNTaG9ydCA9IHZhcmlhdGlvbiA9PiB7XG4gIHZhciBhbGwgPSB7XG4gICAgbjE6ICcxMDAnLFxuICAgIGkxOiAnMTAwJyxcbiAgICBuMjogJzIwMCcsXG4gICAgaTI6ICcyMDAnLFxuICAgIG4zOiAnMzAwJyxcbiAgICBpMzogJzMwMCcsXG4gICAgbjQ6ICc0MDAnLFxuICAgIGk0OiAnNDAwJyxcbiAgICBuNTogJzUwMCcsXG4gICAgaTU6ICc1MDAnLFxuICAgIG42OiAnNjAwJyxcbiAgICBpNjogJzYwMCcsXG4gICAgbjc6ICc3MDAnLFxuICAgIGk3OiAnNzAwJyxcbiAgICBuODogJzgwMCcsXG4gICAgaTg6ICc4MDAnLFxuICAgIG45OiAnOTAwJyxcbiAgICBpOTogJzkwMCcsXG4gICAgRGVmYXVsdDogX18oJ0RlZmF1bHQnLCAnYmxvY2tzeScpXG4gIH07XG4gIHJldHVybiBhbGxbdmFyaWF0aW9uXTtcbn07XG5leHBvcnQgY29uc3QgaHVtYW5pemVWYXJpYXRpb25zID0gdmFyaWF0aW9uID0+IHtcbiAgdmFyIGFsbCA9IHtcbiAgICBuMTogX18oJ1RoaW4gMTAwJywgJ2Jsb2Nrc3knKSxcbiAgICBpMTogX18oJ1RoaW4gMTAwIEl0YWxpYycsICdibG9ja3N5JyksXG4gICAgbjI6IF9fKCdFeHRyYS1MaWdodCAyMDAnLCAnYmxvY2tzeScpLFxuICAgIGkyOiBfXygnRXh0cmEtTGlnaHQgMjAwIEl0YWxpYycsICdibG9ja3N5JyksXG4gICAgbjM6IF9fKCdMaWdodCAzMDAnLCAnYmxvY2tzeScpLFxuICAgIGkzOiBfXygnTGlnaHQgMzAwIEl0YWxpYycsICdibG9ja3N5JyksXG4gICAgbjQ6IF9fKCdSZWd1bGFyJywgJ2Jsb2Nrc3knKSxcbiAgICBpNDogX18oJ1JlZ3VsYXIgNDAwIEl0YWxpYycsICdibG9ja3N5JyksXG4gICAgbjU6IF9fKCdNZWRpdW0gNTAwJywgJ2Jsb2Nrc3knKSxcbiAgICBpNTogX18oJ01lZGl1bSA1MDAgSXRhbGljJywgJ2Jsb2Nrc3knKSxcbiAgICBuNjogX18oJ1NlbWktQm9sZCA2MDAnLCAnYmxvY2tzeScpLFxuICAgIGk2OiBfXygnU2VtaS1Cb2xkIDYwMCBJdGFsaWMnLCAnYmxvY2tzeScpLFxuICAgIG43OiBfXygnQm9sZCA3MDAnLCAnYmxvY2tzeScpLFxuICAgIGk3OiBfXygnQm9sZCA3MDAgSXRhbGljJywgJ2Jsb2Nrc3knKSxcbiAgICBuODogX18oJ0V4dHJhLUJvbGQgODAwJywgJ2Jsb2Nrc3knKSxcbiAgICBpODogX18oJ0V4dHJhLUJvbGQgODAwIEl0YWxpYycsICdibG9ja3N5JyksXG4gICAgbjk6IF9fKCdVbHRyYS1Cb2xkIDkwMCcsICdibG9ja3N5JyksXG4gICAgaTk6IF9fKCdVbHRyYS1Cb2xkIDkwMCBJdGFsaWMnLCAnYmxvY2tzeScpLFxuICAgIERlZmF1bHQ6IF9fKCdEZWZhdWx0IFdlaWdodCcsICdibG9ja3N5JylcbiAgfTtcbiAgcmV0dXJuIGFsbFt2YXJpYXRpb25dO1xufTtcbmV4cG9ydCBjb25zdCBmYW1pbHlGb3JEaXNwbGF5ID0gZmFtaWx5ID0+IHtcbiAgaWYgKGZhbWlseS5pbmRleE9mKCdjdF9mb250JykgPT09IDApIHtcbiAgICByZXR1cm4gZmFtaWx5LnJlcGxhY2UoJ2N0X2ZvbnRfJywgJycpLnJlcGxhY2UoLyhbLV9dW2Etel0pL2dpLCAkMSA9PiAkMS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoJy0nLCAnJykucmVwbGFjZSgnXycsICcnKSk7XG4gIH1cblxuICBpZiAoZmFtaWx5LmluZGV4T2YoJ2N0X3R5cGVraXQnKSA9PT0gMCkge1xuICAgIHJldHVybiBmYW1pbHkucmVwbGFjZSgnY3RfdHlwZWtpdF8nLCAnJykucmVwbGFjZSgvKFstX11bYS16XSkvZ2ksICQxID0+ICQxLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgnLScsICcgJykucmVwbGFjZSgnXycsICcgJykpO1xuICB9XG5cbiAgaWYgKGZhbWlseSA9PT0gJ1N5c3RlbSBEZWZhdWx0Jykge1xuICAgIHJldHVybiBfXygnU3lzdGVtIERlZmF1bHQnLCAnYmxvY2tzeScpO1xuICB9XG5cbiAgaWYgKGZhbWlseSA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgcmV0dXJuIF9fKCdEZWZhdWx0JywgJ2Jsb2Nrc3knKTtcbiAgfVxuXG4gIHJldHVybiBmYW1pbHk7XG59OyIsInZhciBzYWZlSXNOYU4gPSBOdW1iZXIuaXNOYU4gfHxcbiAgICBmdW5jdGlvbiBwb255ZmlsbCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gdmFsdWU7XG4gICAgfTtcbmZ1bmN0aW9uIGlzRXF1YWwoZmlyc3QsIHNlY29uZCkge1xuICAgIGlmIChmaXJzdCA9PT0gc2Vjb25kKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoc2FmZUlzTmFOKGZpcnN0KSAmJiBzYWZlSXNOYU4oc2Vjb25kKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gYXJlSW5wdXRzRXF1YWwobmV3SW5wdXRzLCBsYXN0SW5wdXRzKSB7XG4gICAgaWYgKG5ld0lucHV0cy5sZW5ndGggIT09IGxhc3RJbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdJbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFpc0VxdWFsKG5ld0lucHV0c1tpXSwgbGFzdElucHV0c1tpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWVtb2l6ZU9uZShyZXN1bHRGbiwgaXNFcXVhbCkge1xuICAgIGlmIChpc0VxdWFsID09PSB2b2lkIDApIHsgaXNFcXVhbCA9IGFyZUlucHV0c0VxdWFsOyB9XG4gICAgdmFyIGxhc3RUaGlzO1xuICAgIHZhciBsYXN0QXJncyA9IFtdO1xuICAgIHZhciBsYXN0UmVzdWx0O1xuICAgIHZhciBjYWxsZWRPbmNlID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgICAgIHZhciBuZXdBcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBuZXdBcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGxlZE9uY2UgJiYgbGFzdFRoaXMgPT09IHRoaXMgJiYgaXNFcXVhbChuZXdBcmdzLCBsYXN0QXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxhc3RSZXN1bHQgPSByZXN1bHRGbi5hcHBseSh0aGlzLCBuZXdBcmdzKTtcbiAgICAgICAgY2FsbGVkT25jZSA9IHRydWU7XG4gICAgICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICAgICAgbGFzdEFyZ3MgPSBuZXdBcmdzO1xuICAgICAgICByZXR1cm4gbGFzdFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZW1vaXplT25lO1xuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkJztcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlJztcbmltcG9ydCBtZW1vaXplT25lIGZyb20gJ21lbW9pemUtb25lJztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSc7XG5cbi8vIEFuaW1hdGlvbiBmcmFtZSBiYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBzZXRUaW1lb3V0LlxuLy8gSW5zcGlyZWQgYnkgSm9lIExhbWJlcnQsIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2pvZWxhbWJlcnQvMTAwMjExNiNmaWxlLXJlcXVlc3R0aW1lb3V0LWpzXG52YXIgaGFzTmF0aXZlUGVyZm9ybWFuY2VOb3cgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbic7XG52YXIgbm93ID0gaGFzTmF0aXZlUGVyZm9ybWFuY2VOb3cgPyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbn0gOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufTtcbmZ1bmN0aW9uIGNhbmNlbFRpbWVvdXQodGltZW91dElEKSB7XG4gIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVvdXRJRC5pZCk7XG59XG5mdW5jdGlvbiByZXF1ZXN0VGltZW91dChjYWxsYmFjaywgZGVsYXkpIHtcbiAgdmFyIHN0YXJ0ID0gbm93KCk7XG5cbiAgZnVuY3Rpb24gdGljaygpIHtcbiAgICBpZiAobm93KCkgLSBzdGFydCA+PSBkZWxheSkge1xuICAgICAgY2FsbGJhY2suY2FsbChudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZW91dElELmlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIH1cbiAgfVxuXG4gIHZhciB0aW1lb3V0SUQgPSB7XG4gICAgaWQ6IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICB9O1xuICByZXR1cm4gdGltZW91dElEO1xufVxuXG52YXIgc2l6ZSA9IC0xOyAvLyBUaGlzIHV0aWxpdHkgY29waWVkIGZyb20gXCJkb20taGVscGVyc1wiIHBhY2thZ2UuXG5cbmZ1bmN0aW9uIGdldFNjcm9sbGJhclNpemUocmVjYWxjdWxhdGUpIHtcbiAgaWYgKHJlY2FsY3VsYXRlID09PSB2b2lkIDApIHtcbiAgICByZWNhbGN1bGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHNpemUgPT09IC0xIHx8IHJlY2FsY3VsYXRlKSB7XG4gICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHZhciBzdHlsZSA9IGRpdi5zdHlsZTtcbiAgICBzdHlsZS53aWR0aCA9ICc1MHB4JztcbiAgICBzdHlsZS5oZWlnaHQgPSAnNTBweCc7XG4gICAgc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgc2l6ZSA9IGRpdi5vZmZzZXRXaWR0aCAtIGRpdi5jbGllbnRXaWR0aDtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7XG4gIH1cblxuICByZXR1cm4gc2l6ZTtcbn1cbnZhciBjYWNoZWRSVExSZXN1bHQgPSBudWxsOyAvLyBUUklDS1kgQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCBzY3JvbGxMZWZ0IHNob3VsZCBiZSBuZWdhdGl2ZSBmb3IgUlRMIGFsaWduZWQgZWxlbWVudHMuXG4vLyBDaHJvbWUgZG9lcyBub3Qgc2VlbSB0byBhZGhlcmU7IGl0cyBzY3JvbGxMZWZ0IHZhbHVlcyBhcmUgcG9zaXRpdmUgKG1lYXN1cmVkIHJlbGF0aXZlIHRvIHRoZSBsZWZ0KS5cbi8vIFNhZmFyaSdzIGVsYXN0aWMgYm91bmNlIG1ha2VzIGRldGVjdGluZyB0aGlzIGV2ZW4gbW9yZSBjb21wbGljYXRlZCB3cnQgcG90ZW50aWFsIGZhbHNlIHBvc2l0aXZlcy5cbi8vIFRoZSBzYWZlc3Qgd2F5IHRvIGNoZWNrIHRoaXMgaXMgdG8gaW50ZW50aW9uYWxseSBzZXQgYSBuZWdhdGl2ZSBvZmZzZXQsXG4vLyBhbmQgdGhlbiB2ZXJpZnkgdGhhdCB0aGUgc3Vic2VxdWVudCBcInNjcm9sbFwiIGV2ZW50IG1hdGNoZXMgdGhlIG5lZ2F0aXZlIG9mZnNldC5cbi8vIElmIGl0IGRvZXMgbm90IG1hdGNoLCB0aGVuIHdlIGNhbiBhc3N1bWUgYSBub24tc3RhbmRhcmQgUlRMIHNjcm9sbCBpbXBsZW1lbnRhdGlvbi5cblxuZnVuY3Rpb24gZ2V0UlRMT2Zmc2V0VHlwZShyZWNhbGN1bGF0ZSkge1xuICBpZiAocmVjYWxjdWxhdGUgPT09IHZvaWQgMCkge1xuICAgIHJlY2FsY3VsYXRlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoY2FjaGVkUlRMUmVzdWx0ID09PSBudWxsIHx8IHJlY2FsY3VsYXRlKSB7XG4gICAgdmFyIG91dGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdmFyIG91dGVyU3R5bGUgPSBvdXRlckRpdi5zdHlsZTtcbiAgICBvdXRlclN0eWxlLndpZHRoID0gJzUwcHgnO1xuICAgIG91dGVyU3R5bGUuaGVpZ2h0ID0gJzUwcHgnO1xuICAgIG91dGVyU3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcbiAgICBvdXRlclN0eWxlLmRpcmVjdGlvbiA9ICdydGwnO1xuICAgIHZhciBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHZhciBpbm5lclN0eWxlID0gaW5uZXJEaXYuc3R5bGU7XG4gICAgaW5uZXJTdHlsZS53aWR0aCA9ICcxMDBweCc7XG4gICAgaW5uZXJTdHlsZS5oZWlnaHQgPSAnMTAwcHgnO1xuICAgIG91dGVyRGl2LmFwcGVuZENoaWxkKGlubmVyRGl2KTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyRGl2KTtcblxuICAgIGlmIChvdXRlckRpdi5zY3JvbGxMZWZ0ID4gMCkge1xuICAgICAgY2FjaGVkUlRMUmVzdWx0ID0gJ3Bvc2l0aXZlLWRlc2NlbmRpbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRlckRpdi5zY3JvbGxMZWZ0ID0gMTtcblxuICAgICAgaWYgKG91dGVyRGl2LnNjcm9sbExlZnQgPT09IDApIHtcbiAgICAgICAgY2FjaGVkUlRMUmVzdWx0ID0gJ25lZ2F0aXZlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlZFJUTFJlc3VsdCA9ICdwb3NpdGl2ZS1hc2NlbmRpbmcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQob3V0ZXJEaXYpO1xuICAgIHJldHVybiBjYWNoZWRSVExSZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gY2FjaGVkUlRMUmVzdWx0O1xufVxuXG52YXIgSVNfU0NST0xMSU5HX0RFQk9VTkNFX0lOVEVSVkFMID0gMTUwO1xuXG52YXIgZGVmYXVsdEl0ZW1LZXkgPSBmdW5jdGlvbiBkZWZhdWx0SXRlbUtleShfcmVmKSB7XG4gIHZhciBjb2x1bW5JbmRleCA9IF9yZWYuY29sdW1uSW5kZXgsXG4gICAgICBkYXRhID0gX3JlZi5kYXRhLFxuICAgICAgcm93SW5kZXggPSBfcmVmLnJvd0luZGV4O1xuICByZXR1cm4gcm93SW5kZXggKyBcIjpcIiArIGNvbHVtbkluZGV4O1xufTsgLy8gSW4gREVWIG1vZGUsIHRoaXMgU2V0IGhlbHBzIHVzIG9ubHkgbG9nIGEgd2FybmluZyBvbmNlIHBlciBjb21wb25lbnQgaW5zdGFuY2UuXG4vLyBUaGlzIGF2b2lkcyBzcGFtbWluZyB0aGUgY29uc29sZSBldmVyeSB0aW1lIGEgcmVuZGVyIGhhcHBlbnMuXG5cblxudmFyIGRldldhcm5pbmdzT3ZlcnNjYW5Db3VudCA9IG51bGw7XG52YXIgZGV2V2FybmluZ3NPdmVyc2NhblJvd3NDb2x1bW5zQ291bnQgPSBudWxsO1xudmFyIGRldldhcm5pbmdzVGFnTmFtZSA9IG51bGw7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LldlYWtTZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGV2V2FybmluZ3NPdmVyc2NhbkNvdW50ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgZGV2V2FybmluZ3NPdmVyc2NhblJvd3NDb2x1bW5zQ291bnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICBkZXZXYXJuaW5nc1RhZ05hbWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVHcmlkQ29tcG9uZW50KF9yZWYyKSB7XG4gIHZhciBfY2xhc3M7XG5cbiAgdmFyIGdldENvbHVtbk9mZnNldCA9IF9yZWYyLmdldENvbHVtbk9mZnNldCxcbiAgICAgIGdldENvbHVtblN0YXJ0SW5kZXhGb3JPZmZzZXQgPSBfcmVmMi5nZXRDb2x1bW5TdGFydEluZGV4Rm9yT2Zmc2V0LFxuICAgICAgZ2V0Q29sdW1uU3RvcEluZGV4Rm9yU3RhcnRJbmRleCA9IF9yZWYyLmdldENvbHVtblN0b3BJbmRleEZvclN0YXJ0SW5kZXgsXG4gICAgICBnZXRDb2x1bW5XaWR0aCA9IF9yZWYyLmdldENvbHVtbldpZHRoLFxuICAgICAgZ2V0RXN0aW1hdGVkVG90YWxIZWlnaHQgPSBfcmVmMi5nZXRFc3RpbWF0ZWRUb3RhbEhlaWdodCxcbiAgICAgIGdldEVzdGltYXRlZFRvdGFsV2lkdGggPSBfcmVmMi5nZXRFc3RpbWF0ZWRUb3RhbFdpZHRoLFxuICAgICAgZ2V0T2Zmc2V0Rm9yQ29sdW1uQW5kQWxpZ25tZW50ID0gX3JlZjIuZ2V0T2Zmc2V0Rm9yQ29sdW1uQW5kQWxpZ25tZW50LFxuICAgICAgZ2V0T2Zmc2V0Rm9yUm93QW5kQWxpZ25tZW50ID0gX3JlZjIuZ2V0T2Zmc2V0Rm9yUm93QW5kQWxpZ25tZW50LFxuICAgICAgZ2V0Um93SGVpZ2h0ID0gX3JlZjIuZ2V0Um93SGVpZ2h0LFxuICAgICAgZ2V0Um93T2Zmc2V0ID0gX3JlZjIuZ2V0Um93T2Zmc2V0LFxuICAgICAgZ2V0Um93U3RhcnRJbmRleEZvck9mZnNldCA9IF9yZWYyLmdldFJvd1N0YXJ0SW5kZXhGb3JPZmZzZXQsXG4gICAgICBnZXRSb3dTdG9wSW5kZXhGb3JTdGFydEluZGV4ID0gX3JlZjIuZ2V0Um93U3RvcEluZGV4Rm9yU3RhcnRJbmRleCxcbiAgICAgIGluaXRJbnN0YW5jZVByb3BzID0gX3JlZjIuaW5pdEluc3RhbmNlUHJvcHMsXG4gICAgICBzaG91bGRSZXNldFN0eWxlQ2FjaGVPbkl0ZW1TaXplQ2hhbmdlID0gX3JlZjIuc2hvdWxkUmVzZXRTdHlsZUNhY2hlT25JdGVtU2l6ZUNoYW5nZSxcbiAgICAgIHZhbGlkYXRlUHJvcHMgPSBfcmVmMi52YWxpZGF0ZVByb3BzO1xuICByZXR1cm4gX2NsYXNzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICAgIF9pbmhlcml0c0xvb3NlKEdyaWQsIF9QdXJlQ29tcG9uZW50KTtcblxuICAgIC8vIEFsd2F5cyB1c2UgZXhwbGljaXQgY29uc3RydWN0b3IgZm9yIFJlYWN0IGNvbXBvbmVudHMuXG4gICAgLy8gSXQgcHJvZHVjZXMgbGVzcyBjb2RlIGFmdGVyIHRyYW5zcGlsYXRpb24uICgjMjYpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY29uc3RydWN0b3JcbiAgICBmdW5jdGlvbiBHcmlkKHByb3BzKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgIF90aGlzID0gX1B1cmVDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAgIF90aGlzLl9pbnN0YW5jZVByb3BzID0gaW5pdEluc3RhbmNlUHJvcHMoX3RoaXMucHJvcHMsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICAgIF90aGlzLl9yZXNldElzU2Nyb2xsaW5nVGltZW91dElkID0gbnVsbDtcbiAgICAgIF90aGlzLl9vdXRlclJlZiA9IHZvaWQgMDtcbiAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICBpbnN0YW5jZTogX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksXG4gICAgICAgIGlzU2Nyb2xsaW5nOiBmYWxzZSxcbiAgICAgICAgaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbjogJ2ZvcndhcmQnLFxuICAgICAgICBzY3JvbGxMZWZ0OiB0eXBlb2YgX3RoaXMucHJvcHMuaW5pdGlhbFNjcm9sbExlZnQgPT09ICdudW1iZXInID8gX3RoaXMucHJvcHMuaW5pdGlhbFNjcm9sbExlZnQgOiAwLFxuICAgICAgICBzY3JvbGxUb3A6IHR5cGVvZiBfdGhpcy5wcm9wcy5pbml0aWFsU2Nyb2xsVG9wID09PSAnbnVtYmVyJyA/IF90aGlzLnByb3BzLmluaXRpYWxTY3JvbGxUb3AgOiAwLFxuICAgICAgICBzY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQ6IGZhbHNlLFxuICAgICAgICB2ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbjogJ2ZvcndhcmQnXG4gICAgICB9O1xuICAgICAgX3RoaXMuX2NhbGxPbkl0ZW1zUmVuZGVyZWQgPSB2b2lkIDA7XG4gICAgICBfdGhpcy5fY2FsbE9uSXRlbXNSZW5kZXJlZCA9IG1lbW9pemVPbmUoZnVuY3Rpb24gKG92ZXJzY2FuQ29sdW1uU3RhcnRJbmRleCwgb3ZlcnNjYW5Db2x1bW5TdG9wSW5kZXgsIG92ZXJzY2FuUm93U3RhcnRJbmRleCwgb3ZlcnNjYW5Sb3dTdG9wSW5kZXgsIHZpc2libGVDb2x1bW5TdGFydEluZGV4LCB2aXNpYmxlQ29sdW1uU3RvcEluZGV4LCB2aXNpYmxlUm93U3RhcnRJbmRleCwgdmlzaWJsZVJvd1N0b3BJbmRleCkge1xuICAgICAgICByZXR1cm4gX3RoaXMucHJvcHMub25JdGVtc1JlbmRlcmVkKHtcbiAgICAgICAgICBvdmVyc2NhbkNvbHVtblN0YXJ0SW5kZXg6IG92ZXJzY2FuQ29sdW1uU3RhcnRJbmRleCxcbiAgICAgICAgICBvdmVyc2NhbkNvbHVtblN0b3BJbmRleDogb3ZlcnNjYW5Db2x1bW5TdG9wSW5kZXgsXG4gICAgICAgICAgb3ZlcnNjYW5Sb3dTdGFydEluZGV4OiBvdmVyc2NhblJvd1N0YXJ0SW5kZXgsXG4gICAgICAgICAgb3ZlcnNjYW5Sb3dTdG9wSW5kZXg6IG92ZXJzY2FuUm93U3RvcEluZGV4LFxuICAgICAgICAgIHZpc2libGVDb2x1bW5TdGFydEluZGV4OiB2aXNpYmxlQ29sdW1uU3RhcnRJbmRleCxcbiAgICAgICAgICB2aXNpYmxlQ29sdW1uU3RvcEluZGV4OiB2aXNpYmxlQ29sdW1uU3RvcEluZGV4LFxuICAgICAgICAgIHZpc2libGVSb3dTdGFydEluZGV4OiB2aXNpYmxlUm93U3RhcnRJbmRleCxcbiAgICAgICAgICB2aXNpYmxlUm93U3RvcEluZGV4OiB2aXNpYmxlUm93U3RvcEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBfdGhpcy5fY2FsbE9uU2Nyb2xsID0gdm9pZCAwO1xuICAgICAgX3RoaXMuX2NhbGxPblNjcm9sbCA9IG1lbW9pemVPbmUoZnVuY3Rpb24gKHNjcm9sbExlZnQsIHNjcm9sbFRvcCwgaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiwgdmVydGljYWxTY3JvbGxEaXJlY3Rpb24sIHNjcm9sbFVwZGF0ZVdhc1JlcXVlc3RlZCkge1xuICAgICAgICByZXR1cm4gX3RoaXMucHJvcHMub25TY3JvbGwoe1xuICAgICAgICAgIGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb246IGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24sXG4gICAgICAgICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICAgICAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcCxcbiAgICAgICAgICB2ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbjogdmVydGljYWxTY3JvbGxEaXJlY3Rpb24sXG4gICAgICAgICAgc2Nyb2xsVXBkYXRlV2FzUmVxdWVzdGVkOiBzY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIF90aGlzLl9nZXRJdGVtU3R5bGUgPSB2b2lkIDA7XG5cbiAgICAgIF90aGlzLl9nZXRJdGVtU3R5bGUgPSBmdW5jdGlvbiAocm93SW5kZXgsIGNvbHVtbkluZGV4KSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgY29sdW1uV2lkdGggPSBfdGhpcyRwcm9wcy5jb2x1bW5XaWR0aCxcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzLmRpcmVjdGlvbixcbiAgICAgICAgICAgIHJvd0hlaWdodCA9IF90aGlzJHByb3BzLnJvd0hlaWdodDtcblxuICAgICAgICB2YXIgaXRlbVN0eWxlQ2FjaGUgPSBfdGhpcy5fZ2V0SXRlbVN0eWxlQ2FjaGUoc2hvdWxkUmVzZXRTdHlsZUNhY2hlT25JdGVtU2l6ZUNoYW5nZSAmJiBjb2x1bW5XaWR0aCwgc2hvdWxkUmVzZXRTdHlsZUNhY2hlT25JdGVtU2l6ZUNoYW5nZSAmJiBkaXJlY3Rpb24sIHNob3VsZFJlc2V0U3R5bGVDYWNoZU9uSXRlbVNpemVDaGFuZ2UgJiYgcm93SGVpZ2h0KTtcblxuICAgICAgICB2YXIga2V5ID0gcm93SW5kZXggKyBcIjpcIiArIGNvbHVtbkluZGV4O1xuICAgICAgICB2YXIgc3R5bGU7XG5cbiAgICAgICAgaWYgKGl0ZW1TdHlsZUNhY2hlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBzdHlsZSA9IGl0ZW1TdHlsZUNhY2hlW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9vZmZzZXQgPSBnZXRDb2x1bW5PZmZzZXQoX3RoaXMucHJvcHMsIGNvbHVtbkluZGV4LCBfdGhpcy5faW5zdGFuY2VQcm9wcyk7XG5cbiAgICAgICAgICB2YXIgaXNSdGwgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICAgICAgICAgIGl0ZW1TdHlsZUNhY2hlW2tleV0gPSBzdHlsZSA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgbGVmdDogaXNSdGwgPyB1bmRlZmluZWQgOiBfb2Zmc2V0LFxuICAgICAgICAgICAgcmlnaHQ6IGlzUnRsID8gX29mZnNldCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRvcDogZ2V0Um93T2Zmc2V0KF90aGlzLnByb3BzLCByb3dJbmRleCwgX3RoaXMuX2luc3RhbmNlUHJvcHMpLFxuICAgICAgICAgICAgaGVpZ2h0OiBnZXRSb3dIZWlnaHQoX3RoaXMucHJvcHMsIHJvd0luZGV4LCBfdGhpcy5faW5zdGFuY2VQcm9wcyksXG4gICAgICAgICAgICB3aWR0aDogZ2V0Q29sdW1uV2lkdGgoX3RoaXMucHJvcHMsIGNvbHVtbkluZGV4LCBfdGhpcy5faW5zdGFuY2VQcm9wcylcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuX2dldEl0ZW1TdHlsZUNhY2hlID0gdm9pZCAwO1xuICAgICAgX3RoaXMuX2dldEl0ZW1TdHlsZUNhY2hlID0gbWVtb2l6ZU9uZShmdW5jdGlvbiAoXywgX18sIF9fXykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMuX29uU2Nyb2xsID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfZXZlbnQkY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgICBjbGllbnRIZWlnaHQgPSBfZXZlbnQkY3VycmVudFRhcmdldC5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICBjbGllbnRXaWR0aCA9IF9ldmVudCRjdXJyZW50VGFyZ2V0LmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgc2Nyb2xsTGVmdCA9IF9ldmVudCRjdXJyZW50VGFyZ2V0LnNjcm9sbExlZnQsXG4gICAgICAgICAgICBzY3JvbGxUb3AgPSBfZXZlbnQkY3VycmVudFRhcmdldC5zY3JvbGxUb3AsXG4gICAgICAgICAgICBzY3JvbGxIZWlnaHQgPSBfZXZlbnQkY3VycmVudFRhcmdldC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgICBzY3JvbGxXaWR0aCA9IF9ldmVudCRjdXJyZW50VGFyZ2V0LnNjcm9sbFdpZHRoO1xuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICBpZiAocHJldlN0YXRlLnNjcm9sbExlZnQgPT09IHNjcm9sbExlZnQgJiYgcHJldlN0YXRlLnNjcm9sbFRvcCA9PT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICAvLyBTY3JvbGwgcG9zaXRpb24gbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGJ5IGNETS9jRFUsXG4gICAgICAgICAgICAvLyBJbiB3aGljaCBjYXNlIHdlIGRvbid0IG5lZWQgdG8gdHJpZ2dlciBhbm90aGVyIHJlbmRlcixcbiAgICAgICAgICAgIC8vIEFuZCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSBzdGF0ZS5pc1Njcm9sbGluZy5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBfdGhpcy5wcm9wcy5kaXJlY3Rpb247IC8vIFRSSUNLWSBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNjcm9sbExlZnQgc2hvdWxkIGJlIG5lZ2F0aXZlIGZvciBSVEwgYWxpZ25lZCBlbGVtZW50cy5cbiAgICAgICAgICAvLyBUaGlzIGlzIG5vdCB0aGUgY2FzZSBmb3IgYWxsIGJyb3dzZXJzIHRob3VnaCAoZS5nLiBDaHJvbWUgcmVwb3J0cyB2YWx1ZXMgYXMgcG9zaXRpdmUsIG1lYXN1cmVkIHJlbGF0aXZlIHRvIHRoZSBsZWZ0KS5cbiAgICAgICAgICAvLyBJdCdzIGFsc28gZWFzaWVyIGZvciB0aGlzIGNvbXBvbmVudCBpZiB3ZSBjb252ZXJ0IG9mZnNldHMgdG8gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZXkgd291bGQgYmUgaW4gZm9yIGx0ci5cbiAgICAgICAgICAvLyBTbyB0aGUgc2ltcGxlc3Qgc29sdXRpb24gaXMgdG8gZGV0ZXJtaW5lIHdoaWNoIGJyb3dzZXIgYmVoYXZpb3Igd2UncmUgZGVhbGluZyB3aXRoLCBhbmQgY29udmVydCBiYXNlZCBvbiBpdC5cblxuICAgICAgICAgIHZhciBjYWxjdWxhdGVkU2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG5cbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgICAgICAgc3dpdGNoIChnZXRSVExPZmZzZXRUeXBlKCkpIHtcbiAgICAgICAgICAgICAgY2FzZSAnbmVnYXRpdmUnOlxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRTY3JvbGxMZWZ0ID0gLXNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAncG9zaXRpdmUtZGVzY2VuZGluZyc6XG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlZFNjcm9sbExlZnQgPSBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoIC0gc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFByZXZlbnQgU2FmYXJpJ3MgZWxhc3RpYyBzY3JvbGxpbmcgZnJvbSBjYXVzaW5nIHZpc3VhbCBzaGFraW5nIHdoZW4gc2Nyb2xsaW5nIHBhc3QgYm91bmRzLlxuXG5cbiAgICAgICAgICBjYWxjdWxhdGVkU2Nyb2xsTGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGNhbGN1bGF0ZWRTY3JvbGxMZWZ0LCBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoKSk7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRTY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodCkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1Njcm9sbGluZzogdHJ1ZSxcbiAgICAgICAgICAgIGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb246IHByZXZTdGF0ZS5zY3JvbGxMZWZ0IDwgc2Nyb2xsTGVmdCA/ICdmb3J3YXJkJyA6ICdiYWNrd2FyZCcsXG4gICAgICAgICAgICBzY3JvbGxMZWZ0OiBjYWxjdWxhdGVkU2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIHNjcm9sbFRvcDogY2FsY3VsYXRlZFNjcm9sbFRvcCxcbiAgICAgICAgICAgIHZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uOiBwcmV2U3RhdGUuc2Nyb2xsVG9wIDwgc2Nyb2xsVG9wID8gJ2ZvcndhcmQnIDogJ2JhY2t3YXJkJyxcbiAgICAgICAgICAgIHNjcm9sbFVwZGF0ZVdhc1JlcXVlc3RlZDogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICB9LCBfdGhpcy5fcmVzZXRJc1Njcm9sbGluZ0RlYm91bmNlZCk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fb3V0ZXJSZWZTZXR0ZXIgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHZhciBvdXRlclJlZiA9IF90aGlzLnByb3BzLm91dGVyUmVmO1xuICAgICAgICBfdGhpcy5fb3V0ZXJSZWYgPSByZWY7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvdXRlclJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG91dGVyUmVmKHJlZik7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0ZXJSZWYgIT0gbnVsbCAmJiB0eXBlb2Ygb3V0ZXJSZWYgPT09ICdvYmplY3QnICYmIG91dGVyUmVmLmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgICBvdXRlclJlZi5jdXJyZW50ID0gcmVmO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fcmVzZXRJc1Njcm9sbGluZ0RlYm91bmNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzLl9yZXNldElzU2Nyb2xsaW5nVGltZW91dElkICE9PSBudWxsKSB7XG4gICAgICAgICAgY2FuY2VsVGltZW91dChfdGhpcy5fcmVzZXRJc1Njcm9sbGluZ1RpbWVvdXRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5fcmVzZXRJc1Njcm9sbGluZ1RpbWVvdXRJZCA9IHJlcXVlc3RUaW1lb3V0KF90aGlzLl9yZXNldElzU2Nyb2xsaW5nLCBJU19TQ1JPTExJTkdfREVCT1VOQ0VfSU5URVJWQUwpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuX3Jlc2V0SXNTY3JvbGxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLl9yZXNldElzU2Nyb2xsaW5nVGltZW91dElkID0gbnVsbDtcblxuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNTY3JvbGxpbmc6IGZhbHNlXG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBDbGVhciBzdHlsZSBjYWNoZSBhZnRlciBzdGF0ZSB1cGRhdGUgaGFzIGJlZW4gY29tbWl0dGVkLlxuICAgICAgICAgIC8vIFRoaXMgd2F5IHdlIGRvbid0IGJyZWFrIHB1cmUgc0NVIGZvciBpdGVtcyB0aGF0IGRvbid0IHVzZSBpc1Njcm9sbGluZyBwYXJhbS5cbiAgICAgICAgICBfdGhpcy5fZ2V0SXRlbVN0eWxlQ2FjaGUoLTEpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBHcmlkLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgdmFsaWRhdGVTaGFyZWRQcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgICB2YWxpZGF0ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIF9wcm90byA9IEdyaWQucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNjcm9sbFRvID0gZnVuY3Rpb24gc2Nyb2xsVG8oX3JlZjMpIHtcbiAgICAgIHZhciBzY3JvbGxMZWZ0ID0gX3JlZjMuc2Nyb2xsTGVmdCxcbiAgICAgICAgICBzY3JvbGxUb3AgPSBfcmVmMy5zY3JvbGxUb3A7XG5cbiAgICAgIGlmIChzY3JvbGxMZWZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2Nyb2xsTGVmdCA9IE1hdGgubWF4KDAsIHNjcm9sbExlZnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsVG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgc2Nyb2xsVG9wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIGlmIChzY3JvbGxMZWZ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY3JvbGxMZWZ0ID0gcHJldlN0YXRlLnNjcm9sbExlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Nyb2xsVG9wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY3JvbGxUb3AgPSBwcmV2U3RhdGUuc2Nyb2xsVG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZTdGF0ZS5zY3JvbGxMZWZ0ID09PSBzY3JvbGxMZWZ0ICYmIHByZXZTdGF0ZS5zY3JvbGxUb3AgPT09IHNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uOiBwcmV2U3RhdGUuc2Nyb2xsTGVmdCA8IHNjcm9sbExlZnQgPyAnZm9yd2FyZCcgOiAnYmFja3dhcmQnLFxuICAgICAgICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AsXG4gICAgICAgICAgc2Nyb2xsVXBkYXRlV2FzUmVxdWVzdGVkOiB0cnVlLFxuICAgICAgICAgIHZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uOiBwcmV2U3RhdGUuc2Nyb2xsVG9wIDwgc2Nyb2xsVG9wID8gJ2ZvcndhcmQnIDogJ2JhY2t3YXJkJ1xuICAgICAgICB9O1xuICAgICAgfSwgdGhpcy5fcmVzZXRJc1Njcm9sbGluZ0RlYm91bmNlZCk7XG4gICAgfTtcblxuICAgIF9wcm90by5zY3JvbGxUb0l0ZW0gPSBmdW5jdGlvbiBzY3JvbGxUb0l0ZW0oX3JlZjQpIHtcbiAgICAgIHZhciBfcmVmNCRhbGlnbiA9IF9yZWY0LmFsaWduLFxuICAgICAgICAgIGFsaWduID0gX3JlZjQkYWxpZ24gPT09IHZvaWQgMCA/ICdhdXRvJyA6IF9yZWY0JGFsaWduLFxuICAgICAgICAgIGNvbHVtbkluZGV4ID0gX3JlZjQuY29sdW1uSW5kZXgsXG4gICAgICAgICAgcm93SW5kZXggPSBfcmVmNC5yb3dJbmRleDtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNvbHVtbkNvdW50ID0gX3RoaXMkcHJvcHMyLmNvbHVtbkNvdW50LFxuICAgICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzMi5oZWlnaHQsXG4gICAgICAgICAgcm93Q291bnQgPSBfdGhpcyRwcm9wczIucm93Q291bnQsXG4gICAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczIud2lkdGg7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIHNjcm9sbExlZnQgPSBfdGhpcyRzdGF0ZS5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHNjcm9sbFRvcCA9IF90aGlzJHN0YXRlLnNjcm9sbFRvcDtcbiAgICAgIHZhciBzY3JvbGxiYXJTaXplID0gZ2V0U2Nyb2xsYmFyU2l6ZSgpO1xuXG4gICAgICBpZiAoY29sdW1uSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb2x1bW5JbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGNvbHVtbkluZGV4LCBjb2x1bW5Db3VudCAtIDEpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJvd0luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcm93SW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihyb3dJbmRleCwgcm93Q291bnQgLSAxKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlc3RpbWF0ZWRUb3RhbEhlaWdodCA9IGdldEVzdGltYXRlZFRvdGFsSGVpZ2h0KHRoaXMucHJvcHMsIHRoaXMuX2luc3RhbmNlUHJvcHMpO1xuICAgICAgdmFyIGVzdGltYXRlZFRvdGFsV2lkdGggPSBnZXRFc3RpbWF0ZWRUb3RhbFdpZHRoKHRoaXMucHJvcHMsIHRoaXMuX2luc3RhbmNlUHJvcHMpOyAvLyBUaGUgc2Nyb2xsYmFyIHNpemUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgd2hlbiBzY3JvbGxpbmcgYW4gaXRlbSBpbnRvIHZpZXcsXG4gICAgICAvLyB0byBlbnN1cmUgaXQncyBmdWxseSB2aXNpYmxlLlxuICAgICAgLy8gQnV0IHdlIG9ubHkgbmVlZCB0byBhY2NvdW50IGZvciBpdHMgc2l6ZSB3aGVuIGl0J3MgYWN0dWFsbHkgdmlzaWJsZS5cblxuICAgICAgdmFyIGhvcml6b250YWxTY3JvbGxiYXJTaXplID0gZXN0aW1hdGVkVG90YWxXaWR0aCA+IHdpZHRoID8gc2Nyb2xsYmFyU2l6ZSA6IDA7XG4gICAgICB2YXIgdmVydGljYWxTY3JvbGxiYXJTaXplID0gZXN0aW1hdGVkVG90YWxIZWlnaHQgPiBoZWlnaHQgPyBzY3JvbGxiYXJTaXplIDogMDtcbiAgICAgIHRoaXMuc2Nyb2xsVG8oe1xuICAgICAgICBzY3JvbGxMZWZ0OiBjb2x1bW5JbmRleCAhPT0gdW5kZWZpbmVkID8gZ2V0T2Zmc2V0Rm9yQ29sdW1uQW5kQWxpZ25tZW50KHRoaXMucHJvcHMsIGNvbHVtbkluZGV4LCBhbGlnbiwgc2Nyb2xsTGVmdCwgdGhpcy5faW5zdGFuY2VQcm9wcywgdmVydGljYWxTY3JvbGxiYXJTaXplKSA6IHNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFRvcDogcm93SW5kZXggIT09IHVuZGVmaW5lZCA/IGdldE9mZnNldEZvclJvd0FuZEFsaWdubWVudCh0aGlzLnByb3BzLCByb3dJbmRleCwgYWxpZ24sIHNjcm9sbFRvcCwgdGhpcy5faW5zdGFuY2VQcm9wcywgaG9yaXpvbnRhbFNjcm9sbGJhclNpemUpIDogc2Nyb2xsVG9wXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBpbml0aWFsU2Nyb2xsTGVmdCA9IF90aGlzJHByb3BzMy5pbml0aWFsU2Nyb2xsTGVmdCxcbiAgICAgICAgICBpbml0aWFsU2Nyb2xsVG9wID0gX3RoaXMkcHJvcHMzLmluaXRpYWxTY3JvbGxUb3A7XG5cbiAgICAgIGlmICh0aGlzLl9vdXRlclJlZiAhPSBudWxsKSB7XG4gICAgICAgIHZhciBvdXRlclJlZiA9IHRoaXMuX291dGVyUmVmO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5pdGlhbFNjcm9sbExlZnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3V0ZXJSZWYuc2Nyb2xsTGVmdCA9IGluaXRpYWxTY3JvbGxMZWZ0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbml0aWFsU2Nyb2xsVG9wID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIG91dGVyUmVmLnNjcm9sbFRvcCA9IGluaXRpYWxTY3JvbGxUb3A7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2FsbFByb3BzQ2FsbGJhY2tzKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5wcm9wcy5kaXJlY3Rpb247XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBzY3JvbGxMZWZ0ID0gX3RoaXMkc3RhdGUyLnNjcm9sbExlZnQsXG4gICAgICAgICAgc2Nyb2xsVG9wID0gX3RoaXMkc3RhdGUyLnNjcm9sbFRvcCxcbiAgICAgICAgICBzY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQgPSBfdGhpcyRzdGF0ZTIuc2Nyb2xsVXBkYXRlV2FzUmVxdWVzdGVkO1xuXG4gICAgICBpZiAoc2Nyb2xsVXBkYXRlV2FzUmVxdWVzdGVkICYmIHRoaXMuX291dGVyUmVmICE9IG51bGwpIHtcbiAgICAgICAgLy8gVFJJQ0tZIEFjY29yZGluZyB0byB0aGUgc3BlYywgc2Nyb2xsTGVmdCBzaG91bGQgYmUgbmVnYXRpdmUgZm9yIFJUTCBhbGlnbmVkIGVsZW1lbnRzLlxuICAgICAgICAvLyBUaGlzIGlzIG5vdCB0aGUgY2FzZSBmb3IgYWxsIGJyb3dzZXJzIHRob3VnaCAoZS5nLiBDaHJvbWUgcmVwb3J0cyB2YWx1ZXMgYXMgcG9zaXRpdmUsIG1lYXN1cmVkIHJlbGF0aXZlIHRvIHRoZSBsZWZ0KS5cbiAgICAgICAgLy8gU28gd2UgbmVlZCB0byBkZXRlcm1pbmUgd2hpY2ggYnJvd3NlciBiZWhhdmlvciB3ZSdyZSBkZWFsaW5nIHdpdGgsIGFuZCBtaW1pYyBpdC5cbiAgICAgICAgdmFyIG91dGVyUmVmID0gdGhpcy5fb3V0ZXJSZWY7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGdldFJUTE9mZnNldFR5cGUoKSkge1xuICAgICAgICAgICAgY2FzZSAnbmVnYXRpdmUnOlxuICAgICAgICAgICAgICBvdXRlclJlZi5zY3JvbGxMZWZ0ID0gLXNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdwb3NpdGl2ZS1hc2NlbmRpbmcnOlxuICAgICAgICAgICAgICBvdXRlclJlZi5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHZhciBjbGllbnRXaWR0aCA9IG91dGVyUmVmLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgICAgICAgc2Nyb2xsV2lkdGggPSBvdXRlclJlZi5zY3JvbGxXaWR0aDtcbiAgICAgICAgICAgICAgb3V0ZXJSZWYuc2Nyb2xsTGVmdCA9IHNjcm9sbFdpZHRoIC0gY2xpZW50V2lkdGggLSBzY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ZXJSZWYuc2Nyb2xsTGVmdCA9IE1hdGgubWF4KDAsIHNjcm9sbExlZnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ZXJSZWYuc2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgc2Nyb2xsVG9wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2FsbFByb3BzQ2FsbGJhY2tzKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMuX3Jlc2V0SXNTY3JvbGxpbmdUaW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsVGltZW91dCh0aGlzLl9yZXNldElzU2Nyb2xsaW5nVGltZW91dElkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHM0LmNoaWxkcmVuLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNC5jbGFzc05hbWUsXG4gICAgICAgICAgY29sdW1uQ291bnQgPSBfdGhpcyRwcm9wczQuY29sdW1uQ291bnQsXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3RoaXMkcHJvcHM0LmRpcmVjdGlvbixcbiAgICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczQuaGVpZ2h0LFxuICAgICAgICAgIGlubmVyUmVmID0gX3RoaXMkcHJvcHM0LmlubmVyUmVmLFxuICAgICAgICAgIGlubmVyRWxlbWVudFR5cGUgPSBfdGhpcyRwcm9wczQuaW5uZXJFbGVtZW50VHlwZSxcbiAgICAgICAgICBpbm5lclRhZ05hbWUgPSBfdGhpcyRwcm9wczQuaW5uZXJUYWdOYW1lLFxuICAgICAgICAgIGl0ZW1EYXRhID0gX3RoaXMkcHJvcHM0Lml0ZW1EYXRhLFxuICAgICAgICAgIF90aGlzJHByb3BzNCRpdGVtS2V5ID0gX3RoaXMkcHJvcHM0Lml0ZW1LZXksXG4gICAgICAgICAgaXRlbUtleSA9IF90aGlzJHByb3BzNCRpdGVtS2V5ID09PSB2b2lkIDAgPyBkZWZhdWx0SXRlbUtleSA6IF90aGlzJHByb3BzNCRpdGVtS2V5LFxuICAgICAgICAgIG91dGVyRWxlbWVudFR5cGUgPSBfdGhpcyRwcm9wczQub3V0ZXJFbGVtZW50VHlwZSxcbiAgICAgICAgICBvdXRlclRhZ05hbWUgPSBfdGhpcyRwcm9wczQub3V0ZXJUYWdOYW1lLFxuICAgICAgICAgIHJvd0NvdW50ID0gX3RoaXMkcHJvcHM0LnJvd0NvdW50LFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHM0LnN0eWxlLFxuICAgICAgICAgIHVzZUlzU2Nyb2xsaW5nID0gX3RoaXMkcHJvcHM0LnVzZUlzU2Nyb2xsaW5nLFxuICAgICAgICAgIHdpZHRoID0gX3RoaXMkcHJvcHM0LndpZHRoO1xuICAgICAgdmFyIGlzU2Nyb2xsaW5nID0gdGhpcy5zdGF0ZS5pc1Njcm9sbGluZztcblxuICAgICAgdmFyIF90aGlzJF9nZXRIb3Jpem9udGFsUiA9IHRoaXMuX2dldEhvcml6b250YWxSYW5nZVRvUmVuZGVyKCksXG4gICAgICAgICAgY29sdW1uU3RhcnRJbmRleCA9IF90aGlzJF9nZXRIb3Jpem9udGFsUlswXSxcbiAgICAgICAgICBjb2x1bW5TdG9wSW5kZXggPSBfdGhpcyRfZ2V0SG9yaXpvbnRhbFJbMV07XG5cbiAgICAgIHZhciBfdGhpcyRfZ2V0VmVydGljYWxSYW4gPSB0aGlzLl9nZXRWZXJ0aWNhbFJhbmdlVG9SZW5kZXIoKSxcbiAgICAgICAgICByb3dTdGFydEluZGV4ID0gX3RoaXMkX2dldFZlcnRpY2FsUmFuWzBdLFxuICAgICAgICAgIHJvd1N0b3BJbmRleCA9IF90aGlzJF9nZXRWZXJ0aWNhbFJhblsxXTtcblxuICAgICAgdmFyIGl0ZW1zID0gW107XG5cbiAgICAgIGlmIChjb2x1bW5Db3VudCA+IDAgJiYgcm93Q291bnQpIHtcbiAgICAgICAgZm9yICh2YXIgX3Jvd0luZGV4ID0gcm93U3RhcnRJbmRleDsgX3Jvd0luZGV4IDw9IHJvd1N0b3BJbmRleDsgX3Jvd0luZGV4KyspIHtcbiAgICAgICAgICBmb3IgKHZhciBfY29sdW1uSW5kZXggPSBjb2x1bW5TdGFydEluZGV4OyBfY29sdW1uSW5kZXggPD0gY29sdW1uU3RvcEluZGV4OyBfY29sdW1uSW5kZXgrKykge1xuICAgICAgICAgICAgaXRlbXMucHVzaChjcmVhdGVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAgICAgICAgIGNvbHVtbkluZGV4OiBfY29sdW1uSW5kZXgsXG4gICAgICAgICAgICAgIGRhdGE6IGl0ZW1EYXRhLFxuICAgICAgICAgICAgICBpc1Njcm9sbGluZzogdXNlSXNTY3JvbGxpbmcgPyBpc1Njcm9sbGluZyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAga2V5OiBpdGVtS2V5KHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogX2NvbHVtbkluZGV4LFxuICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW1EYXRhLFxuICAgICAgICAgICAgICAgIHJvd0luZGV4OiBfcm93SW5kZXhcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHJvd0luZGV4OiBfcm93SW5kZXgsXG4gICAgICAgICAgICAgIHN0eWxlOiB0aGlzLl9nZXRJdGVtU3R5bGUoX3Jvd0luZGV4LCBfY29sdW1uSW5kZXgpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIFJlYWQgdGhpcyB2YWx1ZSBBRlRFUiBpdGVtcyBoYXZlIGJlZW4gY3JlYXRlZCxcbiAgICAgIC8vIFNvIHRoZWlyIGFjdHVhbCBzaXplcyAoaWYgdmFyaWFibGUpIGFyZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uXG5cblxuICAgICAgdmFyIGVzdGltYXRlZFRvdGFsSGVpZ2h0ID0gZ2V0RXN0aW1hdGVkVG90YWxIZWlnaHQodGhpcy5wcm9wcywgdGhpcy5faW5zdGFuY2VQcm9wcyk7XG4gICAgICB2YXIgZXN0aW1hdGVkVG90YWxXaWR0aCA9IGdldEVzdGltYXRlZFRvdGFsV2lkdGgodGhpcy5wcm9wcywgdGhpcy5faW5zdGFuY2VQcm9wcyk7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChvdXRlckVsZW1lbnRUeXBlIHx8IG91dGVyVGFnTmFtZSB8fCAnZGl2Jywge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgb25TY3JvbGw6IHRoaXMuX29uU2Nyb2xsLFxuICAgICAgICByZWY6IHRoaXMuX291dGVyUmVmU2V0dGVyLFxuICAgICAgICBzdHlsZTogX2V4dGVuZHMoe1xuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICBvdmVyZmxvdzogJ2F1dG8nLFxuICAgICAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnLFxuICAgICAgICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0nLFxuICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICAgIH0sIHN0eWxlKVxuICAgICAgfSwgY3JlYXRlRWxlbWVudChpbm5lckVsZW1lbnRUeXBlIHx8IGlubmVyVGFnTmFtZSB8fCAnZGl2Jywge1xuICAgICAgICBjaGlsZHJlbjogaXRlbXMsXG4gICAgICAgIHJlZjogaW5uZXJSZWYsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgaGVpZ2h0OiBlc3RpbWF0ZWRUb3RhbEhlaWdodCxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiBpc1Njcm9sbGluZyA/ICdub25lJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB3aWR0aDogZXN0aW1hdGVkVG90YWxXaWR0aFxuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2FsbFByb3BzQ2FsbGJhY2tzID0gZnVuY3Rpb24gX2NhbGxQcm9wc0NhbGxiYWNrcygpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNvbHVtbkNvdW50ID0gX3RoaXMkcHJvcHM1LmNvbHVtbkNvdW50LFxuICAgICAgICAgIG9uSXRlbXNSZW5kZXJlZCA9IF90aGlzJHByb3BzNS5vbkl0ZW1zUmVuZGVyZWQsXG4gICAgICAgICAgb25TY3JvbGwgPSBfdGhpcyRwcm9wczUub25TY3JvbGwsXG4gICAgICAgICAgcm93Q291bnQgPSBfdGhpcyRwcm9wczUucm93Q291bnQ7XG5cbiAgICAgIGlmICh0eXBlb2Ygb25JdGVtc1JlbmRlcmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChjb2x1bW5Db3VudCA+IDAgJiYgcm93Q291bnQgPiAwKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9nZXRIb3Jpem9udGFsUjIgPSB0aGlzLl9nZXRIb3Jpem9udGFsUmFuZ2VUb1JlbmRlcigpLFxuICAgICAgICAgICAgICBfb3ZlcnNjYW5Db2x1bW5TdGFydEluZGV4ID0gX3RoaXMkX2dldEhvcml6b250YWxSMlswXSxcbiAgICAgICAgICAgICAgX292ZXJzY2FuQ29sdW1uU3RvcEluZGV4ID0gX3RoaXMkX2dldEhvcml6b250YWxSMlsxXSxcbiAgICAgICAgICAgICAgX3Zpc2libGVDb2x1bW5TdGFydEluZGV4ID0gX3RoaXMkX2dldEhvcml6b250YWxSMlsyXSxcbiAgICAgICAgICAgICAgX3Zpc2libGVDb2x1bW5TdG9wSW5kZXggPSBfdGhpcyRfZ2V0SG9yaXpvbnRhbFIyWzNdO1xuXG4gICAgICAgICAgdmFyIF90aGlzJF9nZXRWZXJ0aWNhbFJhbjIgPSB0aGlzLl9nZXRWZXJ0aWNhbFJhbmdlVG9SZW5kZXIoKSxcbiAgICAgICAgICAgICAgX292ZXJzY2FuUm93U3RhcnRJbmRleCA9IF90aGlzJF9nZXRWZXJ0aWNhbFJhbjJbMF0sXG4gICAgICAgICAgICAgIF9vdmVyc2NhblJvd1N0b3BJbmRleCA9IF90aGlzJF9nZXRWZXJ0aWNhbFJhbjJbMV0sXG4gICAgICAgICAgICAgIF92aXNpYmxlUm93U3RhcnRJbmRleCA9IF90aGlzJF9nZXRWZXJ0aWNhbFJhbjJbMl0sXG4gICAgICAgICAgICAgIF92aXNpYmxlUm93U3RvcEluZGV4ID0gX3RoaXMkX2dldFZlcnRpY2FsUmFuMlszXTtcblxuICAgICAgICAgIHRoaXMuX2NhbGxPbkl0ZW1zUmVuZGVyZWQoX292ZXJzY2FuQ29sdW1uU3RhcnRJbmRleCwgX292ZXJzY2FuQ29sdW1uU3RvcEluZGV4LCBfb3ZlcnNjYW5Sb3dTdGFydEluZGV4LCBfb3ZlcnNjYW5Sb3dTdG9wSW5kZXgsIF92aXNpYmxlQ29sdW1uU3RhcnRJbmRleCwgX3Zpc2libGVDb2x1bW5TdG9wSW5kZXgsIF92aXNpYmxlUm93U3RhcnRJbmRleCwgX3Zpc2libGVSb3dTdG9wSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb25TY3JvbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIF90aGlzJHN0YXRlMyA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBfaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiA9IF90aGlzJHN0YXRlMy5ob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uLFxuICAgICAgICAgICAgX3Njcm9sbExlZnQgPSBfdGhpcyRzdGF0ZTMuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIF9zY3JvbGxUb3AgPSBfdGhpcyRzdGF0ZTMuc2Nyb2xsVG9wLFxuICAgICAgICAgICAgX3Njcm9sbFVwZGF0ZVdhc1JlcXVlc3RlZCA9IF90aGlzJHN0YXRlMy5zY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQsXG4gICAgICAgICAgICBfdmVydGljYWxTY3JvbGxEaXJlY3Rpb24gPSBfdGhpcyRzdGF0ZTMudmVydGljYWxTY3JvbGxEaXJlY3Rpb247XG5cbiAgICAgICAgdGhpcy5fY2FsbE9uU2Nyb2xsKF9zY3JvbGxMZWZ0LCBfc2Nyb2xsVG9wLCBfaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiwgX3ZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uLCBfc2Nyb2xsVXBkYXRlV2FzUmVxdWVzdGVkKTtcbiAgICAgIH1cbiAgICB9IC8vIExhemlseSBjcmVhdGUgYW5kIGNhY2hlIGl0ZW0gc3R5bGVzIHdoaWxlIHNjcm9sbGluZyxcbiAgICAvLyBTbyB0aGF0IHB1cmUgY29tcG9uZW50IHNDVSB3aWxsIHByZXZlbnQgcmUtcmVuZGVycy5cbiAgICAvLyBXZSBtYWludGFpbiB0aGlzIGNhY2hlLCBhbmQgcGFzcyBhIHN0eWxlIHByb3AgcmF0aGVyIHRoYW4gaW5kZXgsXG4gICAgLy8gU28gdGhhdCBMaXN0IGNhbiBjbGVhciBjYWNoZWQgc3R5bGVzIGFuZCBmb3JjZSBpdGVtIHJlLXJlbmRlciBpZiBuZWNlc3NhcnkuXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRIb3Jpem9udGFsUmFuZ2VUb1JlbmRlciA9IGZ1bmN0aW9uIF9nZXRIb3Jpem9udGFsUmFuZ2VUb1JlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNvbHVtbkNvdW50ID0gX3RoaXMkcHJvcHM2LmNvbHVtbkNvdW50LFxuICAgICAgICAgIG92ZXJzY2FuQ29sdW1uQ291bnQgPSBfdGhpcyRwcm9wczYub3ZlcnNjYW5Db2x1bW5Db3VudCxcbiAgICAgICAgICBvdmVyc2NhbkNvbHVtbnNDb3VudCA9IF90aGlzJHByb3BzNi5vdmVyc2NhbkNvbHVtbnNDb3VudCxcbiAgICAgICAgICBvdmVyc2NhbkNvdW50ID0gX3RoaXMkcHJvcHM2Lm92ZXJzY2FuQ291bnQsXG4gICAgICAgICAgcm93Q291bnQgPSBfdGhpcyRwcm9wczYucm93Q291bnQ7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU0ID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uID0gX3RoaXMkc3RhdGU0Lmhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24sXG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSBfdGhpcyRzdGF0ZTQuaXNTY3JvbGxpbmcsXG4gICAgICAgICAgc2Nyb2xsTGVmdCA9IF90aGlzJHN0YXRlNC5zY3JvbGxMZWZ0O1xuICAgICAgdmFyIG92ZXJzY2FuQ291bnRSZXNvbHZlZCA9IG92ZXJzY2FuQ29sdW1uQ291bnQgfHwgb3ZlcnNjYW5Db2x1bW5zQ291bnQgfHwgb3ZlcnNjYW5Db3VudCB8fCAxO1xuXG4gICAgICBpZiAoY29sdW1uQ291bnQgPT09IDAgfHwgcm93Q291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0SW5kZXggPSBnZXRDb2x1bW5TdGFydEluZGV4Rm9yT2Zmc2V0KHRoaXMucHJvcHMsIHNjcm9sbExlZnQsIHRoaXMuX2luc3RhbmNlUHJvcHMpO1xuICAgICAgdmFyIHN0b3BJbmRleCA9IGdldENvbHVtblN0b3BJbmRleEZvclN0YXJ0SW5kZXgodGhpcy5wcm9wcywgc3RhcnRJbmRleCwgc2Nyb2xsTGVmdCwgdGhpcy5faW5zdGFuY2VQcm9wcyk7IC8vIE92ZXJzY2FuIGJ5IG9uZSBpdGVtIGluIGVhY2ggZGlyZWN0aW9uIHNvIHRoYXQgdGFiL2ZvY3VzIHdvcmtzLlxuICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYXQgbGVhc3Qgb25lIGV4dHJhIGl0ZW0sIHRhYiBsb29wcyBiYWNrIGFyb3VuZC5cblxuICAgICAgdmFyIG92ZXJzY2FuQmFja3dhcmQgPSAhaXNTY3JvbGxpbmcgfHwgaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiA9PT0gJ2JhY2t3YXJkJyA/IE1hdGgubWF4KDEsIG92ZXJzY2FuQ291bnRSZXNvbHZlZCkgOiAxO1xuICAgICAgdmFyIG92ZXJzY2FuRm9yd2FyZCA9ICFpc1Njcm9sbGluZyB8fCBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uID09PSAnZm9yd2FyZCcgPyBNYXRoLm1heCgxLCBvdmVyc2NhbkNvdW50UmVzb2x2ZWQpIDogMTtcbiAgICAgIHJldHVybiBbTWF0aC5tYXgoMCwgc3RhcnRJbmRleCAtIG92ZXJzY2FuQmFja3dhcmQpLCBNYXRoLm1heCgwLCBNYXRoLm1pbihjb2x1bW5Db3VudCAtIDEsIHN0b3BJbmRleCArIG92ZXJzY2FuRm9yd2FyZCkpLCBzdGFydEluZGV4LCBzdG9wSW5kZXhdO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFZlcnRpY2FsUmFuZ2VUb1JlbmRlciA9IGZ1bmN0aW9uIF9nZXRWZXJ0aWNhbFJhbmdlVG9SZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjb2x1bW5Db3VudCA9IF90aGlzJHByb3BzNy5jb2x1bW5Db3VudCxcbiAgICAgICAgICBvdmVyc2NhbkNvdW50ID0gX3RoaXMkcHJvcHM3Lm92ZXJzY2FuQ291bnQsXG4gICAgICAgICAgb3ZlcnNjYW5Sb3dDb3VudCA9IF90aGlzJHByb3BzNy5vdmVyc2NhblJvd0NvdW50LFxuICAgICAgICAgIG92ZXJzY2FuUm93c0NvdW50ID0gX3RoaXMkcHJvcHM3Lm92ZXJzY2FuUm93c0NvdW50LFxuICAgICAgICAgIHJvd0NvdW50ID0gX3RoaXMkcHJvcHM3LnJvd0NvdW50O1xuICAgICAgdmFyIF90aGlzJHN0YXRlNSA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSBfdGhpcyRzdGF0ZTUuaXNTY3JvbGxpbmcsXG4gICAgICAgICAgdmVydGljYWxTY3JvbGxEaXJlY3Rpb24gPSBfdGhpcyRzdGF0ZTUudmVydGljYWxTY3JvbGxEaXJlY3Rpb24sXG4gICAgICAgICAgc2Nyb2xsVG9wID0gX3RoaXMkc3RhdGU1LnNjcm9sbFRvcDtcbiAgICAgIHZhciBvdmVyc2NhbkNvdW50UmVzb2x2ZWQgPSBvdmVyc2NhblJvd0NvdW50IHx8IG92ZXJzY2FuUm93c0NvdW50IHx8IG92ZXJzY2FuQ291bnQgfHwgMTtcblxuICAgICAgaWYgKGNvbHVtbkNvdW50ID09PSAwIHx8IHJvd0NvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydEluZGV4ID0gZ2V0Um93U3RhcnRJbmRleEZvck9mZnNldCh0aGlzLnByb3BzLCBzY3JvbGxUb3AsIHRoaXMuX2luc3RhbmNlUHJvcHMpO1xuICAgICAgdmFyIHN0b3BJbmRleCA9IGdldFJvd1N0b3BJbmRleEZvclN0YXJ0SW5kZXgodGhpcy5wcm9wcywgc3RhcnRJbmRleCwgc2Nyb2xsVG9wLCB0aGlzLl9pbnN0YW5jZVByb3BzKTsgLy8gT3ZlcnNjYW4gYnkgb25lIGl0ZW0gaW4gZWFjaCBkaXJlY3Rpb24gc28gdGhhdCB0YWIvZm9jdXMgd29ya3MuXG4gICAgICAvLyBJZiB0aGVyZSBpc24ndCBhdCBsZWFzdCBvbmUgZXh0cmEgaXRlbSwgdGFiIGxvb3BzIGJhY2sgYXJvdW5kLlxuXG4gICAgICB2YXIgb3ZlcnNjYW5CYWNrd2FyZCA9ICFpc1Njcm9sbGluZyB8fCB2ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbiA9PT0gJ2JhY2t3YXJkJyA/IE1hdGgubWF4KDEsIG92ZXJzY2FuQ291bnRSZXNvbHZlZCkgOiAxO1xuICAgICAgdmFyIG92ZXJzY2FuRm9yd2FyZCA9ICFpc1Njcm9sbGluZyB8fCB2ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbiA9PT0gJ2ZvcndhcmQnID8gTWF0aC5tYXgoMSwgb3ZlcnNjYW5Db3VudFJlc29sdmVkKSA6IDE7XG4gICAgICByZXR1cm4gW01hdGgubWF4KDAsIHN0YXJ0SW5kZXggLSBvdmVyc2NhbkJhY2t3YXJkKSwgTWF0aC5tYXgoMCwgTWF0aC5taW4ocm93Q291bnQgLSAxLCBzdG9wSW5kZXggKyBvdmVyc2NhbkZvcndhcmQpKSwgc3RhcnRJbmRleCwgc3RvcEluZGV4XTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEdyaWQ7XG4gIH0oUHVyZUNvbXBvbmVudCksIF9jbGFzcy5kZWZhdWx0UHJvcHMgPSB7XG4gICAgZGlyZWN0aW9uOiAnbHRyJyxcbiAgICBpdGVtRGF0YTogdW5kZWZpbmVkLFxuICAgIHVzZUlzU2Nyb2xsaW5nOiBmYWxzZVxuICB9LCBfY2xhc3M7XG59XG5cbnZhciB2YWxpZGF0ZVNoYXJlZFByb3BzID0gZnVuY3Rpb24gdmFsaWRhdGVTaGFyZWRQcm9wcyhfcmVmNSwgX3JlZjYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZjUuY2hpbGRyZW4sXG4gICAgICBkaXJlY3Rpb24gPSBfcmVmNS5kaXJlY3Rpb24sXG4gICAgICBoZWlnaHQgPSBfcmVmNS5oZWlnaHQsXG4gICAgICBpbm5lclRhZ05hbWUgPSBfcmVmNS5pbm5lclRhZ05hbWUsXG4gICAgICBvdXRlclRhZ05hbWUgPSBfcmVmNS5vdXRlclRhZ05hbWUsXG4gICAgICBvdmVyc2NhbkNvbHVtbnNDb3VudCA9IF9yZWY1Lm92ZXJzY2FuQ29sdW1uc0NvdW50LFxuICAgICAgb3ZlcnNjYW5Db3VudCA9IF9yZWY1Lm92ZXJzY2FuQ291bnQsXG4gICAgICBvdmVyc2NhblJvd3NDb3VudCA9IF9yZWY1Lm92ZXJzY2FuUm93c0NvdW50LFxuICAgICAgd2lkdGggPSBfcmVmNS53aWR0aDtcbiAgdmFyIGluc3RhbmNlID0gX3JlZjYuaW5zdGFuY2U7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIG92ZXJzY2FuQ291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoZGV2V2FybmluZ3NPdmVyc2NhbkNvdW50ICYmICFkZXZXYXJuaW5nc092ZXJzY2FuQ291bnQuaGFzKGluc3RhbmNlKSkge1xuICAgICAgICBkZXZXYXJuaW5nc092ZXJzY2FuQ291bnQuYWRkKGluc3RhbmNlKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdUaGUgb3ZlcnNjYW5Db3VudCBwcm9wIGhhcyBiZWVuIGRlcHJlY2F0ZWQuICcgKyAnUGxlYXNlIHVzZSB0aGUgb3ZlcnNjYW5Db2x1bW5Db3VudCBhbmQgb3ZlcnNjYW5Sb3dDb3VudCBwcm9wcyBpbnN0ZWFkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3ZlcnNjYW5Db2x1bW5zQ291bnQgPT09ICdudW1iZXInIHx8IHR5cGVvZiBvdmVyc2NhblJvd3NDb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChkZXZXYXJuaW5nc092ZXJzY2FuUm93c0NvbHVtbnNDb3VudCAmJiAhZGV2V2FybmluZ3NPdmVyc2NhblJvd3NDb2x1bW5zQ291bnQuaGFzKGluc3RhbmNlKSkge1xuICAgICAgICBkZXZXYXJuaW5nc092ZXJzY2FuUm93c0NvbHVtbnNDb3VudC5hZGQoaW5zdGFuY2UpO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBvdmVyc2NhbkNvbHVtbnNDb3VudCBhbmQgb3ZlcnNjYW5Sb3dzQ291bnQgcHJvcHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQuICcgKyAnUGxlYXNlIHVzZSB0aGUgb3ZlcnNjYW5Db2x1bW5Db3VudCBhbmQgb3ZlcnNjYW5Sb3dDb3VudCBwcm9wcyBpbnN0ZWFkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbm5lclRhZ05hbWUgIT0gbnVsbCB8fCBvdXRlclRhZ05hbWUgIT0gbnVsbCkge1xuICAgICAgaWYgKGRldldhcm5pbmdzVGFnTmFtZSAmJiAhZGV2V2FybmluZ3NUYWdOYW1lLmhhcyhpbnN0YW5jZSkpIHtcbiAgICAgICAgZGV2V2FybmluZ3NUYWdOYW1lLmFkZChpbnN0YW5jZSk7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhlIGlubmVyVGFnTmFtZSBhbmQgb3V0ZXJUYWdOYW1lIHByb3BzIGhhdmUgYmVlbiBkZXByZWNhdGVkLiAnICsgJ1BsZWFzZSB1c2UgdGhlIGlubmVyRWxlbWVudFR5cGUgYW5kIG91dGVyRWxlbWVudFR5cGUgcHJvcHMgaW5zdGVhZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0FuIGludmFsaWQgXCJjaGlsZHJlblwiIHByb3AgaGFzIGJlZW4gc3BlY2lmaWVkLiAnICsgJ1ZhbHVlIHNob3VsZCBiZSBhIFJlYWN0IGNvbXBvbmVudC4gJyArIChcIlxcXCJcIiArIChjaGlsZHJlbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBjaGlsZHJlbikgKyBcIlxcXCIgd2FzIHNwZWNpZmllZC5cIikpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdsdHInOlxuICAgICAgY2FzZSAncnRsJzpcbiAgICAgICAgLy8gVmFsaWQgdmFsdWVzXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcignQW4gaW52YWxpZCBcImRpcmVjdGlvblwiIHByb3AgaGFzIGJlZW4gc3BlY2lmaWVkLiAnICsgJ1ZhbHVlIHNob3VsZCBiZSBlaXRoZXIgXCJsdHJcIiBvciBcInJ0bFwiLiAnICsgKFwiXFxcIlwiICsgZGlyZWN0aW9uICsgXCJcXFwiIHdhcyBzcGVjaWZpZWQuXCIpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgRXJyb3IoJ0FuIGludmFsaWQgXCJ3aWR0aFwiIHByb3AgaGFzIGJlZW4gc3BlY2lmaWVkLiAnICsgJ0dyaWRzIG11c3Qgc3BlY2lmeSBhIG51bWJlciBmb3Igd2lkdGguICcgKyAoXCJcXFwiXCIgKyAod2lkdGggPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygd2lkdGgpICsgXCJcXFwiIHdhcyBzcGVjaWZpZWQuXCIpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhlaWdodCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IEVycm9yKCdBbiBpbnZhbGlkIFwiaGVpZ2h0XCIgcHJvcCBoYXMgYmVlbiBzcGVjaWZpZWQuICcgKyAnR3JpZHMgbXVzdCBzcGVjaWZ5IGEgbnVtYmVyIGZvciBoZWlnaHQuICcgKyAoXCJcXFwiXCIgKyAoaGVpZ2h0ID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGhlaWdodCkgKyBcIlxcXCIgd2FzIHNwZWNpZmllZC5cIikpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIERFRkFVTFRfRVNUSU1BVEVEX0lURU1fU0laRSA9IDUwO1xuXG52YXIgZ2V0RXN0aW1hdGVkVG90YWxIZWlnaHQgPSBmdW5jdGlvbiBnZXRFc3RpbWF0ZWRUb3RhbEhlaWdodChfcmVmLCBfcmVmMikge1xuICB2YXIgcm93Q291bnQgPSBfcmVmLnJvd0NvdW50O1xuICB2YXIgcm93TWV0YWRhdGFNYXAgPSBfcmVmMi5yb3dNZXRhZGF0YU1hcCxcbiAgICAgIGVzdGltYXRlZFJvd0hlaWdodCA9IF9yZWYyLmVzdGltYXRlZFJvd0hlaWdodCxcbiAgICAgIGxhc3RNZWFzdXJlZFJvd0luZGV4ID0gX3JlZjIubGFzdE1lYXN1cmVkUm93SW5kZXg7XG4gIHZhciB0b3RhbFNpemVPZk1lYXN1cmVkUm93cyA9IDA7IC8vIEVkZ2UgY2FzZSBjaGVjayBmb3Igd2hlbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGRlY3JlYXNlcyB3aGlsZSBhIHNjcm9sbCBpcyBpbiBwcm9ncmVzcy5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2J2YXVnaG4vcmVhY3Qtd2luZG93L3B1bGwvMTM4XG5cbiAgaWYgKGxhc3RNZWFzdXJlZFJvd0luZGV4ID49IHJvd0NvdW50KSB7XG4gICAgbGFzdE1lYXN1cmVkUm93SW5kZXggPSByb3dDb3VudCAtIDE7XG4gIH1cblxuICBpZiAobGFzdE1lYXN1cmVkUm93SW5kZXggPj0gMCkge1xuICAgIHZhciBpdGVtTWV0YWRhdGEgPSByb3dNZXRhZGF0YU1hcFtsYXN0TWVhc3VyZWRSb3dJbmRleF07XG4gICAgdG90YWxTaXplT2ZNZWFzdXJlZFJvd3MgPSBpdGVtTWV0YWRhdGEub2Zmc2V0ICsgaXRlbU1ldGFkYXRhLnNpemU7XG4gIH1cblxuICB2YXIgbnVtVW5tZWFzdXJlZEl0ZW1zID0gcm93Q291bnQgLSBsYXN0TWVhc3VyZWRSb3dJbmRleCAtIDE7XG4gIHZhciB0b3RhbFNpemVPZlVubWVhc3VyZWRJdGVtcyA9IG51bVVubWVhc3VyZWRJdGVtcyAqIGVzdGltYXRlZFJvd0hlaWdodDtcbiAgcmV0dXJuIHRvdGFsU2l6ZU9mTWVhc3VyZWRSb3dzICsgdG90YWxTaXplT2ZVbm1lYXN1cmVkSXRlbXM7XG59O1xuXG52YXIgZ2V0RXN0aW1hdGVkVG90YWxXaWR0aCA9IGZ1bmN0aW9uIGdldEVzdGltYXRlZFRvdGFsV2lkdGgoX3JlZjMsIF9yZWY0KSB7XG4gIHZhciBjb2x1bW5Db3VudCA9IF9yZWYzLmNvbHVtbkNvdW50O1xuICB2YXIgY29sdW1uTWV0YWRhdGFNYXAgPSBfcmVmNC5jb2x1bW5NZXRhZGF0YU1hcCxcbiAgICAgIGVzdGltYXRlZENvbHVtbldpZHRoID0gX3JlZjQuZXN0aW1hdGVkQ29sdW1uV2lkdGgsXG4gICAgICBsYXN0TWVhc3VyZWRDb2x1bW5JbmRleCA9IF9yZWY0Lmxhc3RNZWFzdXJlZENvbHVtbkluZGV4O1xuICB2YXIgdG90YWxTaXplT2ZNZWFzdXJlZFJvd3MgPSAwOyAvLyBFZGdlIGNhc2UgY2hlY2sgZm9yIHdoZW4gdGhlIG51bWJlciBvZiBpdGVtcyBkZWNyZWFzZXMgd2hpbGUgYSBzY3JvbGwgaXMgaW4gcHJvZ3Jlc3MuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9idmF1Z2huL3JlYWN0LXdpbmRvdy9wdWxsLzEzOFxuXG4gIGlmIChsYXN0TWVhc3VyZWRDb2x1bW5JbmRleCA+PSBjb2x1bW5Db3VudCkge1xuICAgIGxhc3RNZWFzdXJlZENvbHVtbkluZGV4ID0gY29sdW1uQ291bnQgLSAxO1xuICB9XG5cbiAgaWYgKGxhc3RNZWFzdXJlZENvbHVtbkluZGV4ID49IDApIHtcbiAgICB2YXIgaXRlbU1ldGFkYXRhID0gY29sdW1uTWV0YWRhdGFNYXBbbGFzdE1lYXN1cmVkQ29sdW1uSW5kZXhdO1xuICAgIHRvdGFsU2l6ZU9mTWVhc3VyZWRSb3dzID0gaXRlbU1ldGFkYXRhLm9mZnNldCArIGl0ZW1NZXRhZGF0YS5zaXplO1xuICB9XG5cbiAgdmFyIG51bVVubWVhc3VyZWRJdGVtcyA9IGNvbHVtbkNvdW50IC0gbGFzdE1lYXN1cmVkQ29sdW1uSW5kZXggLSAxO1xuICB2YXIgdG90YWxTaXplT2ZVbm1lYXN1cmVkSXRlbXMgPSBudW1Vbm1lYXN1cmVkSXRlbXMgKiBlc3RpbWF0ZWRDb2x1bW5XaWR0aDtcbiAgcmV0dXJuIHRvdGFsU2l6ZU9mTWVhc3VyZWRSb3dzICsgdG90YWxTaXplT2ZVbm1lYXN1cmVkSXRlbXM7XG59O1xuXG52YXIgZ2V0SXRlbU1ldGFkYXRhID0gZnVuY3Rpb24gZ2V0SXRlbU1ldGFkYXRhKGl0ZW1UeXBlLCBwcm9wcywgaW5kZXgsIGluc3RhbmNlUHJvcHMpIHtcbiAgdmFyIGl0ZW1NZXRhZGF0YU1hcCwgaXRlbVNpemUsIGxhc3RNZWFzdXJlZEluZGV4O1xuXG4gIGlmIChpdGVtVHlwZSA9PT0gJ2NvbHVtbicpIHtcbiAgICBpdGVtTWV0YWRhdGFNYXAgPSBpbnN0YW5jZVByb3BzLmNvbHVtbk1ldGFkYXRhTWFwO1xuICAgIGl0ZW1TaXplID0gcHJvcHMuY29sdW1uV2lkdGg7XG4gICAgbGFzdE1lYXN1cmVkSW5kZXggPSBpbnN0YW5jZVByb3BzLmxhc3RNZWFzdXJlZENvbHVtbkluZGV4O1xuICB9IGVsc2Uge1xuICAgIGl0ZW1NZXRhZGF0YU1hcCA9IGluc3RhbmNlUHJvcHMucm93TWV0YWRhdGFNYXA7XG4gICAgaXRlbVNpemUgPSBwcm9wcy5yb3dIZWlnaHQ7XG4gICAgbGFzdE1lYXN1cmVkSW5kZXggPSBpbnN0YW5jZVByb3BzLmxhc3RNZWFzdXJlZFJvd0luZGV4O1xuICB9XG5cbiAgaWYgKGluZGV4ID4gbGFzdE1lYXN1cmVkSW5kZXgpIHtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcblxuICAgIGlmIChsYXN0TWVhc3VyZWRJbmRleCA+PSAwKSB7XG4gICAgICB2YXIgaXRlbU1ldGFkYXRhID0gaXRlbU1ldGFkYXRhTWFwW2xhc3RNZWFzdXJlZEluZGV4XTtcbiAgICAgIG9mZnNldCA9IGl0ZW1NZXRhZGF0YS5vZmZzZXQgKyBpdGVtTWV0YWRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gbGFzdE1lYXN1cmVkSW5kZXggKyAxOyBpIDw9IGluZGV4OyBpKyspIHtcbiAgICAgIHZhciBzaXplID0gaXRlbVNpemUoaSk7XG4gICAgICBpdGVtTWV0YWRhdGFNYXBbaV0gPSB7XG4gICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICBzaXplOiBzaXplXG4gICAgICB9O1xuICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW1UeXBlID09PSAnY29sdW1uJykge1xuICAgICAgaW5zdGFuY2VQcm9wcy5sYXN0TWVhc3VyZWRDb2x1bW5JbmRleCA9IGluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZVByb3BzLmxhc3RNZWFzdXJlZFJvd0luZGV4ID0gaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGl0ZW1NZXRhZGF0YU1hcFtpbmRleF07XG59O1xuXG52YXIgZmluZE5lYXJlc3RJdGVtID0gZnVuY3Rpb24gZmluZE5lYXJlc3RJdGVtKGl0ZW1UeXBlLCBwcm9wcywgaW5zdGFuY2VQcm9wcywgb2Zmc2V0KSB7XG4gIHZhciBpdGVtTWV0YWRhdGFNYXAsIGxhc3RNZWFzdXJlZEluZGV4O1xuXG4gIGlmIChpdGVtVHlwZSA9PT0gJ2NvbHVtbicpIHtcbiAgICBpdGVtTWV0YWRhdGFNYXAgPSBpbnN0YW5jZVByb3BzLmNvbHVtbk1ldGFkYXRhTWFwO1xuICAgIGxhc3RNZWFzdXJlZEluZGV4ID0gaW5zdGFuY2VQcm9wcy5sYXN0TWVhc3VyZWRDb2x1bW5JbmRleDtcbiAgfSBlbHNlIHtcbiAgICBpdGVtTWV0YWRhdGFNYXAgPSBpbnN0YW5jZVByb3BzLnJvd01ldGFkYXRhTWFwO1xuICAgIGxhc3RNZWFzdXJlZEluZGV4ID0gaW5zdGFuY2VQcm9wcy5sYXN0TWVhc3VyZWRSb3dJbmRleDtcbiAgfVxuXG4gIHZhciBsYXN0TWVhc3VyZWRJdGVtT2Zmc2V0ID0gbGFzdE1lYXN1cmVkSW5kZXggPiAwID8gaXRlbU1ldGFkYXRhTWFwW2xhc3RNZWFzdXJlZEluZGV4XS5vZmZzZXQgOiAwO1xuXG4gIGlmIChsYXN0TWVhc3VyZWRJdGVtT2Zmc2V0ID49IG9mZnNldCkge1xuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgbWVhc3VyZWQgaXRlbXMgd2l0aGluIHRoaXMgcmFuZ2UganVzdCB1c2UgYSBiaW5hcnkgc2VhcmNoIGFzIGl0J3MgZmFzdGVyLlxuICAgIHJldHVybiBmaW5kTmVhcmVzdEl0ZW1CaW5hcnlTZWFyY2goaXRlbVR5cGUsIHByb3BzLCBpbnN0YW5jZVByb3BzLCBsYXN0TWVhc3VyZWRJbmRleCwgMCwgb2Zmc2V0KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB3ZSBoYXZlbid0IHlldCBtZWFzdXJlZCB0aGlzIGhpZ2gsIGZhbGxiYWNrIHRvIGFuIGV4cG9uZW50aWFsIHNlYXJjaCB3aXRoIGFuIGlubmVyIGJpbmFyeSBzZWFyY2guXG4gICAgLy8gVGhlIGV4cG9uZW50aWFsIHNlYXJjaCBhdm9pZHMgcHJlLWNvbXB1dGluZyBzaXplcyBmb3IgdGhlIGZ1bGwgc2V0IG9mIGl0ZW1zIGFzIGEgYmluYXJ5IHNlYXJjaCB3b3VsZC5cbiAgICAvLyBUaGUgb3ZlcmFsbCBjb21wbGV4aXR5IGZvciB0aGlzIGFwcHJvYWNoIGlzIE8obG9nIG4pLlxuICAgIHJldHVybiBmaW5kTmVhcmVzdEl0ZW1FeHBvbmVudGlhbFNlYXJjaChpdGVtVHlwZSwgcHJvcHMsIGluc3RhbmNlUHJvcHMsIE1hdGgubWF4KDAsIGxhc3RNZWFzdXJlZEluZGV4KSwgb2Zmc2V0KTtcbiAgfVxufTtcblxudmFyIGZpbmROZWFyZXN0SXRlbUJpbmFyeVNlYXJjaCA9IGZ1bmN0aW9uIGZpbmROZWFyZXN0SXRlbUJpbmFyeVNlYXJjaChpdGVtVHlwZSwgcHJvcHMsIGluc3RhbmNlUHJvcHMsIGhpZ2gsIGxvdywgb2Zmc2V0KSB7XG4gIHdoaWxlIChsb3cgPD0gaGlnaCkge1xuICAgIHZhciBtaWRkbGUgPSBsb3cgKyBNYXRoLmZsb29yKChoaWdoIC0gbG93KSAvIDIpO1xuICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gZ2V0SXRlbU1ldGFkYXRhKGl0ZW1UeXBlLCBwcm9wcywgbWlkZGxlLCBpbnN0YW5jZVByb3BzKS5vZmZzZXQ7XG5cbiAgICBpZiAoY3VycmVudE9mZnNldCA9PT0gb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gbWlkZGxlO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudE9mZnNldCA8IG9mZnNldCkge1xuICAgICAgbG93ID0gbWlkZGxlICsgMTtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRPZmZzZXQgPiBvZmZzZXQpIHtcbiAgICAgIGhpZ2ggPSBtaWRkbGUgLSAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsb3cgPiAwKSB7XG4gICAgcmV0dXJuIGxvdyAtIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbnZhciBmaW5kTmVhcmVzdEl0ZW1FeHBvbmVudGlhbFNlYXJjaCA9IGZ1bmN0aW9uIGZpbmROZWFyZXN0SXRlbUV4cG9uZW50aWFsU2VhcmNoKGl0ZW1UeXBlLCBwcm9wcywgaW5zdGFuY2VQcm9wcywgaW5kZXgsIG9mZnNldCkge1xuICB2YXIgaXRlbUNvdW50ID0gaXRlbVR5cGUgPT09ICdjb2x1bW4nID8gcHJvcHMuY29sdW1uQ291bnQgOiBwcm9wcy5yb3dDb3VudDtcbiAgdmFyIGludGVydmFsID0gMTtcblxuICB3aGlsZSAoaW5kZXggPCBpdGVtQ291bnQgJiYgZ2V0SXRlbU1ldGFkYXRhKGl0ZW1UeXBlLCBwcm9wcywgaW5kZXgsIGluc3RhbmNlUHJvcHMpLm9mZnNldCA8IG9mZnNldCkge1xuICAgIGluZGV4ICs9IGludGVydmFsO1xuICAgIGludGVydmFsICo9IDI7XG4gIH1cblxuICByZXR1cm4gZmluZE5lYXJlc3RJdGVtQmluYXJ5U2VhcmNoKGl0ZW1UeXBlLCBwcm9wcywgaW5zdGFuY2VQcm9wcywgTWF0aC5taW4oaW5kZXgsIGl0ZW1Db3VudCAtIDEpLCBNYXRoLmZsb29yKGluZGV4IC8gMiksIG9mZnNldCk7XG59O1xuXG52YXIgZ2V0T2Zmc2V0Rm9ySW5kZXhBbmRBbGlnbm1lbnQgPSBmdW5jdGlvbiBnZXRPZmZzZXRGb3JJbmRleEFuZEFsaWdubWVudChpdGVtVHlwZSwgcHJvcHMsIGluZGV4LCBhbGlnbiwgc2Nyb2xsT2Zmc2V0LCBpbnN0YW5jZVByb3BzLCBzY3JvbGxiYXJTaXplKSB7XG4gIHZhciBzaXplID0gaXRlbVR5cGUgPT09ICdjb2x1bW4nID8gcHJvcHMud2lkdGggOiBwcm9wcy5oZWlnaHQ7XG4gIHZhciBpdGVtTWV0YWRhdGEgPSBnZXRJdGVtTWV0YWRhdGEoaXRlbVR5cGUsIHByb3BzLCBpbmRleCwgaW5zdGFuY2VQcm9wcyk7IC8vIEdldCBlc3RpbWF0ZWQgdG90YWwgc2l6ZSBhZnRlciBJdGVtTWV0YWRhdGEgaXMgY29tcHV0ZWQsXG4gIC8vIFRvIGVuc3VyZSBpdCByZWZsZWN0cyBhY3R1YWwgbWVhc3VyZW1lbnRzIGluc3RlYWQgb2YganVzdCBlc3RpbWF0ZXMuXG5cbiAgdmFyIGVzdGltYXRlZFRvdGFsU2l6ZSA9IGl0ZW1UeXBlID09PSAnY29sdW1uJyA/IGdldEVzdGltYXRlZFRvdGFsV2lkdGgocHJvcHMsIGluc3RhbmNlUHJvcHMpIDogZ2V0RXN0aW1hdGVkVG90YWxIZWlnaHQocHJvcHMsIGluc3RhbmNlUHJvcHMpO1xuICB2YXIgbWF4T2Zmc2V0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZXN0aW1hdGVkVG90YWxTaXplIC0gc2l6ZSwgaXRlbU1ldGFkYXRhLm9mZnNldCkpO1xuICB2YXIgbWluT2Zmc2V0ID0gTWF0aC5tYXgoMCwgaXRlbU1ldGFkYXRhLm9mZnNldCAtIHNpemUgKyBzY3JvbGxiYXJTaXplICsgaXRlbU1ldGFkYXRhLnNpemUpO1xuXG4gIGlmIChhbGlnbiA9PT0gJ3NtYXJ0Jykge1xuICAgIGlmIChzY3JvbGxPZmZzZXQgPj0gbWluT2Zmc2V0IC0gc2l6ZSAmJiBzY3JvbGxPZmZzZXQgPD0gbWF4T2Zmc2V0ICsgc2l6ZSkge1xuICAgICAgYWxpZ24gPSAnYXV0byc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsaWduID0gJ2NlbnRlcic7XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoIChhbGlnbikge1xuICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgIHJldHVybiBtYXhPZmZzZXQ7XG5cbiAgICBjYXNlICdlbmQnOlxuICAgICAgcmV0dXJuIG1pbk9mZnNldDtcblxuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChtaW5PZmZzZXQgKyAobWF4T2Zmc2V0IC0gbWluT2Zmc2V0KSAvIDIpO1xuXG4gICAgY2FzZSAnYXV0byc6XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChzY3JvbGxPZmZzZXQgPj0gbWluT2Zmc2V0ICYmIHNjcm9sbE9mZnNldCA8PSBtYXhPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbE9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAobWluT2Zmc2V0ID4gbWF4T2Zmc2V0KSB7XG4gICAgICAgIC8vIEJlY2F1c2Ugd2Ugb25seSB0YWtlIGludG8gYWNjb3VudCB0aGUgc2Nyb2xsYmFyIHNpemUgd2hlbiBjYWxjdWxhdGluZyBtaW5PZmZzZXRcbiAgICAgICAgLy8gdGhpcyB2YWx1ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gbWF4T2Zmc2V0IHdoZW4gYXQgdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgICAgICByZXR1cm4gbWluT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChzY3JvbGxPZmZzZXQgPCBtaW5PZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG1pbk9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBtYXhPZmZzZXQ7XG4gICAgICB9XG5cbiAgfVxufTtcblxudmFyIFZhcmlhYmxlU2l6ZUdyaWQgPSAvKiNfX1BVUkVfXyovY3JlYXRlR3JpZENvbXBvbmVudCh7XG4gIGdldENvbHVtbk9mZnNldDogZnVuY3Rpb24gZ2V0Q29sdW1uT2Zmc2V0KHByb3BzLCBpbmRleCwgaW5zdGFuY2VQcm9wcykge1xuICAgIHJldHVybiBnZXRJdGVtTWV0YWRhdGEoJ2NvbHVtbicsIHByb3BzLCBpbmRleCwgaW5zdGFuY2VQcm9wcykub2Zmc2V0O1xuICB9LFxuICBnZXRDb2x1bW5TdGFydEluZGV4Rm9yT2Zmc2V0OiBmdW5jdGlvbiBnZXRDb2x1bW5TdGFydEluZGV4Rm9yT2Zmc2V0KHByb3BzLCBzY3JvbGxMZWZ0LCBpbnN0YW5jZVByb3BzKSB7XG4gICAgcmV0dXJuIGZpbmROZWFyZXN0SXRlbSgnY29sdW1uJywgcHJvcHMsIGluc3RhbmNlUHJvcHMsIHNjcm9sbExlZnQpO1xuICB9LFxuICBnZXRDb2x1bW5TdG9wSW5kZXhGb3JTdGFydEluZGV4OiBmdW5jdGlvbiBnZXRDb2x1bW5TdG9wSW5kZXhGb3JTdGFydEluZGV4KHByb3BzLCBzdGFydEluZGV4LCBzY3JvbGxMZWZ0LCBpbnN0YW5jZVByb3BzKSB7XG4gICAgdmFyIGNvbHVtbkNvdW50ID0gcHJvcHMuY29sdW1uQ291bnQsXG4gICAgICAgIHdpZHRoID0gcHJvcHMud2lkdGg7XG4gICAgdmFyIGl0ZW1NZXRhZGF0YSA9IGdldEl0ZW1NZXRhZGF0YSgnY29sdW1uJywgcHJvcHMsIHN0YXJ0SW5kZXgsIGluc3RhbmNlUHJvcHMpO1xuICAgIHZhciBtYXhPZmZzZXQgPSBzY3JvbGxMZWZ0ICsgd2lkdGg7XG4gICAgdmFyIG9mZnNldCA9IGl0ZW1NZXRhZGF0YS5vZmZzZXQgKyBpdGVtTWV0YWRhdGEuc2l6ZTtcbiAgICB2YXIgc3RvcEluZGV4ID0gc3RhcnRJbmRleDtcblxuICAgIHdoaWxlIChzdG9wSW5kZXggPCBjb2x1bW5Db3VudCAtIDEgJiYgb2Zmc2V0IDwgbWF4T2Zmc2V0KSB7XG4gICAgICBzdG9wSW5kZXgrKztcbiAgICAgIG9mZnNldCArPSBnZXRJdGVtTWV0YWRhdGEoJ2NvbHVtbicsIHByb3BzLCBzdG9wSW5kZXgsIGluc3RhbmNlUHJvcHMpLnNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0b3BJbmRleDtcbiAgfSxcbiAgZ2V0Q29sdW1uV2lkdGg6IGZ1bmN0aW9uIGdldENvbHVtbldpZHRoKHByb3BzLCBpbmRleCwgaW5zdGFuY2VQcm9wcykge1xuICAgIHJldHVybiBpbnN0YW5jZVByb3BzLmNvbHVtbk1ldGFkYXRhTWFwW2luZGV4XS5zaXplO1xuICB9LFxuICBnZXRFc3RpbWF0ZWRUb3RhbEhlaWdodDogZ2V0RXN0aW1hdGVkVG90YWxIZWlnaHQsXG4gIGdldEVzdGltYXRlZFRvdGFsV2lkdGg6IGdldEVzdGltYXRlZFRvdGFsV2lkdGgsXG4gIGdldE9mZnNldEZvckNvbHVtbkFuZEFsaWdubWVudDogZnVuY3Rpb24gZ2V0T2Zmc2V0Rm9yQ29sdW1uQW5kQWxpZ25tZW50KHByb3BzLCBpbmRleCwgYWxpZ24sIHNjcm9sbE9mZnNldCwgaW5zdGFuY2VQcm9wcywgc2Nyb2xsYmFyU2l6ZSkge1xuICAgIHJldHVybiBnZXRPZmZzZXRGb3JJbmRleEFuZEFsaWdubWVudCgnY29sdW1uJywgcHJvcHMsIGluZGV4LCBhbGlnbiwgc2Nyb2xsT2Zmc2V0LCBpbnN0YW5jZVByb3BzLCBzY3JvbGxiYXJTaXplKTtcbiAgfSxcbiAgZ2V0T2Zmc2V0Rm9yUm93QW5kQWxpZ25tZW50OiBmdW5jdGlvbiBnZXRPZmZzZXRGb3JSb3dBbmRBbGlnbm1lbnQocHJvcHMsIGluZGV4LCBhbGlnbiwgc2Nyb2xsT2Zmc2V0LCBpbnN0YW5jZVByb3BzLCBzY3JvbGxiYXJTaXplKSB7XG4gICAgcmV0dXJuIGdldE9mZnNldEZvckluZGV4QW5kQWxpZ25tZW50KCdyb3cnLCBwcm9wcywgaW5kZXgsIGFsaWduLCBzY3JvbGxPZmZzZXQsIGluc3RhbmNlUHJvcHMsIHNjcm9sbGJhclNpemUpO1xuICB9LFxuICBnZXRSb3dPZmZzZXQ6IGZ1bmN0aW9uIGdldFJvd09mZnNldChwcm9wcywgaW5kZXgsIGluc3RhbmNlUHJvcHMpIHtcbiAgICByZXR1cm4gZ2V0SXRlbU1ldGFkYXRhKCdyb3cnLCBwcm9wcywgaW5kZXgsIGluc3RhbmNlUHJvcHMpLm9mZnNldDtcbiAgfSxcbiAgZ2V0Um93SGVpZ2h0OiBmdW5jdGlvbiBnZXRSb3dIZWlnaHQocHJvcHMsIGluZGV4LCBpbnN0YW5jZVByb3BzKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlUHJvcHMucm93TWV0YWRhdGFNYXBbaW5kZXhdLnNpemU7XG4gIH0sXG4gIGdldFJvd1N0YXJ0SW5kZXhGb3JPZmZzZXQ6IGZ1bmN0aW9uIGdldFJvd1N0YXJ0SW5kZXhGb3JPZmZzZXQocHJvcHMsIHNjcm9sbFRvcCwgaW5zdGFuY2VQcm9wcykge1xuICAgIHJldHVybiBmaW5kTmVhcmVzdEl0ZW0oJ3JvdycsIHByb3BzLCBpbnN0YW5jZVByb3BzLCBzY3JvbGxUb3ApO1xuICB9LFxuICBnZXRSb3dTdG9wSW5kZXhGb3JTdGFydEluZGV4OiBmdW5jdGlvbiBnZXRSb3dTdG9wSW5kZXhGb3JTdGFydEluZGV4KHByb3BzLCBzdGFydEluZGV4LCBzY3JvbGxUb3AsIGluc3RhbmNlUHJvcHMpIHtcbiAgICB2YXIgcm93Q291bnQgPSBwcm9wcy5yb3dDb3VudCxcbiAgICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0O1xuICAgIHZhciBpdGVtTWV0YWRhdGEgPSBnZXRJdGVtTWV0YWRhdGEoJ3JvdycsIHByb3BzLCBzdGFydEluZGV4LCBpbnN0YW5jZVByb3BzKTtcbiAgICB2YXIgbWF4T2Zmc2V0ID0gc2Nyb2xsVG9wICsgaGVpZ2h0O1xuICAgIHZhciBvZmZzZXQgPSBpdGVtTWV0YWRhdGEub2Zmc2V0ICsgaXRlbU1ldGFkYXRhLnNpemU7XG4gICAgdmFyIHN0b3BJbmRleCA9IHN0YXJ0SW5kZXg7XG5cbiAgICB3aGlsZSAoc3RvcEluZGV4IDwgcm93Q291bnQgLSAxICYmIG9mZnNldCA8IG1heE9mZnNldCkge1xuICAgICAgc3RvcEluZGV4Kys7XG4gICAgICBvZmZzZXQgKz0gZ2V0SXRlbU1ldGFkYXRhKCdyb3cnLCBwcm9wcywgc3RvcEluZGV4LCBpbnN0YW5jZVByb3BzKS5zaXplO1xuICAgIH1cblxuICAgIHJldHVybiBzdG9wSW5kZXg7XG4gIH0sXG4gIGluaXRJbnN0YW5jZVByb3BzOiBmdW5jdGlvbiBpbml0SW5zdGFuY2VQcm9wcyhwcm9wcywgaW5zdGFuY2UpIHtcbiAgICB2YXIgX3JlZjUgPSBwcm9wcyxcbiAgICAgICAgZXN0aW1hdGVkQ29sdW1uV2lkdGggPSBfcmVmNS5lc3RpbWF0ZWRDb2x1bW5XaWR0aCxcbiAgICAgICAgZXN0aW1hdGVkUm93SGVpZ2h0ID0gX3JlZjUuZXN0aW1hdGVkUm93SGVpZ2h0O1xuICAgIHZhciBpbnN0YW5jZVByb3BzID0ge1xuICAgICAgY29sdW1uTWV0YWRhdGFNYXA6IHt9LFxuICAgICAgZXN0aW1hdGVkQ29sdW1uV2lkdGg6IGVzdGltYXRlZENvbHVtbldpZHRoIHx8IERFRkFVTFRfRVNUSU1BVEVEX0lURU1fU0laRSxcbiAgICAgIGVzdGltYXRlZFJvd0hlaWdodDogZXN0aW1hdGVkUm93SGVpZ2h0IHx8IERFRkFVTFRfRVNUSU1BVEVEX0lURU1fU0laRSxcbiAgICAgIGxhc3RNZWFzdXJlZENvbHVtbkluZGV4OiAtMSxcbiAgICAgIGxhc3RNZWFzdXJlZFJvd0luZGV4OiAtMSxcbiAgICAgIHJvd01ldGFkYXRhTWFwOiB7fVxuICAgIH07XG5cbiAgICBpbnN0YW5jZS5yZXNldEFmdGVyQ29sdW1uSW5kZXggPSBmdW5jdGlvbiAoY29sdW1uSW5kZXgsIHNob3VsZEZvcmNlVXBkYXRlKSB7XG4gICAgICBpZiAoc2hvdWxkRm9yY2VVcGRhdGUgPT09IHZvaWQgMCkge1xuICAgICAgICBzaG91bGRGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlLnJlc2V0QWZ0ZXJJbmRpY2VzKHtcbiAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgICBzaG91bGRGb3JjZVVwZGF0ZTogc2hvdWxkRm9yY2VVcGRhdGVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbnN0YW5jZS5yZXNldEFmdGVyUm93SW5kZXggPSBmdW5jdGlvbiAocm93SW5kZXgsIHNob3VsZEZvcmNlVXBkYXRlKSB7XG4gICAgICBpZiAoc2hvdWxkRm9yY2VVcGRhdGUgPT09IHZvaWQgMCkge1xuICAgICAgICBzaG91bGRGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlLnJlc2V0QWZ0ZXJJbmRpY2VzKHtcbiAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgICBzaG91bGRGb3JjZVVwZGF0ZTogc2hvdWxkRm9yY2VVcGRhdGVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbnN0YW5jZS5yZXNldEFmdGVySW5kaWNlcyA9IGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGNvbHVtbkluZGV4ID0gX3JlZjYuY29sdW1uSW5kZXgsXG4gICAgICAgICAgcm93SW5kZXggPSBfcmVmNi5yb3dJbmRleCxcbiAgICAgICAgICBfcmVmNiRzaG91bGRGb3JjZVVwZGEgPSBfcmVmNi5zaG91bGRGb3JjZVVwZGF0ZSxcbiAgICAgICAgICBzaG91bGRGb3JjZVVwZGF0ZSA9IF9yZWY2JHNob3VsZEZvcmNlVXBkYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWY2JHNob3VsZEZvcmNlVXBkYTtcblxuICAgICAgaWYgKHR5cGVvZiBjb2x1bW5JbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaW5zdGFuY2VQcm9wcy5sYXN0TWVhc3VyZWRDb2x1bW5JbmRleCA9IE1hdGgubWluKGluc3RhbmNlUHJvcHMubGFzdE1lYXN1cmVkQ29sdW1uSW5kZXgsIGNvbHVtbkluZGV4IC0gMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygcm93SW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICAgIGluc3RhbmNlUHJvcHMubGFzdE1lYXN1cmVkUm93SW5kZXggPSBNYXRoLm1pbihpbnN0YW5jZVByb3BzLmxhc3RNZWFzdXJlZFJvd0luZGV4LCByb3dJbmRleCAtIDEpO1xuICAgICAgfSAvLyBXZSBjb3VsZCBwb3RlbnRpYWxseSBvcHRpbWl6ZSBmdXJ0aGVyIGJ5IG9ubHkgZXZpY3Rpbmcgc3R5bGVzIGFmdGVyIHRoaXMgaW5kZXgsXG4gICAgICAvLyBCdXQgc2luY2Ugc3R5bGVzIGFyZSBvbmx5IGNhY2hlZCB3aGlsZSBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MtXG4gICAgICAvLyBJdCBzZWVtcyBhbiB1bm5lY2Vzc2FyeSBvcHRpbWl6YXRpb24uXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoYXQgcmVzZXRBZnRlckluZGV4KCkgd2lsbCBiZSBjYWxsZWQgd2hpbGUgYSB1c2VyIGlzIHNjcm9sbGluZy5cblxuXG4gICAgICBpbnN0YW5jZS5fZ2V0SXRlbVN0eWxlQ2FjaGUoLTEpO1xuXG4gICAgICBpZiAoc2hvdWxkRm9yY2VVcGRhdGUpIHtcbiAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGluc3RhbmNlUHJvcHM7XG4gIH0sXG4gIHNob3VsZFJlc2V0U3R5bGVDYWNoZU9uSXRlbVNpemVDaGFuZ2U6IGZhbHNlLFxuICB2YWxpZGF0ZVByb3BzOiBmdW5jdGlvbiB2YWxpZGF0ZVByb3BzKF9yZWY3KSB7XG4gICAgdmFyIGNvbHVtbldpZHRoID0gX3JlZjcuY29sdW1uV2lkdGgsXG4gICAgICAgIHJvd0hlaWdodCA9IF9yZWY3LnJvd0hlaWdodDtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbldpZHRoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdBbiBpbnZhbGlkIFwiY29sdW1uV2lkdGhcIiBwcm9wIGhhcyBiZWVuIHNwZWNpZmllZC4gJyArICdWYWx1ZSBzaG91bGQgYmUgYSBmdW5jdGlvbi4gJyArIChcIlxcXCJcIiArIChjb2x1bW5XaWR0aCA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBjb2x1bW5XaWR0aCkgKyBcIlxcXCIgd2FzIHNwZWNpZmllZC5cIikpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygcm93SGVpZ2h0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdBbiBpbnZhbGlkIFwicm93SGVpZ2h0XCIgcHJvcCBoYXMgYmVlbiBzcGVjaWZpZWQuICcgKyAnVmFsdWUgc2hvdWxkIGJlIGEgZnVuY3Rpb24uICcgKyAoXCJcXFwiXCIgKyAocm93SGVpZ2h0ID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJvd0hlaWdodCkgKyBcIlxcXCIgd2FzIHNwZWNpZmllZC5cIikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG5cbnZhciBJU19TQ1JPTExJTkdfREVCT1VOQ0VfSU5URVJWQUwkMSA9IDE1MDtcblxudmFyIGRlZmF1bHRJdGVtS2V5JDEgPSBmdW5jdGlvbiBkZWZhdWx0SXRlbUtleShpbmRleCwgZGF0YSkge1xuICByZXR1cm4gaW5kZXg7XG59OyAvLyBJbiBERVYgbW9kZSwgdGhpcyBTZXQgaGVscHMgdXMgb25seSBsb2cgYSB3YXJuaW5nIG9uY2UgcGVyIGNvbXBvbmVudCBpbnN0YW5jZS5cbi8vIFRoaXMgYXZvaWRzIHNwYW1taW5nIHRoZSBjb25zb2xlIGV2ZXJ5IHRpbWUgYSByZW5kZXIgaGFwcGVucy5cblxuXG52YXIgZGV2V2FybmluZ3NEaXJlY3Rpb24gPSBudWxsO1xudmFyIGRldldhcm5pbmdzVGFnTmFtZSQxID0gbnVsbDtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuV2Vha1NldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZXZXYXJuaW5nc0RpcmVjdGlvbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgIGRldldhcm5pbmdzVGFnTmFtZSQxID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlzdENvbXBvbmVudChfcmVmKSB7XG4gIHZhciBfY2xhc3M7XG5cbiAgdmFyIGdldEl0ZW1PZmZzZXQgPSBfcmVmLmdldEl0ZW1PZmZzZXQsXG4gICAgICBnZXRFc3RpbWF0ZWRUb3RhbFNpemUgPSBfcmVmLmdldEVzdGltYXRlZFRvdGFsU2l6ZSxcbiAgICAgIGdldEl0ZW1TaXplID0gX3JlZi5nZXRJdGVtU2l6ZSxcbiAgICAgIGdldE9mZnNldEZvckluZGV4QW5kQWxpZ25tZW50ID0gX3JlZi5nZXRPZmZzZXRGb3JJbmRleEFuZEFsaWdubWVudCxcbiAgICAgIGdldFN0YXJ0SW5kZXhGb3JPZmZzZXQgPSBfcmVmLmdldFN0YXJ0SW5kZXhGb3JPZmZzZXQsXG4gICAgICBnZXRTdG9wSW5kZXhGb3JTdGFydEluZGV4ID0gX3JlZi5nZXRTdG9wSW5kZXhGb3JTdGFydEluZGV4LFxuICAgICAgaW5pdEluc3RhbmNlUHJvcHMgPSBfcmVmLmluaXRJbnN0YW5jZVByb3BzLFxuICAgICAgc2hvdWxkUmVzZXRTdHlsZUNhY2hlT25JdGVtU2l6ZUNoYW5nZSA9IF9yZWYuc2hvdWxkUmVzZXRTdHlsZUNhY2hlT25JdGVtU2l6ZUNoYW5nZSxcbiAgICAgIHZhbGlkYXRlUHJvcHMgPSBfcmVmLnZhbGlkYXRlUHJvcHM7XG4gIHJldHVybiBfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzTG9vc2UoTGlzdCwgX1B1cmVDb21wb25lbnQpO1xuXG4gICAgLy8gQWx3YXlzIHVzZSBleHBsaWNpdCBjb25zdHJ1Y3RvciBmb3IgUmVhY3QgY29tcG9uZW50cy5cbiAgICAvLyBJdCBwcm9kdWNlcyBsZXNzIGNvZGUgYWZ0ZXIgdHJhbnNwaWxhdGlvbi4gKCMyNilcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jb25zdHJ1Y3RvclxuICAgIGZ1bmN0aW9uIExpc3QocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX3RoaXMgPSBfUHVyZUNvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuICAgICAgX3RoaXMuX2luc3RhbmNlUHJvcHMgPSBpbml0SW5zdGFuY2VQcm9wcyhfdGhpcy5wcm9wcywgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgICAgX3RoaXMuX291dGVyUmVmID0gdm9pZCAwO1xuICAgICAgX3RoaXMuX3Jlc2V0SXNTY3JvbGxpbmdUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgIGluc3RhbmNlOiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSxcbiAgICAgICAgaXNTY3JvbGxpbmc6IGZhbHNlLFxuICAgICAgICBzY3JvbGxEaXJlY3Rpb246ICdmb3J3YXJkJyxcbiAgICAgICAgc2Nyb2xsT2Zmc2V0OiB0eXBlb2YgX3RoaXMucHJvcHMuaW5pdGlhbFNjcm9sbE9mZnNldCA9PT0gJ251bWJlcicgPyBfdGhpcy5wcm9wcy5pbml0aWFsU2Nyb2xsT2Zmc2V0IDogMCxcbiAgICAgICAgc2Nyb2xsVXBkYXRlV2FzUmVxdWVzdGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIF90aGlzLl9jYWxsT25JdGVtc1JlbmRlcmVkID0gdm9pZCAwO1xuICAgICAgX3RoaXMuX2NhbGxPbkl0ZW1zUmVuZGVyZWQgPSBtZW1vaXplT25lKGZ1bmN0aW9uIChvdmVyc2NhblN0YXJ0SW5kZXgsIG92ZXJzY2FuU3RvcEluZGV4LCB2aXNpYmxlU3RhcnRJbmRleCwgdmlzaWJsZVN0b3BJbmRleCkge1xuICAgICAgICByZXR1cm4gX3RoaXMucHJvcHMub25JdGVtc1JlbmRlcmVkKHtcbiAgICAgICAgICBvdmVyc2NhblN0YXJ0SW5kZXg6IG92ZXJzY2FuU3RhcnRJbmRleCxcbiAgICAgICAgICBvdmVyc2NhblN0b3BJbmRleDogb3ZlcnNjYW5TdG9wSW5kZXgsXG4gICAgICAgICAgdmlzaWJsZVN0YXJ0SW5kZXg6IHZpc2libGVTdGFydEluZGV4LFxuICAgICAgICAgIHZpc2libGVTdG9wSW5kZXg6IHZpc2libGVTdG9wSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIF90aGlzLl9jYWxsT25TY3JvbGwgPSB2b2lkIDA7XG4gICAgICBfdGhpcy5fY2FsbE9uU2Nyb2xsID0gbWVtb2l6ZU9uZShmdW5jdGlvbiAoc2Nyb2xsRGlyZWN0aW9uLCBzY3JvbGxPZmZzZXQsIHNjcm9sbFVwZGF0ZVdhc1JlcXVlc3RlZCkge1xuICAgICAgICByZXR1cm4gX3RoaXMucHJvcHMub25TY3JvbGwoe1xuICAgICAgICAgIHNjcm9sbERpcmVjdGlvbjogc2Nyb2xsRGlyZWN0aW9uLFxuICAgICAgICAgIHNjcm9sbE9mZnNldDogc2Nyb2xsT2Zmc2V0LFxuICAgICAgICAgIHNjcm9sbFVwZGF0ZVdhc1JlcXVlc3RlZDogc2Nyb2xsVXBkYXRlV2FzUmVxdWVzdGVkXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBfdGhpcy5fZ2V0SXRlbVN0eWxlID0gdm9pZCAwO1xuXG4gICAgICBfdGhpcy5fZ2V0SXRlbVN0eWxlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgZGlyZWN0aW9uID0gX3RoaXMkcHJvcHMuZGlyZWN0aW9uLFxuICAgICAgICAgICAgaXRlbVNpemUgPSBfdGhpcyRwcm9wcy5pdGVtU2l6ZSxcbiAgICAgICAgICAgIGxheW91dCA9IF90aGlzJHByb3BzLmxheW91dDtcblxuICAgICAgICB2YXIgaXRlbVN0eWxlQ2FjaGUgPSBfdGhpcy5fZ2V0SXRlbVN0eWxlQ2FjaGUoc2hvdWxkUmVzZXRTdHlsZUNhY2hlT25JdGVtU2l6ZUNoYW5nZSAmJiBpdGVtU2l6ZSwgc2hvdWxkUmVzZXRTdHlsZUNhY2hlT25JdGVtU2l6ZUNoYW5nZSAmJiBsYXlvdXQsIHNob3VsZFJlc2V0U3R5bGVDYWNoZU9uSXRlbVNpemVDaGFuZ2UgJiYgZGlyZWN0aW9uKTtcblxuICAgICAgICB2YXIgc3R5bGU7XG5cbiAgICAgICAgaWYgKGl0ZW1TdHlsZUNhY2hlLmhhc093blByb3BlcnR5KGluZGV4KSkge1xuICAgICAgICAgIHN0eWxlID0gaXRlbVN0eWxlQ2FjaGVbaW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfb2Zmc2V0ID0gZ2V0SXRlbU9mZnNldChfdGhpcy5wcm9wcywgaW5kZXgsIF90aGlzLl9pbnN0YW5jZVByb3BzKTtcblxuICAgICAgICAgIHZhciBzaXplID0gZ2V0SXRlbVNpemUoX3RoaXMucHJvcHMsIGluZGV4LCBfdGhpcy5faW5zdGFuY2VQcm9wcyk7IC8vIFRPRE8gRGVwcmVjYXRlIGRpcmVjdGlvbiBcImhvcml6b250YWxcIlxuXG4gICAgICAgICAgdmFyIGlzSG9yaXpvbnRhbCA9IGRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnIHx8IGxheW91dCA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgICAgIHZhciBpc1J0bCA9IGRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgICAgICAgdmFyIG9mZnNldEhvcml6b250YWwgPSBpc0hvcml6b250YWwgPyBfb2Zmc2V0IDogMDtcbiAgICAgICAgICBpdGVtU3R5bGVDYWNoZVtpbmRleF0gPSBzdHlsZSA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgbGVmdDogaXNSdGwgPyB1bmRlZmluZWQgOiBvZmZzZXRIb3Jpem9udGFsLFxuICAgICAgICAgICAgcmlnaHQ6IGlzUnRsID8gb2Zmc2V0SG9yaXpvbnRhbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRvcDogIWlzSG9yaXpvbnRhbCA/IF9vZmZzZXQgOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAhaXNIb3Jpem9udGFsID8gc2l6ZSA6ICcxMDAlJyxcbiAgICAgICAgICAgIHdpZHRoOiBpc0hvcml6b250YWwgPyBzaXplIDogJzEwMCUnXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9nZXRJdGVtU3R5bGVDYWNoZSA9IHZvaWQgMDtcbiAgICAgIF90aGlzLl9nZXRJdGVtU3R5bGVDYWNoZSA9IG1lbW9pemVPbmUoZnVuY3Rpb24gKF8sIF9fLCBfX18pIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfSk7XG5cbiAgICAgIF90aGlzLl9vblNjcm9sbEhvcml6b250YWwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9ldmVudCRjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgIGNsaWVudFdpZHRoID0gX2V2ZW50JGN1cnJlbnRUYXJnZXQuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICBzY3JvbGxMZWZ0ID0gX2V2ZW50JGN1cnJlbnRUYXJnZXQuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIHNjcm9sbFdpZHRoID0gX2V2ZW50JGN1cnJlbnRUYXJnZXQuc2Nyb2xsV2lkdGg7XG5cbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIGlmIChwcmV2U3RhdGUuc2Nyb2xsT2Zmc2V0ID09PSBzY3JvbGxMZWZ0KSB7XG4gICAgICAgICAgICAvLyBTY3JvbGwgcG9zaXRpb24gbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGJ5IGNETS9jRFUsXG4gICAgICAgICAgICAvLyBJbiB3aGljaCBjYXNlIHdlIGRvbid0IG5lZWQgdG8gdHJpZ2dlciBhbm90aGVyIHJlbmRlcixcbiAgICAgICAgICAgIC8vIEFuZCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSBzdGF0ZS5pc1Njcm9sbGluZy5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBfdGhpcy5wcm9wcy5kaXJlY3Rpb247XG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldCA9IHNjcm9sbExlZnQ7XG5cbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgICAgICAgLy8gVFJJQ0tZIEFjY29yZGluZyB0byB0aGUgc3BlYywgc2Nyb2xsTGVmdCBzaG91bGQgYmUgbmVnYXRpdmUgZm9yIFJUTCBhbGlnbmVkIGVsZW1lbnRzLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgdGhlIGNhc2UgZm9yIGFsbCBicm93c2VycyB0aG91Z2ggKGUuZy4gQ2hyb21lIHJlcG9ydHMgdmFsdWVzIGFzIHBvc2l0aXZlLCBtZWFzdXJlZCByZWxhdGl2ZSB0byB0aGUgbGVmdCkuXG4gICAgICAgICAgICAvLyBJdCdzIGFsc28gZWFzaWVyIGZvciB0aGlzIGNvbXBvbmVudCBpZiB3ZSBjb252ZXJ0IG9mZnNldHMgdG8gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZXkgd291bGQgYmUgaW4gZm9yIGx0ci5cbiAgICAgICAgICAgIC8vIFNvIHRoZSBzaW1wbGVzdCBzb2x1dGlvbiBpcyB0byBkZXRlcm1pbmUgd2hpY2ggYnJvd3NlciBiZWhhdmlvciB3ZSdyZSBkZWFsaW5nIHdpdGgsIGFuZCBjb252ZXJ0IGJhc2VkIG9uIGl0LlxuICAgICAgICAgICAgc3dpdGNoIChnZXRSVExPZmZzZXRUeXBlKCkpIHtcbiAgICAgICAgICAgICAgY2FzZSAnbmVnYXRpdmUnOlxuICAgICAgICAgICAgICAgIHNjcm9sbE9mZnNldCA9IC1zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgJ3Bvc2l0aXZlLWRlc2NlbmRpbmcnOlxuICAgICAgICAgICAgICAgIHNjcm9sbE9mZnNldCA9IHNjcm9sbFdpZHRoIC0gY2xpZW50V2lkdGggLSBzY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gUHJldmVudCBTYWZhcmkncyBlbGFzdGljIHNjcm9sbGluZyBmcm9tIGNhdXNpbmcgdmlzdWFsIHNoYWtpbmcgd2hlbiBzY3JvbGxpbmcgcGFzdCBib3VuZHMuXG5cblxuICAgICAgICAgIHNjcm9sbE9mZnNldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNjcm9sbE9mZnNldCwgc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1Njcm9sbGluZzogdHJ1ZSxcbiAgICAgICAgICAgIHNjcm9sbERpcmVjdGlvbjogcHJldlN0YXRlLnNjcm9sbE9mZnNldCA8IHNjcm9sbExlZnQgPyAnZm9yd2FyZCcgOiAnYmFja3dhcmQnLFxuICAgICAgICAgICAgc2Nyb2xsT2Zmc2V0OiBzY3JvbGxPZmZzZXQsXG4gICAgICAgICAgICBzY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQ6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfSwgX3RoaXMuX3Jlc2V0SXNTY3JvbGxpbmdEZWJvdW5jZWQpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuX29uU2Nyb2xsVmVydGljYWwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9ldmVudCRjdXJyZW50VGFyZ2V0MiA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgICBjbGllbnRIZWlnaHQgPSBfZXZlbnQkY3VycmVudFRhcmdldDIuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0ID0gX2V2ZW50JGN1cnJlbnRUYXJnZXQyLnNjcm9sbEhlaWdodCxcbiAgICAgICAgICAgIHNjcm9sbFRvcCA9IF9ldmVudCRjdXJyZW50VGFyZ2V0Mi5zY3JvbGxUb3A7XG5cbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIGlmIChwcmV2U3RhdGUuc2Nyb2xsT2Zmc2V0ID09PSBzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgIC8vIFNjcm9sbCBwb3NpdGlvbiBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQgYnkgY0RNL2NEVSxcbiAgICAgICAgICAgIC8vIEluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgbmVlZCB0byB0cmlnZ2VyIGFub3RoZXIgcmVuZGVyLFxuICAgICAgICAgICAgLy8gQW5kIHdlIGRvbid0IHdhbnQgdG8gdXBkYXRlIHN0YXRlLmlzU2Nyb2xsaW5nLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBQcmV2ZW50IFNhZmFyaSdzIGVsYXN0aWMgc2Nyb2xsaW5nIGZyb20gY2F1c2luZyB2aXN1YWwgc2hha2luZyB3aGVuIHNjcm9sbGluZyBwYXN0IGJvdW5kcy5cblxuXG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0IC0gY2xpZW50SGVpZ2h0KSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiB0cnVlLFxuICAgICAgICAgICAgc2Nyb2xsRGlyZWN0aW9uOiBwcmV2U3RhdGUuc2Nyb2xsT2Zmc2V0IDwgc2Nyb2xsT2Zmc2V0ID8gJ2ZvcndhcmQnIDogJ2JhY2t3YXJkJyxcbiAgICAgICAgICAgIHNjcm9sbE9mZnNldDogc2Nyb2xsT2Zmc2V0LFxuICAgICAgICAgICAgc2Nyb2xsVXBkYXRlV2FzUmVxdWVzdGVkOiBmYWxzZVxuICAgICAgICAgIH07XG4gICAgICAgIH0sIF90aGlzLl9yZXNldElzU2Nyb2xsaW5nRGVib3VuY2VkKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9vdXRlclJlZlNldHRlciA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgdmFyIG91dGVyUmVmID0gX3RoaXMucHJvcHMub3V0ZXJSZWY7XG4gICAgICAgIF90aGlzLl9vdXRlclJlZiA9IHJlZjtcblxuICAgICAgICBpZiAodHlwZW9mIG91dGVyUmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb3V0ZXJSZWYocmVmKTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRlclJlZiAhPSBudWxsICYmIHR5cGVvZiBvdXRlclJlZiA9PT0gJ29iamVjdCcgJiYgb3V0ZXJSZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIG91dGVyUmVmLmN1cnJlbnQgPSByZWY7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9yZXNldElzU2Nyb2xsaW5nRGVib3VuY2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuX3Jlc2V0SXNTY3JvbGxpbmdUaW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgICAgICBjYW5jZWxUaW1lb3V0KF90aGlzLl9yZXNldElzU2Nyb2xsaW5nVGltZW91dElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLl9yZXNldElzU2Nyb2xsaW5nVGltZW91dElkID0gcmVxdWVzdFRpbWVvdXQoX3RoaXMuX3Jlc2V0SXNTY3JvbGxpbmcsIElTX1NDUk9MTElOR19ERUJPVU5DRV9JTlRFUlZBTCQxKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9yZXNldElzU2Nyb2xsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5fcmVzZXRJc1Njcm9sbGluZ1RpbWVvdXRJZCA9IG51bGw7XG5cbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlzU2Nyb2xsaW5nOiBmYWxzZVxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQ2xlYXIgc3R5bGUgY2FjaGUgYWZ0ZXIgc3RhdGUgdXBkYXRlIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgICAgICAvLyBUaGlzIHdheSB3ZSBkb24ndCBicmVhayBwdXJlIHNDVSBmb3IgaXRlbXMgdGhhdCBkb24ndCB1c2UgaXNTY3JvbGxpbmcgcGFyYW0uXG4gICAgICAgICAgX3RoaXMuX2dldEl0ZW1TdHlsZUNhY2hlKC0xLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgTGlzdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgIHZhbGlkYXRlU2hhcmVkUHJvcHMkMShuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgICB2YWxpZGF0ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIF9wcm90byA9IExpc3QucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNjcm9sbFRvID0gZnVuY3Rpb24gc2Nyb2xsVG8oc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICBzY3JvbGxPZmZzZXQgPSBNYXRoLm1heCgwLCBzY3JvbGxPZmZzZXQpO1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIGlmIChwcmV2U3RhdGUuc2Nyb2xsT2Zmc2V0ID09PSBzY3JvbGxPZmZzZXQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2Nyb2xsRGlyZWN0aW9uOiBwcmV2U3RhdGUuc2Nyb2xsT2Zmc2V0IDwgc2Nyb2xsT2Zmc2V0ID8gJ2ZvcndhcmQnIDogJ2JhY2t3YXJkJyxcbiAgICAgICAgICBzY3JvbGxPZmZzZXQ6IHNjcm9sbE9mZnNldCxcbiAgICAgICAgICBzY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0sIHRoaXMuX3Jlc2V0SXNTY3JvbGxpbmdEZWJvdW5jZWQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2Nyb2xsVG9JdGVtID0gZnVuY3Rpb24gc2Nyb2xsVG9JdGVtKGluZGV4LCBhbGlnbikge1xuICAgICAgaWYgKGFsaWduID09PSB2b2lkIDApIHtcbiAgICAgICAgYWxpZ24gPSAnYXV0byc7XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVtQ291bnQgPSB0aGlzLnByb3BzLml0ZW1Db3VudDtcbiAgICAgIHZhciBzY3JvbGxPZmZzZXQgPSB0aGlzLnN0YXRlLnNjcm9sbE9mZnNldDtcbiAgICAgIGluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGl0ZW1Db3VudCAtIDEpKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG8oZ2V0T2Zmc2V0Rm9ySW5kZXhBbmRBbGlnbm1lbnQodGhpcy5wcm9wcywgaW5kZXgsIGFsaWduLCBzY3JvbGxPZmZzZXQsIHRoaXMuX2luc3RhbmNlUHJvcHMpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczIuZGlyZWN0aW9uLFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxPZmZzZXQgPSBfdGhpcyRwcm9wczIuaW5pdGlhbFNjcm9sbE9mZnNldCxcbiAgICAgICAgICBsYXlvdXQgPSBfdGhpcyRwcm9wczIubGF5b3V0O1xuXG4gICAgICBpZiAodHlwZW9mIGluaXRpYWxTY3JvbGxPZmZzZXQgPT09ICdudW1iZXInICYmIHRoaXMuX291dGVyUmVmICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG91dGVyUmVmID0gdGhpcy5fb3V0ZXJSZWY7IC8vIFRPRE8gRGVwcmVjYXRlIGRpcmVjdGlvbiBcImhvcml6b250YWxcIlxuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyB8fCBsYXlvdXQgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgIG91dGVyUmVmLnNjcm9sbExlZnQgPSBpbml0aWFsU2Nyb2xsT2Zmc2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dGVyUmVmLnNjcm9sbFRvcCA9IGluaXRpYWxTY3JvbGxPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2FsbFByb3BzQ2FsbGJhY2tzKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczMuZGlyZWN0aW9uLFxuICAgICAgICAgIGxheW91dCA9IF90aGlzJHByb3BzMy5sYXlvdXQ7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIHNjcm9sbE9mZnNldCA9IF90aGlzJHN0YXRlLnNjcm9sbE9mZnNldCxcbiAgICAgICAgICBzY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQgPSBfdGhpcyRzdGF0ZS5zY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQ7XG5cbiAgICAgIGlmIChzY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQgJiYgdGhpcy5fb3V0ZXJSZWYgIT0gbnVsbCkge1xuICAgICAgICB2YXIgb3V0ZXJSZWYgPSB0aGlzLl9vdXRlclJlZjsgLy8gVE9ETyBEZXByZWNhdGUgZGlyZWN0aW9uIFwiaG9yaXpvbnRhbFwiXG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnIHx8IGxheW91dCA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICAgIC8vIFRSSUNLWSBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNjcm9sbExlZnQgc2hvdWxkIGJlIG5lZ2F0aXZlIGZvciBSVEwgYWxpZ25lZCBlbGVtZW50cy5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHRoZSBjYXNlIGZvciBhbGwgYnJvd3NlcnMgdGhvdWdoIChlLmcuIENocm9tZSByZXBvcnRzIHZhbHVlcyBhcyBwb3NpdGl2ZSwgbWVhc3VyZWQgcmVsYXRpdmUgdG8gdGhlIGxlZnQpLlxuICAgICAgICAgICAgLy8gU28gd2UgbmVlZCB0byBkZXRlcm1pbmUgd2hpY2ggYnJvd3NlciBiZWhhdmlvciB3ZSdyZSBkZWFsaW5nIHdpdGgsIGFuZCBtaW1pYyBpdC5cbiAgICAgICAgICAgIHN3aXRjaCAoZ2V0UlRMT2Zmc2V0VHlwZSgpKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ25lZ2F0aXZlJzpcbiAgICAgICAgICAgICAgICBvdXRlclJlZi5zY3JvbGxMZWZ0ID0gLXNjcm9sbE9mZnNldDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlICdwb3NpdGl2ZS1hc2NlbmRpbmcnOlxuICAgICAgICAgICAgICAgIG91dGVyUmVmLnNjcm9sbExlZnQgPSBzY3JvbGxPZmZzZXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB2YXIgY2xpZW50V2lkdGggPSBvdXRlclJlZi5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsV2lkdGggPSBvdXRlclJlZi5zY3JvbGxXaWR0aDtcbiAgICAgICAgICAgICAgICBvdXRlclJlZi5zY3JvbGxMZWZ0ID0gc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCAtIHNjcm9sbE9mZnNldDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ZXJSZWYuc2Nyb2xsTGVmdCA9IHNjcm9sbE9mZnNldDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ZXJSZWYuc2Nyb2xsVG9wID0gc2Nyb2xsT2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NhbGxQcm9wc0NhbGxiYWNrcygpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLl9yZXNldElzU2Nyb2xsaW5nVGltZW91dElkICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbFRpbWVvdXQodGhpcy5fcmVzZXRJc1Njcm9sbGluZ1RpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzNC5jaGlsZHJlbixcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczQuY2xhc3NOYW1lLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzNC5kaXJlY3Rpb24sXG4gICAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHM0LmhlaWdodCxcbiAgICAgICAgICBpbm5lclJlZiA9IF90aGlzJHByb3BzNC5pbm5lclJlZixcbiAgICAgICAgICBpbm5lckVsZW1lbnRUeXBlID0gX3RoaXMkcHJvcHM0LmlubmVyRWxlbWVudFR5cGUsXG4gICAgICAgICAgaW5uZXJUYWdOYW1lID0gX3RoaXMkcHJvcHM0LmlubmVyVGFnTmFtZSxcbiAgICAgICAgICBpdGVtQ291bnQgPSBfdGhpcyRwcm9wczQuaXRlbUNvdW50LFxuICAgICAgICAgIGl0ZW1EYXRhID0gX3RoaXMkcHJvcHM0Lml0ZW1EYXRhLFxuICAgICAgICAgIF90aGlzJHByb3BzNCRpdGVtS2V5ID0gX3RoaXMkcHJvcHM0Lml0ZW1LZXksXG4gICAgICAgICAgaXRlbUtleSA9IF90aGlzJHByb3BzNCRpdGVtS2V5ID09PSB2b2lkIDAgPyBkZWZhdWx0SXRlbUtleSQxIDogX3RoaXMkcHJvcHM0JGl0ZW1LZXksXG4gICAgICAgICAgbGF5b3V0ID0gX3RoaXMkcHJvcHM0LmxheW91dCxcbiAgICAgICAgICBvdXRlckVsZW1lbnRUeXBlID0gX3RoaXMkcHJvcHM0Lm91dGVyRWxlbWVudFR5cGUsXG4gICAgICAgICAgb3V0ZXJUYWdOYW1lID0gX3RoaXMkcHJvcHM0Lm91dGVyVGFnTmFtZSxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzNC5zdHlsZSxcbiAgICAgICAgICB1c2VJc1Njcm9sbGluZyA9IF90aGlzJHByb3BzNC51c2VJc1Njcm9sbGluZyxcbiAgICAgICAgICB3aWR0aCA9IF90aGlzJHByb3BzNC53aWR0aDtcbiAgICAgIHZhciBpc1Njcm9sbGluZyA9IHRoaXMuc3RhdGUuaXNTY3JvbGxpbmc7IC8vIFRPRE8gRGVwcmVjYXRlIGRpcmVjdGlvbiBcImhvcml6b250YWxcIlxuXG4gICAgICB2YXIgaXNIb3Jpem9udGFsID0gZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgfHwgbGF5b3V0ID09PSAnaG9yaXpvbnRhbCc7XG4gICAgICB2YXIgb25TY3JvbGwgPSBpc0hvcml6b250YWwgPyB0aGlzLl9vblNjcm9sbEhvcml6b250YWwgOiB0aGlzLl9vblNjcm9sbFZlcnRpY2FsO1xuXG4gICAgICB2YXIgX3RoaXMkX2dldFJhbmdlVG9SZW5kID0gdGhpcy5fZ2V0UmFuZ2VUb1JlbmRlcigpLFxuICAgICAgICAgIHN0YXJ0SW5kZXggPSBfdGhpcyRfZ2V0UmFuZ2VUb1JlbmRbMF0sXG4gICAgICAgICAgc3RvcEluZGV4ID0gX3RoaXMkX2dldFJhbmdlVG9SZW5kWzFdO1xuXG4gICAgICB2YXIgaXRlbXMgPSBbXTtcblxuICAgICAgaWYgKGl0ZW1Db3VudCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgX2luZGV4ID0gc3RhcnRJbmRleDsgX2luZGV4IDw9IHN0b3BJbmRleDsgX2luZGV4KyspIHtcbiAgICAgICAgICBpdGVtcy5wdXNoKGNyZWF0ZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgICAgICAgIGRhdGE6IGl0ZW1EYXRhLFxuICAgICAgICAgICAga2V5OiBpdGVtS2V5KF9pbmRleCwgaXRlbURhdGEpLFxuICAgICAgICAgICAgaW5kZXg6IF9pbmRleCxcbiAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiB1c2VJc1Njcm9sbGluZyA/IGlzU2Nyb2xsaW5nIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3R5bGU6IHRoaXMuX2dldEl0ZW1TdHlsZShfaW5kZXgpXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlYWQgdGhpcyB2YWx1ZSBBRlRFUiBpdGVtcyBoYXZlIGJlZW4gY3JlYXRlZCxcbiAgICAgIC8vIFNvIHRoZWlyIGFjdHVhbCBzaXplcyAoaWYgdmFyaWFibGUpIGFyZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uXG5cblxuICAgICAgdmFyIGVzdGltYXRlZFRvdGFsU2l6ZSA9IGdldEVzdGltYXRlZFRvdGFsU2l6ZSh0aGlzLnByb3BzLCB0aGlzLl9pbnN0YW5jZVByb3BzKTtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KG91dGVyRWxlbWVudFR5cGUgfHwgb3V0ZXJUYWdOYW1lIHx8ICdkaXYnLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICBvblNjcm9sbDogb25TY3JvbGwsXG4gICAgICAgIHJlZjogdGhpcy5fb3V0ZXJSZWZTZXR0ZXIsXG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7XG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgIG92ZXJmbG93OiAnYXV0bycsXG4gICAgICAgICAgV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6ICd0b3VjaCcsXG4gICAgICAgICAgd2lsbENoYW5nZTogJ3RyYW5zZm9ybScsXG4gICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgICAgfSwgc3R5bGUpXG4gICAgICB9LCBjcmVhdGVFbGVtZW50KGlubmVyRWxlbWVudFR5cGUgfHwgaW5uZXJUYWdOYW1lIHx8ICdkaXYnLCB7XG4gICAgICAgIGNoaWxkcmVuOiBpdGVtcyxcbiAgICAgICAgcmVmOiBpbm5lclJlZixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBoZWlnaHQ6IGlzSG9yaXpvbnRhbCA/ICcxMDAlJyA6IGVzdGltYXRlZFRvdGFsU2l6ZSxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiBpc1Njcm9sbGluZyA/ICdub25lJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB3aWR0aDogaXNIb3Jpem9udGFsID8gZXN0aW1hdGVkVG90YWxTaXplIDogJzEwMCUnXG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jYWxsUHJvcHNDYWxsYmFja3MgPSBmdW5jdGlvbiBfY2FsbFByb3BzQ2FsbGJhY2tzKCkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLm9uSXRlbXNSZW5kZXJlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgaXRlbUNvdW50ID0gdGhpcy5wcm9wcy5pdGVtQ291bnQ7XG5cbiAgICAgICAgaWYgKGl0ZW1Db3VudCA+IDApIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2dldFJhbmdlVG9SZW5kMiA9IHRoaXMuX2dldFJhbmdlVG9SZW5kZXIoKSxcbiAgICAgICAgICAgICAgX292ZXJzY2FuU3RhcnRJbmRleCA9IF90aGlzJF9nZXRSYW5nZVRvUmVuZDJbMF0sXG4gICAgICAgICAgICAgIF9vdmVyc2NhblN0b3BJbmRleCA9IF90aGlzJF9nZXRSYW5nZVRvUmVuZDJbMV0sXG4gICAgICAgICAgICAgIF92aXNpYmxlU3RhcnRJbmRleCA9IF90aGlzJF9nZXRSYW5nZVRvUmVuZDJbMl0sXG4gICAgICAgICAgICAgIF92aXNpYmxlU3RvcEluZGV4ID0gX3RoaXMkX2dldFJhbmdlVG9SZW5kMlszXTtcblxuICAgICAgICAgIHRoaXMuX2NhbGxPbkl0ZW1zUmVuZGVyZWQoX292ZXJzY2FuU3RhcnRJbmRleCwgX292ZXJzY2FuU3RvcEluZGV4LCBfdmlzaWJsZVN0YXJ0SW5kZXgsIF92aXNpYmxlU3RvcEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMub25TY3JvbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIF90aGlzJHN0YXRlMiA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBfc2Nyb2xsRGlyZWN0aW9uID0gX3RoaXMkc3RhdGUyLnNjcm9sbERpcmVjdGlvbixcbiAgICAgICAgICAgIF9zY3JvbGxPZmZzZXQgPSBfdGhpcyRzdGF0ZTIuc2Nyb2xsT2Zmc2V0LFxuICAgICAgICAgICAgX3Njcm9sbFVwZGF0ZVdhc1JlcXVlc3RlZCA9IF90aGlzJHN0YXRlMi5zY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQ7XG5cbiAgICAgICAgdGhpcy5fY2FsbE9uU2Nyb2xsKF9zY3JvbGxEaXJlY3Rpb24sIF9zY3JvbGxPZmZzZXQsIF9zY3JvbGxVcGRhdGVXYXNSZXF1ZXN0ZWQpO1xuICAgICAgfVxuICAgIH0gLy8gTGF6aWx5IGNyZWF0ZSBhbmQgY2FjaGUgaXRlbSBzdHlsZXMgd2hpbGUgc2Nyb2xsaW5nLFxuICAgIC8vIFNvIHRoYXQgcHVyZSBjb21wb25lbnQgc0NVIHdpbGwgcHJldmVudCByZS1yZW5kZXJzLlxuICAgIC8vIFdlIG1haW50YWluIHRoaXMgY2FjaGUsIGFuZCBwYXNzIGEgc3R5bGUgcHJvcCByYXRoZXIgdGhhbiBpbmRleCxcbiAgICAvLyBTbyB0aGF0IExpc3QgY2FuIGNsZWFyIGNhY2hlZCBzdHlsZXMgYW5kIGZvcmNlIGl0ZW0gcmUtcmVuZGVyIGlmIG5lY2Vzc2FyeS5cbiAgICA7XG5cbiAgICBfcHJvdG8uX2dldFJhbmdlVG9SZW5kZXIgPSBmdW5jdGlvbiBfZ2V0UmFuZ2VUb1JlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGl0ZW1Db3VudCA9IF90aGlzJHByb3BzNS5pdGVtQ291bnQsXG4gICAgICAgICAgb3ZlcnNjYW5Db3VudCA9IF90aGlzJHByb3BzNS5vdmVyc2NhbkNvdW50O1xuICAgICAgdmFyIF90aGlzJHN0YXRlMyA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSBfdGhpcyRzdGF0ZTMuaXNTY3JvbGxpbmcsXG4gICAgICAgICAgc2Nyb2xsRGlyZWN0aW9uID0gX3RoaXMkc3RhdGUzLnNjcm9sbERpcmVjdGlvbixcbiAgICAgICAgICBzY3JvbGxPZmZzZXQgPSBfdGhpcyRzdGF0ZTMuc2Nyb2xsT2Zmc2V0O1xuXG4gICAgICBpZiAoaXRlbUNvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydEluZGV4ID0gZ2V0U3RhcnRJbmRleEZvck9mZnNldCh0aGlzLnByb3BzLCBzY3JvbGxPZmZzZXQsIHRoaXMuX2luc3RhbmNlUHJvcHMpO1xuICAgICAgdmFyIHN0b3BJbmRleCA9IGdldFN0b3BJbmRleEZvclN0YXJ0SW5kZXgodGhpcy5wcm9wcywgc3RhcnRJbmRleCwgc2Nyb2xsT2Zmc2V0LCB0aGlzLl9pbnN0YW5jZVByb3BzKTsgLy8gT3ZlcnNjYW4gYnkgb25lIGl0ZW0gaW4gZWFjaCBkaXJlY3Rpb24gc28gdGhhdCB0YWIvZm9jdXMgd29ya3MuXG4gICAgICAvLyBJZiB0aGVyZSBpc24ndCBhdCBsZWFzdCBvbmUgZXh0cmEgaXRlbSwgdGFiIGxvb3BzIGJhY2sgYXJvdW5kLlxuXG4gICAgICB2YXIgb3ZlcnNjYW5CYWNrd2FyZCA9ICFpc1Njcm9sbGluZyB8fCBzY3JvbGxEaXJlY3Rpb24gPT09ICdiYWNrd2FyZCcgPyBNYXRoLm1heCgxLCBvdmVyc2NhbkNvdW50KSA6IDE7XG4gICAgICB2YXIgb3ZlcnNjYW5Gb3J3YXJkID0gIWlzU2Nyb2xsaW5nIHx8IHNjcm9sbERpcmVjdGlvbiA9PT0gJ2ZvcndhcmQnID8gTWF0aC5tYXgoMSwgb3ZlcnNjYW5Db3VudCkgOiAxO1xuICAgICAgcmV0dXJuIFtNYXRoLm1heCgwLCBzdGFydEluZGV4IC0gb3ZlcnNjYW5CYWNrd2FyZCksIE1hdGgubWF4KDAsIE1hdGgubWluKGl0ZW1Db3VudCAtIDEsIHN0b3BJbmRleCArIG92ZXJzY2FuRm9yd2FyZCkpLCBzdGFydEluZGV4LCBzdG9wSW5kZXhdO1xuICAgIH07XG5cbiAgICByZXR1cm4gTGlzdDtcbiAgfShQdXJlQ29tcG9uZW50KSwgX2NsYXNzLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBkaXJlY3Rpb246ICdsdHInLFxuICAgIGl0ZW1EYXRhOiB1bmRlZmluZWQsXG4gICAgbGF5b3V0OiAndmVydGljYWwnLFxuICAgIG92ZXJzY2FuQ291bnQ6IDIsXG4gICAgdXNlSXNTY3JvbGxpbmc6IGZhbHNlXG4gIH0sIF9jbGFzcztcbn0gLy8gTk9URTogSSBjb25zaWRlcmVkIGZ1cnRoZXIgd3JhcHBpbmcgaW5kaXZpZHVhbCBpdGVtcyB3aXRoIGEgcHVyZSBMaXN0SXRlbSBjb21wb25lbnQuXG4vLyBUaGlzIHdvdWxkIGF2b2lkIGV2ZXIgY2FsbGluZyB0aGUgcmVuZGVyIGZ1bmN0aW9uIGZvciB0aGUgc2FtZSBpbmRleCBtb3JlIHRoYW4gb25jZSxcbi8vIEJ1dCBpdCB3b3VsZCBhbHNvIGFkZCB0aGUgb3ZlcmhlYWQgb2YgYSBsb3Qgb2YgY29tcG9uZW50cy9maWJlcnMuXG4vLyBJIGFzc3VtZSBwZW9wbGUgYWxyZWFkeSBkbyB0aGlzIChyZW5kZXIgZnVuY3Rpb24gcmV0dXJuaW5nIGEgY2xhc3MgY29tcG9uZW50KSxcbi8vIFNvIG15IGRvaW5nIGl0IHdvdWxkIGp1c3QgdW5uZWNlc3NhcmlseSBkb3VibGUgdGhlIHdyYXBwZXJzLlxuXG52YXIgdmFsaWRhdGVTaGFyZWRQcm9wcyQxID0gZnVuY3Rpb24gdmFsaWRhdGVTaGFyZWRQcm9wcyhfcmVmMiwgX3JlZjMpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZjIuY2hpbGRyZW4sXG4gICAgICBkaXJlY3Rpb24gPSBfcmVmMi5kaXJlY3Rpb24sXG4gICAgICBoZWlnaHQgPSBfcmVmMi5oZWlnaHQsXG4gICAgICBsYXlvdXQgPSBfcmVmMi5sYXlvdXQsXG4gICAgICBpbm5lclRhZ05hbWUgPSBfcmVmMi5pbm5lclRhZ05hbWUsXG4gICAgICBvdXRlclRhZ05hbWUgPSBfcmVmMi5vdXRlclRhZ05hbWUsXG4gICAgICB3aWR0aCA9IF9yZWYyLndpZHRoO1xuICB2YXIgaW5zdGFuY2UgPSBfcmVmMy5pbnN0YW5jZTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChpbm5lclRhZ05hbWUgIT0gbnVsbCB8fCBvdXRlclRhZ05hbWUgIT0gbnVsbCkge1xuICAgICAgaWYgKGRldldhcm5pbmdzVGFnTmFtZSQxICYmICFkZXZXYXJuaW5nc1RhZ05hbWUkMS5oYXMoaW5zdGFuY2UpKSB7XG4gICAgICAgIGRldldhcm5pbmdzVGFnTmFtZSQxLmFkZChpbnN0YW5jZSk7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhlIGlubmVyVGFnTmFtZSBhbmQgb3V0ZXJUYWdOYW1lIHByb3BzIGhhdmUgYmVlbiBkZXByZWNhdGVkLiAnICsgJ1BsZWFzZSB1c2UgdGhlIGlubmVyRWxlbWVudFR5cGUgYW5kIG91dGVyRWxlbWVudFR5cGUgcHJvcHMgaW5zdGVhZC4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFRPRE8gRGVwcmVjYXRlIGRpcmVjdGlvbiBcImhvcml6b250YWxcIlxuXG5cbiAgICB2YXIgaXNIb3Jpem9udGFsID0gZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgfHwgbGF5b3V0ID09PSAnaG9yaXpvbnRhbCc7XG5cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIGlmIChkZXZXYXJuaW5nc0RpcmVjdGlvbiAmJiAhZGV2V2FybmluZ3NEaXJlY3Rpb24uaGFzKGluc3RhbmNlKSkge1xuICAgICAgICAgIGRldldhcm5pbmdzRGlyZWN0aW9uLmFkZChpbnN0YW5jZSk7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgZGlyZWN0aW9uIHByb3Agc2hvdWxkIGJlIGVpdGhlciBcImx0clwiIChkZWZhdWx0KSBvciBcInJ0bFwiLiAnICsgJ1BsZWFzZSB1c2UgdGhlIGxheW91dCBwcm9wIHRvIHNwZWNpZnkgXCJ2ZXJ0aWNhbFwiIChkZWZhdWx0KSBvciBcImhvcml6b250YWxcIiBvcmllbnRhdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsdHInOlxuICAgICAgY2FzZSAncnRsJzpcbiAgICAgICAgLy8gVmFsaWQgdmFsdWVzXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcignQW4gaW52YWxpZCBcImRpcmVjdGlvblwiIHByb3AgaGFzIGJlZW4gc3BlY2lmaWVkLiAnICsgJ1ZhbHVlIHNob3VsZCBiZSBlaXRoZXIgXCJsdHJcIiBvciBcInJ0bFwiLiAnICsgKFwiXFxcIlwiICsgZGlyZWN0aW9uICsgXCJcXFwiIHdhcyBzcGVjaWZpZWQuXCIpKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGxheW91dCkge1xuICAgICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIC8vIFZhbGlkIHZhbHVlc1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0FuIGludmFsaWQgXCJsYXlvdXRcIiBwcm9wIGhhcyBiZWVuIHNwZWNpZmllZC4gJyArICdWYWx1ZSBzaG91bGQgYmUgZWl0aGVyIFwiaG9yaXpvbnRhbFwiIG9yIFwidmVydGljYWxcIi4gJyArIChcIlxcXCJcIiArIGxheW91dCArIFwiXFxcIiB3YXMgc3BlY2lmaWVkLlwiKSk7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRocm93IEVycm9yKCdBbiBpbnZhbGlkIFwiY2hpbGRyZW5cIiBwcm9wIGhhcyBiZWVuIHNwZWNpZmllZC4gJyArICdWYWx1ZSBzaG91bGQgYmUgYSBSZWFjdCBjb21wb25lbnQuICcgKyAoXCJcXFwiXCIgKyAoY2hpbGRyZW4gPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgY2hpbGRyZW4pICsgXCJcXFwiIHdhcyBzcGVjaWZpZWQuXCIpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNIb3Jpem9udGFsICYmIHR5cGVvZiB3aWR0aCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IEVycm9yKCdBbiBpbnZhbGlkIFwid2lkdGhcIiBwcm9wIGhhcyBiZWVuIHNwZWNpZmllZC4gJyArICdIb3Jpem9udGFsIGxpc3RzIG11c3Qgc3BlY2lmeSBhIG51bWJlciBmb3Igd2lkdGguICcgKyAoXCJcXFwiXCIgKyAod2lkdGggPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygd2lkdGgpICsgXCJcXFwiIHdhcyBzcGVjaWZpZWQuXCIpKTtcbiAgICB9IGVsc2UgaWYgKCFpc0hvcml6b250YWwgJiYgdHlwZW9mIGhlaWdodCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IEVycm9yKCdBbiBpbnZhbGlkIFwiaGVpZ2h0XCIgcHJvcCBoYXMgYmVlbiBzcGVjaWZpZWQuICcgKyAnVmVydGljYWwgbGlzdHMgbXVzdCBzcGVjaWZ5IGEgbnVtYmVyIGZvciBoZWlnaHQuICcgKyAoXCJcXFwiXCIgKyAoaGVpZ2h0ID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGhlaWdodCkgKyBcIlxcXCIgd2FzIHNwZWNpZmllZC5cIikpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIERFRkFVTFRfRVNUSU1BVEVEX0lURU1fU0laRSQxID0gNTA7XG5cbnZhciBnZXRJdGVtTWV0YWRhdGEkMSA9IGZ1bmN0aW9uIGdldEl0ZW1NZXRhZGF0YShwcm9wcywgaW5kZXgsIGluc3RhbmNlUHJvcHMpIHtcbiAgdmFyIF9yZWYgPSBwcm9wcyxcbiAgICAgIGl0ZW1TaXplID0gX3JlZi5pdGVtU2l6ZTtcbiAgdmFyIGl0ZW1NZXRhZGF0YU1hcCA9IGluc3RhbmNlUHJvcHMuaXRlbU1ldGFkYXRhTWFwLFxuICAgICAgbGFzdE1lYXN1cmVkSW5kZXggPSBpbnN0YW5jZVByb3BzLmxhc3RNZWFzdXJlZEluZGV4O1xuXG4gIGlmIChpbmRleCA+IGxhc3RNZWFzdXJlZEluZGV4KSB7XG4gICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICBpZiAobGFzdE1lYXN1cmVkSW5kZXggPj0gMCkge1xuICAgICAgdmFyIGl0ZW1NZXRhZGF0YSA9IGl0ZW1NZXRhZGF0YU1hcFtsYXN0TWVhc3VyZWRJbmRleF07XG4gICAgICBvZmZzZXQgPSBpdGVtTWV0YWRhdGEub2Zmc2V0ICsgaXRlbU1ldGFkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IGxhc3RNZWFzdXJlZEluZGV4ICsgMTsgaSA8PSBpbmRleDsgaSsrKSB7XG4gICAgICB2YXIgc2l6ZSA9IGl0ZW1TaXplKGkpO1xuICAgICAgaXRlbU1ldGFkYXRhTWFwW2ldID0ge1xuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgc2l6ZTogc2l6ZVxuICAgICAgfTtcbiAgICAgIG9mZnNldCArPSBzaXplO1xuICAgIH1cblxuICAgIGluc3RhbmNlUHJvcHMubGFzdE1lYXN1cmVkSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHJldHVybiBpdGVtTWV0YWRhdGFNYXBbaW5kZXhdO1xufTtcblxudmFyIGZpbmROZWFyZXN0SXRlbSQxID0gZnVuY3Rpb24gZmluZE5lYXJlc3RJdGVtKHByb3BzLCBpbnN0YW5jZVByb3BzLCBvZmZzZXQpIHtcbiAgdmFyIGl0ZW1NZXRhZGF0YU1hcCA9IGluc3RhbmNlUHJvcHMuaXRlbU1ldGFkYXRhTWFwLFxuICAgICAgbGFzdE1lYXN1cmVkSW5kZXggPSBpbnN0YW5jZVByb3BzLmxhc3RNZWFzdXJlZEluZGV4O1xuICB2YXIgbGFzdE1lYXN1cmVkSXRlbU9mZnNldCA9IGxhc3RNZWFzdXJlZEluZGV4ID4gMCA/IGl0ZW1NZXRhZGF0YU1hcFtsYXN0TWVhc3VyZWRJbmRleF0ub2Zmc2V0IDogMDtcblxuICBpZiAobGFzdE1lYXN1cmVkSXRlbU9mZnNldCA+PSBvZmZzZXQpIHtcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IG1lYXN1cmVkIGl0ZW1zIHdpdGhpbiB0aGlzIHJhbmdlIGp1c3QgdXNlIGEgYmluYXJ5IHNlYXJjaCBhcyBpdCdzIGZhc3Rlci5cbiAgICByZXR1cm4gZmluZE5lYXJlc3RJdGVtQmluYXJ5U2VhcmNoJDEocHJvcHMsIGluc3RhbmNlUHJvcHMsIGxhc3RNZWFzdXJlZEluZGV4LCAwLCBvZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHdlIGhhdmVuJ3QgeWV0IG1lYXN1cmVkIHRoaXMgaGlnaCwgZmFsbGJhY2sgdG8gYW4gZXhwb25lbnRpYWwgc2VhcmNoIHdpdGggYW4gaW5uZXIgYmluYXJ5IHNlYXJjaC5cbiAgICAvLyBUaGUgZXhwb25lbnRpYWwgc2VhcmNoIGF2b2lkcyBwcmUtY29tcHV0aW5nIHNpemVzIGZvciB0aGUgZnVsbCBzZXQgb2YgaXRlbXMgYXMgYSBiaW5hcnkgc2VhcmNoIHdvdWxkLlxuICAgIC8vIFRoZSBvdmVyYWxsIGNvbXBsZXhpdHkgZm9yIHRoaXMgYXBwcm9hY2ggaXMgTyhsb2cgbikuXG4gICAgcmV0dXJuIGZpbmROZWFyZXN0SXRlbUV4cG9uZW50aWFsU2VhcmNoJDEocHJvcHMsIGluc3RhbmNlUHJvcHMsIE1hdGgubWF4KDAsIGxhc3RNZWFzdXJlZEluZGV4KSwgb2Zmc2V0KTtcbiAgfVxufTtcblxudmFyIGZpbmROZWFyZXN0SXRlbUJpbmFyeVNlYXJjaCQxID0gZnVuY3Rpb24gZmluZE5lYXJlc3RJdGVtQmluYXJ5U2VhcmNoKHByb3BzLCBpbnN0YW5jZVByb3BzLCBoaWdoLCBsb3csIG9mZnNldCkge1xuICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICB2YXIgbWlkZGxlID0gbG93ICsgTWF0aC5mbG9vcigoaGlnaCAtIGxvdykgLyAyKTtcbiAgICB2YXIgY3VycmVudE9mZnNldCA9IGdldEl0ZW1NZXRhZGF0YSQxKHByb3BzLCBtaWRkbGUsIGluc3RhbmNlUHJvcHMpLm9mZnNldDtcblxuICAgIGlmIChjdXJyZW50T2Zmc2V0ID09PSBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBtaWRkbGU7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50T2Zmc2V0IDwgb2Zmc2V0KSB7XG4gICAgICBsb3cgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudE9mZnNldCA+IG9mZnNldCkge1xuICAgICAgaGlnaCA9IG1pZGRsZSAtIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxvdyA+IDApIHtcbiAgICByZXR1cm4gbG93IC0gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxudmFyIGZpbmROZWFyZXN0SXRlbUV4cG9uZW50aWFsU2VhcmNoJDEgPSBmdW5jdGlvbiBmaW5kTmVhcmVzdEl0ZW1FeHBvbmVudGlhbFNlYXJjaChwcm9wcywgaW5zdGFuY2VQcm9wcywgaW5kZXgsIG9mZnNldCkge1xuICB2YXIgaXRlbUNvdW50ID0gcHJvcHMuaXRlbUNvdW50O1xuICB2YXIgaW50ZXJ2YWwgPSAxO1xuXG4gIHdoaWxlIChpbmRleCA8IGl0ZW1Db3VudCAmJiBnZXRJdGVtTWV0YWRhdGEkMShwcm9wcywgaW5kZXgsIGluc3RhbmNlUHJvcHMpLm9mZnNldCA8IG9mZnNldCkge1xuICAgIGluZGV4ICs9IGludGVydmFsO1xuICAgIGludGVydmFsICo9IDI7XG4gIH1cblxuICByZXR1cm4gZmluZE5lYXJlc3RJdGVtQmluYXJ5U2VhcmNoJDEocHJvcHMsIGluc3RhbmNlUHJvcHMsIE1hdGgubWluKGluZGV4LCBpdGVtQ291bnQgLSAxKSwgTWF0aC5mbG9vcihpbmRleCAvIDIpLCBvZmZzZXQpO1xufTtcblxudmFyIGdldEVzdGltYXRlZFRvdGFsU2l6ZSA9IGZ1bmN0aW9uIGdldEVzdGltYXRlZFRvdGFsU2l6ZShfcmVmMiwgX3JlZjMpIHtcbiAgdmFyIGl0ZW1Db3VudCA9IF9yZWYyLml0ZW1Db3VudDtcbiAgdmFyIGl0ZW1NZXRhZGF0YU1hcCA9IF9yZWYzLml0ZW1NZXRhZGF0YU1hcCxcbiAgICAgIGVzdGltYXRlZEl0ZW1TaXplID0gX3JlZjMuZXN0aW1hdGVkSXRlbVNpemUsXG4gICAgICBsYXN0TWVhc3VyZWRJbmRleCA9IF9yZWYzLmxhc3RNZWFzdXJlZEluZGV4O1xuICB2YXIgdG90YWxTaXplT2ZNZWFzdXJlZEl0ZW1zID0gMDsgLy8gRWRnZSBjYXNlIGNoZWNrIGZvciB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgZGVjcmVhc2VzIHdoaWxlIGEgc2Nyb2xsIGlzIGluIHByb2dyZXNzLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYnZhdWdobi9yZWFjdC13aW5kb3cvcHVsbC8xMzhcblxuICBpZiAobGFzdE1lYXN1cmVkSW5kZXggPj0gaXRlbUNvdW50KSB7XG4gICAgbGFzdE1lYXN1cmVkSW5kZXggPSBpdGVtQ291bnQgLSAxO1xuICB9XG5cbiAgaWYgKGxhc3RNZWFzdXJlZEluZGV4ID49IDApIHtcbiAgICB2YXIgaXRlbU1ldGFkYXRhID0gaXRlbU1ldGFkYXRhTWFwW2xhc3RNZWFzdXJlZEluZGV4XTtcbiAgICB0b3RhbFNpemVPZk1lYXN1cmVkSXRlbXMgPSBpdGVtTWV0YWRhdGEub2Zmc2V0ICsgaXRlbU1ldGFkYXRhLnNpemU7XG4gIH1cblxuICB2YXIgbnVtVW5tZWFzdXJlZEl0ZW1zID0gaXRlbUNvdW50IC0gbGFzdE1lYXN1cmVkSW5kZXggLSAxO1xuICB2YXIgdG90YWxTaXplT2ZVbm1lYXN1cmVkSXRlbXMgPSBudW1Vbm1lYXN1cmVkSXRlbXMgKiBlc3RpbWF0ZWRJdGVtU2l6ZTtcbiAgcmV0dXJuIHRvdGFsU2l6ZU9mTWVhc3VyZWRJdGVtcyArIHRvdGFsU2l6ZU9mVW5tZWFzdXJlZEl0ZW1zO1xufTtcblxudmFyIFZhcmlhYmxlU2l6ZUxpc3QgPSAvKiNfX1BVUkVfXyovY3JlYXRlTGlzdENvbXBvbmVudCh7XG4gIGdldEl0ZW1PZmZzZXQ6IGZ1bmN0aW9uIGdldEl0ZW1PZmZzZXQocHJvcHMsIGluZGV4LCBpbnN0YW5jZVByb3BzKSB7XG4gICAgcmV0dXJuIGdldEl0ZW1NZXRhZGF0YSQxKHByb3BzLCBpbmRleCwgaW5zdGFuY2VQcm9wcykub2Zmc2V0O1xuICB9LFxuICBnZXRJdGVtU2l6ZTogZnVuY3Rpb24gZ2V0SXRlbVNpemUocHJvcHMsIGluZGV4LCBpbnN0YW5jZVByb3BzKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlUHJvcHMuaXRlbU1ldGFkYXRhTWFwW2luZGV4XS5zaXplO1xuICB9LFxuICBnZXRFc3RpbWF0ZWRUb3RhbFNpemU6IGdldEVzdGltYXRlZFRvdGFsU2l6ZSxcbiAgZ2V0T2Zmc2V0Rm9ySW5kZXhBbmRBbGlnbm1lbnQ6IGZ1bmN0aW9uIGdldE9mZnNldEZvckluZGV4QW5kQWxpZ25tZW50KHByb3BzLCBpbmRleCwgYWxpZ24sIHNjcm9sbE9mZnNldCwgaW5zdGFuY2VQcm9wcykge1xuICAgIHZhciBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgICAgbGF5b3V0ID0gcHJvcHMubGF5b3V0LFxuICAgICAgICB3aWR0aCA9IHByb3BzLndpZHRoOyAvLyBUT0RPIERlcHJlY2F0ZSBkaXJlY3Rpb24gXCJob3Jpem9udGFsXCJcblxuICAgIHZhciBpc0hvcml6b250YWwgPSBkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyB8fCBsYXlvdXQgPT09ICdob3Jpem9udGFsJztcbiAgICB2YXIgc2l6ZSA9IGlzSG9yaXpvbnRhbCA/IHdpZHRoIDogaGVpZ2h0O1xuICAgIHZhciBpdGVtTWV0YWRhdGEgPSBnZXRJdGVtTWV0YWRhdGEkMShwcm9wcywgaW5kZXgsIGluc3RhbmNlUHJvcHMpOyAvLyBHZXQgZXN0aW1hdGVkIHRvdGFsIHNpemUgYWZ0ZXIgSXRlbU1ldGFkYXRhIGlzIGNvbXB1dGVkLFxuICAgIC8vIFRvIGVuc3VyZSBpdCByZWZsZWN0cyBhY3R1YWwgbWVhc3VyZW1lbnRzIGluc3RlYWQgb2YganVzdCBlc3RpbWF0ZXMuXG5cbiAgICB2YXIgZXN0aW1hdGVkVG90YWxTaXplID0gZ2V0RXN0aW1hdGVkVG90YWxTaXplKHByb3BzLCBpbnN0YW5jZVByb3BzKTtcbiAgICB2YXIgbWF4T2Zmc2V0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZXN0aW1hdGVkVG90YWxTaXplIC0gc2l6ZSwgaXRlbU1ldGFkYXRhLm9mZnNldCkpO1xuICAgIHZhciBtaW5PZmZzZXQgPSBNYXRoLm1heCgwLCBpdGVtTWV0YWRhdGEub2Zmc2V0IC0gc2l6ZSArIGl0ZW1NZXRhZGF0YS5zaXplKTtcblxuICAgIGlmIChhbGlnbiA9PT0gJ3NtYXJ0Jykge1xuICAgICAgaWYgKHNjcm9sbE9mZnNldCA+PSBtaW5PZmZzZXQgLSBzaXplICYmIHNjcm9sbE9mZnNldCA8PSBtYXhPZmZzZXQgKyBzaXplKSB7XG4gICAgICAgIGFsaWduID0gJ2F1dG8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxpZ24gPSAnY2VudGVyJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgIHJldHVybiBtYXhPZmZzZXQ7XG5cbiAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgIHJldHVybiBtaW5PZmZzZXQ7XG5cbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1pbk9mZnNldCArIChtYXhPZmZzZXQgLSBtaW5PZmZzZXQpIC8gMik7XG5cbiAgICAgIGNhc2UgJ2F1dG8nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNjcm9sbE9mZnNldCA+PSBtaW5PZmZzZXQgJiYgc2Nyb2xsT2Zmc2V0IDw9IG1heE9mZnNldCkge1xuICAgICAgICAgIHJldHVybiBzY3JvbGxPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsT2Zmc2V0IDwgbWluT2Zmc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIG1pbk9mZnNldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbWF4T2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICB9XG4gIH0sXG4gIGdldFN0YXJ0SW5kZXhGb3JPZmZzZXQ6IGZ1bmN0aW9uIGdldFN0YXJ0SW5kZXhGb3JPZmZzZXQocHJvcHMsIG9mZnNldCwgaW5zdGFuY2VQcm9wcykge1xuICAgIHJldHVybiBmaW5kTmVhcmVzdEl0ZW0kMShwcm9wcywgaW5zdGFuY2VQcm9wcywgb2Zmc2V0KTtcbiAgfSxcbiAgZ2V0U3RvcEluZGV4Rm9yU3RhcnRJbmRleDogZnVuY3Rpb24gZ2V0U3RvcEluZGV4Rm9yU3RhcnRJbmRleChwcm9wcywgc3RhcnRJbmRleCwgc2Nyb2xsT2Zmc2V0LCBpbnN0YW5jZVByb3BzKSB7XG4gICAgdmFyIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgICAgICBpdGVtQ291bnQgPSBwcm9wcy5pdGVtQ291bnQsXG4gICAgICAgIGxheW91dCA9IHByb3BzLmxheW91dCxcbiAgICAgICAgd2lkdGggPSBwcm9wcy53aWR0aDsgLy8gVE9ETyBEZXByZWNhdGUgZGlyZWN0aW9uIFwiaG9yaXpvbnRhbFwiXG5cbiAgICB2YXIgaXNIb3Jpem9udGFsID0gZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgfHwgbGF5b3V0ID09PSAnaG9yaXpvbnRhbCc7XG4gICAgdmFyIHNpemUgPSBpc0hvcml6b250YWwgPyB3aWR0aCA6IGhlaWdodDtcbiAgICB2YXIgaXRlbU1ldGFkYXRhID0gZ2V0SXRlbU1ldGFkYXRhJDEocHJvcHMsIHN0YXJ0SW5kZXgsIGluc3RhbmNlUHJvcHMpO1xuICAgIHZhciBtYXhPZmZzZXQgPSBzY3JvbGxPZmZzZXQgKyBzaXplO1xuICAgIHZhciBvZmZzZXQgPSBpdGVtTWV0YWRhdGEub2Zmc2V0ICsgaXRlbU1ldGFkYXRhLnNpemU7XG4gICAgdmFyIHN0b3BJbmRleCA9IHN0YXJ0SW5kZXg7XG5cbiAgICB3aGlsZSAoc3RvcEluZGV4IDwgaXRlbUNvdW50IC0gMSAmJiBvZmZzZXQgPCBtYXhPZmZzZXQpIHtcbiAgICAgIHN0b3BJbmRleCsrO1xuICAgICAgb2Zmc2V0ICs9IGdldEl0ZW1NZXRhZGF0YSQxKHByb3BzLCBzdG9wSW5kZXgsIGluc3RhbmNlUHJvcHMpLnNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0b3BJbmRleDtcbiAgfSxcbiAgaW5pdEluc3RhbmNlUHJvcHM6IGZ1bmN0aW9uIGluaXRJbnN0YW5jZVByb3BzKHByb3BzLCBpbnN0YW5jZSkge1xuICAgIHZhciBfcmVmNCA9IHByb3BzLFxuICAgICAgICBlc3RpbWF0ZWRJdGVtU2l6ZSA9IF9yZWY0LmVzdGltYXRlZEl0ZW1TaXplO1xuICAgIHZhciBpbnN0YW5jZVByb3BzID0ge1xuICAgICAgaXRlbU1ldGFkYXRhTWFwOiB7fSxcbiAgICAgIGVzdGltYXRlZEl0ZW1TaXplOiBlc3RpbWF0ZWRJdGVtU2l6ZSB8fCBERUZBVUxUX0VTVElNQVRFRF9JVEVNX1NJWkUkMSxcbiAgICAgIGxhc3RNZWFzdXJlZEluZGV4OiAtMVxuICAgIH07XG5cbiAgICBpbnN0YW5jZS5yZXNldEFmdGVySW5kZXggPSBmdW5jdGlvbiAoaW5kZXgsIHNob3VsZEZvcmNlVXBkYXRlKSB7XG4gICAgICBpZiAoc2hvdWxkRm9yY2VVcGRhdGUgPT09IHZvaWQgMCkge1xuICAgICAgICBzaG91bGRGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlUHJvcHMubGFzdE1lYXN1cmVkSW5kZXggPSBNYXRoLm1pbihpbnN0YW5jZVByb3BzLmxhc3RNZWFzdXJlZEluZGV4LCBpbmRleCAtIDEpOyAvLyBXZSBjb3VsZCBwb3RlbnRpYWxseSBvcHRpbWl6ZSBmdXJ0aGVyIGJ5IG9ubHkgZXZpY3Rpbmcgc3R5bGVzIGFmdGVyIHRoaXMgaW5kZXgsXG4gICAgICAvLyBCdXQgc2luY2Ugc3R5bGVzIGFyZSBvbmx5IGNhY2hlZCB3aGlsZSBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MtXG4gICAgICAvLyBJdCBzZWVtcyBhbiB1bm5lY2Vzc2FyeSBvcHRpbWl6YXRpb24uXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoYXQgcmVzZXRBZnRlckluZGV4KCkgd2lsbCBiZSBjYWxsZWQgd2hpbGUgYSB1c2VyIGlzIHNjcm9sbGluZy5cblxuICAgICAgaW5zdGFuY2UuX2dldEl0ZW1TdHlsZUNhY2hlKC0xKTtcblxuICAgICAgaWYgKHNob3VsZEZvcmNlVXBkYXRlKSB7XG4gICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBpbnN0YW5jZVByb3BzO1xuICB9LFxuICBzaG91bGRSZXNldFN0eWxlQ2FjaGVPbkl0ZW1TaXplQ2hhbmdlOiBmYWxzZSxcbiAgdmFsaWRhdGVQcm9wczogZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhfcmVmNSkge1xuICAgIHZhciBpdGVtU2l6ZSA9IF9yZWY1Lml0ZW1TaXplO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbVNpemUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0FuIGludmFsaWQgXCJpdGVtU2l6ZVwiIHByb3AgaGFzIGJlZW4gc3BlY2lmaWVkLiAnICsgJ1ZhbHVlIHNob3VsZCBiZSBhIGZ1bmN0aW9uLiAnICsgKFwiXFxcIlwiICsgKGl0ZW1TaXplID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGl0ZW1TaXplKSArIFwiXFxcIiB3YXMgc3BlY2lmaWVkLlwiKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcblxudmFyIEZpeGVkU2l6ZUdyaWQgPSAvKiNfX1BVUkVfXyovY3JlYXRlR3JpZENvbXBvbmVudCh7XG4gIGdldENvbHVtbk9mZnNldDogZnVuY3Rpb24gZ2V0Q29sdW1uT2Zmc2V0KF9yZWYsIGluZGV4KSB7XG4gICAgdmFyIGNvbHVtbldpZHRoID0gX3JlZi5jb2x1bW5XaWR0aDtcbiAgICByZXR1cm4gaW5kZXggKiBjb2x1bW5XaWR0aDtcbiAgfSxcbiAgZ2V0Q29sdW1uV2lkdGg6IGZ1bmN0aW9uIGdldENvbHVtbldpZHRoKF9yZWYyLCBpbmRleCkge1xuICAgIHZhciBjb2x1bW5XaWR0aCA9IF9yZWYyLmNvbHVtbldpZHRoO1xuICAgIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgfSxcbiAgZ2V0Um93T2Zmc2V0OiBmdW5jdGlvbiBnZXRSb3dPZmZzZXQoX3JlZjMsIGluZGV4KSB7XG4gICAgdmFyIHJvd0hlaWdodCA9IF9yZWYzLnJvd0hlaWdodDtcbiAgICByZXR1cm4gaW5kZXggKiByb3dIZWlnaHQ7XG4gIH0sXG4gIGdldFJvd0hlaWdodDogZnVuY3Rpb24gZ2V0Um93SGVpZ2h0KF9yZWY0LCBpbmRleCkge1xuICAgIHZhciByb3dIZWlnaHQgPSBfcmVmNC5yb3dIZWlnaHQ7XG4gICAgcmV0dXJuIHJvd0hlaWdodDtcbiAgfSxcbiAgZ2V0RXN0aW1hdGVkVG90YWxIZWlnaHQ6IGZ1bmN0aW9uIGdldEVzdGltYXRlZFRvdGFsSGVpZ2h0KF9yZWY1KSB7XG4gICAgdmFyIHJvd0NvdW50ID0gX3JlZjUucm93Q291bnQsXG4gICAgICAgIHJvd0hlaWdodCA9IF9yZWY1LnJvd0hlaWdodDtcbiAgICByZXR1cm4gcm93SGVpZ2h0ICogcm93Q291bnQ7XG4gIH0sXG4gIGdldEVzdGltYXRlZFRvdGFsV2lkdGg6IGZ1bmN0aW9uIGdldEVzdGltYXRlZFRvdGFsV2lkdGgoX3JlZjYpIHtcbiAgICB2YXIgY29sdW1uQ291bnQgPSBfcmVmNi5jb2x1bW5Db3VudCxcbiAgICAgICAgY29sdW1uV2lkdGggPSBfcmVmNi5jb2x1bW5XaWR0aDtcbiAgICByZXR1cm4gY29sdW1uV2lkdGggKiBjb2x1bW5Db3VudDtcbiAgfSxcbiAgZ2V0T2Zmc2V0Rm9yQ29sdW1uQW5kQWxpZ25tZW50OiBmdW5jdGlvbiBnZXRPZmZzZXRGb3JDb2x1bW5BbmRBbGlnbm1lbnQoX3JlZjcsIGNvbHVtbkluZGV4LCBhbGlnbiwgc2Nyb2xsTGVmdCwgaW5zdGFuY2VQcm9wcywgc2Nyb2xsYmFyU2l6ZSkge1xuICAgIHZhciBjb2x1bW5Db3VudCA9IF9yZWY3LmNvbHVtbkNvdW50LFxuICAgICAgICBjb2x1bW5XaWR0aCA9IF9yZWY3LmNvbHVtbldpZHRoLFxuICAgICAgICB3aWR0aCA9IF9yZWY3LndpZHRoO1xuICAgIHZhciBsYXN0Q29sdW1uT2Zmc2V0ID0gTWF0aC5tYXgoMCwgY29sdW1uQ291bnQgKiBjb2x1bW5XaWR0aCAtIHdpZHRoKTtcbiAgICB2YXIgbWF4T2Zmc2V0ID0gTWF0aC5taW4obGFzdENvbHVtbk9mZnNldCwgY29sdW1uSW5kZXggKiBjb2x1bW5XaWR0aCk7XG4gICAgdmFyIG1pbk9mZnNldCA9IE1hdGgubWF4KDAsIGNvbHVtbkluZGV4ICogY29sdW1uV2lkdGggLSB3aWR0aCArIHNjcm9sbGJhclNpemUgKyBjb2x1bW5XaWR0aCk7XG5cbiAgICBpZiAoYWxpZ24gPT09ICdzbWFydCcpIHtcbiAgICAgIGlmIChzY3JvbGxMZWZ0ID49IG1pbk9mZnNldCAtIHdpZHRoICYmIHNjcm9sbExlZnQgPD0gbWF4T2Zmc2V0ICsgd2lkdGgpIHtcbiAgICAgICAgYWxpZ24gPSAnYXV0byc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGlnbiA9ICdjZW50ZXInO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgICAgcmV0dXJuIG1heE9mZnNldDtcblxuICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgcmV0dXJuIG1pbk9mZnNldDtcblxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgLy8gXCJDZW50ZXJlZFwiIG9mZnNldCBpcyB1c3VhbGx5IHRoZSBhdmVyYWdlIG9mIHRoZSBtaW4gYW5kIG1heC5cbiAgICAgICAgLy8gQnV0IG5lYXIgdGhlIGVkZ2VzIG9mIHRoZSBsaXN0LCB0aGlzIGRvZXNuJ3QgaG9sZCB0cnVlLlxuICAgICAgICB2YXIgbWlkZGxlT2Zmc2V0ID0gTWF0aC5yb3VuZChtaW5PZmZzZXQgKyAobWF4T2Zmc2V0IC0gbWluT2Zmc2V0KSAvIDIpO1xuXG4gICAgICAgIGlmIChtaWRkbGVPZmZzZXQgPCBNYXRoLmNlaWwod2lkdGggLyAyKSkge1xuICAgICAgICAgIHJldHVybiAwOyAvLyBuZWFyIHRoZSBiZWdpbm5pbmdcbiAgICAgICAgfSBlbHNlIGlmIChtaWRkbGVPZmZzZXQgPiBsYXN0Q29sdW1uT2Zmc2V0ICsgTWF0aC5mbG9vcih3aWR0aCAvIDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGxhc3RDb2x1bW5PZmZzZXQ7IC8vIG5lYXIgdGhlIGVuZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBtaWRkbGVPZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnYXV0byc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoc2Nyb2xsTGVmdCA+PSBtaW5PZmZzZXQgJiYgc2Nyb2xsTGVmdCA8PSBtYXhPZmZzZXQpIHtcbiAgICAgICAgICByZXR1cm4gc2Nyb2xsTGVmdDtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5PZmZzZXQgPiBtYXhPZmZzZXQpIHtcbiAgICAgICAgICAvLyBCZWNhdXNlIHdlIG9ubHkgdGFrZSBpbnRvIGFjY291bnQgdGhlIHNjcm9sbGJhciBzaXplIHdoZW4gY2FsY3VsYXRpbmcgbWluT2Zmc2V0XG4gICAgICAgICAgLy8gdGhpcyB2YWx1ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gbWF4T2Zmc2V0IHdoZW4gYXQgdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgICAgICAgIHJldHVybiBtaW5PZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsTGVmdCA8IG1pbk9mZnNldCkge1xuICAgICAgICAgIHJldHVybiBtaW5PZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG1heE9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9LFxuICBnZXRPZmZzZXRGb3JSb3dBbmRBbGlnbm1lbnQ6IGZ1bmN0aW9uIGdldE9mZnNldEZvclJvd0FuZEFsaWdubWVudChfcmVmOCwgcm93SW5kZXgsIGFsaWduLCBzY3JvbGxUb3AsIGluc3RhbmNlUHJvcHMsIHNjcm9sbGJhclNpemUpIHtcbiAgICB2YXIgcm93SGVpZ2h0ID0gX3JlZjgucm93SGVpZ2h0LFxuICAgICAgICBoZWlnaHQgPSBfcmVmOC5oZWlnaHQsXG4gICAgICAgIHJvd0NvdW50ID0gX3JlZjgucm93Q291bnQ7XG4gICAgdmFyIGxhc3RSb3dPZmZzZXQgPSBNYXRoLm1heCgwLCByb3dDb3VudCAqIHJvd0hlaWdodCAtIGhlaWdodCk7XG4gICAgdmFyIG1heE9mZnNldCA9IE1hdGgubWluKGxhc3RSb3dPZmZzZXQsIHJvd0luZGV4ICogcm93SGVpZ2h0KTtcbiAgICB2YXIgbWluT2Zmc2V0ID0gTWF0aC5tYXgoMCwgcm93SW5kZXggKiByb3dIZWlnaHQgLSBoZWlnaHQgKyBzY3JvbGxiYXJTaXplICsgcm93SGVpZ2h0KTtcblxuICAgIGlmIChhbGlnbiA9PT0gJ3NtYXJ0Jykge1xuICAgICAgaWYgKHNjcm9sbFRvcCA+PSBtaW5PZmZzZXQgLSBoZWlnaHQgJiYgc2Nyb2xsVG9wIDw9IG1heE9mZnNldCArIGhlaWdodCkge1xuICAgICAgICBhbGlnbiA9ICdhdXRvJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFsaWduID0gJ2NlbnRlcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICByZXR1cm4gbWF4T2Zmc2V0O1xuXG4gICAgICBjYXNlICdlbmQnOlxuICAgICAgICByZXR1cm4gbWluT2Zmc2V0O1xuXG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAvLyBcIkNlbnRlcmVkXCIgb2Zmc2V0IGlzIHVzdWFsbHkgdGhlIGF2ZXJhZ2Ugb2YgdGhlIG1pbiBhbmQgbWF4LlxuICAgICAgICAvLyBCdXQgbmVhciB0aGUgZWRnZXMgb2YgdGhlIGxpc3QsIHRoaXMgZG9lc24ndCBob2xkIHRydWUuXG4gICAgICAgIHZhciBtaWRkbGVPZmZzZXQgPSBNYXRoLnJvdW5kKG1pbk9mZnNldCArIChtYXhPZmZzZXQgLSBtaW5PZmZzZXQpIC8gMik7XG5cbiAgICAgICAgaWYgKG1pZGRsZU9mZnNldCA8IE1hdGguY2VpbChoZWlnaHQgLyAyKSkge1xuICAgICAgICAgIHJldHVybiAwOyAvLyBuZWFyIHRoZSBiZWdpbm5pbmdcbiAgICAgICAgfSBlbHNlIGlmIChtaWRkbGVPZmZzZXQgPiBsYXN0Um93T2Zmc2V0ICsgTWF0aC5mbG9vcihoZWlnaHQgLyAyKSkge1xuICAgICAgICAgIHJldHVybiBsYXN0Um93T2Zmc2V0OyAvLyBuZWFyIHRoZSBlbmRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbWlkZGxlT2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ2F1dG8nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNjcm9sbFRvcCA+PSBtaW5PZmZzZXQgJiYgc2Nyb2xsVG9wIDw9IG1heE9mZnNldCkge1xuICAgICAgICAgIHJldHVybiBzY3JvbGxUb3A7XG4gICAgICAgIH0gZWxzZSBpZiAobWluT2Zmc2V0ID4gbWF4T2Zmc2V0KSB7XG4gICAgICAgICAgLy8gQmVjYXVzZSB3ZSBvbmx5IHRha2UgaW50byBhY2NvdW50IHRoZSBzY3JvbGxiYXIgc2l6ZSB3aGVuIGNhbGN1bGF0aW5nIG1pbk9mZnNldFxuICAgICAgICAgIC8vIHRoaXMgdmFsdWUgY2FuIGJlIGxhcmdlciB0aGFuIG1heE9mZnNldCB3aGVuIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3RcbiAgICAgICAgICByZXR1cm4gbWluT2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFRvcCA8IG1pbk9mZnNldCkge1xuICAgICAgICAgIHJldHVybiBtaW5PZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG1heE9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9LFxuICBnZXRDb2x1bW5TdGFydEluZGV4Rm9yT2Zmc2V0OiBmdW5jdGlvbiBnZXRDb2x1bW5TdGFydEluZGV4Rm9yT2Zmc2V0KF9yZWY5LCBzY3JvbGxMZWZ0KSB7XG4gICAgdmFyIGNvbHVtbldpZHRoID0gX3JlZjkuY29sdW1uV2lkdGgsXG4gICAgICAgIGNvbHVtbkNvdW50ID0gX3JlZjkuY29sdW1uQ291bnQ7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKGNvbHVtbkNvdW50IC0gMSwgTWF0aC5mbG9vcihzY3JvbGxMZWZ0IC8gY29sdW1uV2lkdGgpKSk7XG4gIH0sXG4gIGdldENvbHVtblN0b3BJbmRleEZvclN0YXJ0SW5kZXg6IGZ1bmN0aW9uIGdldENvbHVtblN0b3BJbmRleEZvclN0YXJ0SW5kZXgoX3JlZjEwLCBzdGFydEluZGV4LCBzY3JvbGxMZWZ0KSB7XG4gICAgdmFyIGNvbHVtbldpZHRoID0gX3JlZjEwLmNvbHVtbldpZHRoLFxuICAgICAgICBjb2x1bW5Db3VudCA9IF9yZWYxMC5jb2x1bW5Db3VudCxcbiAgICAgICAgd2lkdGggPSBfcmVmMTAud2lkdGg7XG4gICAgdmFyIGxlZnQgPSBzdGFydEluZGV4ICogY29sdW1uV2lkdGg7XG4gICAgdmFyIG51bVZpc2libGVDb2x1bW5zID0gTWF0aC5jZWlsKCh3aWR0aCArIHNjcm9sbExlZnQgLSBsZWZ0KSAvIGNvbHVtbldpZHRoKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oY29sdW1uQ291bnQgLSAxLCBzdGFydEluZGV4ICsgbnVtVmlzaWJsZUNvbHVtbnMgLSAxIC8vIC0xIGlzIGJlY2F1c2Ugc3RvcCBpbmRleCBpcyBpbmNsdXNpdmVcbiAgICApKTtcbiAgfSxcbiAgZ2V0Um93U3RhcnRJbmRleEZvck9mZnNldDogZnVuY3Rpb24gZ2V0Um93U3RhcnRJbmRleEZvck9mZnNldChfcmVmMTEsIHNjcm9sbFRvcCkge1xuICAgIHZhciByb3dIZWlnaHQgPSBfcmVmMTEucm93SGVpZ2h0LFxuICAgICAgICByb3dDb3VudCA9IF9yZWYxMS5yb3dDb3VudDtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4ocm93Q291bnQgLSAxLCBNYXRoLmZsb29yKHNjcm9sbFRvcCAvIHJvd0hlaWdodCkpKTtcbiAgfSxcbiAgZ2V0Um93U3RvcEluZGV4Rm9yU3RhcnRJbmRleDogZnVuY3Rpb24gZ2V0Um93U3RvcEluZGV4Rm9yU3RhcnRJbmRleChfcmVmMTIsIHN0YXJ0SW5kZXgsIHNjcm9sbFRvcCkge1xuICAgIHZhciByb3dIZWlnaHQgPSBfcmVmMTIucm93SGVpZ2h0LFxuICAgICAgICByb3dDb3VudCA9IF9yZWYxMi5yb3dDb3VudCxcbiAgICAgICAgaGVpZ2h0ID0gX3JlZjEyLmhlaWdodDtcbiAgICB2YXIgdG9wID0gc3RhcnRJbmRleCAqIHJvd0hlaWdodDtcbiAgICB2YXIgbnVtVmlzaWJsZVJvd3MgPSBNYXRoLmNlaWwoKGhlaWdodCArIHNjcm9sbFRvcCAtIHRvcCkgLyByb3dIZWlnaHQpO1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihyb3dDb3VudCAtIDEsIHN0YXJ0SW5kZXggKyBudW1WaXNpYmxlUm93cyAtIDEgLy8gLTEgaXMgYmVjYXVzZSBzdG9wIGluZGV4IGlzIGluY2x1c2l2ZVxuICAgICkpO1xuICB9LFxuICBpbml0SW5zdGFuY2VQcm9wczogZnVuY3Rpb24gaW5pdEluc3RhbmNlUHJvcHMocHJvcHMpIHsvLyBOb29wXG4gIH0sXG4gIHNob3VsZFJlc2V0U3R5bGVDYWNoZU9uSXRlbVNpemVDaGFuZ2U6IHRydWUsXG4gIHZhbGlkYXRlUHJvcHM6IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMoX3JlZjEzKSB7XG4gICAgdmFyIGNvbHVtbldpZHRoID0gX3JlZjEzLmNvbHVtbldpZHRoLFxuICAgICAgICByb3dIZWlnaHQgPSBfcmVmMTMucm93SGVpZ2h0O1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgY29sdW1uV2lkdGggIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdBbiBpbnZhbGlkIFwiY29sdW1uV2lkdGhcIiBwcm9wIGhhcyBiZWVuIHNwZWNpZmllZC4gJyArICdWYWx1ZSBzaG91bGQgYmUgYSBudW1iZXIuICcgKyAoXCJcXFwiXCIgKyAoY29sdW1uV2lkdGggPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgY29sdW1uV2lkdGgpICsgXCJcXFwiIHdhcyBzcGVjaWZpZWQuXCIpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByb3dIZWlnaHQgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdBbiBpbnZhbGlkIFwicm93SGVpZ2h0XCIgcHJvcCBoYXMgYmVlbiBzcGVjaWZpZWQuICcgKyAnVmFsdWUgc2hvdWxkIGJlIGEgbnVtYmVyLiAnICsgKFwiXFxcIlwiICsgKHJvd0hlaWdodCA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiByb3dIZWlnaHQpICsgXCJcXFwiIHdhcyBzcGVjaWZpZWQuXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuXG52YXIgRml4ZWRTaXplTGlzdCA9IC8qI19fUFVSRV9fKi9jcmVhdGVMaXN0Q29tcG9uZW50KHtcbiAgZ2V0SXRlbU9mZnNldDogZnVuY3Rpb24gZ2V0SXRlbU9mZnNldChfcmVmLCBpbmRleCkge1xuICAgIHZhciBpdGVtU2l6ZSA9IF9yZWYuaXRlbVNpemU7XG4gICAgcmV0dXJuIGluZGV4ICogaXRlbVNpemU7XG4gIH0sXG4gIGdldEl0ZW1TaXplOiBmdW5jdGlvbiBnZXRJdGVtU2l6ZShfcmVmMiwgaW5kZXgpIHtcbiAgICB2YXIgaXRlbVNpemUgPSBfcmVmMi5pdGVtU2l6ZTtcbiAgICByZXR1cm4gaXRlbVNpemU7XG4gIH0sXG4gIGdldEVzdGltYXRlZFRvdGFsU2l6ZTogZnVuY3Rpb24gZ2V0RXN0aW1hdGVkVG90YWxTaXplKF9yZWYzKSB7XG4gICAgdmFyIGl0ZW1Db3VudCA9IF9yZWYzLml0ZW1Db3VudCxcbiAgICAgICAgaXRlbVNpemUgPSBfcmVmMy5pdGVtU2l6ZTtcbiAgICByZXR1cm4gaXRlbVNpemUgKiBpdGVtQ291bnQ7XG4gIH0sXG4gIGdldE9mZnNldEZvckluZGV4QW5kQWxpZ25tZW50OiBmdW5jdGlvbiBnZXRPZmZzZXRGb3JJbmRleEFuZEFsaWdubWVudChfcmVmNCwgaW5kZXgsIGFsaWduLCBzY3JvbGxPZmZzZXQpIHtcbiAgICB2YXIgZGlyZWN0aW9uID0gX3JlZjQuZGlyZWN0aW9uLFxuICAgICAgICBoZWlnaHQgPSBfcmVmNC5oZWlnaHQsXG4gICAgICAgIGl0ZW1Db3VudCA9IF9yZWY0Lml0ZW1Db3VudCxcbiAgICAgICAgaXRlbVNpemUgPSBfcmVmNC5pdGVtU2l6ZSxcbiAgICAgICAgbGF5b3V0ID0gX3JlZjQubGF5b3V0LFxuICAgICAgICB3aWR0aCA9IF9yZWY0LndpZHRoO1xuICAgIC8vIFRPRE8gRGVwcmVjYXRlIGRpcmVjdGlvbiBcImhvcml6b250YWxcIlxuICAgIHZhciBpc0hvcml6b250YWwgPSBkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyB8fCBsYXlvdXQgPT09ICdob3Jpem9udGFsJztcbiAgICB2YXIgc2l6ZSA9IGlzSG9yaXpvbnRhbCA/IHdpZHRoIDogaGVpZ2h0O1xuICAgIHZhciBsYXN0SXRlbU9mZnNldCA9IE1hdGgubWF4KDAsIGl0ZW1Db3VudCAqIGl0ZW1TaXplIC0gc2l6ZSk7XG4gICAgdmFyIG1heE9mZnNldCA9IE1hdGgubWluKGxhc3RJdGVtT2Zmc2V0LCBpbmRleCAqIGl0ZW1TaXplKTtcbiAgICB2YXIgbWluT2Zmc2V0ID0gTWF0aC5tYXgoMCwgaW5kZXggKiBpdGVtU2l6ZSAtIHNpemUgKyBpdGVtU2l6ZSk7XG5cbiAgICBpZiAoYWxpZ24gPT09ICdzbWFydCcpIHtcbiAgICAgIGlmIChzY3JvbGxPZmZzZXQgPj0gbWluT2Zmc2V0IC0gc2l6ZSAmJiBzY3JvbGxPZmZzZXQgPD0gbWF4T2Zmc2V0ICsgc2l6ZSkge1xuICAgICAgICBhbGlnbiA9ICdhdXRvJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFsaWduID0gJ2NlbnRlcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICByZXR1cm4gbWF4T2Zmc2V0O1xuXG4gICAgICBjYXNlICdlbmQnOlxuICAgICAgICByZXR1cm4gbWluT2Zmc2V0O1xuXG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gXCJDZW50ZXJlZFwiIG9mZnNldCBpcyB1c3VhbGx5IHRoZSBhdmVyYWdlIG9mIHRoZSBtaW4gYW5kIG1heC5cbiAgICAgICAgICAvLyBCdXQgbmVhciB0aGUgZWRnZXMgb2YgdGhlIGxpc3QsIHRoaXMgZG9lc24ndCBob2xkIHRydWUuXG4gICAgICAgICAgdmFyIG1pZGRsZU9mZnNldCA9IE1hdGgucm91bmQobWluT2Zmc2V0ICsgKG1heE9mZnNldCAtIG1pbk9mZnNldCkgLyAyKTtcblxuICAgICAgICAgIGlmIChtaWRkbGVPZmZzZXQgPCBNYXRoLmNlaWwoc2l6ZSAvIDIpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDsgLy8gbmVhciB0aGUgYmVnaW5uaW5nXG4gICAgICAgICAgfSBlbHNlIGlmIChtaWRkbGVPZmZzZXQgPiBsYXN0SXRlbU9mZnNldCArIE1hdGguZmxvb3Ioc2l6ZSAvIDIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFzdEl0ZW1PZmZzZXQ7IC8vIG5lYXIgdGhlIGVuZFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbWlkZGxlT2Zmc2V0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdhdXRvJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChzY3JvbGxPZmZzZXQgPj0gbWluT2Zmc2V0ICYmIHNjcm9sbE9mZnNldCA8PSBtYXhPZmZzZXQpIHtcbiAgICAgICAgICByZXR1cm4gc2Nyb2xsT2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbE9mZnNldCA8IG1pbk9mZnNldCkge1xuICAgICAgICAgIHJldHVybiBtaW5PZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG1heE9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9LFxuICBnZXRTdGFydEluZGV4Rm9yT2Zmc2V0OiBmdW5jdGlvbiBnZXRTdGFydEluZGV4Rm9yT2Zmc2V0KF9yZWY1LCBvZmZzZXQpIHtcbiAgICB2YXIgaXRlbUNvdW50ID0gX3JlZjUuaXRlbUNvdW50LFxuICAgICAgICBpdGVtU2l6ZSA9IF9yZWY1Lml0ZW1TaXplO1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihpdGVtQ291bnQgLSAxLCBNYXRoLmZsb29yKG9mZnNldCAvIGl0ZW1TaXplKSkpO1xuICB9LFxuICBnZXRTdG9wSW5kZXhGb3JTdGFydEluZGV4OiBmdW5jdGlvbiBnZXRTdG9wSW5kZXhGb3JTdGFydEluZGV4KF9yZWY2LCBzdGFydEluZGV4LCBzY3JvbGxPZmZzZXQpIHtcbiAgICB2YXIgZGlyZWN0aW9uID0gX3JlZjYuZGlyZWN0aW9uLFxuICAgICAgICBoZWlnaHQgPSBfcmVmNi5oZWlnaHQsXG4gICAgICAgIGl0ZW1Db3VudCA9IF9yZWY2Lml0ZW1Db3VudCxcbiAgICAgICAgaXRlbVNpemUgPSBfcmVmNi5pdGVtU2l6ZSxcbiAgICAgICAgbGF5b3V0ID0gX3JlZjYubGF5b3V0LFxuICAgICAgICB3aWR0aCA9IF9yZWY2LndpZHRoO1xuICAgIC8vIFRPRE8gRGVwcmVjYXRlIGRpcmVjdGlvbiBcImhvcml6b250YWxcIlxuICAgIHZhciBpc0hvcml6b250YWwgPSBkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyB8fCBsYXlvdXQgPT09ICdob3Jpem9udGFsJztcbiAgICB2YXIgb2Zmc2V0ID0gc3RhcnRJbmRleCAqIGl0ZW1TaXplO1xuICAgIHZhciBzaXplID0gaXNIb3Jpem9udGFsID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgdmFyIG51bVZpc2libGVJdGVtcyA9IE1hdGguY2VpbCgoc2l6ZSArIHNjcm9sbE9mZnNldCAtIG9mZnNldCkgLyBpdGVtU2l6ZSk7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKGl0ZW1Db3VudCAtIDEsIHN0YXJ0SW5kZXggKyBudW1WaXNpYmxlSXRlbXMgLSAxIC8vIC0xIGlzIGJlY2F1c2Ugc3RvcCBpbmRleCBpcyBpbmNsdXNpdmVcbiAgICApKTtcbiAgfSxcbiAgaW5pdEluc3RhbmNlUHJvcHM6IGZ1bmN0aW9uIGluaXRJbnN0YW5jZVByb3BzKHByb3BzKSB7Ly8gTm9vcFxuICB9LFxuICBzaG91bGRSZXNldFN0eWxlQ2FjaGVPbkl0ZW1TaXplQ2hhbmdlOiB0cnVlLFxuICB2YWxpZGF0ZVByb3BzOiBmdW5jdGlvbiB2YWxpZGF0ZVByb3BzKF9yZWY3KSB7XG4gICAgdmFyIGl0ZW1TaXplID0gX3JlZjcuaXRlbVNpemU7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtU2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0FuIGludmFsaWQgXCJpdGVtU2l6ZVwiIHByb3AgaGFzIGJlZW4gc3BlY2lmaWVkLiAnICsgJ1ZhbHVlIHNob3VsZCBiZSBhIG51bWJlci4gJyArIChcIlxcXCJcIiArIChpdGVtU2l6ZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBpdGVtU2l6ZSkgKyBcIlxcXCIgd2FzIHNwZWNpZmllZC5cIikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG5cbi8vIFB1bGxlZCBmcm9tIHJlYWN0LWNvbXBhdFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BpdC9wcmVhY3QtY29tcGF0L2Jsb2IvN2M1ZGUwMGU3Yzg1ZTJmZmQwMTFiZjNhZjAyODk5YjYzZjY5OWQzYS9zcmMvaW5kZXguanMjTDM0OVxuZnVuY3Rpb24gc2hhbGxvd0RpZmZlcnMocHJldiwgbmV4dCkge1xuICBmb3IgKHZhciBhdHRyaWJ1dGUgaW4gcHJldikge1xuICAgIGlmICghKGF0dHJpYnV0ZSBpbiBuZXh0KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2F0dHJpYnV0ZSBpbiBuZXh0KSB7XG4gICAgaWYgKHByZXZbX2F0dHJpYnV0ZV0gIT09IG5leHRbX2F0dHJpYnV0ZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIF9leGNsdWRlZCA9IFtcInN0eWxlXCJdLFxuICAgIF9leGNsdWRlZDIgPSBbXCJzdHlsZVwiXTtcbi8vIEl0IGtub3dzIHRvIGNvbXBhcmUgaW5kaXZpZHVhbCBzdHlsZSBwcm9wcyBhbmQgaWdub3JlIHRoZSB3cmFwcGVyIG9iamVjdC5cbi8vIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RtZW1vXG5cbmZ1bmN0aW9uIGFyZUVxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gIHZhciBwcmV2U3R5bGUgPSBwcmV2UHJvcHMuc3R5bGUsXG4gICAgICBwcmV2UmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHByZXZQcm9wcywgX2V4Y2x1ZGVkKTtcblxuICB2YXIgbmV4dFN0eWxlID0gbmV4dFByb3BzLnN0eWxlLFxuICAgICAgbmV4dFJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShuZXh0UHJvcHMsIF9leGNsdWRlZDIpO1xuXG4gIHJldHVybiAhc2hhbGxvd0RpZmZlcnMocHJldlN0eWxlLCBuZXh0U3R5bGUpICYmICFzaGFsbG93RGlmZmVycyhwcmV2UmVzdCwgbmV4dFJlc3QpO1xufVxuXG4vLyBJdCBrbm93cyB0byBjb21wYXJlIGluZGl2aWR1YWwgc3R5bGUgcHJvcHMgYW5kIGlnbm9yZSB0aGUgd3JhcHBlciBvYmplY3QuXG4vLyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWNvbXBvbmVudC5odG1sI3Nob3VsZGNvbXBvbmVudHVwZGF0ZVxuXG5mdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgcmV0dXJuICFhcmVFcXVhbCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpIHx8IHNoYWxsb3dEaWZmZXJzKHRoaXMuc3RhdGUsIG5leHRTdGF0ZSk7XG59XG5cbmV4cG9ydCB7IEZpeGVkU2l6ZUdyaWQsIEZpeGVkU2l6ZUxpc3QsIFZhcmlhYmxlU2l6ZUdyaWQsIFZhcmlhYmxlU2l6ZUxpc3QsIGFyZUVxdWFsLCBzaG91bGRDb21wb25lbnRVcGRhdGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbS5qcy5tYXBcbiIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxudmFyIHNsaWNlZFRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7XG4gICAgdmFyIF9hcnIgPSBbXTtcbiAgICB2YXIgX24gPSB0cnVlO1xuICAgIHZhciBfZCA9IGZhbHNlO1xuICAgIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSB0cnVlO1xuICAgICAgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBfYXJyO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7XG4gICAgICByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbiAgICB9XG4gIH07XG59KCk7XG5cbi8qKlxuICogRGV0ZWN0IEVsZW1lbnQgUmVzaXplLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3NkZWNpbWEvamF2YXNjcmlwdC1kZXRlY3QtZWxlbWVudC1yZXNpemVcbiAqIFNlYmFzdGlhbiBEZWNpbWFcbiAqXG4gKiBGb3JrZWQgZnJvbSB2ZXJzaW9uIDAuNS4zOyBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIG1vZGlmaWNhdGlvbnM6XG4gKiAxKcKgR3VhcmQgYWdhaW5zdCB1bnNhZmUgJ3dpbmRvdycgYW5kICdkb2N1bWVudCcgcmVmZXJlbmNlcyAodG8gc3VwcG9ydCBTU1IpLlxuICogMinCoERlZmVyIGluaXRpYWxpemF0aW9uIGNvZGUgdmlhIGEgdG9wLWxldmVsIGZ1bmN0aW9uIHdyYXBwZXIgKHRvIHN1cHBvcnQgU1NSKS5cbiAqIDMpIEF2b2lkIHVubmVjZXNzYXJ5IHJlZmxvd3MgYnkgbm90IG1lYXN1cmluZyBzaXplIGZvciBzY3JvbGwgZXZlbnRzIGJ1YmJsaW5nIGZyb20gY2hpbGRyZW4uXG4gKiA0KSBBZGQgbm9uY2UgZm9yIHN0eWxlIGVsZW1lbnQuXG4gKiovXG5cbi8vIENoZWNrIGBkb2N1bWVudGAgYW5kIGB3aW5kb3dgIGluIGNhc2Ugb2Ygc2VydmVyLXNpZGUgcmVuZGVyaW5nXG52YXIgd2luZG93T2JqZWN0ID0gdm9pZCAwO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvd09iamVjdCA9IHdpbmRvdztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gIHdpbmRvd09iamVjdCA9IHNlbGY7XG59IGVsc2Uge1xuICB3aW5kb3dPYmplY3QgPSBnbG9iYWw7XG59XG5cbnZhciBjYW5jZWxGcmFtZSA9IG51bGw7XG52YXIgcmVxdWVzdEZyYW1lID0gbnVsbDtcblxudmFyIFRJTUVPVVRfRFVSQVRJT04gPSAyMDtcblxudmFyIGNsZWFyVGltZW91dEZuID0gd2luZG93T2JqZWN0LmNsZWFyVGltZW91dDtcbnZhciBzZXRUaW1lb3V0Rm4gPSB3aW5kb3dPYmplY3Quc2V0VGltZW91dDtcblxudmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lRm4gPSB3aW5kb3dPYmplY3QuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93T2JqZWN0Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvd09iamVjdC53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZTtcblxudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZUZuID0gd2luZG93T2JqZWN0LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3dPYmplY3QubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvd09iamVjdC53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbmlmIChjYW5jZWxBbmltYXRpb25GcmFtZUZuID09IG51bGwgfHwgcmVxdWVzdEFuaW1hdGlvbkZyYW1lRm4gPT0gbnVsbCkge1xuICAvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBhbmltYXRpb24gZnJhbWUsXG4gIC8vIGZhbGxiYWNrIHRvIGEgc2V0VGltZW91dCBiYXNlZCBhcHByb2FjaC5cbiAgY2FuY2VsRnJhbWUgPSBjbGVhclRpbWVvdXRGbjtcbiAgcmVxdWVzdEZyYW1lID0gZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lVmlhU2V0VGltZW91dChjYWxsYmFjaykge1xuICAgIHJldHVybiBzZXRUaW1lb3V0Rm4oY2FsbGJhY2ssIFRJTUVPVVRfRFVSQVRJT04pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gQ291bnRlciBpbnR1aXRpdmVseSwgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBhbmltYXRpb24gZnJhbWVzIGNhbiBiZSB0cmlja2llci5cbiAgLy8gQ2hyb21lJ3MgXCJUaHJvdHRsZSBub24tdmlzaWJsZSBjcm9zcy1vcmlnaW4gaWZyYW1lc1wiIGZsYWcgY2FuIHByZXZlbnQgckFGcyBmcm9tIGJlaW5nIGNhbGxlZC5cbiAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgZmFsbGJhY2sgdG8gYSBzZXRUaW1lb3V0KCkgaW1wbGVtZW50YXRpb24uXG4gIGNhbmNlbEZyYW1lID0gZnVuY3Rpb24gY2FuY2VsRnJhbWUoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IHNsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSUQgPSBfcmVmMlswXSxcbiAgICAgICAgdGltZW91dElEID0gX3JlZjJbMV07XG5cbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZUZuKGFuaW1hdGlvbkZyYW1lSUQpO1xuICAgIGNsZWFyVGltZW91dEZuKHRpbWVvdXRJRCk7XG4gIH07XG4gIHJlcXVlc3RGcmFtZSA9IGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZVdpdGhTZXRUaW1lb3V0RmFsbGJhY2soY2FsbGJhY2spIHtcbiAgICB2YXIgYW5pbWF0aW9uRnJhbWVJRCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZUZuKGZ1bmN0aW9uIGFuaW1hdGlvbkZyYW1lQ2FsbGJhY2soKSB7XG4gICAgICBjbGVhclRpbWVvdXRGbih0aW1lb3V0SUQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcblxuICAgIHZhciB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0Rm4oZnVuY3Rpb24gdGltZW91dENhbGxiYWNrKCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWVGbihhbmltYXRpb25GcmFtZUlEKTtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSwgVElNRU9VVF9EVVJBVElPTik7XG5cbiAgICByZXR1cm4gW2FuaW1hdGlvbkZyYW1lSUQsIHRpbWVvdXRJRF07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURldGVjdEVsZW1lbnRSZXNpemUobm9uY2UpIHtcbiAgdmFyIGFuaW1hdGlvbktleWZyYW1lcyA9IHZvaWQgMDtcbiAgdmFyIGFuaW1hdGlvbk5hbWUgPSB2b2lkIDA7XG4gIHZhciBhbmltYXRpb25TdGFydEV2ZW50ID0gdm9pZCAwO1xuICB2YXIgYW5pbWF0aW9uU3R5bGUgPSB2b2lkIDA7XG4gIHZhciBjaGVja1RyaWdnZXJzID0gdm9pZCAwO1xuICB2YXIgcmVzZXRUcmlnZ2VycyA9IHZvaWQgMDtcbiAgdmFyIHNjcm9sbExpc3RlbmVyID0gdm9pZCAwO1xuXG4gIHZhciBhdHRhY2hFdmVudCA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuYXR0YWNoRXZlbnQ7XG4gIGlmICghYXR0YWNoRXZlbnQpIHtcbiAgICByZXNldFRyaWdnZXJzID0gZnVuY3Rpb24gcmVzZXRUcmlnZ2VycyhlbGVtZW50KSB7XG4gICAgICB2YXIgdHJpZ2dlcnMgPSBlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXyxcbiAgICAgICAgICBleHBhbmQgPSB0cmlnZ2Vycy5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgICBjb250cmFjdCA9IHRyaWdnZXJzLmxhc3RFbGVtZW50Q2hpbGQsXG4gICAgICAgICAgZXhwYW5kQ2hpbGQgPSBleHBhbmQuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBjb250cmFjdC5zY3JvbGxMZWZ0ID0gY29udHJhY3Quc2Nyb2xsV2lkdGg7XG4gICAgICBjb250cmFjdC5zY3JvbGxUb3AgPSBjb250cmFjdC5zY3JvbGxIZWlnaHQ7XG4gICAgICBleHBhbmRDaGlsZC5zdHlsZS53aWR0aCA9IGV4cGFuZC5vZmZzZXRXaWR0aCArIDEgKyAncHgnO1xuICAgICAgZXhwYW5kQ2hpbGQuc3R5bGUuaGVpZ2h0ID0gZXhwYW5kLm9mZnNldEhlaWdodCArIDEgKyAncHgnO1xuICAgICAgZXhwYW5kLnNjcm9sbExlZnQgPSBleHBhbmQuc2Nyb2xsV2lkdGg7XG4gICAgICBleHBhbmQuc2Nyb2xsVG9wID0gZXhwYW5kLnNjcm9sbEhlaWdodDtcbiAgICB9O1xuXG4gICAgY2hlY2tUcmlnZ2VycyA9IGZ1bmN0aW9uIGNoZWNrVHJpZ2dlcnMoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0V2lkdGggIT09IGVsZW1lbnQuX19yZXNpemVMYXN0X18ud2lkdGggfHwgZWxlbWVudC5vZmZzZXRIZWlnaHQgIT09IGVsZW1lbnQuX19yZXNpemVMYXN0X18uaGVpZ2h0O1xuICAgIH07XG5cbiAgICBzY3JvbGxMaXN0ZW5lciA9IGZ1bmN0aW9uIHNjcm9sbExpc3RlbmVyKGUpIHtcbiAgICAgIC8vIERvbid0IG1lYXN1cmUgKHdoaWNoIGZvcmNlcykgcmVmbG93IGZvciBzY3JvbGxzIHRoYXQgaGFwcGVuIGluc2lkZSBvZiBjaGlsZHJlbiFcbiAgICAgIGlmIChlLnRhcmdldC5jbGFzc05hbWUgJiYgdHlwZW9mIGUudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mID09PSAnZnVuY3Rpb24nICYmIGUudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdjb250cmFjdC10cmlnZ2VyJykgPCAwICYmIGUudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdleHBhbmQtdHJpZ2dlcicpIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBlbGVtZW50ID0gdGhpcztcbiAgICAgIHJlc2V0VHJpZ2dlcnModGhpcyk7XG4gICAgICBpZiAodGhpcy5fX3Jlc2l6ZVJBRl9fKSB7XG4gICAgICAgIGNhbmNlbEZyYW1lKHRoaXMuX19yZXNpemVSQUZfXyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fcmVzaXplUkFGX18gPSByZXF1ZXN0RnJhbWUoZnVuY3Rpb24gYW5pbWF0aW9uRnJhbWUoKSB7XG4gICAgICAgIGlmIChjaGVja1RyaWdnZXJzKGVsZW1lbnQpKSB7XG4gICAgICAgICAgZWxlbWVudC5fX3Jlc2l6ZUxhc3RfXy53aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgZWxlbWVudC5fX3Jlc2l6ZUxhc3RfXy5oZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICBlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18uZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoUmVzaXplTGlzdGVuZXIoZm4pIHtcbiAgICAgICAgICAgIGZuLmNhbGwoZWxlbWVudCwgZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKiBEZXRlY3QgQ1NTIEFuaW1hdGlvbnMgc3VwcG9ydCB0byBkZXRlY3QgZWxlbWVudCBkaXNwbGF5L3JlLWF0dGFjaCAqL1xuICAgIHZhciBhbmltYXRpb24gPSBmYWxzZTtcbiAgICB2YXIga2V5ZnJhbWVwcmVmaXggPSAnJztcbiAgICBhbmltYXRpb25TdGFydEV2ZW50ID0gJ2FuaW1hdGlvbnN0YXJ0JztcbiAgICB2YXIgZG9tUHJlZml4ZXMgPSAnV2Via2l0IE1veiBPIG1zJy5zcGxpdCgnICcpO1xuICAgIHZhciBzdGFydEV2ZW50cyA9ICd3ZWJraXRBbmltYXRpb25TdGFydCBhbmltYXRpb25zdGFydCBvQW5pbWF0aW9uU3RhcnQgTVNBbmltYXRpb25TdGFydCcuc3BsaXQoJyAnKTtcbiAgICB2YXIgcGZ4ID0gJyc7XG4gICAge1xuICAgICAgdmFyIGVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zha2VlbGVtZW50Jyk7XG4gICAgICBpZiAoZWxtLnN0eWxlLmFuaW1hdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhbmltYXRpb24gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYW5pbWF0aW9uID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvbVByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGVsbS5zdHlsZVtkb21QcmVmaXhlc1tpXSArICdBbmltYXRpb25OYW1lJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGZ4ID0gZG9tUHJlZml4ZXNbaV07XG4gICAgICAgICAgICBrZXlmcmFtZXByZWZpeCA9ICctJyArIHBmeC50b0xvd2VyQ2FzZSgpICsgJy0nO1xuICAgICAgICAgICAgYW5pbWF0aW9uU3RhcnRFdmVudCA9IHN0YXJ0RXZlbnRzW2ldO1xuICAgICAgICAgICAgYW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGFuaW1hdGlvbk5hbWUgPSAncmVzaXplYW5pbSc7XG4gICAgYW5pbWF0aW9uS2V5ZnJhbWVzID0gJ0AnICsga2V5ZnJhbWVwcmVmaXggKyAna2V5ZnJhbWVzICcgKyBhbmltYXRpb25OYW1lICsgJyB7IGZyb20geyBvcGFjaXR5OiAwOyB9IHRvIHsgb3BhY2l0eTogMDsgfSB9ICc7XG4gICAgYW5pbWF0aW9uU3R5bGUgPSBrZXlmcmFtZXByZWZpeCArICdhbmltYXRpb246IDFtcyAnICsgYW5pbWF0aW9uTmFtZSArICc7ICc7XG4gIH1cblxuICB2YXIgY3JlYXRlU3R5bGVzID0gZnVuY3Rpb24gY3JlYXRlU3R5bGVzKGRvYykge1xuICAgIGlmICghZG9jLmdldEVsZW1lbnRCeUlkKCdkZXRlY3RFbGVtZW50UmVzaXplJykpIHtcbiAgICAgIC8vb3BhY2l0eTowIHdvcmtzIGFyb3VuZCBhIGNocm9tZSBidWcgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI4NjM2MFxuICAgICAgdmFyIGNzcyA9IChhbmltYXRpb25LZXlmcmFtZXMgPyBhbmltYXRpb25LZXlmcmFtZXMgOiAnJykgKyAnLnJlc2l6ZS10cmlnZ2VycyB7ICcgKyAoYW5pbWF0aW9uU3R5bGUgPyBhbmltYXRpb25TdHlsZSA6ICcnKSArICd2aXNpYmlsaXR5OiBoaWRkZW47IG9wYWNpdHk6IDA7IH0gJyArICcucmVzaXplLXRyaWdnZXJzLCAucmVzaXplLXRyaWdnZXJzID4gZGl2LCAuY29udHJhY3QtdHJpZ2dlcjpiZWZvcmUgeyBjb250ZW50OiBcIiBcIjsgZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlOyBvdmVyZmxvdzogaGlkZGVuOyB6LWluZGV4OiAtMTsgfSAucmVzaXplLXRyaWdnZXJzID4gZGl2IHsgYmFja2dyb3VuZDogI2VlZTsgb3ZlcmZsb3c6IGF1dG87IH0gLmNvbnRyYWN0LXRyaWdnZXI6YmVmb3JlIHsgd2lkdGg6IDIwMCU7IGhlaWdodDogMjAwJTsgfScsXG4gICAgICAgICAgaGVhZCA9IGRvYy5oZWFkIHx8IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLFxuICAgICAgICAgIHN0eWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5cbiAgICAgIHN0eWxlLmlkID0gJ2RldGVjdEVsZW1lbnRSZXNpemUnO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG5cbiAgICAgIGlmIChub25jZSAhPSBudWxsKSB7XG4gICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgnbm9uY2UnLCBub25jZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG4gICAgICAgIHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgICAgIH1cblxuICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBhZGRSZXNpemVMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZFJlc2l6ZUxpc3RlbmVyKGVsZW1lbnQsIGZuKSB7XG4gICAgaWYgKGF0dGFjaEV2ZW50KSB7XG4gICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCdvbnJlc2l6ZScsIGZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXykge1xuICAgICAgICB2YXIgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICB2YXIgZWxlbWVudFN0eWxlID0gd2luZG93T2JqZWN0LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50U3R5bGUgJiYgZWxlbWVudFN0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZVN0eWxlcyhkb2MpO1xuICAgICAgICBlbGVtZW50Ll9fcmVzaXplTGFzdF9fID0ge307XG4gICAgICAgIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXyA9IFtdO1xuICAgICAgICAoZWxlbWVudC5fX3Jlc2l6ZVRyaWdnZXJzX18gPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2JykpLmNsYXNzTmFtZSA9ICdyZXNpemUtdHJpZ2dlcnMnO1xuICAgICAgICB2YXIgZXhwYW5kVHJpZ2dlciA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZXhwYW5kVHJpZ2dlci5jbGFzc05hbWUgPSAnZXhwYW5kLXRyaWdnZXInO1xuICAgICAgICBleHBhbmRUcmlnZ2VyLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgICAgIHZhciBjb250cmFjdFRyaWdnZXIgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnRyYWN0VHJpZ2dlci5jbGFzc05hbWUgPSAnY29udHJhY3QtdHJpZ2dlcic7XG4gICAgICAgIGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fLmFwcGVuZENoaWxkKGV4cGFuZFRyaWdnZXIpO1xuICAgICAgICBlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5hcHBlbmRDaGlsZChjb250cmFjdFRyaWdnZXIpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fKTtcbiAgICAgICAgcmVzZXRUcmlnZ2VycyhlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lciwgdHJ1ZSk7XG5cbiAgICAgICAgLyogTGlzdGVuIGZvciBhIGNzcyBhbmltYXRpb24gdG8gZGV0ZWN0IGVsZW1lbnQgZGlzcGxheS9yZS1hdHRhY2ggKi9cbiAgICAgICAgaWYgKGFuaW1hdGlvblN0YXJ0RXZlbnQpIHtcbiAgICAgICAgICBlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5fX2FuaW1hdGlvbkxpc3RlbmVyX18gPSBmdW5jdGlvbiBhbmltYXRpb25MaXN0ZW5lcihlKSB7XG4gICAgICAgICAgICBpZiAoZS5hbmltYXRpb25OYW1lID09PSBhbmltYXRpb25OYW1lKSB7XG4gICAgICAgICAgICAgIHJlc2V0VHJpZ2dlcnMoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5hZGRFdmVudExpc3RlbmVyKGFuaW1hdGlvblN0YXJ0RXZlbnQsIGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fLl9fYW5pbWF0aW9uTGlzdGVuZXJfXyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5wdXNoKGZuKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJlbW92ZVJlc2l6ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlUmVzaXplTGlzdGVuZXIoZWxlbWVudCwgZm4pIHtcbiAgICBpZiAoYXR0YWNoRXZlbnQpIHtcbiAgICAgIGVsZW1lbnQuZGV0YWNoRXZlbnQoJ29ucmVzaXplJywgZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18uc3BsaWNlKGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5pbmRleE9mKGZuKSwgMSk7XG4gICAgICBpZiAoIWVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5sZW5ndGgpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgICAgIGlmIChlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5fX2FuaW1hdGlvbkxpc3RlbmVyX18pIHtcbiAgICAgICAgICBlbGVtZW50Ll9fcmVzaXplVHJpZ2dlcnNfXy5yZW1vdmVFdmVudExpc3RlbmVyKGFuaW1hdGlvblN0YXJ0RXZlbnQsIGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fLl9fYW5pbWF0aW9uTGlzdGVuZXJfXyk7XG4gICAgICAgICAgZWxlbWVudC5fX3Jlc2l6ZVRyaWdnZXJzX18uX19hbmltYXRpb25MaXN0ZW5lcl9fID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnQuX19yZXNpemVUcmlnZ2Vyc19fID0gIWVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5fX3Jlc2l6ZVRyaWdnZXJzX18pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gUHJlYWN0IGNvbXBhdDsgc2VlIGRldmVsb3BpdC9wcmVhY3QtY29tcGF0L2lzc3Vlcy8yMjhcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFkZFJlc2l6ZUxpc3RlbmVyOiBhZGRSZXNpemVMaXN0ZW5lcixcbiAgICByZW1vdmVSZXNpemVMaXN0ZW5lcjogcmVtb3ZlUmVzaXplTGlzdGVuZXJcbiAgfTtcbn1cblxudmFyIEF1dG9TaXplciA9IGZ1bmN0aW9uIChfUmVhY3QkUHVyZUNvbXBvbmVudCkge1xuICBpbmhlcml0cyhBdXRvU2l6ZXIsIF9SZWFjdCRQdXJlQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBBdXRvU2l6ZXIoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQXV0b1NpemVyKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX3JlZiA9IEF1dG9TaXplci5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEF1dG9TaXplcikpLmNhbGwuYXBwbHkoX3JlZiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpcyksIF90aGlzLnN0YXRlID0ge1xuICAgICAgaGVpZ2h0OiBfdGhpcy5wcm9wcy5kZWZhdWx0SGVpZ2h0IHx8IDAsXG4gICAgICB3aWR0aDogX3RoaXMucHJvcHMuZGVmYXVsdFdpZHRoIHx8IDBcbiAgICB9LCBfdGhpcy5fb25SZXNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlSGVpZ2h0ID0gX3RoaXMkcHJvcHMuZGlzYWJsZUhlaWdodCxcbiAgICAgICAgICBkaXNhYmxlV2lkdGggPSBfdGhpcyRwcm9wcy5kaXNhYmxlV2lkdGgsXG4gICAgICAgICAgb25SZXNpemUgPSBfdGhpcyRwcm9wcy5vblJlc2l6ZTtcblxuXG4gICAgICBpZiAoX3RoaXMuX3BhcmVudE5vZGUpIHtcbiAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBBdXRvU2l6ZXIgY29tcG9uZW50IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGltbWVkaWF0ZWx5IGFmdGVyIGJlaW5nIGFkZGVkLlxuICAgICAgICAvLyBUaGlzIGNhbiByZXN1bHQgaW4gaW52YWxpZCBzdHlsZSB2YWx1ZXMgd2hpY2ggY2FuIHJlc3VsdCBpbiBOYU4gdmFsdWVzIGlmIHdlIGRvbid0IGhhbmRsZSB0aGVtLlxuICAgICAgICAvLyBTZWUgaXNzdWUgIzE1MCBmb3IgbW9yZSBjb250ZXh0LlxuXG4gICAgICAgIHZhciBfaGVpZ2h0ID0gX3RoaXMuX3BhcmVudE5vZGUub2Zmc2V0SGVpZ2h0IHx8IDA7XG4gICAgICAgIHZhciBfd2lkdGggPSBfdGhpcy5fcGFyZW50Tm9kZS5vZmZzZXRXaWR0aCB8fCAwO1xuXG4gICAgICAgIHZhciBfc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy5fcGFyZW50Tm9kZSkgfHwge307XG4gICAgICAgIHZhciBwYWRkaW5nTGVmdCA9IHBhcnNlSW50KF9zdHlsZS5wYWRkaW5nTGVmdCwgMTApIHx8IDA7XG4gICAgICAgIHZhciBwYWRkaW5nUmlnaHQgPSBwYXJzZUludChfc3R5bGUucGFkZGluZ1JpZ2h0LCAxMCkgfHwgMDtcbiAgICAgICAgdmFyIHBhZGRpbmdUb3AgPSBwYXJzZUludChfc3R5bGUucGFkZGluZ1RvcCwgMTApIHx8IDA7XG4gICAgICAgIHZhciBwYWRkaW5nQm90dG9tID0gcGFyc2VJbnQoX3N0eWxlLnBhZGRpbmdCb3R0b20sIDEwKSB8fCAwO1xuXG4gICAgICAgIHZhciBuZXdIZWlnaHQgPSBfaGVpZ2h0IC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207XG4gICAgICAgIHZhciBuZXdXaWR0aCA9IF93aWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0O1xuXG4gICAgICAgIGlmICghZGlzYWJsZUhlaWdodCAmJiBfdGhpcy5zdGF0ZS5oZWlnaHQgIT09IG5ld0hlaWdodCB8fCAhZGlzYWJsZVdpZHRoICYmIF90aGlzLnN0YXRlLndpZHRoICE9PSBuZXdXaWR0aCkge1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGhlaWdodDogX2hlaWdodCAtIHBhZGRpbmdUb3AgLSBwYWRkaW5nQm90dG9tLFxuICAgICAgICAgICAgd2lkdGg6IF93aWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBvblJlc2l6ZSh7IGhlaWdodDogX2hlaWdodCwgd2lkdGg6IF93aWR0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF90aGlzLl9zZXRSZWYgPSBmdW5jdGlvbiAoYXV0b1NpemVyKSB7XG4gICAgICBfdGhpcy5fYXV0b1NpemVyID0gYXV0b1NpemVyO1xuICAgIH0sIF90ZW1wKSwgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhBdXRvU2l6ZXIsIFt7XG4gICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBub25jZSA9IHRoaXMucHJvcHMubm9uY2U7XG5cbiAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZXIgJiYgdGhpcy5fYXV0b1NpemVyLnBhcmVudE5vZGUgJiYgdGhpcy5fYXV0b1NpemVyLnBhcmVudE5vZGUub3duZXJEb2N1bWVudCAmJiB0aGlzLl9hdXRvU2l6ZXIucGFyZW50Tm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIHRoaXMuX2F1dG9TaXplci5wYXJlbnROb2RlIGluc3RhbmNlb2YgdGhpcy5fYXV0b1NpemVyLnBhcmVudE5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5IVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBEZWxheSBhY2Nlc3Mgb2YgcGFyZW50Tm9kZSB1bnRpbCBtb3VudC5cbiAgICAgICAgLy8gVGhpcyBoYW5kbGVzIGVkZ2UtY2FzZXMgd2hlcmUgdGhlIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuIHVubW91bnRlZCBiZWZvcmUgaXRzIHJlZiBoYXMgYmVlbiBzZXQsXG4gICAgICAgIC8vIEFzIHdlbGwgYXMgbGlicmFyaWVzIGxpa2UgcmVhY3QtbGl0ZSB3aGljaCBoYXZlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGxpZmVjeWNsZS5cbiAgICAgICAgdGhpcy5fcGFyZW50Tm9kZSA9IHRoaXMuX2F1dG9TaXplci5wYXJlbnROb2RlO1xuXG4gICAgICAgIC8vIERlZmVyIHJlcXVpcmluZyByZXNpemUgaGFuZGxlciBpbiBvcmRlciB0byBzdXBwb3J0IHNlcnZlci1zaWRlIHJlbmRlcmluZy5cbiAgICAgICAgLy8gU2VlIGlzc3VlICM0MVxuICAgICAgICB0aGlzLl9kZXRlY3RFbGVtZW50UmVzaXplID0gY3JlYXRlRGV0ZWN0RWxlbWVudFJlc2l6ZShub25jZSk7XG4gICAgICAgIHRoaXMuX2RldGVjdEVsZW1lbnRSZXNpemUuYWRkUmVzaXplTGlzdGVuZXIodGhpcy5fcGFyZW50Tm9kZSwgdGhpcy5fb25SZXNpemUpO1xuXG4gICAgICAgIHRoaXMuX29uUmVzaXplKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50V2lsbFVubW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLl9kZXRlY3RFbGVtZW50UmVzaXplICYmIHRoaXMuX3BhcmVudE5vZGUpIHtcbiAgICAgICAgdGhpcy5fZGV0ZWN0RWxlbWVudFJlc2l6ZS5yZW1vdmVSZXNpemVMaXN0ZW5lcih0aGlzLl9wYXJlbnROb2RlLCB0aGlzLl9vblJlc2l6ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBkaXNhYmxlSGVpZ2h0ID0gX3Byb3BzLmRpc2FibGVIZWlnaHQsXG4gICAgICAgICAgZGlzYWJsZVdpZHRoID0gX3Byb3BzLmRpc2FibGVXaWR0aCxcbiAgICAgICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZTtcbiAgICAgIHZhciBfc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIGhlaWdodCA9IF9zdGF0ZS5oZWlnaHQsXG4gICAgICAgICAgd2lkdGggPSBfc3RhdGUud2lkdGg7XG5cbiAgICAgIC8vIE91dGVyIGRpdiBzaG91bGQgbm90IGZvcmNlIHdpZHRoL2hlaWdodCBzaW5jZSB0aGF0IG1heSBwcmV2ZW50IGNvbnRhaW5lcnMgZnJvbSBzaHJpbmtpbmcuXG4gICAgICAvLyBJbm5lciBjb21wb25lbnQgc2hvdWxkIG92ZXJmbG93IGFuZCB1c2UgY2FsY3VsYXRlZCB3aWR0aC9oZWlnaHQuXG4gICAgICAvLyBTZWUgaXNzdWUgIzY4IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICAgICB2YXIgb3V0ZXJTdHlsZSA9IHsgb3ZlcmZsb3c6ICd2aXNpYmxlJyB9O1xuICAgICAgdmFyIGNoaWxkUGFyYW1zID0ge307XG5cbiAgICAgIC8vIEF2b2lkIHJlbmRlcmluZyBjaGlsZHJlbiBiZWZvcmUgdGhlIGluaXRpYWwgbWVhc3VyZW1lbnRzIGhhdmUgYmVlbiBjb2xsZWN0ZWQuXG4gICAgICAvLyBBdCBiZXN0IHRoaXMgd291bGQganVzdCBiZSB3YXN0aW5nIGN5Y2xlcy5cbiAgICAgIHZhciBiYWlsb3V0T25DaGlsZHJlbiA9IGZhbHNlO1xuXG4gICAgICBpZiAoIWRpc2FibGVIZWlnaHQpIHtcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgIGJhaWxvdXRPbkNoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBvdXRlclN0eWxlLmhlaWdodCA9IDA7XG4gICAgICAgIGNoaWxkUGFyYW1zLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaXNhYmxlV2lkdGgpIHtcbiAgICAgICAgaWYgKHdpZHRoID09PSAwKSB7XG4gICAgICAgICAgYmFpbG91dE9uQ2hpbGRyZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG91dGVyU3R5bGUud2lkdGggPSAwO1xuICAgICAgICBjaGlsZFBhcmFtcy53aWR0aCA9IHdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgICByZWY6IHRoaXMuX3NldFJlZixcbiAgICAgICAgICBzdHlsZTogX2V4dGVuZHMoe30sIG91dGVyU3R5bGUsIHN0eWxlKVxuICAgICAgICB9LFxuICAgICAgICAhYmFpbG91dE9uQ2hpbGRyZW4gJiYgY2hpbGRyZW4oY2hpbGRQYXJhbXMpXG4gICAgICApO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQXV0b1NpemVyO1xufShQdXJlQ29tcG9uZW50KTtcblxuQXV0b1NpemVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgb25SZXNpemU6IGZ1bmN0aW9uIG9uUmVzaXplKCkge30sXG4gIGRpc2FibGVIZWlnaHQ6IGZhbHNlLFxuICBkaXNhYmxlV2lkdGg6IGZhbHNlLFxuICBzdHlsZToge31cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF1dG9TaXplcjtcbiIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IEZyYWdtZW50LCBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGdldERlZmF1bHRGb250cyB9IGZyb20gJy4vZGVmYXVsdC1kYXRhJztcbmltcG9ydCB7IGZhbWlseUZvckRpc3BsYXksIGh1bWFuaXplVmFyaWF0aW9ucywgZm9udEZhbWlseVRvQ1NTRmFtaWx5IH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUxpc3QgYXMgTGlzdCB9IGZyb20gJ3JlYWN0LXdpbmRvdyc7XG5pbXBvcnQgV2ViRm9udExvYWRlciBmcm9tICd3ZWJmb250bG9hZGVyJztcbmltcG9ydCBBdXRvU2l6ZXIgZnJvbSAncmVhY3QtdmlydHVhbGl6ZWQtYXV0by1zaXplcic7XG5sZXQgbG9hZGVkRm9udHMgPSBbXTtcblxuY29uc3QgbG9hZEdvb2dsZUZvbnRzID0gZm9udF9mYW1pbGllcyA9PiB7XG4gIGlmIChmb250X2ZhbWlsaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBsb2FkZWRGb250cyA9IFsuLi5sb2FkZWRGb250cywgLi4uZm9udF9mYW1pbGllcy5tYXAoX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGZhbWlseVxuICAgIH0gPSBfcmVmO1xuICAgIHJldHVybiBmYW1pbHk7XG4gIH0pXTtcbiAgY29uc3QgZ29vZ2xlRm9udHMgPSBmb250X2ZhbWlsaWVzLm1hcChfcmVmMiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGZhbWlseVxuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gZmFtaWx5O1xuICB9KS5maWx0ZXIoZmFtaWx5ID0+IGZhbWlseS5pbmRleE9mKCdjdF90eXBla2l0JykgPT09IC0xKTtcbiAgY29uc3QgdHlwZWtpdEZvbnRzID0gZm9udF9mYW1pbGllcy5maWx0ZXIoX3JlZjMgPT4ge1xuICAgIGxldCB7XG4gICAgICBmYW1pbHlcbiAgICB9ID0gX3JlZjM7XG4gICAgcmV0dXJuIGZhbWlseS5pbmRleE9mKCdjdF90eXBla2l0JykgPiAtMTtcbiAgfSk7XG5cbiAgaWYgKGdvb2dsZUZvbnRzLmxlbmd0aCA+IDAgfHwgdHlwZWtpdEZvbnRzLmxlbmd0aCA+IDApIHtcbiAgICBXZWJGb250TG9hZGVyLmxvYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdvb2dsZUZvbnRzLmxlbmd0aCA+IDAgPyB7XG4gICAgICBnb29nbGU6IHtcbiAgICAgICAgZmFtaWxpZXM6IGdvb2dsZUZvbnRzXG4gICAgICB9XG4gICAgfSA6IHt9KSwgdHlwZWtpdEZvbnRzLmxlbmd0aCA+IDAgPyB7XG4gICAgICB0eXBla2l0OiB7XG4gICAgICAgIGlkOiB0eXBla2l0Rm9udHNbMF0ua2l0XG4gICAgICB9XG4gICAgfSA6IHt9KSwge30sIHtcbiAgICAgIGNsYXNzZXM6IGZhbHNlLFxuICAgICAgdGV4dDogJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J1xuICAgIH0pKTtcbiAgfVxufTtcblxuY29uc3QgU2luZ2xlRm9udCA9IF9yZWY0ID0+IHtcbiAgbGV0IHtcbiAgICBkYXRhOiB7XG4gICAgICBsaW5lYXJGb250c0xpc3QsXG4gICAgICBvblBpY2tGYW1pbHksXG4gICAgICB2YWx1ZVxuICAgIH0sXG4gICAgaW5kZXgsXG4gICAgc3R5bGVcbiAgfSA9IF9yZWY0O1xuICBjb25zdCBmYW1pbHkgPSBsaW5lYXJGb250c0xpc3RbaW5kZXhdO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uQ2xpY2s6ICgpID0+IG9uUGlja0ZhbWlseShmYW1pbHkpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3QtdHlwb2dyYXBoeS1zaW5nbGUtZm9udCcsIGBjdC0ke2ZhbWlseS5zb3VyY2V9YCwge1xuICAgICAgYWN0aXZlOiBmYW1pbHkuZmFtaWx5ID09PSB2YWx1ZS5mYW1pbHlcbiAgICB9KSxcbiAgICBrZXk6IGZhbWlseS5mYW1pbHlcbiAgfSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC1mb250LW5hbWVcIlxuICB9LCBmYW1pbHlGb3JEaXNwbGF5KGZhbWlseS5kaXNwbGF5IHx8IGZhbWlseS5mYW1pbHkpKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHN0eWxlOiB7XG4gICAgICBmb250RmFtaWx5OiBmb250RmFtaWx5VG9DU1NGYW1pbHkoZmFtaWx5LmZhbWlseSlcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogXCJjdC1mb250LXByZXZpZXdcIlxuICB9LCBcIlNpbXBseSBkdW1teSB0ZXh0XCIpKTtcbn07XG5cbmNvbnN0IEZvbnRzTGlzdCA9IF9yZWY1ID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgdmFsdWUsXG4gICAgb25QaWNrRmFtaWx5LFxuICAgIHR5cG9ncmFwaHlMaXN0LFxuICAgIGxpbmVhckZvbnRzTGlzdCxcbiAgICBjdXJyZW50VmlldyxcbiAgICBzZWFyY2hUZXJtXG4gIH0gPSBfcmVmNTtcbiAgY29uc3QgbGlzdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgdGltZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtzY3JvbGxUaW1lciwgc2V0U2Nyb2xsVGltZXJdID0gdXNlU3RhdGUobnVsbCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHZhbHVlLmZhbWlseSkge1xuICAgICAgbGlzdFJlZi5jdXJyZW50LnNjcm9sbFRvSXRlbShsaW5lYXJGb250c0xpc3QubWFwKF9yZWY2ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBmYW1pbHlcbiAgICAgICAgfSA9IF9yZWY2O1xuICAgICAgICByZXR1cm4gZmFtaWx5O1xuICAgICAgfSkuaW5kZXhPZih2YWx1ZS5mYW1pbHkpLCAnc3RhcnQnKTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBvblNjcm9sbCA9ICgpID0+IHtcbiAgICBzY3JvbGxUaW1lciAmJiBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpO1xuICAgIHNldFNjcm9sbFRpbWVyKHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFsaXN0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbb3ZlcnNjYW5TdGFydEluZGV4XSA9IGxpc3RSZWYuY3VycmVudC5fZ2V0UmFuZ2VUb1JlbmRlcigpO1xuXG4gICAgICBjb25zdCBwZXJQYWdlID0gMjU7XG4gICAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKGxpbmVhckZvbnRzTGlzdC5sZW5ndGggLyBwZXJQYWdlKTtcbiAgICAgIGNvbnN0IHN0YXJ0aW5nUGFnZSA9IE1hdGguY2VpbCgob3ZlcnNjYW5TdGFydEluZGV4ICsgMSkgLyBwZXJQYWdlKTsgLy8gY29uc3Qgc3RvcFBhZ2UgPSBNYXRoLmNlaWwoKG92ZXJzY2FuU3RvcEluZGV4ICsgMSkgLyBwZXJQYWdlKVxuXG4gICAgICBjb25zdCBwYWdlSXRlbXMgPSBbLi4uQXJyYXkocGVyUGFnZSldLm1hcCgoXywgaSkgPT4gKHN0YXJ0aW5nUGFnZSAtIDEpICogcGVyUGFnZSArIGkpLm1hcChpbmRleCA9PiBsaW5lYXJGb250c0xpc3RbaW5kZXhdKS5maWx0ZXIocyA9PiAhIXMpLmZpbHRlcihfcmVmNyA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgIGZhbWlseVxuICAgICAgICB9ID0gX3JlZjc7XG4gICAgICAgIHJldHVybiBsb2FkZWRGb250cy5pbmRleE9mKGZhbWlseSkgPT09IC0xICYmIChzb3VyY2UgPT09ICdnb29nbGUnIHx8IHNvdXJjZSA9PT0gJ3R5cGVraXQnKTtcbiAgICAgIH0pO1xuICAgICAgbG9hZEdvb2dsZUZvbnRzKHBhZ2VJdGVtcyk7XG4gICAgfSwgMTAwKSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvblNjcm9sbCgpO1xuICB9LCBbbGluZWFyRm9udHNMaXN0XSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KExpc3QsIHtcbiAgICBoZWlnaHQ6IDM2MCxcbiAgICBpdGVtQ291bnQ6IGxpbmVhckZvbnRzTGlzdC5sZW5ndGgsXG4gICAgaXRlbVNpemU6IDg1LFxuICAgIHJlZjogbGlzdFJlZixcbiAgICBvblNjcm9sbDogZSA9PiB7XG4gICAgICBvblNjcm9sbCgpO1xuICAgIH0sXG4gICAgaXRlbURhdGE6IHtcbiAgICAgIGxpbmVhckZvbnRzTGlzdCxcbiAgICAgIG9uUGlja0ZhbWlseSxcbiAgICAgIHZhbHVlXG4gICAgfSxcbiAgICBvbkl0ZW1zUmVuZGVyZWQ6IF9yZWY4ID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIG92ZXJzY2FuU3RhcnRJbmRleCxcbiAgICAgICAgb3ZlcnNjYW5TdG9wSW5kZXhcbiAgICAgIH0gPSBfcmVmODtcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogXCJjdC10eXBvZ3JhcGh5LWZvbnRzXCJcbiAgfSwgU2luZ2xlRm9udCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGb250c0xpc3Q7IiwiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgRnJhZ21lbnQsIGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEZvbnRzIH0gZnJvbSAnLi9kZWZhdWx0LWRhdGEnO1xuaW1wb3J0IHsgaHVtYW5pemVWYXJpYXRpb25zLCBmaW5kU2VsZWN0ZWRGb250RmFtaWx5IH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGFuaW1hdGVkIH0gZnJvbSAnQHJlYWN0LXNwcmluZy93ZWInO1xuXG5jb25zdCBWYXJpYXRpb25zTGlzdCA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbixcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgICB0eXBvZ3JhcGh5TGlzdCxcbiAgICBwcm9wc1xuICB9ID0gX3JlZjtcbiAgY29uc3Qgc2VsZWN0ZWRGb250RmFtaWx5ID0gZmluZFNlbGVjdGVkRm9udEZhbWlseSh2YWx1ZS5mYW1pbHksIHR5cG9ncmFwaHlMaXN0KTtcbiAgY29uc3QgcGFyZW50RWwgPSB1c2VSZWYobnVsbCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzZWxlY3RlZEZvbnRGYW1pbHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwYXJlbnRFbC5jdXJyZW50LnNjcm9sbFRvcCA9IChwYXJlbnRFbC5jdXJyZW50LmNoaWxkcmVuW3NlbGVjdGVkRm9udEZhbWlseS5hbGxfdmFyaWF0aW9ucy5pbmRleE9mKHZhbHVlLnZhcmlhdGlvbildIHx8IHBhcmVudEVsLmN1cnJlbnQuY2hpbGRyZW5bMF0pLm9mZnNldFRvcCAtIHBhcmVudEVsLmN1cnJlbnQub2Zmc2V0VG9wO1xuICB9LCBbc2VsZWN0ZWRGb250RmFtaWx5XSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KGFuaW1hdGVkLnVsLCB7XG4gICAgc3R5bGU6IHByb3BzLFxuICAgIGNsYXNzTmFtZTogXCJjdC10eXBvZ3JhcGh5LXZhcmlhdGlvbnNcIixcbiAgICByZWY6IHBhcmVudEVsXG4gIH0sIHNlbGVjdGVkRm9udEZhbWlseSAmJiBzZWxlY3RlZEZvbnRGYW1pbHkuYWxsX3ZhcmlhdGlvbnMubWFwKHZhcmlhdGlvbiA9PiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIG9uQ2xpY2s6ICgpID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgdmFyaWF0aW9uXG4gICAgfSkpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBhY3RpdmU6IHZhcmlhdGlvbiA9PT0gdmFsdWUudmFyaWF0aW9uXG4gICAgfSksXG4gICAga2V5OiB2YXJpYXRpb25cbiAgfSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC12YXJpYXRpb24tbmFtZVwiLFxuICAgIFwiZGF0YS12YXJpYXRpb25cIjogdmFyaWF0aW9uXG4gIH0sIGh1bWFuaXplVmFyaWF0aW9ucyh2YXJpYXRpb24pKSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZhcmlhdGlvbnNMaXN0OyIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IEZyYWdtZW50LCBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgeyBhbmltYXRlZCB9IGZyb20gJ0ByZWFjdC1zcHJpbmcvd2ViJztcbmltcG9ydCBHZW5lcmljT3B0aW9uVHlwZSBmcm9tICcuLi8uLi9HZW5lcmljT3B0aW9uVHlwZSc7XG5cbmNvbnN0IEZvbnRPcHRpb25zID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIHNpemVSZWYsXG4gICAgb25DaGFuZ2UsXG4gICAgcHJvcHNcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KGFuaW1hdGVkLnVsLCB7XG4gICAgc3R5bGU6IHByb3BzLFxuICAgIGNsYXNzTmFtZTogXCJjdC10eXBvZ3JhcGh5LW9wdGlvbnNcIixcbiAgICBrZXk6IFwib3B0aW9uc1wiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiBcInNpemVcIlxuICB9LCBjcmVhdGVFbGVtZW50KEdlbmVyaWNPcHRpb25UeXBlLCB7XG4gICAgdmFsdWU6IHZhbHVlLnNpemUsXG4gICAgdmFsdWVzOiB2YWx1ZSxcbiAgICBpZDogXCJzaXplXCIsXG4gICAgb3B0aW9uOiB7XG4gICAgICBpZDogJ3NpemUnLFxuICAgICAgbGFiZWw6IF9fKCdGb250IFNpemUnLCAnYmxvY2tzeScpLFxuICAgICAgdHlwZTogJ2N0LXNsaWRlcicsXG4gICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLnNpemUsXG4gICAgICByZWY6IHNpemVSZWYsXG4gICAgICByZXNwb25zaXZlOiBvcHRpb24udHlwb2dyYXBoeV9yZXNwb25zaXZlIHx8IHRydWUsXG4gICAgICB1bml0czogW3tcbiAgICAgICAgdW5pdDogJ3B4JyxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDIwMFxuICAgICAgfSwge1xuICAgICAgICB1bml0OiAnZW0nLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogNTBcbiAgICAgIH0sIHtcbiAgICAgICAgdW5pdDogJ3JlbScsXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiA1MFxuICAgICAgfSwge1xuICAgICAgICB1bml0OiAncHQnLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogNTBcbiAgICAgIH0sIHtcbiAgICAgICAgdW5pdDogJ3Z3JyxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEwMFxuICAgICAgfV1cbiAgICB9LFxuICAgIGhhc1JldmVydEJ1dHRvbjogdHJ1ZSxcbiAgICBvbkNoYW5nZTogbmV3VmFsdWUgPT4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICBzaXplOiBuZXdWYWx1ZVxuICAgIH0pKVxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiBcImxpbmUtaGVpZ2h0XCJcbiAgfSwgY3JlYXRlRWxlbWVudChHZW5lcmljT3B0aW9uVHlwZSwge1xuICAgIHZhbHVlOiB2YWx1ZVsnbGluZS1oZWlnaHQnXSxcbiAgICB2YWx1ZXM6IHZhbHVlLFxuICAgIGlkOiBcImxpbmUtaGVpZ2h0XCIsXG4gICAgb3B0aW9uOiB7XG4gICAgICBpZDogJ2xpbmUtaGVpZ2h0JyxcbiAgICAgIGxhYmVsOiBfXygnTGluZSBIZWlnaHQnLCAnYmxvY2tzeScpLFxuICAgICAgdHlwZTogJ2N0LXNsaWRlcicsXG4gICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlWydsaW5lLWhlaWdodCddLFxuICAgICAgcmVzcG9uc2l2ZTogb3B0aW9uLnR5cG9ncmFwaHlfcmVzcG9uc2l2ZSB8fCB0cnVlLFxuICAgICAgdW5pdHM6IFt7XG4gICAgICAgIHVuaXQ6ICcnLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMTAsXG4gICAgICAgIGRlY2ltYWxzOiAxXG4gICAgICB9LCB7XG4gICAgICAgIHVuaXQ6ICdweCcsXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxMDBcbiAgICAgIH0sIHtcbiAgICAgICAgdW5pdDogJ2VtJyxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEwMFxuICAgICAgfSwge1xuICAgICAgICB1bml0OiAncHQnLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMTAwXG4gICAgICB9LCB7XG4gICAgICAgIHVuaXQ6ICclJyxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEwMFxuICAgICAgfV1cbiAgICB9LFxuICAgIGhhc1JldmVydEJ1dHRvbjogdHJ1ZSxcbiAgICBvbkNoYW5nZTogbmV3VmFsdWUgPT4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICAnbGluZS1oZWlnaHQnOiBuZXdWYWx1ZVxuICAgIH0pKVxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiBcImxldHRlci1zcGFjaW5nXCJcbiAgfSwgY3JlYXRlRWxlbWVudChHZW5lcmljT3B0aW9uVHlwZSwge1xuICAgIHZhbHVlOiB2YWx1ZVsnbGV0dGVyLXNwYWNpbmcnXSxcbiAgICB2YWx1ZXM6IHZhbHVlLFxuICAgIGlkOiBcImxldHRlci1zcGFjaW5nXCIsXG4gICAgb3B0aW9uOiB7XG4gICAgICBpZDogJ2xldHRlci1zcGFjaW5nJyxcbiAgICAgIGxhYmVsOiBfXygnTGV0dGVyIFNwYWNpbmcnLCAnYmxvY2tzeScpLFxuICAgICAgdHlwZTogJ2N0LXNsaWRlcicsXG4gICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlWydsZXR0ZXItc3BhY2luZyddLFxuICAgICAgcmVzcG9uc2l2ZTogb3B0aW9uLnR5cG9ncmFwaHlfcmVzcG9uc2l2ZSB8fCB0cnVlLFxuICAgICAgZGVmYXVsdFBvc2l0aW9uOiAnY2VudGVyJyxcbiAgICAgIHVuaXRzOiBbe1xuICAgICAgICB1bml0OiAnZW0nLFxuICAgICAgICBtaW46IC01LFxuICAgICAgICBtYXg6IDUsXG4gICAgICAgIGRlY2ltYWxzOiAxXG4gICAgICB9LCB7XG4gICAgICAgIHVuaXQ6ICdweCcsXG4gICAgICAgIG1pbjogLTIwLFxuICAgICAgICBtYXg6IDIwLFxuICAgICAgICBkZWNpbWFsczogMVxuICAgICAgfSwge1xuICAgICAgICB1bml0OiAncmVtJyxcbiAgICAgICAgbWluOiAtNSxcbiAgICAgICAgbWF4OiA1LFxuICAgICAgICBkZWNpbWFsczogMVxuICAgICAgfV1cbiAgICB9LFxuICAgIGhhc1JldmVydEJ1dHRvbjogdHJ1ZSxcbiAgICBvbkNoYW5nZTogbmV3VmFsdWUgPT4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICAnbGV0dGVyLXNwYWNpbmcnOiBuZXdWYWx1ZVxuICAgIH0pKVxuICB9KSksIGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiBcInZhcmlhbnRcIixcbiAgICBjbGFzc05hbWU6IFwiY3QtdHlwb2dyYXBoeS12YXJpYW50XCJcbiAgfSwgY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LXRleHQtdHJhbnNmb3JtJylcbiAgfSwgWydjYXBpdGFsaXplJywgJ3VwcGVyY2FzZSddLm1hcCh2YXJpYW50ID0+IGNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAga2V5OiB2YXJpYW50LFxuICAgIG9uQ2xpY2s6ICgpID0+IG9uQ2hhbmdlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsdWUpLCB7fSwge1xuICAgICAgJ3RleHQtdHJhbnNmb3JtJzogdmFsdWVbJ3RleHQtdHJhbnNmb3JtJ10gPT09IHZhcmlhbnQgPyAnbm9uZScgOiB2YXJpYW50XG4gICAgfSkpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICBhY3RpdmU6IHZhcmlhbnQgPT09IHZhbHVlWyd0ZXh0LXRyYW5zZm9ybSddXG4gICAgfSksXG4gICAgXCJkYXRhLXZhcmlhbnRcIjogdmFyaWFudFxuICB9LCBjcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LXRvb2x0aXAtdG9wXCJcbiAgfSwge1xuICAgIGNhcGl0YWxpemU6IF9fKCdDYXBpdGFsaXplJywgJ2Jsb2Nrc3knKSxcbiAgICB1cHBlcmNhc2U6IF9fKCdVcHBlcmNhc2UnLCAnYmxvY2tzeScpXG4gIH1bdmFyaWFudF0pKSkpLCBjcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3QtdGV4dC1kZWNvcmF0aW9uJylcbiAgfSwgWydsaW5lLXRocm91Z2gnLCAndW5kZXJsaW5lJ10ubWFwKHZhcmlhbnQgPT4gY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBrZXk6IHZhcmlhbnQsXG4gICAgb25DbGljazogKCkgPT4gb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICAndGV4dC1kZWNvcmF0aW9uJzogdmFsdWVbJ3RleHQtZGVjb3JhdGlvbiddID09PSB2YXJpYW50ID8gJ25vbmUnIDogdmFyaWFudFxuICAgIH0pKSxcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoe1xuICAgICAgYWN0aXZlOiB2YXJpYW50ID09PSB2YWx1ZVsndGV4dC1kZWNvcmF0aW9uJ11cbiAgICB9KSxcbiAgICBcImRhdGEtdmFyaWFudFwiOiB2YXJpYW50XG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtdG9vbHRpcC10b3BcIlxuICB9LCB7XG4gICAgJ2xpbmUtdGhyb3VnaCc6IF9fKCdMaW5lIFRocm91Z2gnLCAnYmxvY2tzeScpLFxuICAgIHVuZGVybGluZTogX18oJ1VuZGVybGluZScsICdibG9ja3N5JylcbiAgfVt2YXJpYW50XSkpKSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvbnRPcHRpb25zOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEZvbnRzIH0gZnJvbSAnLi9kZWZhdWx0LWRhdGEnO1xuaW1wb3J0IHsgaHVtYW5pemVWYXJpYXRpb25zU2hvcnQsIGRlY2lkZVZhcmlhdGlvblRvU2VsZWN0LCBmYW1pbHlGb3JEaXNwbGF5IH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgYmV6aWVyRWFzaW5nIGZyb20gJ2Jlemllci1lYXNpbmcnO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiwgYW5pbWF0ZWQgfSBmcm9tICdAcmVhY3Qtc3ByaW5nL3dlYic7XG5pbXBvcnQgRm9udHNMaXN0IGZyb20gJy4vRm9udHNMaXN0JztcbmltcG9ydCBWYXJpYXRpb25zTGlzdCBmcm9tICcuL1ZhcmlhdGlvbnNMaXN0JztcbmltcG9ydCBGb250T3B0aW9ucyBmcm9tICcuL0ZvbnRPcHRpb25zJztcbmltcG9ydCBHZW5lcmljT3B0aW9uVHlwZSBmcm9tICcuLi8uLi9HZW5lcmljT3B0aW9uVHlwZSc7XG5cbmNvbnN0IGNvbWJpbmVSZWZzID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVmcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICByZWZzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGVsID0+IHtcbiAgICByZWZzLm1hcChyZWYgPT4ge1xuICAgICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVmKGVsKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlZiA9PT0gJ29iamVjdCcgJiYgcmVmICE9PSBudWxsICYmIHJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgIHJlZi5jdXJyZW50ID0gZWw7XG4gICAgICB9IGVsc2UgaWYgKHJlZiA9PT0gbnVsbCkgey8vIE5vLW9wXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59O1xuXG5mdW5jdGlvbiBmdXp6eXNlYXJjaChuZWVkbGUsIGhheXN0YWNrKSB7XG4gIHZhciBobGVuID0gaGF5c3RhY2subGVuZ3RoO1xuICB2YXIgbmxlbiA9IG5lZWRsZS5sZW5ndGg7XG5cbiAgaWYgKG5sZW4gPiBobGVuKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5sZW4gPT09IGhsZW4pIHtcbiAgICByZXR1cm4gbmVlZGxlID09PSBoYXlzdGFjaztcbiAgfVxuXG4gIG91dGVyOiBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCBubGVuOyBpKyspIHtcbiAgICB2YXIgbmNoID0gbmVlZGxlLmNoYXJDb2RlQXQoaSk7XG5cbiAgICB3aGlsZSAoaiA8IGhsZW4pIHtcbiAgICAgIGlmIChoYXlzdGFjay5jaGFyQ29kZUF0KGorKykgPT09IG5jaCkge1xuICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgVHlwb2dyYXBoeU1vZGFsID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIGluaXRpYWxWaWV3LFxuICAgIGN1cnJlbnRWaWV3LFxuICAgIHByZXZpb3VzVmlldyxcbiAgICBzZXRDdXJyZW50VmlldyxcbiAgICBzZXRJbml0aXRpYWxWaWV3LFxuICAgIG9uQ2hhbmdlLFxuICAgIHdyYXBwZXJQcm9wcyA9IHt9XG4gIH0gPSBfcmVmO1xuICBjb25zdCBbdHlwb2dyYXBoeUxpc3QsIHNldFR5cG9ncmFwaHlMaXN0XSA9IHVzZVN0YXRlKGdldERlZmF1bHRGb250cyhvcHRpb24pKTtcbiAgY29uc3QgW2lzU2VhcmNoLCBzZXRJc1NlYXJjaF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzZWFyY2hUZXJtLCBzZXRTZWFyY2hUZXJtXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgZGlyZWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHByZXZpb3VzVmlldyA9PT0gJ18nKSB7XG4gICAgICByZXR1cm4gJ3N0YXRpYyc7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRWaWV3ID09PSAnc2VhcmNoJyAmJiBwcmV2aW91c1ZpZXcgPT09ICdmb250cycgfHwgcHJldmlvdXNWaWV3ID09PSAnc2VhcmNoJyAmJiBjdXJyZW50VmlldyA9PT0gJ2ZvbnRzJykge1xuICAgICAgcmV0dXJuICdzdGF0aWMnO1xuICAgIH1cblxuICAgIGlmIChwcmV2aW91c1ZpZXcgPT09ICdvcHRpb25zJykge1xuICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgfVxuXG4gICAgaWYgKHByZXZpb3VzVmlldyA9PT0gJ2ZvbnRzJyAmJiBjdXJyZW50VmlldyA9PT0gJ3ZhcmlhdGlvbnMnKSB7XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9XG5cbiAgICByZXR1cm4gJ2xlZnQnO1xuICB9LCBbY3VycmVudFZpZXcsIHByZXZpb3VzVmlld10pO1xuICBjb25zdCBpbnB1dEVsID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBzaXplRWwgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IGxpbmVhckZvbnRzTGlzdCA9IE9iamVjdC5rZXlzKHR5cG9ncmFwaHlMaXN0KS5yZWR1Y2UoKGN1cnJlbnRMaXN0LCBjdXJyZW50U291cmNlKSA9PiBbLi4uY3VycmVudExpc3QsIC4uLih0eXBvZ3JhcGh5TGlzdFtjdXJyZW50U291cmNlXS5mYW1pbGllcyB8fCBbXSkuZmlsdGVyKF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAgZmFtaWx5XG4gICAgfSA9IF9yZWYyO1xuICAgIHJldHVybiBmdXp6eXNlYXJjaChzZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCksIGZhbWlseS50b0xvd2VyQ2FzZSgpKTtcbiAgfSldLCBbXSk7XG5cbiAgY29uc3QgZmV0Y2hGb250c0xpc3QgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYm9keSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGJvZHkuYXBwZW5kKCdhY3Rpb24nLCAnYmxvY2tzeV9nZXRfZm9udHNfbGlzdCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYWpheHVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgc3VjY2VzcyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBzZXRUeXBvZ3JhcGh5TGlzdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRhdGEuZm9udHMpLCB7fSwge1xuICAgICAgICAgICAgc3lzdGVtOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRhdGEuZm9udHMuc3lzdGVtKSwge30sIHtcbiAgICAgICAgICAgICAgZmFtaWxpZXM6IFsuLi4ob3B0aW9uLmlzRGVmYXVsdCA/IFtdIDogW3tcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdzeXN0ZW0nLFxuICAgICAgICAgICAgICAgIGZhbWlseTogJ0RlZmF1bHQnLFxuICAgICAgICAgICAgICAgIHZhcmlhdGlvbnM6IFtdLFxuICAgICAgICAgICAgICAgIGFsbF92YXJpYXRpb25zOiBbJ0RlZmF1bHQnLCAnbjEnLCAnaTEnLCAnbjInLCAnaTInLCAnbjMnLCAnaTMnLCAnbjQnLCAnaTQnLCAnbjUnLCAnaTUnLCAnbjYnLCAnaTYnLCAnbjcnLCAnaTcnLCAnbjgnLCAnaTgnLCAnbjknLCAnaTknXVxuICAgICAgICAgICAgICB9XSksIC4uLmRhdGEuZm9udHMuc3lzdGVtLmZhbWlsaWVzXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7fVxuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxWaWV3ICYmIGluaXRpYWxWaWV3ICE9PSAnZG9uZScpIHtcbiAgICAgIHNldFNlYXJjaFRlcm0oJycpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7Ly8gc2V0SW5pdGl0aWFsVmlldygnZG9uZScpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaW5pdGlhbFZpZXcgPT09ICdmb250X3NpemUnKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNpemVFbC5jdXJyZW50ICYmIHNpemVFbC5jdXJyZW50LmZvY3VzKCksIDEwMCk7XG4gICAgfVxuICB9LCBbaW5pdGlhbFZpZXddKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBmZXRjaEZvbnRzTGlzdCgpO1xuICB9LCBbXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRWaWV3ID09PSAnc2VhcmNoJykge1xuICAgICAgaW5wdXRFbC5jdXJyZW50LmZvY3VzKCk7XG4gICAgfVxuICB9LCBbY3VycmVudFZpZXddKTtcblxuICBjb25zdCBwaWNrRm9udEZhbWlseSA9IGZhbWlseSA9PiB7XG4gICAgb25DaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICBmYW1pbHk6IGZhbWlseS5mYW1pbHksXG4gICAgICB2YXJpYXRpb246IGRlY2lkZVZhcmlhdGlvblRvU2VsZWN0KGZhbWlseSwgdmFsdWUpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KGFuaW1hdGVkLmRpdiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogXCJjdC1vcHRpb24tbW9kYWwgY3QtdHlwb2dyYXBoeS1tb2RhbFwiXG4gIH0sIHdyYXBwZXJQcm9wcyksIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjdC10eXBvZ3JhcGh5LWNvbnRhaW5lclwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjdC10eXBvZ3JhcGh5LXRvcCcsIHtcbiAgICAgICdjdC1zd2l0Y2gtcGFuZWwnOiBjdXJyZW50VmlldyAhPT0gJ29wdGlvbnMnLFxuICAgICAgJ2N0LXN0YXRpYyc6IHByZXZpb3VzVmlldyA9PT0gJ18nXG4gICAgfSlcbiAgfSwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtYmFja1wiLFxuICAgIG9uQ2xpY2s6ICgpID0+IHNldEN1cnJlbnRWaWV3KCdvcHRpb25zJylcbiAgfSwgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiMTBcIixcbiAgICBoZWlnaHQ6IFwiMTBcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAxNSAxNVwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNC4yLDYuOEgyLjZsNC00YzAuMy0wLjMsMC4zLTAuOCwwLTEuMWMtMC4zLTAuMy0wLjgtMC4zLTEuMSwwTDAuMiw3bDAsMGMwLDAtMC4xLDAuMS0wLjEsMC4xYzAsMCwwLDAsMCwwLjFjMCwwLDAsMCwwLDAuMWMwLDAsMCwwLjEsMCwwLjFjMCwwLDAsMCwwLDAuMWMwLDAsMCwwLjEsMCwwLjFsMCwwYzAsMCwwLDAsMCwwYzAsMCwwLDAuMSwwLDAuMWMwLDAsMCwwLDAsMC4xYzAsMCwwLDAuMSwwLDAuMWMwLDAsMCwwLDAsMC4xYzAsMCwwLDAsMCwwLjFDMC4yLDgsMC4yLDgsMC4yLDhsNS4zLDUuM2MwLjMsMC4zLDAuOCwwLjMsMS4xLDBjMC4zLTAuMywwLjMtMC44LDAtMS4xbC00LTRoMTEuN2MwLjQsMCwwLjgtMC4zLDAuOC0wLjhTMTQuNyw2LjgsMTQuMiw2Ljh6XCJcbiAgfSkpKSwgY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LWZvbnQnLCB7XG4gICAgICBhY3RpdmU6IGN1cnJlbnRWaWV3ID09PSAnc2VhcmNoJyB8fCBjdXJyZW50VmlldyA9PT0gJ2ZvbnRzJ1xuICAgIH0pLFxuICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgIHNldEN1cnJlbnRWaWV3KGN1cnJlbnRWaWV3ID09PSAnZm9udHMnID8gJ3NlYXJjaCcgOiAnZm9udHMnKTtcbiAgICAgIHNldFNlYXJjaFRlcm0oJycpO1xuICAgIH1cbiAgfSwgY3VycmVudFZpZXcgIT09ICdzZWFyY2gnICYmIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGZhbWlseUZvckRpc3BsYXkodmFsdWUuZmFtaWx5KSksIGN1cnJlbnRWaWV3ID09PSAnc2VhcmNoJyAmJiBjcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge1xuICAgIG9uQ2xpY2s6IGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSxcbiAgICByZWY6IGlucHV0RWwsXG4gICAgYXV0b0ZvY3VzOiB0cnVlLFxuICAgIHZhbHVlOiBzZWFyY2hUZXJtLFxuICAgIG9uS2V5VXA6IGUgPT4ge1xuICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykge1xuICAgICAgICBpZiAobGluZWFyRm9udHNMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwaWNrRm9udEZhbWlseShsaW5lYXJGb250c0xpc3RbMF0pO1xuICAgICAgICAgIHNldEN1cnJlbnRWaWV3KCdvcHRpb25zJyk7XG4gICAgICAgICAgc2V0U2VhcmNoVGVybSgnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG9uQ2hhbmdlOiBfcmVmMyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9ID0gX3JlZjM7XG4gICAgICByZXR1cm4gc2V0U2VhcmNoVGVybSh2YWx1ZSk7XG4gICAgfVxuICB9KSwgY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IFwiOFwiLFxuICAgIGhlaWdodDogXCI4XCIsXG4gICAgdmlld0JveDogXCIwIDAgMTUgMTVcIlxuICB9LCBjdXJyZW50VmlldyA9PT0gJ3NlYXJjaCcgJiYgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTguOSw3LjVsNC42LTQuNmMwLjQtMC40LDAuNC0xLDAtMS40Yy0wLjQtMC40LTEtMC40LTEuNCwwTDcuNSw2LjFMMi45LDEuNWMtMC40LTAuNC0xLTAuNC0xLjQsMGMtMC40LDAuNC0wLjQsMSwwLDEuNGw0LjYsNC42bC00LjYsNC42Yy0wLjQsMC40LTAuNCwxLDAsMS40YzAuNCwwLjQsMSwwLjQsMS40LDBsNC42LTQuNmw0LjYsNC42YzAuNCwwLjQsMSwwLjQsMS40LDBjMC40LTAuNCwwLjQtMSwwLTEuNEw4LjksNy41elwiXG4gIH0pLCBjdXJyZW50VmlldyAhPT0gJ3NlYXJjaCcgJiYgY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0LjYsMTQuNmMtMC42LDAuNi0xLjQsMC42LTIsMGwtMi41LTIuNWMtMSwwLjctMi4yLDEtMy41LDFDMi45LDEzLjEsMCwxMC4yLDAsNi42UzIuOSwwLDYuNiwwYzMuNiwwLDYuNiwyLjksNi42LDYuNmMwLDEuMy0wLjQsMi41LTEsMy41bDIuNSwyLjVDMTUuMSwxMy4xLDE1LjEsMTQsMTQuNiwxNC42eiBNNi42LDEuOUM0LDEuOSwxLjksNCwxLjksNi42czIuMSw0LjcsNC43LDQuN2MyLjYsMCw0LjctMi4xLDQuNy00LjdDMTEuMyw0LDkuMiwxLjksNi42LDEuOXpcIlxuICB9KSkpLCBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY3Qtd2VpZ2h0Jywge1xuICAgICAgYWN0aXZlOiBjdXJyZW50VmlldyA9PT0gJ3ZhcmlhdGlvbnMnXG4gICAgfSksXG4gICAgb25DbGljazogKCkgPT4gc2V0Q3VycmVudFZpZXcoJ3ZhcmlhdGlvbnMnKVxuICB9LCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgXCJkYXRhLXZhcmlhdGlvblwiOiB2YWx1ZS52YXJpYXRpb25cbiAgfSwgaHVtYW5pemVWYXJpYXRpb25zU2hvcnQodmFsdWUudmFyaWF0aW9uKSkpKSwgY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCB7XG4gICAgaXRlbXM6IGN1cnJlbnRWaWV3LFxuICAgIGltbWVkaWF0ZTogZGlyZWN0aW9uID09PSAnc3RhdGljJyxcbiAgICBjb25maWc6IChpdGVtLCB0eXBlKSA9PiAoe1xuICAgICAgZHVyYXRpb246IDIxMCxcbiAgICAgIGVhc2luZzogYmV6aWVyRWFzaW5nKDAuNDU1LCAwLjAzLCAwLjUxNSwgMC45NTUpXG4gICAgfSksXG4gICAgZnJvbToge1xuICAgICAgdHJhbnNmb3JtOiBkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICd0cmFuc2xhdGVYKDEwMCUpJyA6ICd0cmFuc2xhdGVYKC0xMDAlKScsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgZW50ZXI6IHtcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCUpJyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICBsZWF2ZToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB0cmFuc2Zvcm06IGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ3RyYW5zbGF0ZVgoLTEwMCUpJyA6ICd0cmFuc2xhdGVYKDEwMCUpJ1xuICAgIH1cbiAgfSwgKHByb3BzLCBjdXJyZW50VmlldywgdHJhbnNpdGlvbiwga2V5KSA9PiB7XG4gICAgaWYgKGN1cnJlbnRWaWV3ID09PSAnb3B0aW9ucycpIHtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KEZvbnRPcHRpb25zLCB7XG4gICAgICAgIHNpemVSZWY6IHNpemVFbCxcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBvcHRpb246IG9wdGlvbixcbiAgICAgICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgIGN1cnJlbnRWaWV3OiBjdXJyZW50Vmlld1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRWaWV3ID09PSAnZm9udHMnIHx8IGN1cnJlbnRWaWV3ID09PSAnc2VhcmNoJykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoYW5pbWF0ZWQuZGl2LCB7XG4gICAgICAgIHN0eWxlOiBwcm9wcyxcbiAgICAgICAga2V5OiBjdXJyZW50Vmlld1xuICAgICAgfSwgY3JlYXRlRWxlbWVudChGb250c0xpc3QsIHtcbiAgICAgICAgdHlwb2dyYXBoeUxpc3Q6IHR5cG9ncmFwaHlMaXN0LFxuICAgICAgICBzZWFyY2hUZXJtOiBzZWFyY2hUZXJtLFxuICAgICAgICBsaW5lYXJGb250c0xpc3Q6IGxpbmVhckZvbnRzTGlzdCxcbiAgICAgICAgY3VycmVudFZpZXc6IGAke2N1cnJlbnRWaWV3fToke3ByZXZpb3VzVmlld31gLFxuICAgICAgICBvblBpY2tGYW1pbHk6IGZhbWlseSA9PiB7XG4gICAgICAgICAgcGlja0ZvbnRGYW1pbHkoZmFtaWx5KTsgLy8gc2V0Q3VycmVudFZpZXcoJ29wdGlvbnMnKVxuICAgICAgICAgIC8vIHNldFNlYXJjaFRlcm0oJycpXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50VmlldyA9PT0gJ3ZhcmlhdGlvbnMnKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChWYXJpYXRpb25zTGlzdCwge1xuICAgICAgICBjdXJyZW50VmlldzogY3VycmVudFZpZXcsXG4gICAgICAgIHByb3BzOiBwcm9wcyxcbiAgICAgICAgdHlwb2dyYXBoeUxpc3Q6IHR5cG9ncmFwaHlMaXN0LFxuICAgICAgICBvbkNoYW5nZTogdmFsdWUgPT4ge1xuICAgICAgICAgIG9uQ2hhbmdlKHZhbHVlKTsgLy8gc2V0Q3VycmVudFZpZXcoJ29wdGlvbnMnKVxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFR5cG9ncmFwaHlNb2RhbDsiLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgY3JlYXRlUG9ydGFsLCBDb21wb25lbnQsIHVzZVJlZiwgdXNlUmVkdWNlciwgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgVHlwb2dyYXBoeU1vZGFsIGZyb20gJy4vdHlwb2dyYXBoeS9UeXBvZ3JhcGh5TW9kYWwnO1xuaW1wb3J0IE91dHNpZGVDbGlja0hhbmRsZXIgZnJvbSAnLi9yZWFjdC1vdXRzaWRlLWNsaWNrLWhhbmRsZXInO1xuaW1wb3J0IHsgaHVtYW5pemVWYXJpYXRpb25zLCBmYW1pbHlGb3JEaXNwbGF5IH0gZnJvbSAnLi90eXBvZ3JhcGh5L2hlbHBlcnMnO1xuaW1wb3J0IHsgbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZSB9IGZyb20gJy4uLy4uL2N1c3RvbWl6ZXIvY29tcG9uZW50cy9yZXNwb25zaXZlLWNvbnRyb2xzJztcbmltcG9ydCB1c2VQb3BvdmVyTWFrZXIgZnJvbSAnLi4vaGVscGVycy91c2VQb3BvdmVyTWFrZXInO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiB9IGZyb20gJ0ByZWFjdC1zcHJpbmcvd2ViJztcbmltcG9ydCBiZXppZXJFYXNpbmcgZnJvbSAnYmV6aWVyLWVhc2luZyc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuXG5jb25zdCBnZXRMZWZ0Rm9yRWwgPSAobW9kYWwsIGVsKSA9PiB7XG4gIGlmICghbW9kYWwpIHJldHVybjtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG1vZGFsKTtcbiAgbGV0IHdyYXBwZXJMZWZ0ID0gcGFyc2VGbG9hdChzdHlsZS5sZWZ0KTtcbiAgZWwgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHtcbiAgICAnLS1vcHRpb24tbW9kYWwtYXJyb3ctcG9zaXRpb24nOiBgJHtlbC5sZWZ0ICsgZWwud2lkdGggLyAyIC0gd3JhcHBlckxlZnQgLSA2fXB4YFxuICB9O1xufTtcblxuY29uc3QgVHlwb2dyYXBoeSA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbjoge1xuICAgICAgbGFiZWwgPSAnJyxcbiAgICAgIGRlc2MgPSAnJyxcbiAgICAgIGF0dHIgPSB7fVxuICAgIH0sXG4gICAgb3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIGRldmljZSxcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjtcbiAgLy8gY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICAvLyBvcHRpb25zIHwgZm9udHMgfCB2YXJpYXRpb25zIHwgc2VhcmNoXG4gIGNvbnN0IFtjdXJyZW50Vmlld0NhY2hlLCBzZXRDdXJyZW50Vmlld0NhY2hlXSA9IHVzZVN0YXRlKCdfOl8nKTtcbiAgY29uc3QgdHlwb2dyYXBoeVdyYXBwZXIgPSB1c2VSZWYoKTtcbiAgbGV0IFtjdXJyZW50VmlldywgcHJldmlvdXNWaWV3XSA9IHVzZU1lbW8oKCkgPT4gY3VycmVudFZpZXdDYWNoZS5zcGxpdCgnOicpLCBbY3VycmVudFZpZXdDYWNoZV0pO1xuICBjb25zdCBzZXRDdXJyZW50VmlldyA9IHVzZUNhbGxiYWNrKG5ld1ZpZXcgPT4gc2V0Q3VycmVudFZpZXdDYWNoZShgJHtuZXdWaWV3fToke2N1cnJlbnRWaWV3fWApLCBbY3VycmVudFZpZXddKTtcbiAgY29uc3QgW3tcbiAgICBpc09wZW4sXG4gICAgaXNUcmFuc2l0aW9uaW5nXG4gIH0sIHNldE1vZGFsU3RhdGVdID0gdXNlU3RhdGUoe1xuICAgIGlzT3BlbjogZmFsc2UsXG4gICAgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZVxuICB9KTtcbiAgY29uc3Qge1xuICAgIHN0eWxlcyxcbiAgICBwb3BvdmVyUHJvcHNcbiAgfSA9IHVzZVBvcG92ZXJNYWtlcih7XG4gICAgcmVmOiB0eXBvZ3JhcGh5V3JhcHBlcixcbiAgICBkZWZhdWx0SGVpZ2h0OiA0MzAsXG4gICAgc2hvdWxkQ2FsY3VsYXRlOiBpc1RyYW5zaXRpb25pbmcgfHwgaXNPcGVuXG4gIH0pO1xuXG4gIGNvbnN0IHNldElzT3BlbiA9IGlzT3BlbiA9PiB7XG4gICAgc2V0TW9kYWxTdGF0ZShzdGF0ZSA9PiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgIGlzT3BlbixcbiAgICAgIGlzVHJhbnNpdGlvbmluZzogdHJ1ZVxuICAgIH0pKTtcbiAgfTtcblxuICBjb25zdCBzdG9wVHJhbnNpdGlvbmluZyA9ICgpID0+IHNldE1vZGFsU3RhdGUoc3RhdGUgPT4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSksIHt9LCB7XG4gICAgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZVxuICB9KSk7XG5cbiAgY29uc3QgZm9udEZhbWlseVJlZiA9IHVzZVJlZigpO1xuICBjb25zdCBmb250U2l6ZVJlZiA9IHVzZVJlZigpO1xuICBjb25zdCBmb250V2VpZ2h0UmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IGRvdHNSZWYgPSB1c2VSZWYoKTtcbiAgY29uc3QgYXJyb3dMZWZ0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgdmlldyA9IGN1cnJlbnRWaWV3O1xuICAgIGNvbnN0IGZ1dHVyZVJlZiA9IHZpZXcgPT09ICdvcHRpb25zJyA/IGZvbnRTaXplUmVmLmN1cnJlbnQgOiB2aWV3ID09PSAnZm9udHMnID8gZm9udEZhbWlseVJlZi5jdXJyZW50IDogdmlldyA9PT0gJ3ZhcmlhdGlvbnMnID8gZm9udFdlaWdodFJlZi5jdXJyZW50IDogZm9udFNpemVSZWYuY3VycmVudDtcbiAgICByZXR1cm4gcG9wb3ZlclByb3BzLnJlZiAmJiBwb3BvdmVyUHJvcHMucmVmLmN1cnJlbnQgJiYgZ2V0TGVmdEZvckVsKHBvcG92ZXJQcm9wcy5yZWYuY3VycmVudCwgZnV0dXJlUmVmKTtcbiAgfSwgW2lzT3BlbiwgY3VycmVudFZpZXcsIHBvcG92ZXJQcm9wcy5yZWYsIHBvcG92ZXJQcm9wcy5yZWYgJiYgcG9wb3ZlclByb3BzLnJlZi5jdXJyZW50LCBmb250RmFtaWx5UmVmICYmIGZvbnRGYW1pbHlSZWYuY3VycmVudCwgZm9udFdlaWdodFJlZiAmJiBmb250V2VpZ2h0UmVmLmN1cnJlbnQsIGZvbnRTaXplUmVmICYmIGZvbnRTaXplUmVmLmN1cnJlbnQsIGRvdHNSZWYgJiYgZG90c1JlZi5jdXJyZW50XSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LXR5cG9ncmFwaHknLCB7fSlcbiAgfSwgY3JlYXRlRWxlbWVudChPdXRzaWRlQ2xpY2tIYW5kbGVyLCB7XG4gICAgZGlzYWJsZWQ6ICFpc09wZW4sXG4gICAgdXNlQ2FwdHVyZTogZmFsc2UsXG4gICAgY2xhc3NOYW1lOiBcImN0LXR5cG9ocmFwaHktdmFsdWVcIixcbiAgICBhZGRpdGlvbmFsUmVmczogW3BvcG92ZXJQcm9wcy5yZWZdLFxuICAgIG9uT3V0c2lkZUNsaWNrOiAoKSA9PiB7XG4gICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgIH0sXG4gICAgd3JhcHBlclByb3BzOiB7XG4gICAgICByZWY6IHR5cG9ncmFwaHlXcmFwcGVyLFxuICAgICAgb25DbGljazogZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgICAgc2V0Q3VycmVudFZpZXcoJ29wdGlvbnMnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRDdXJyZW50Vmlld0NhY2hlKCdvcHRpb25zOl8nKTtcbiAgICAgICAgc2V0SXNPcGVuKCdvcHRpb25zJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgc2V0Q3VycmVudFZpZXcoJ2ZvbnRzJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0Q3VycmVudFZpZXdDYWNoZSgnZm9udHM6XycpO1xuICAgICAgc2V0SXNPcGVuKCdmb250cycpO1xuICAgIH0sXG4gICAgY2xhc3NOYW1lOiBcImN0LWZvbnRcIixcbiAgICByZWY6IGZvbnRGYW1pbHlSZWZcbiAgfSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgdmFsdWUuZmFtaWx5ID09PSAnRGVmYXVsdCcgPyBfXygnRGVmYXVsdCBGYW1pbHknLCAnYmxvY2tzeScpIDogZmFtaWx5Rm9yRGlzcGxheSh2YWx1ZS5mYW1pbHkpKSksIGNyZWF0ZUVsZW1lbnQoXCJpXCIsIG51bGwsIFwiL1wiKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICBzZXRDdXJyZW50Vmlldygnb3B0aW9ucycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldEN1cnJlbnRWaWV3Q2FjaGUoJ29wdGlvbnM6XycpO1xuICAgICAgc2V0SXNPcGVuKCdmb250X3NpemUnKTtcbiAgICB9LFxuICAgIHJlZjogZm9udFNpemVSZWYsXG4gICAgY2xhc3NOYW1lOiBcImN0LXNpemVcIlxuICB9LCBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBtYXliZVByb21vdGVTY2FsYXJWYWx1ZUludG9SZXNwb25zaXZlKHZhbHVlWydzaXplJ10pW2RldmljZV0gPT09ICdDVF9DU1NfU0tJUF9SVUxFJyA/IF9fKCdEZWZhdWx0IFNpemUnLCAnYmxvY2tzeScpIDogbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZSh2YWx1ZVsnc2l6ZSddKVtkZXZpY2VdKSksIGNyZWF0ZUVsZW1lbnQoXCJpXCIsIG51bGwsIFwiL1wiKSwgY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHJlZjogZm9udFdlaWdodFJlZixcbiAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgc2V0Q3VycmVudFZpZXcoJ3ZhcmlhdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRDdXJyZW50Vmlld0NhY2hlKCd2YXJpYXRpb25zOl8nKTtcbiAgICAgIHNldElzT3BlbigndmFyaWF0aW9ucycpO1xuICAgIH0sXG4gICAgY2xhc3NOYW1lOiBcImN0LXdlaWdodFwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGh1bWFuaXplVmFyaWF0aW9ucyh2YWx1ZS52YXJpYXRpb24pKSkpLCBjcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgcmVmOiBkb3RzUmVmXG4gIH0pKSwgKGlzVHJhbnNpdGlvbmluZyB8fCBpc09wZW4pICYmIGNyZWF0ZVBvcnRhbChjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHtcbiAgICBpdGVtczogaXNPcGVuLFxuICAgIG9uUmVzdDogaXNPcGVuID0+IHtcbiAgICAgIHN0b3BUcmFuc2l0aW9uaW5nKCk7XG4gICAgfSxcbiAgICBjb25maWc6IHtcbiAgICAgIGR1cmF0aW9uOiAxMDAsXG4gICAgICBlYXNpbmc6IGJlemllckVhc2luZygwLjI1LCAwLjEsIDAuMjUsIDEuMClcbiAgICB9LFxuICAgIGZyb206IGlzT3BlbiA/IHtcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMC45NSwgMC45NSwgMSknLFxuICAgICAgb3BhY2l0eTogMFxuICAgIH0gOiB7XG4gICAgICBvcGFjaXR5OiAxXG4gICAgfSxcbiAgICBlbnRlcjogaXNPcGVuID8ge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUzZCgxLCAxLCAxKScsXG4gICAgICBvcGFjaXR5OiAxXG4gICAgfSA6IHtcbiAgICAgIG9wYWNpdHk6IDFcbiAgICB9LFxuICAgIGxlYXZlOiAhaXNPcGVuID8ge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUzZCgwLjk1LCAwLjk1LCAxKScsXG4gICAgICBvcGFjaXR5OiAwXG4gICAgfSA6IHtcbiAgICAgIG9wYWNpdHk6IDFcbiAgICB9XG4gIH0sIChzdHlsZSwgaXRlbSkgPT4ge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoVHlwb2dyYXBoeU1vZGFsLCB7XG4gICAgICB3cmFwcGVyUHJvcHM6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwgc3R5bGVzKSwgYXJyb3dMZWZ0KVxuICAgICAgfSwgcG9wb3ZlclByb3BzKSxcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIG9wdGlvbjogb3B0aW9uLFxuICAgICAgaW5pdGlhbFZpZXc6IGl0ZW0sXG4gICAgICBzZXRJbml0aXRpYWxWaWV3OiBpbml0aWFsVmlldyA9PiBzZXRJc09wZW4oaW5pdGlhbFZpZXcpLFxuICAgICAgY3VycmVudFZpZXc6IGN1cnJlbnRWaWV3LFxuICAgICAgcHJldmlvdXNWaWV3OiBwcmV2aW91c1ZpZXcsXG4gICAgICBzZXRDdXJyZW50Vmlldzogc2V0Q3VycmVudFZpZXdcbiAgICB9KTtcbiAgICAvKlxuICAgIGlzT3BlbiAmJlxuICAgICgocHJvcHMpID0+IChcbiAgICBcdDxUeXBvZ3JhcGh5TW9kYWxcbiAgICBcdFx0d3JhcHBlclByb3BzPXt7XG4gICAgXHRcdFx0c3R5bGU6IHtcbiAgICBcdFx0XHRcdC4uLnByb3BzLFxuICAgIFx0XHRcdFx0Li4uc3R5bGVzLFxuICAgIFx0XHRcdFx0Li4uYXJyb3dMZWZ0LFxuICAgIFx0XHRcdH0sXG4gICAgXHRcdFx0Li4ucG9wb3ZlclByb3BzLFxuICAgIFx0XHR9fVxuICAgIFx0XHRvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgXHRcdHZhbHVlPXt2YWx1ZX1cbiAgICBcdFx0b3B0aW9uPXtvcHRpb259XG4gICAgXHRcdGluaXRpYWxWaWV3PXtpc09wZW59XG4gICAgXHRcdHNldEluaXRpdGlhbFZpZXc9eyhpbml0aWFsVmlldykgPT5cbiAgICBcdFx0XHRzZXRJc09wZW4oaW5pdGlhbFZpZXcpXG4gICAgXHRcdH1cbiAgICBcdFx0Y3VycmVudFZpZXc9e2N1cnJlbnRWaWV3fVxuICAgIFx0XHRwcmV2aW91c1ZpZXc9e3ByZXZpb3VzVmlld31cbiAgICBcdFx0c2V0Q3VycmVudFZpZXc9e3NldEN1cnJlbnRWaWV3fVxuICAgIFx0Lz5cbiAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIH0pLCBkb2N1bWVudC5ib2R5KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUeXBvZ3JhcGh5OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5183\n")},5138:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _helpers_parse_choices_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4592);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_spring_renderprops__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4823);\n/* harmony import */ var bezier_easing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3431);\n/* harmony import */ var bezier_easing__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(bezier_easing__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _react_outside_click_handler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8204);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_4__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\nconst InlineVisibility = _ref => {\n let {\n option,\n value,\n onChange\n } = _ref;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"ul\", _extends({\n className: \"ct-visibility-option ct-devices ct-buttons-group\"\n }, option.attr || {}), (0,_helpers_parse_choices_js__WEBPACK_IMPORTED_MODULE_5__/* .maybeTransformUnorderedChoices */ .N)(option.choices).map(_ref2 => {\n let {\n key,\n value: val\n } = _ref2;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"li\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()({\n active: value[key]\n }, `ct-${key}`),\n onClick: () => onChange(_objectSpread(_objectSpread({}, value), {}, {\n [key]: value[key] ? Object.values(value).filter(v => v).length === 1 && !option.allow_empty ? true : false : true\n })),\n key: key\n });\n }));\n};\n\nconst VisibilityModal = _ref3 => {\n let {\n option,\n value,\n onChange\n } = _ref3;\n const [{\n isPicking,\n isTransitioning\n }, setAnimationState] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)({\n isPicking: null,\n isTransitioning: null\n });\n\n const stopTransitioning = () => setAnimationState({\n isPicking,\n isTransitioning: false\n });\n\n const el = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_react_outside_click_handler__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n useCapture: false,\n disabled: !isPicking,\n className: \"ct-visibility-trigger\",\n additionalRefs: [],\n onOutsideClick: () => {\n if (!isPicking) {\n return;\n }\n\n setAnimationState({\n isTransitioning: true,\n isPicking: null\n });\n },\n wrapperProps: {\n ref: el,\n onClick: e => {\n e.preventDefault();\n setAnimationState({\n isTransitioning: true,\n isPicking: true\n });\n }\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"span\", null, \"open visibility\")), (isTransitioning || isPicking) && (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createPortal)((0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(react_spring_renderprops__WEBPACK_IMPORTED_MODULE_6__/* .Transition */ .uT, {\n items: isPicking,\n onRest: isOpen => {\n stopTransitioning();\n },\n config: {\n duration: 100,\n easing: bezier_easing__WEBPACK_IMPORTED_MODULE_2___default()(0.25, 0.1, 0.25, 1.0)\n },\n from: isPicking ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n },\n enter: isPicking ? {\n transform: 'scale3d(1, 1, 1)',\n opacity: 1\n } : {\n opacity: 1\n },\n leave: isPicking ? {\n transform: 'scale3d(0.95, 0.95, 1)',\n opacity: 0\n } : {\n opacity: 1\n }\n }, isPicking => isPicking && (props => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n style: props,\n className: \"ct-box-shadow-modal\",\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n },\n onMouseDownCapture: e => {\n e.nativeEvent.stopImmediatePropagation();\n e.nativeEvent.stopPropagation();\n },\n onMouseUpCapture: e => {\n e.nativeEvent.stopImmediatePropagation();\n e.nativeEvent.stopPropagation();\n }\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(InlineVisibility, {\n option: option,\n value: value,\n onChange: onChange\n })))), el.current.closest('.ct-labeled-group-item') ? el.current.closest('.ct-labeled-group-item').querySelector('.ct-visibility-modal-wrapper') : el.current.closest('.ct-single-palette') ? el.current.closest('.ct-single-palette').querySelector('.ct-visibility-modal-wrapper') : el.current.closest('.ct-visibility-modal-wrapper') ? el.current.closest('.ct-visibility-modal-wrapper') : el.current.closest('.ct-control').querySelector('.ct-visibility-modal-wrapper')));\n};\n\nconst Visibility = _ref4 => {\n let {\n option,\n option: {\n // inline | modal\n view = 'inline'\n },\n value,\n onChange\n } = _ref4;\n\n if (view === 'inline') {\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(InlineVisibility, {\n option: option,\n value: value,\n onChange: onChange\n });\n }\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(VisibilityModal, {\n option: option,\n value: value,\n onChange: onChange\n });\n};\n\nVisibility.hiddenResponsive = true;\n\nVisibility.ControlEnd = () => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"ct-visibility-modal-wrapper\"\n});\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Visibility);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEzOC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3QtdmlzaWJpbGl0eS5qcz8zYzA1Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBjcmVhdGVQb3J0YWwsIHVzZUNvbnRleHQsIEZyYWdtZW50LCB1c2VTdGF0ZSwgQ29tcG9uZW50LCB1c2VSZWYgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgbWF5YmVUcmFuc2Zvcm1Vbm9yZGVyZWRDaG9pY2VzIH0gZnJvbSAnLi4vaGVscGVycy9wYXJzZS1jaG9pY2VzLmpzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiB9IGZyb20gJ3JlYWN0LXNwcmluZy9yZW5kZXJwcm9wcyc7XG5pbXBvcnQgYmV6aWVyRWFzaW5nIGZyb20gJ2Jlemllci1lYXNpbmcnO1xuaW1wb3J0IE91dHNpZGVDbGlja0hhbmRsZXIgZnJvbSAnLi9yZWFjdC1vdXRzaWRlLWNsaWNrLWhhbmRsZXInO1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcblxuY29uc3QgSW5saW5lVmlzaWJpbGl0eSA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIG9wdGlvbixcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBcImN0LXZpc2liaWxpdHktb3B0aW9uIGN0LWRldmljZXMgY3QtYnV0dG9ucy1ncm91cFwiXG4gIH0sIG9wdGlvbi5hdHRyIHx8IHt9KSwgbWF5YmVUcmFuc2Zvcm1Vbm9yZGVyZWRDaG9pY2VzKG9wdGlvbi5jaG9pY2VzKS5tYXAoX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogdmFsXG4gICAgfSA9IF9yZWYyO1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKHtcbiAgICAgICAgYWN0aXZlOiB2YWx1ZVtrZXldXG4gICAgICB9LCBgY3QtJHtrZXl9YCksXG4gICAgICBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlKSwge30sIHtcbiAgICAgICAgW2tleV06IHZhbHVlW2tleV0gPyBPYmplY3QudmFsdWVzKHZhbHVlKS5maWx0ZXIodiA9PiB2KS5sZW5ndGggPT09IDEgJiYgIW9wdGlvbi5hbGxvd19lbXB0eSA/IHRydWUgOiBmYWxzZSA6IHRydWVcbiAgICAgIH0pKSxcbiAgICAgIGtleToga2V5XG4gICAgfSk7XG4gIH0pKTtcbn07XG5cbmNvbnN0IFZpc2liaWxpdHlNb2RhbCA9IF9yZWYzID0+IHtcbiAgbGV0IHtcbiAgICBvcHRpb24sXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWYzO1xuICBjb25zdCBbe1xuICAgIGlzUGlja2luZyxcbiAgICBpc1RyYW5zaXRpb25pbmdcbiAgfSwgc2V0QW5pbWF0aW9uU3RhdGVdID0gdXNlU3RhdGUoe1xuICAgIGlzUGlja2luZzogbnVsbCxcbiAgICBpc1RyYW5zaXRpb25pbmc6IG51bGxcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcFRyYW5zaXRpb25pbmcgPSAoKSA9PiBzZXRBbmltYXRpb25TdGF0ZSh7XG4gICAgaXNQaWNraW5nLFxuICAgIGlzVHJhbnNpdGlvbmluZzogZmFsc2VcbiAgfSk7XG5cbiAgY29uc3QgZWwgPSB1c2VSZWYoKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNyZWF0ZUVsZW1lbnQoT3V0c2lkZUNsaWNrSGFuZGxlciwge1xuICAgIHVzZUNhcHR1cmU6IGZhbHNlLFxuICAgIGRpc2FibGVkOiAhaXNQaWNraW5nLFxuICAgIGNsYXNzTmFtZTogXCJjdC12aXNpYmlsaXR5LXRyaWdnZXJcIixcbiAgICBhZGRpdGlvbmFsUmVmczogW10sXG4gICAgb25PdXRzaWRlQ2xpY2s6ICgpID0+IHtcbiAgICAgIGlmICghaXNQaWNraW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0QW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICBpc1RyYW5zaXRpb25pbmc6IHRydWUsXG4gICAgICAgIGlzUGlja2luZzogbnVsbFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB3cmFwcGVyUHJvcHM6IHtcbiAgICAgIHJlZjogZWwsXG4gICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlLFxuICAgICAgICAgIGlzUGlja2luZzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIFwib3BlbiB2aXNpYmlsaXR5XCIpKSwgKGlzVHJhbnNpdGlvbmluZyB8fCBpc1BpY2tpbmcpICYmIGNyZWF0ZVBvcnRhbChjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHtcbiAgICBpdGVtczogaXNQaWNraW5nLFxuICAgIG9uUmVzdDogaXNPcGVuID0+IHtcbiAgICAgIHN0b3BUcmFuc2l0aW9uaW5nKCk7XG4gICAgfSxcbiAgICBjb25maWc6IHtcbiAgICAgIGR1cmF0aW9uOiAxMDAsXG4gICAgICBlYXNpbmc6IGJlemllckVhc2luZygwLjI1LCAwLjEsIDAuMjUsIDEuMClcbiAgICB9LFxuICAgIGZyb206IGlzUGlja2luZyA/IHtcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMC45NSwgMC45NSwgMSknLFxuICAgICAgb3BhY2l0eTogMFxuICAgIH0gOiB7XG4gICAgICBvcGFjaXR5OiAxXG4gICAgfSxcbiAgICBlbnRlcjogaXNQaWNraW5nID8ge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUzZCgxLCAxLCAxKScsXG4gICAgICBvcGFjaXR5OiAxXG4gICAgfSA6IHtcbiAgICAgIG9wYWNpdHk6IDFcbiAgICB9LFxuICAgIGxlYXZlOiBpc1BpY2tpbmcgPyB7XG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDAuOTUsIDAuOTUsIDEpJyxcbiAgICAgIG9wYWNpdHk6IDBcbiAgICB9IDoge1xuICAgICAgb3BhY2l0eTogMVxuICAgIH1cbiAgfSwgaXNQaWNraW5nID0+IGlzUGlja2luZyAmJiAocHJvcHMgPT4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHByb3BzLFxuICAgIGNsYXNzTmFtZTogXCJjdC1ib3gtc2hhZG93LW1vZGFsXCIsXG4gICAgb25DbGljazogZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG4gICAgb25Nb3VzZURvd25DYXB0dXJlOiBlID0+IHtcbiAgICAgIGUubmF0aXZlRXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG4gICAgb25Nb3VzZVVwQ2FwdHVyZTogZSA9PiB7XG4gICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgZS5uYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH0sIGNyZWF0ZUVsZW1lbnQoSW5saW5lVmlzaWJpbGl0eSwge1xuICAgIG9wdGlvbjogb3B0aW9uLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBvbkNoYW5nZTogb25DaGFuZ2VcbiAgfSkpKSksIGVsLmN1cnJlbnQuY2xvc2VzdCgnLmN0LWxhYmVsZWQtZ3JvdXAtaXRlbScpID8gZWwuY3VycmVudC5jbG9zZXN0KCcuY3QtbGFiZWxlZC1ncm91cC1pdGVtJykucXVlcnlTZWxlY3RvcignLmN0LXZpc2liaWxpdHktbW9kYWwtd3JhcHBlcicpIDogZWwuY3VycmVudC5jbG9zZXN0KCcuY3Qtc2luZ2xlLXBhbGV0dGUnKSA/IGVsLmN1cnJlbnQuY2xvc2VzdCgnLmN0LXNpbmdsZS1wYWxldHRlJykucXVlcnlTZWxlY3RvcignLmN0LXZpc2liaWxpdHktbW9kYWwtd3JhcHBlcicpIDogZWwuY3VycmVudC5jbG9zZXN0KCcuY3QtdmlzaWJpbGl0eS1tb2RhbC13cmFwcGVyJykgPyBlbC5jdXJyZW50LmNsb3Nlc3QoJy5jdC12aXNpYmlsaXR5LW1vZGFsLXdyYXBwZXInKSA6IGVsLmN1cnJlbnQuY2xvc2VzdCgnLmN0LWNvbnRyb2wnKS5xdWVyeVNlbGVjdG9yKCcuY3QtdmlzaWJpbGl0eS1tb2RhbC13cmFwcGVyJykpKTtcbn07XG5cbmNvbnN0IFZpc2liaWxpdHkgPSBfcmVmNCA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uLFxuICAgIG9wdGlvbjoge1xuICAgICAgLy8gaW5saW5lIHwgbW9kYWxcbiAgICAgIHZpZXcgPSAnaW5saW5lJ1xuICAgIH0sXG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWY0O1xuXG4gIGlmICh2aWV3ID09PSAnaW5saW5lJykge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KElubGluZVZpc2liaWxpdHksIHtcbiAgICAgIG9wdGlvbjogb3B0aW9uLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgb25DaGFuZ2U6IG9uQ2hhbmdlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChWaXNpYmlsaXR5TW9kYWwsIHtcbiAgICBvcHRpb246IG9wdGlvbixcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlXG4gIH0pO1xufTtcblxuVmlzaWJpbGl0eS5oaWRkZW5SZXNwb25zaXZlID0gdHJ1ZTtcblxuVmlzaWJpbGl0eS5Db250cm9sRW5kID0gKCkgPT4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gIGNsYXNzTmFtZTogXCJjdC12aXNpYmlsaXR5LW1vZGFsLXdyYXBwZXJcIlxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFZpc2liaWxpdHk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5138\n")},6223:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _ct_number__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4949);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nconst WooColumnsAndRows = _ref => {\n let {\n onChange,\n value,\n option,\n option: {\n columns_id,\n rows_id\n },\n device,\n onChangeFor,\n values,\n values: {\n woocommerce_catalog_columns,\n woocommerce_catalog_rows\n }\n } = _ref;\n const rowsValue = rows_id ? values[rows_id] : woocommerce_catalog_rows;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()('ct-woo-columns-and-rows', {})\n }, device !== 'desktop' ? {\n 'data-disabled-last': ''\n } : {}), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_ct_number__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n option: _objectSpread(_objectSpread({}, option), {}, {\n attr: _objectSpread(_objectSpread({}, option.attr || {}), {}, {\n 'data-width': 'full'\n })\n }),\n value: !columns_id && device === 'desktop' ? woocommerce_catalog_columns : value,\n onChange: val => {\n device === 'desktop' && !columns_id ? onChangeFor('woocommerce_catalog_columns', val) : onChange(val);\n }\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"p\", {\n className: \"ct-option-description\"\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Number of columns', 'blc'))), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", null, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_ct_number__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n option: {\n min: 1,\n max: 100,\n responsive: false,\n value: 4,\n attr: {\n 'data-width': 'full'\n }\n },\n value: device === 'desktop' ? rowsValue : 'auto',\n onChange: val => {\n device === 'desktop' && onChangeFor(rows_id || 'woocommerce_catalog_rows', val);\n\n if (wp.customize && wp.customize.previewer) {\n wp.customize.previewer.send('ct:sync:refresh_partial', {\n id: rows_id || 'woocommerce_catalog_rows'\n });\n }\n }\n }), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"p\", {\n className: \"ct-option-description\"\n }, (0,ct_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Number of rows', 'blc'))));\n};\n\nWooColumnsAndRows.renderingConfig = {\n getValueForRevert: _ref2 => {\n let {\n value,\n values: {\n woocommerce_catalog_columns,\n woocommerce_catalog_rows\n },\n option,\n option: {\n columns_id,\n rows_id\n },\n values,\n device\n } = _ref2;\n const rowsValue = rows_id ? values[rows_id] : woocommerce_catalog_rows;\n\n let myResult = _objectSpread(_objectSpread({}, value), {}, {\n desktop: woocommerce_catalog_columns,\n woocommerce_catalog_columns,\n woocommerce_catalog_rows\n });\n\n return myResult;\n },\n computeOptionValue: v => _objectSpread(_objectSpread({}, v), {}, {\n woocommerce_catalog_columns: 4,\n woocommerce_catalog_rows: 4\n }),\n computeOptionValue: v => {\n const result = _objectSpread(_objectSpread({}, v), {}, {\n woocommerce_catalog_columns: 4,\n woocommerce_catalog_rows: 4\n });\n\n return result;\n },\n performRevert: _ref3 => {\n let {\n onChangeFor\n } = _ref3;\n onChangeFor('woocommerce_catalog_columns', 4);\n onChangeFor('woocommerce_catalog_rows', 4);\n }\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WooColumnsAndRows);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIyMy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9jdC13b29jb21tZXJjZS1jb2x1bW5zLWFuZC1yb3dzLmpzP2I4ZTQiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCwgdXNlU3RhdGUsIEZyYWdtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBfXywgc3ByaW50ZiB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IE51bWJlck9wdGlvbiBmcm9tICcuL2N0LW51bWJlcic7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuY29uc3QgV29vQ29sdW1uc0FuZFJvd3MgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBvbkNoYW5nZSxcbiAgICB2YWx1ZSxcbiAgICBvcHRpb24sXG4gICAgb3B0aW9uOiB7XG4gICAgICBjb2x1bW5zX2lkLFxuICAgICAgcm93c19pZFxuICAgIH0sXG4gICAgZGV2aWNlLFxuICAgIG9uQ2hhbmdlRm9yLFxuICAgIHZhbHVlcyxcbiAgICB2YWx1ZXM6IHtcbiAgICAgIHdvb2NvbW1lcmNlX2NhdGFsb2dfY29sdW1ucyxcbiAgICAgIHdvb2NvbW1lcmNlX2NhdGFsb2dfcm93c1xuICAgIH1cbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHJvd3NWYWx1ZSA9IHJvd3NfaWQgPyB2YWx1ZXNbcm93c19pZF0gOiB3b29jb21tZXJjZV9jYXRhbG9nX3Jvd3M7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2N0LXdvby1jb2x1bW5zLWFuZC1yb3dzJywge30pXG4gIH0sIGRldmljZSAhPT0gJ2Rlc2t0b3AnID8ge1xuICAgICdkYXRhLWRpc2FibGVkLWxhc3QnOiAnJ1xuICB9IDoge30pLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoTnVtYmVyT3B0aW9uLCB7XG4gICAgb3B0aW9uOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbiksIHt9LCB7XG4gICAgICBhdHRyOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbi5hdHRyIHx8IHt9KSwge30sIHtcbiAgICAgICAgJ2RhdGEtd2lkdGgnOiAnZnVsbCdcbiAgICAgIH0pXG4gICAgfSksXG4gICAgdmFsdWU6ICFjb2x1bW5zX2lkICYmIGRldmljZSA9PT0gJ2Rlc2t0b3AnID8gd29vY29tbWVyY2VfY2F0YWxvZ19jb2x1bW5zIDogdmFsdWUsXG4gICAgb25DaGFuZ2U6IHZhbCA9PiB7XG4gICAgICBkZXZpY2UgPT09ICdkZXNrdG9wJyAmJiAhY29sdW1uc19pZCA/IG9uQ2hhbmdlRm9yKCd3b29jb21tZXJjZV9jYXRhbG9nX2NvbHVtbnMnLCB2YWwpIDogb25DaGFuZ2UodmFsKTtcbiAgICB9XG4gIH0pLCBjcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LW9wdGlvbi1kZXNjcmlwdGlvblwiXG4gIH0sIF9fKCdOdW1iZXIgb2YgY29sdW1ucycsICdibGMnKSkpLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoTnVtYmVyT3B0aW9uLCB7XG4gICAgb3B0aW9uOiB7XG4gICAgICBtaW46IDEsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIHJlc3BvbnNpdmU6IGZhbHNlLFxuICAgICAgdmFsdWU6IDQsXG4gICAgICBhdHRyOiB7XG4gICAgICAgICdkYXRhLXdpZHRoJzogJ2Z1bGwnXG4gICAgICB9XG4gICAgfSxcbiAgICB2YWx1ZTogZGV2aWNlID09PSAnZGVza3RvcCcgPyByb3dzVmFsdWUgOiAnYXV0bycsXG4gICAgb25DaGFuZ2U6IHZhbCA9PiB7XG4gICAgICBkZXZpY2UgPT09ICdkZXNrdG9wJyAmJiBvbkNoYW5nZUZvcihyb3dzX2lkIHx8ICd3b29jb21tZXJjZV9jYXRhbG9nX3Jvd3MnLCB2YWwpO1xuXG4gICAgICBpZiAod3AuY3VzdG9taXplICYmIHdwLmN1c3RvbWl6ZS5wcmV2aWV3ZXIpIHtcbiAgICAgICAgd3AuY3VzdG9taXplLnByZXZpZXdlci5zZW5kKCdjdDpzeW5jOnJlZnJlc2hfcGFydGlhbCcsIHtcbiAgICAgICAgICBpZDogcm93c19pZCB8fCAnd29vY29tbWVyY2VfY2F0YWxvZ19yb3dzJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLCBjcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImN0LW9wdGlvbi1kZXNjcmlwdGlvblwiXG4gIH0sIF9fKCdOdW1iZXIgb2Ygcm93cycsICdibGMnKSkpKTtcbn07XG5cbldvb0NvbHVtbnNBbmRSb3dzLnJlbmRlcmluZ0NvbmZpZyA9IHtcbiAgZ2V0VmFsdWVGb3JSZXZlcnQ6IF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAgdmFsdWUsXG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgd29vY29tbWVyY2VfY2F0YWxvZ19jb2x1bW5zLFxuICAgICAgICB3b29jb21tZXJjZV9jYXRhbG9nX3Jvd3NcbiAgICAgIH0sXG4gICAgICBvcHRpb24sXG4gICAgICBvcHRpb246IHtcbiAgICAgICAgY29sdW1uc19pZCxcbiAgICAgICAgcm93c19pZFxuICAgICAgfSxcbiAgICAgIHZhbHVlcyxcbiAgICAgIGRldmljZVxuICAgIH0gPSBfcmVmMjtcbiAgICBjb25zdCByb3dzVmFsdWUgPSByb3dzX2lkID8gdmFsdWVzW3Jvd3NfaWRdIDogd29vY29tbWVyY2VfY2F0YWxvZ19yb3dzO1xuXG4gICAgbGV0IG15UmVzdWx0ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2YWx1ZSksIHt9LCB7XG4gICAgICBkZXNrdG9wOiB3b29jb21tZXJjZV9jYXRhbG9nX2NvbHVtbnMsXG4gICAgICB3b29jb21tZXJjZV9jYXRhbG9nX2NvbHVtbnMsXG4gICAgICB3b29jb21tZXJjZV9jYXRhbG9nX3Jvd3NcbiAgICB9KTtcblxuICAgIHJldHVybiBteVJlc3VsdDtcbiAgfSxcbiAgY29tcHV0ZU9wdGlvblZhbHVlOiB2ID0+IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdiksIHt9LCB7XG4gICAgd29vY29tbWVyY2VfY2F0YWxvZ19jb2x1bW5zOiA0LFxuICAgIHdvb2NvbW1lcmNlX2NhdGFsb2dfcm93czogNFxuICB9KSxcbiAgY29tcHV0ZU9wdGlvblZhbHVlOiB2ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHYpLCB7fSwge1xuICAgICAgd29vY29tbWVyY2VfY2F0YWxvZ19jb2x1bW5zOiA0LFxuICAgICAgd29vY29tbWVyY2VfY2F0YWxvZ19yb3dzOiA0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICBwZXJmb3JtUmV2ZXJ0OiBfcmVmMyA9PiB7XG4gICAgbGV0IHtcbiAgICAgIG9uQ2hhbmdlRm9yXG4gICAgfSA9IF9yZWYzO1xuICAgIG9uQ2hhbmdlRm9yKCd3b29jb21tZXJjZV9jYXRhbG9nX2NvbHVtbnMnLCA0KTtcbiAgICBvbkNoYW5nZUZvcignd29vY29tbWVyY2VfY2F0YWxvZ19yb3dzJywgNCk7XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBXb29Db2x1bW5zQW5kUm93czsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6223\n")},6761:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5652);\n/* harmony import */ var ct_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ct_i18n__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _ct_ratio__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9735);\nconst _excluded = [\"value\", \"onChange\", \"onChangeFor\", \"values\", \"values\", \"option\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\nconst WooCommerceRatio = _ref => {\n let {\n value,\n onChange,\n onChangeFor,\n values,\n values: {\n woocommerce_thumbnail_cropping_custom_width,\n woocommerce_thumbnail_cropping_custom_height\n },\n option\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_ct_ratio__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _extends({\n onChange: val => {\n let isCustom = val.indexOf('/') === -1;\n let [width, height] = val.split(isCustom ? ':' : '/');\n\n if (val === 'original') {\n onChangeFor('woocommerce_thumbnail_cropping', 'uncropped');\n onChange('uncropped');\n return;\n }\n\n onChange(isCustom ? 'custom' : 'predefined');\n onChangeFor('woocommerce_thumbnail_cropping', 'custom');\n onChangeFor('woocommerce_thumbnail_cropping_custom_height', parseFloat(height || '0') || 0);\n onChangeFor('woocommerce_thumbnail_cropping_custom_width', parseFloat(width || '0') || 0);\n },\n value: value === 'uncropped' ? 'original' : value === '1:1' ? `1/1` : `${woocommerce_thumbnail_cropping_custom_width}${value === 'custom' ? ':' : '/'}${woocommerce_thumbnail_cropping_custom_height}`,\n option: _objectSpread(_objectSpread({}, option), {}, {\n value: '1/1'\n }),\n onChangeFor: onChangeFor,\n values: values\n }, props));\n};\n\nWooCommerceRatio.ControlEnd = () => (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", {\n className: \"ct-color-modal-wrapper\",\n onMouseDown: e => e.stopPropagation(),\n onMouseUp: e => e.stopPropagation()\n});\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WooCommerceRatio);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc2MS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvY3Qtd29vY29tbWVyY2UtcmF0aW8uanM/NWE3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBfZXhjbHVkZWQgPSBbXCJ2YWx1ZVwiLCBcIm9uQ2hhbmdlXCIsIFwib25DaGFuZ2VGb3JcIiwgXCJ2YWx1ZXNcIiwgXCJ2YWx1ZXNcIiwgXCJvcHRpb25cIl07XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIHVzZVN0YXRlIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBfXywgc3ByaW50ZiB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IFJhdGlvIGZyb20gJy4vY3QtcmF0aW8nO1xuXG5jb25zdCBXb29Db21tZXJjZVJhdGlvID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gICAgb25DaGFuZ2VGb3IsXG4gICAgdmFsdWVzLFxuICAgIHZhbHVlczoge1xuICAgICAgd29vY29tbWVyY2VfdGh1bWJuYWlsX2Nyb3BwaW5nX2N1c3RvbV93aWR0aCxcbiAgICAgIHdvb2NvbW1lcmNlX3RodW1ibmFpbF9jcm9wcGluZ19jdXN0b21faGVpZ2h0XG4gICAgfSxcbiAgICBvcHRpb25cbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFJhdGlvLCBfZXh0ZW5kcyh7XG4gICAgb25DaGFuZ2U6IHZhbCA9PiB7XG4gICAgICBsZXQgaXNDdXN0b20gPSB2YWwuaW5kZXhPZignLycpID09PSAtMTtcbiAgICAgIGxldCBbd2lkdGgsIGhlaWdodF0gPSB2YWwuc3BsaXQoaXNDdXN0b20gPyAnOicgOiAnLycpO1xuXG4gICAgICBpZiAodmFsID09PSAnb3JpZ2luYWwnKSB7XG4gICAgICAgIG9uQ2hhbmdlRm9yKCd3b29jb21tZXJjZV90aHVtYm5haWxfY3JvcHBpbmcnLCAndW5jcm9wcGVkJyk7XG4gICAgICAgIG9uQ2hhbmdlKCd1bmNyb3BwZWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBvbkNoYW5nZShpc0N1c3RvbSA/ICdjdXN0b20nIDogJ3ByZWRlZmluZWQnKTtcbiAgICAgIG9uQ2hhbmdlRm9yKCd3b29jb21tZXJjZV90aHVtYm5haWxfY3JvcHBpbmcnLCAnY3VzdG9tJyk7XG4gICAgICBvbkNoYW5nZUZvcignd29vY29tbWVyY2VfdGh1bWJuYWlsX2Nyb3BwaW5nX2N1c3RvbV9oZWlnaHQnLCBwYXJzZUZsb2F0KGhlaWdodCB8fCAnMCcpIHx8IDApO1xuICAgICAgb25DaGFuZ2VGb3IoJ3dvb2NvbW1lcmNlX3RodW1ibmFpbF9jcm9wcGluZ19jdXN0b21fd2lkdGgnLCBwYXJzZUZsb2F0KHdpZHRoIHx8ICcwJykgfHwgMCk7XG4gICAgfSxcbiAgICB2YWx1ZTogdmFsdWUgPT09ICd1bmNyb3BwZWQnID8gJ29yaWdpbmFsJyA6IHZhbHVlID09PSAnMToxJyA/IGAxLzFgIDogYCR7d29vY29tbWVyY2VfdGh1bWJuYWlsX2Nyb3BwaW5nX2N1c3RvbV93aWR0aH0ke3ZhbHVlID09PSAnY3VzdG9tJyA/ICc6JyA6ICcvJ30ke3dvb2NvbW1lcmNlX3RodW1ibmFpbF9jcm9wcGluZ19jdXN0b21faGVpZ2h0fWAsXG4gICAgb3B0aW9uOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbiksIHt9LCB7XG4gICAgICB2YWx1ZTogJzEvMSdcbiAgICB9KSxcbiAgICBvbkNoYW5nZUZvcjogb25DaGFuZ2VGb3IsXG4gICAgdmFsdWVzOiB2YWx1ZXNcbiAgfSwgcHJvcHMpKTtcbn07XG5cbldvb0NvbW1lcmNlUmF0aW8uQ29udHJvbEVuZCA9ICgpID0+IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICBjbGFzc05hbWU6IFwiY3QtY29sb3ItbW9kYWwtd3JhcHBlclwiLFxuICBvbk1vdXNlRG93bjogZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpLFxuICBvbk1vdXNlVXA6IGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFdvb0NvbW1lcmNlUmF0aW87Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6761\n")},7946:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "default": () => (/* binding */ date_time_picker)\n});\n\n// EXTERNAL MODULE: external "window.wp.element"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: external "window.wp.components"\nvar external_window_wp_components_ = __webpack_require__(8441);\n;// CONCATENATED MODULE: external "window.wp.date"\nconst external_window_wp_date_namespaceObject = window.wp.date;\n;// CONCATENATED MODULE: ./static/js/options/options/date-time-picker.js\n\n\n\n\nconst LocalDateTimePicker = _ref => {\n let {\n value,\n option,\n onChange\n } = _ref;\n\n const settings = (0,external_window_wp_date_namespaceObject.__experimentalGetSettings)();\n\n const is12HourTime = /a(?!\\\\)/i.test(settings.formats.time.toLowerCase() // Test only the lower case a\n .replace(/\\\\\\\\/g, \'\') // Replace "//" with empty strings\n .split(\'\').reverse().join(\'\') // Reverse the string and test for "a" not followed by a slash\n );\n return (0,external_window_wp_element_.createElement)("div", {\n className: "ct-date-time-picker"\n }, (0,external_window_wp_element_.createElement)(external_window_wp_components_.DateTimePicker, {\n currentDate: value ? value : new Date(),\n onChange: date => {\n onChange(date);\n },\n is12Hour: is12HourTime\n }));\n};\n/*\n\t
\n\t\t onChange(value)}\n\t\t/>\n\t
\n)\n*/\n\n\n/* harmony default export */ const date_time_picker = (LocalDateTimePicker);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzk0Ni5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvZXh0ZXJuYWwgdmFyIFwid2luZG93LndwLmRhdGVcIj9iOTVlIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9kYXRlLXRpbWUtcGlja2VyLmpzP2Q3MTIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHdpbmRvdy53cC5kYXRlOyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBEYXRlVGltZVBpY2tlciB9IGZyb20gJ0B3b3JkcHJlc3MvY29tcG9uZW50cyc7XG5pbXBvcnQgeyBfX2V4cGVyaW1lbnRhbEdldFNldHRpbmdzIH0gZnJvbSAnQHdvcmRwcmVzcy9kYXRlJztcblxuY29uc3QgTG9jYWxEYXRlVGltZVBpY2tlciA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIHZhbHVlLFxuICAgIG9wdGlvbixcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjtcblxuICBjb25zdCBzZXR0aW5ncyA9IF9fZXhwZXJpbWVudGFsR2V0U2V0dGluZ3MoKTtcblxuICBjb25zdCBpczEySG91clRpbWUgPSAvYSg/IVxcXFwpL2kudGVzdChzZXR0aW5ncy5mb3JtYXRzLnRpbWUudG9Mb3dlckNhc2UoKSAvLyBUZXN0IG9ubHkgdGhlIGxvd2VyIGNhc2UgYVxuICAucmVwbGFjZSgvXFxcXFxcXFwvZywgJycpIC8vIFJlcGxhY2UgXCIvL1wiIHdpdGggZW1wdHkgc3RyaW5nc1xuICAuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSAvLyBSZXZlcnNlIHRoZSBzdHJpbmcgYW5kIHRlc3QgZm9yIFwiYVwiIG5vdCBmb2xsb3dlZCBieSBhIHNsYXNoXG4gICk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3QtZGF0ZS10aW1lLXBpY2tlclwiXG4gIH0sIGNyZWF0ZUVsZW1lbnQoRGF0ZVRpbWVQaWNrZXIsIHtcbiAgICBjdXJyZW50RGF0ZTogdmFsdWUgPyB2YWx1ZSA6IG5ldyBEYXRlKCksXG4gICAgb25DaGFuZ2U6IGRhdGUgPT4ge1xuICAgICAgb25DaGFuZ2UoZGF0ZSk7XG4gICAgfSxcbiAgICBpczEySG91cjogaXMxMkhvdXJUaW1lXG4gIH0pKTtcbn07XG4vKlxuXHQ8ZGl2IGNsYXNzTmFtZT1cImN0LW9wdGlvbi1pbnB1dFwiPlxuXHRcdDxpbnB1dFxuXHRcdFx0dHlwZT1cInRleHRcIlxuXHRcdFx0dmFsdWU9e3ZhbHVlfVxuXHRcdFx0ey4uLntcblx0XHRcdFx0Li4uKG9wdGlvbi5maWVsZF9hdHRyID8gb3B0aW9uLmZpZWxkX2F0dHIgOiB7fSksXG5cdFx0XHRcdC4uLihvcHRpb24uYXR0ciAmJiBvcHRpb24uYXR0ci5wbGFjZWhvbGRlclxuXHRcdFx0XHRcdD8ge1xuXHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlcjogb3B0aW9uLmF0dHIucGxhY2Vob2xkZXIsXG5cdFx0XHRcdFx0ICB9XG5cdFx0XHRcdFx0OiB7fSksXG5cdFx0XHR9fVxuXHRcdFx0b25DaGFuZ2U9eyh7IHRhcmdldDogeyB2YWx1ZSB9IH0pID0+IG9uQ2hhbmdlKHZhbHVlKX1cblx0XHQvPlxuXHQ8L2Rpdj5cbilcbiovXG5cblxuZXhwb3J0IGRlZmF1bHQgTG9jYWxEYXRlVGltZVBpY2tlcjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7946\n')},6897:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n\n\nconst Hidden = _ref => {\n let {\n option: {\n text = '',\n attr = {}\n }\n } = _ref;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n};\n\nHidden.renderingConfig = {\n design: 'none'\n};\n\nHidden.MetaWrapper = () => null;\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Hidden);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjg5Ny5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9oaWRkZW4uanM/NDFkOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGcmFnbWVudCwgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcblxuY29uc3QgSGlkZGVuID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgb3B0aW9uOiB7XG4gICAgICB0ZXh0ID0gJycsXG4gICAgICBhdHRyID0ge31cbiAgICB9XG4gIH0gPSBfcmVmO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCk7XG59O1xuXG5IaWRkZW4ucmVuZGVyaW5nQ29uZmlnID0ge1xuICBkZXNpZ246ICdub25lJ1xufTtcblxuSGlkZGVuLk1ldGFXcmFwcGVyID0gKCkgPT4gbnVsbDtcblxuZXhwb3J0IGRlZmF1bHQgSGlkZGVuOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6897\n")},6904:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n\n\nconst HTML = props => {\n const {\n option\n } = props;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n dangerouslySetInnerHTML: {\n __html: option.html || \'\'\n }\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (HTML);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkwNC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2h0bWwuanM/ZDliOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQsIEZyYWdtZW50LCBtZW1vLCB1c2VNZW1vIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcblxuY29uc3QgSFRNTCA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIG9wdGlvblxuICB9ID0gcHJvcHM7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgX19odG1sOiBvcHRpb24uaHRtbCB8fCAnJ1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBIVE1MOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6904\n')},5491:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n\n\nconst Jsx = props => {\n const {\n option\n } = props;\n\n if (option.render) {\n return option.render(props);\n }\n\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Jsx);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ5MS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvanN4LmpzP2Y0MzciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCBGcmFnbWVudCwgbWVtbywgdXNlTWVtbyB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5cbmNvbnN0IEpzeCA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIG9wdGlvblxuICB9ID0gcHJvcHM7XG5cbiAgaWYgKG9wdGlvbi5yZW5kZXIpIHtcbiAgICByZXR1cm4gb3B0aW9uLnJlbmRlcihwcm9wcyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEpzeDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5491\n')},8204:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ OutsideClickHandler)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4184);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nconst DISPLAY = {\n BLOCK: 'block',\n FLEX: 'flex',\n INLINE_BLOCK: 'inline-block'\n};\nconst defaultProps = {\n disabled: false,\n // `useCapture` is set to true by default so that a `stopPropagation` in the\n // children will not prevent all outside click handlers from firing - maja\n useCapture: true,\n display: DISPLAY.BLOCK\n};\n\nconst updateRef = (ref, instance) => {\n if (typeof ref === 'function') {\n ref(instance);\n } else {\n ref.current = instance;\n }\n};\n\nclass OutsideClickHandler extends _wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Component {\n constructor() {\n super(...arguments);\n\n _defineProperty(this, \"childNode\", (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createRef)());\n\n _defineProperty(this, \"checkIsInside\", event => {\n const result = [this.childNode, ...(this.props.additionalRefs || [])].reduce((isInside, currentRef) => {\n if (isInside) {\n return isInside;\n }\n\n if (!currentRef || !currentRef.current) {\n return isInside;\n }\n\n return currentRef.current.contains(event.target);\n }, false);\n return result;\n });\n\n _defineProperty(this, \"onMouseDown\", e => {\n const {\n useCapture\n } = this.props;\n\n if (!this.checkIsInside(e)) {\n if (this.removeMouseUp) {\n this.removeMouseUp();\n this.removeMouseUp = null;\n }\n\n document.addEventListener('mouseup', this.onMouseUp, useCapture);\n\n this.removeMouseUp = () => {\n document.removeEventListener('mouseup', this.onMouseUp, useCapture);\n };\n }\n });\n\n _defineProperty(this, \"onMouseUp\", e => {\n const {\n onOutsideClick\n } = this.props;\n\n if (this.removeMouseUp) {\n this.removeMouseUp();\n this.removeMouseUp = null;\n }\n\n if (!this.checkIsInside(e)) {\n onOutsideClick(e);\n }\n });\n\n _defineProperty(this, \"setChildNodeRef\", ref => {\n if (this.props.wrapperProps && this.props.wrapperProps.ref) {\n updateRef(this.props.wrapperProps.ref, ref);\n }\n\n updateRef(this.childNode, ref);\n });\n }\n\n componentDidMount() {\n const {\n disabled,\n useCapture\n } = this.props;\n if (!disabled) this.addMouseDownEventListener(useCapture);\n }\n\n UNSAFE_componentWillReceiveProps(_ref) {\n let {\n disabled,\n useCapture\n } = _ref;\n const {\n disabled: prevDisabled\n } = this.props;\n\n if (prevDisabled !== disabled) {\n if (disabled) {\n this.removeEventListeners();\n } else {\n this.addMouseDownEventListener(useCapture);\n }\n }\n }\n\n componentWillUnmount() {\n this.removeEventListeners();\n } // Use mousedown/mouseup to enforce that clicks remain outside the root's\n // descendant tree, even when dragged. This should also get triggered on\n // touch devices.\n\n\n addMouseDownEventListener(useCapture) {\n document.addEventListener('mousedown', this.onMouseDown, useCapture);\n\n this.removeMouseDown = () => {\n document.removeEventListener('mousedown', this.onMouseDown, useCapture);\n };\n }\n\n removeEventListeners() {\n if (this.removeMouseDown) this.removeMouseDown();\n if (this.removeMouseUp) this.removeMouseUp();\n }\n\n render() {\n const {\n children,\n display,\n className,\n wrapperProps\n } = this.props;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(className)\n }, wrapperProps || {}, {\n ref: this.setChildNodeRef\n }), children);\n }\n\n}\nOutsideClickHandler.defaultProps = defaultProps;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIwNC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9yZWFjdC1vdXRzaWRlLWNsaWNrLWhhbmRsZXIuanM/YzNkZiJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgQ29tcG9uZW50LCBGcmFnbWVudCwgY3JlYXRlUmVmIH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5jb25zdCBESVNQTEFZID0ge1xuICBCTE9DSzogJ2Jsb2NrJyxcbiAgRkxFWDogJ2ZsZXgnLFxuICBJTkxJTkVfQkxPQ0s6ICdpbmxpbmUtYmxvY2snXG59O1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBkaXNhYmxlZDogZmFsc2UsXG4gIC8vIGB1c2VDYXB0dXJlYCBpcyBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0IHNvIHRoYXQgYSBgc3RvcFByb3BhZ2F0aW9uYCBpbiB0aGVcbiAgLy8gY2hpbGRyZW4gd2lsbCBub3QgcHJldmVudCBhbGwgb3V0c2lkZSBjbGljayBoYW5kbGVycyBmcm9tIGZpcmluZyAtIG1hamFcbiAgdXNlQ2FwdHVyZTogdHJ1ZSxcbiAgZGlzcGxheTogRElTUExBWS5CTE9DS1xufTtcblxuY29uc3QgdXBkYXRlUmVmID0gKHJlZiwgaW5zdGFuY2UpID0+IHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZWYoaW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIHJlZi5jdXJyZW50ID0gaW5zdGFuY2U7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE91dHNpZGVDbGlja0hhbmRsZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiY2hpbGROb2RlXCIsIGNyZWF0ZVJlZigpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNoZWNrSXNJbnNpZGVcIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gW3RoaXMuY2hpbGROb2RlLCAuLi4odGhpcy5wcm9wcy5hZGRpdGlvbmFsUmVmcyB8fCBbXSldLnJlZHVjZSgoaXNJbnNpZGUsIGN1cnJlbnRSZWYpID0+IHtcbiAgICAgICAgaWYgKGlzSW5zaWRlKSB7XG4gICAgICAgICAgcmV0dXJuIGlzSW5zaWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjdXJyZW50UmVmIHx8ICFjdXJyZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICByZXR1cm4gaXNJbnNpZGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudFJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgICB9LCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25Nb3VzZURvd25cIiwgZSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZUNhcHR1cmVcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBpZiAoIXRoaXMuY2hlY2tJc0luc2lkZShlKSkge1xuICAgICAgICBpZiAodGhpcy5yZW1vdmVNb3VzZVVwKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVNb3VzZVVwKCk7XG4gICAgICAgICAgdGhpcy5yZW1vdmVNb3VzZVVwID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCwgdXNlQ2FwdHVyZSk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCwgdXNlQ2FwdHVyZSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbk1vdXNlVXBcIiwgZSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG9uT3V0c2lkZUNsaWNrXG4gICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHRoaXMucmVtb3ZlTW91c2VVcCkge1xuICAgICAgICB0aGlzLnJlbW92ZU1vdXNlVXAoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVNb3VzZVVwID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmNoZWNrSXNJbnNpZGUoZSkpIHtcbiAgICAgICAgb25PdXRzaWRlQ2xpY2soZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRDaGlsZE5vZGVSZWZcIiwgcmVmID0+IHtcbiAgICAgIGlmICh0aGlzLnByb3BzLndyYXBwZXJQcm9wcyAmJiB0aGlzLnByb3BzLndyYXBwZXJQcm9wcy5yZWYpIHtcbiAgICAgICAgdXBkYXRlUmVmKHRoaXMucHJvcHMud3JhcHBlclByb3BzLnJlZiwgcmVmKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlUmVmKHRoaXMuY2hpbGROb2RlLCByZWYpO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGlzYWJsZWQsXG4gICAgICB1c2VDYXB0dXJlXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFkaXNhYmxlZCkgdGhpcy5hZGRNb3VzZURvd25FdmVudExpc3RlbmVyKHVzZUNhcHR1cmUpO1xuICB9XG5cbiAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIHVzZUNhcHR1cmVcbiAgICB9ID0gX3JlZjtcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlZDogcHJldkRpc2FibGVkXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAocHJldkRpc2FibGVkICE9PSBkaXNhYmxlZCkge1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkTW91c2VEb3duRXZlbnRMaXN0ZW5lcih1c2VDYXB0dXJlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gIH0gLy8gVXNlIG1vdXNlZG93bi9tb3VzZXVwIHRvIGVuZm9yY2UgdGhhdCBjbGlja3MgcmVtYWluIG91dHNpZGUgdGhlIHJvb3Qnc1xuICAvLyBkZXNjZW5kYW50IHRyZWUsIGV2ZW4gd2hlbiBkcmFnZ2VkLiBUaGlzIHNob3VsZCBhbHNvIGdldCB0cmlnZ2VyZWQgb25cbiAgLy8gdG91Y2ggZGV2aWNlcy5cblxuXG4gIGFkZE1vdXNlRG93bkV2ZW50TGlzdGVuZXIodXNlQ2FwdHVyZSkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd24sIHVzZUNhcHR1cmUpO1xuXG4gICAgdGhpcy5yZW1vdmVNb3VzZURvd24gPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duLCB1c2VDYXB0dXJlKTtcbiAgICB9O1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMucmVtb3ZlTW91c2VEb3duKSB0aGlzLnJlbW92ZU1vdXNlRG93bigpO1xuICAgIGlmICh0aGlzLnJlbW92ZU1vdXNlVXApIHRoaXMucmVtb3ZlTW91c2VVcCgpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZGlzcGxheSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHdyYXBwZXJQcm9wc1xuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xzKGNsYXNzTmFtZSlcbiAgICB9LCB3cmFwcGVyUHJvcHMgfHwge30sIHtcbiAgICAgIHJlZjogdGhpcy5zZXRDaGlsZE5vZGVSZWZcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9XG5cbn1cbk91dHNpZGVDbGlja0hhbmRsZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8204\n")},977:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nconst Text = _ref => {\n let {\n value,\n option,\n onChange\n } = _ref;\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {\n className: "ct-option-input"\n }, (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("input", _extends({\n type: "text",\n value: value\n }, _objectSpread(_objectSpread({}, option.field_attr ? option.field_attr : {}), option.attr && option.attr.placeholder ? {\n placeholder: option.attr.placeholder\n } : {}), {\n onChange: _ref2 => {\n let {\n target: {\n value\n }\n } = _ref2;\n return onChange(value);\n }\n }, option.select_on_focus ? {\n onFocus: _ref3 => {\n let {\n target\n } = _ref3;\n return target.select();\n }\n } : {})));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Text);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTc3LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL3RleHQuanM/Y2Q4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5cbmNvbnN0IFRleHQgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICB2YWx1ZSxcbiAgICBvcHRpb24sXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtb3B0aW9uLWlucHV0XCJcbiAgfSwgY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9leHRlbmRzKHtcbiAgICB0eXBlOiBcInRleHRcIixcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb24uZmllbGRfYXR0ciA/IG9wdGlvbi5maWVsZF9hdHRyIDoge30pLCBvcHRpb24uYXR0ciAmJiBvcHRpb24uYXR0ci5wbGFjZWhvbGRlciA/IHtcbiAgICBwbGFjZWhvbGRlcjogb3B0aW9uLmF0dHIucGxhY2Vob2xkZXJcbiAgfSA6IHt9KSwge1xuICAgIG9uQ2hhbmdlOiBfcmVmMiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9ID0gX3JlZjI7XG4gICAgICByZXR1cm4gb25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfSwgb3B0aW9uLnNlbGVjdF9vbl9mb2N1cyA/IHtcbiAgICBvbkZvY3VzOiBfcmVmMyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB0YXJnZXRcbiAgICAgIH0gPSBfcmVmMztcbiAgICAgIHJldHVybiB0YXJnZXQuc2VsZWN0KCk7XG4gICAgfVxuICB9IDoge30pKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUZXh0OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///977\n')},1323:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\nconst _excluded = ["placeholder"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\nconst TextArea = _ref => {\n let {\n value,\n option,\n onChange\n } = _ref;\n\n let _ref2 = _objectSpread({}, option.attr || {}),\n {\n placeholder\n } = _ref2,\n attr = _objectWithoutProperties(_ref2, _excluded);\n\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", _extends({\n className: "ct-option-textarea"\n }, attr), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)("textarea", _extends({\n value: value\n }, _objectSpread(_objectSpread({}, option.field_attr ? option.field_attr : {}), placeholder ? {\n placeholder\n } : {}), {\n onChange: _ref3 => {\n let {\n target: {\n value\n }\n } = _ref3;\n return onChange(value);\n }\n })));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TextArea);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMyMy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvdGV4dGFyZWEuanM/Y2NhZCJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBfZXhjbHVkZWQgPSBbXCJwbGFjZWhvbGRlclwiXTtcblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIENvbXBvbmVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5cbmNvbnN0IFRleHRBcmVhID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgb3B0aW9uLFxuICAgIG9uQ2hhbmdlXG4gIH0gPSBfcmVmO1xuXG4gIGxldCBfcmVmMiA9IF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbi5hdHRyIHx8IHt9KSxcbiAgICAgIHtcbiAgICBwbGFjZWhvbGRlclxuICB9ID0gX3JlZjIsXG4gICAgICBhdHRyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IFwiY3Qtb3B0aW9uLXRleHRhcmVhXCJcbiAgfSwgYXR0ciksIGNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCBfZXh0ZW5kcyh7XG4gICAgdmFsdWU6IHZhbHVlXG4gIH0sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9uLmZpZWxkX2F0dHIgPyBvcHRpb24uZmllbGRfYXR0ciA6IHt9KSwgcGxhY2Vob2xkZXIgPyB7XG4gICAgcGxhY2Vob2xkZXJcbiAgfSA6IHt9KSwge1xuICAgIG9uQ2hhbmdlOiBfcmVmMyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9ID0gX3JlZjM7XG4gICAgICByZXR1cm4gb25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRBcmVhOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1323\n')},9313:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1381);\n/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var md5__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2568);\n/* harmony import */ var md5__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(md5__WEBPACK_IMPORTED_MODULE_1__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nconst TextArea = _ref => {\n let {\n id,\n value,\n option,\n onChange\n } = _ref;\n const el = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const editor = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const [editorId, _] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useState)(`${id}-${md5__WEBPACK_IMPORTED_MODULE_1___default()(Math.random() + '-' + Math.random() + '-' + Math.random())}`);\n\n const correctEditor = () => wp.oldEditor || wp.editor;\n\n const listener = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => onChange(correctEditor().getContent(editorId)), [editorId]);\n (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n correctEditor().initialize(editorId, _objectSpread(_objectSpread({\n quicktags: true,\n mediaButtons: true\n }, option), {}, {\n tinymce: _objectSpread(_objectSpread({\n toolbar1: 'formatselect,styleselect,bold,italic,bullist,numlist,link,alignleft,aligncenter,alignright,wp_adv',\n toolbar2: 'strikethrough,hr,forecolor,pastetext,removeformat,charmap,outdent,indent,undo,redo,wp_help'\n }, typeof option.tinymce === 'object' ? option.tinymce : {}), {}, {\n style_formats_merge: true,\n style_formats: []\n })\n }));\n setTimeout(() => window.tinymce.editors[editorId] && window.tinymce.editors[editorId].on('change', listener));\n\n if (wp.oldEditor) {\n setTimeout(() => {\n setTimeout(() => {\n window.tinymce.editors[editorId].off('change', listener);\n correctEditor().remove(editorId);\n correctEditor().initialize(editorId, _objectSpread(_objectSpread({\n quicktags: true,\n mediaButtons: true\n }, option), {}, {\n tinymce: _objectSpread(_objectSpread({\n toolbar1: 'formatselect,styleselect,bold,italic,bullist,numlist,link,alignleft,aligncenter,alignright,wp_adv',\n toolbar2: 'strikethrough,hr,forecolor,pastetext,removeformat,charmap,outdent,indent,undo,redo,wp_help'\n }, typeof option.tinymce === 'object' ? option.tinymce : {}), {}, {\n style_formats_merge: true,\n style_formats: []\n })\n }));\n setTimeout(() => window.tinymce.editors[editorId] && window.tinymce.editors[editorId].on('change', listener));\n }, 300);\n }, 1000);\n }\n\n return () => {\n if (!window.tinymce.editors[editorId]) return;\n setTimeout(() => {\n window.tinymce.editors[editorId].off('change', listener);\n correctEditor().remove(editorId);\n }, 300);\n };\n }, []);\n return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"div\", _extends({\n className: \"ct-option-editor\"\n }, option.attr || {}), (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"textarea\", _extends({\n style: {\n opacity: 0\n },\n id: editorId,\n ref: el,\n value: value,\n className: \"wp-editor-area\"\n }, _objectSpread(_objectSpread({}, option.field_attr ? option.field_attr : {}), option.attr && option.attr.placeholder ? {\n placeholder: option.attr.placeholder\n } : {}), {\n onChange: _ref2 => {\n let {\n target: {\n value\n }\n } = _ref2;\n return onChange(value);\n }\n })));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TextArea);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMxMy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvd3AtZWRpdG9yLmpzP2Q0Y2YiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2sgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IG1kNSBmcm9tICdtZDUnO1xuXG5jb25zdCBUZXh0QXJlYSA9IF9yZWYgPT4ge1xuICBsZXQge1xuICAgIGlkLFxuICAgIHZhbHVlLFxuICAgIG9wdGlvbixcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjtcbiAgY29uc3QgZWwgPSB1c2VSZWYoKTtcbiAgY29uc3QgZWRpdG9yID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBbZWRpdG9ySWQsIF9dID0gdXNlU3RhdGUoYCR7aWR9LSR7bWQ1KE1hdGgucmFuZG9tKCkgKyAnLScgKyBNYXRoLnJhbmRvbSgpICsgJy0nICsgTWF0aC5yYW5kb20oKSl9YCk7XG5cbiAgY29uc3QgY29ycmVjdEVkaXRvciA9ICgpID0+IHdwLm9sZEVkaXRvciB8fCB3cC5lZGl0b3I7XG5cbiAgY29uc3QgbGlzdGVuZXIgPSB1c2VDYWxsYmFjaygoKSA9PiBvbkNoYW5nZShjb3JyZWN0RWRpdG9yKCkuZ2V0Q29udGVudChlZGl0b3JJZCkpLCBbZWRpdG9ySWRdKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb3JyZWN0RWRpdG9yKCkuaW5pdGlhbGl6ZShlZGl0b3JJZCwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHF1aWNrdGFnczogdHJ1ZSxcbiAgICAgIG1lZGlhQnV0dG9uczogdHJ1ZVxuICAgIH0sIG9wdGlvbiksIHt9LCB7XG4gICAgICB0aW55bWNlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICB0b29sYmFyMTogJ2Zvcm1hdHNlbGVjdCxzdHlsZXNlbGVjdCxib2xkLGl0YWxpYyxidWxsaXN0LG51bWxpc3QsbGluayxhbGlnbmxlZnQsYWxpZ25jZW50ZXIsYWxpZ25yaWdodCx3cF9hZHYnLFxuICAgICAgICB0b29sYmFyMjogJ3N0cmlrZXRocm91Z2gsaHIsZm9yZWNvbG9yLHBhc3RldGV4dCxyZW1vdmVmb3JtYXQsY2hhcm1hcCxvdXRkZW50LGluZGVudCx1bmRvLHJlZG8sd3BfaGVscCdcbiAgICAgIH0sIHR5cGVvZiBvcHRpb24udGlueW1jZSA9PT0gJ29iamVjdCcgPyBvcHRpb24udGlueW1jZSA6IHt9KSwge30sIHtcbiAgICAgICAgc3R5bGVfZm9ybWF0c19tZXJnZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVfZm9ybWF0czogW11cbiAgICAgIH0pXG4gICAgfSkpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gd2luZG93LnRpbnltY2UuZWRpdG9yc1tlZGl0b3JJZF0gJiYgd2luZG93LnRpbnltY2UuZWRpdG9yc1tlZGl0b3JJZF0ub24oJ2NoYW5nZScsIGxpc3RlbmVyKSk7XG5cbiAgICBpZiAod3Aub2xkRWRpdG9yKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgd2luZG93LnRpbnltY2UuZWRpdG9yc1tlZGl0b3JJZF0ub2ZmKCdjaGFuZ2UnLCBsaXN0ZW5lcik7XG4gICAgICAgICAgY29ycmVjdEVkaXRvcigpLnJlbW92ZShlZGl0b3JJZCk7XG4gICAgICAgICAgY29ycmVjdEVkaXRvcigpLmluaXRpYWxpemUoZWRpdG9ySWQsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgICBxdWlja3RhZ3M6IHRydWUsXG4gICAgICAgICAgICBtZWRpYUJ1dHRvbnM6IHRydWVcbiAgICAgICAgICB9LCBvcHRpb24pLCB7fSwge1xuICAgICAgICAgICAgdGlueW1jZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgICAgdG9vbGJhcjE6ICdmb3JtYXRzZWxlY3Qsc3R5bGVzZWxlY3QsYm9sZCxpdGFsaWMsYnVsbGlzdCxudW1saXN0LGxpbmssYWxpZ25sZWZ0LGFsaWduY2VudGVyLGFsaWducmlnaHQsd3BfYWR2JyxcbiAgICAgICAgICAgICAgdG9vbGJhcjI6ICdzdHJpa2V0aHJvdWdoLGhyLGZvcmVjb2xvcixwYXN0ZXRleHQscmVtb3ZlZm9ybWF0LGNoYXJtYXAsb3V0ZGVudCxpbmRlbnQsdW5kbyxyZWRvLHdwX2hlbHAnXG4gICAgICAgICAgICB9LCB0eXBlb2Ygb3B0aW9uLnRpbnltY2UgPT09ICdvYmplY3QnID8gb3B0aW9uLnRpbnltY2UgOiB7fSksIHt9LCB7XG4gICAgICAgICAgICAgIHN0eWxlX2Zvcm1hdHNfbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICAgIHN0eWxlX2Zvcm1hdHM6IFtdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHdpbmRvdy50aW55bWNlLmVkaXRvcnNbZWRpdG9ySWRdICYmIHdpbmRvdy50aW55bWNlLmVkaXRvcnNbZWRpdG9ySWRdLm9uKCdjaGFuZ2UnLCBsaXN0ZW5lcikpO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICghd2luZG93LnRpbnltY2UuZWRpdG9yc1tlZGl0b3JJZF0pIHJldHVybjtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB3aW5kb3cudGlueW1jZS5lZGl0b3JzW2VkaXRvcklkXS5vZmYoJ2NoYW5nZScsIGxpc3RlbmVyKTtcbiAgICAgICAgY29ycmVjdEVkaXRvcigpLnJlbW92ZShlZGl0b3JJZCk7XG4gICAgICB9LCAzMDApO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogXCJjdC1vcHRpb24tZWRpdG9yXCJcbiAgfSwgb3B0aW9uLmF0dHIgfHwge30pLCBjcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIiwgX2V4dGVuZHMoe1xuICAgIHN0eWxlOiB7XG4gICAgICBvcGFjaXR5OiAwXG4gICAgfSxcbiAgICBpZDogZWRpdG9ySWQsXG4gICAgcmVmOiBlbCxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgY2xhc3NOYW1lOiBcIndwLWVkaXRvci1hcmVhXCJcbiAgfSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb24uZmllbGRfYXR0ciA/IG9wdGlvbi5maWVsZF9hdHRyIDoge30pLCBvcHRpb24uYXR0ciAmJiBvcHRpb24uYXR0ci5wbGFjZWhvbGRlciA/IHtcbiAgICBwbGFjZWhvbGRlcjogb3B0aW9uLmF0dHIucGxhY2Vob2xkZXJcbiAgfSA6IHt9KSwge1xuICAgIG9uQ2hhbmdlOiBfcmVmMiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9ID0gX3JlZjI7XG4gICAgICByZXR1cm4gb25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfSkpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRBcmVhOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9313\n")},8683:(__unused_webpack_module,__unused_webpack_exports,__webpack_require__)=>{eval("__webpack_require__.p = ct_localizations.public_url;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODY4My5qcyIsIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL3B1YmxpYy1wYXRoLmpzPzAzYjEiXSwic291cmNlc0NvbnRlbnQiOlsiX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSBjdF9sb2NhbGl6YXRpb25zLnB1YmxpY191cmw7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8683\n")},3431:module=>{eval("/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0) {\n return 0;\n }\n if (x === 1) {\n return 1;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQzMS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvYmV6aWVyLWVhc2luZy9zcmMvaW5kZXguanM/ZDEzOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmUvYmV6aWVyLWVhc2luZ1xuICogQmV6aWVyRWFzaW5nIC0gdXNlIGJlemllciBjdXJ2ZSBmb3IgdHJhbnNpdGlvbiBlYXNpbmcgZnVuY3Rpb25cbiAqIGJ5IEdhw6t0YW4gUmVuYXVkZWF1IDIwMTQgLSAyMDE1IOKAkyBNSVQgTGljZW5zZVxuICovXG5cbi8vIFRoZXNlIHZhbHVlcyBhcmUgZXN0YWJsaXNoZWQgYnkgZW1waXJpY2lzbSB3aXRoIHRlc3RzICh0cmFkZW9mZjogcGVyZm9ybWFuY2UgVlMgcHJlY2lzaW9uKVxudmFyIE5FV1RPTl9JVEVSQVRJT05TID0gNDtcbnZhciBORVdUT05fTUlOX1NMT1BFID0gMC4wMDE7XG52YXIgU1VCRElWSVNJT05fUFJFQ0lTSU9OID0gMC4wMDAwMDAxO1xudmFyIFNVQkRJVklTSU9OX01BWF9JVEVSQVRJT05TID0gMTA7XG5cbnZhciBrU3BsaW5lVGFibGVTaXplID0gMTE7XG52YXIga1NhbXBsZVN0ZXBTaXplID0gMS4wIC8gKGtTcGxpbmVUYWJsZVNpemUgLSAxLjApO1xuXG52YXIgZmxvYXQzMkFycmF5U3VwcG9ydGVkID0gdHlwZW9mIEZsb2F0MzJBcnJheSA9PT0gJ2Z1bmN0aW9uJztcblxuZnVuY3Rpb24gQSAoYUExLCBhQTIpIHsgcmV0dXJuIDEuMCAtIDMuMCAqIGFBMiArIDMuMCAqIGFBMTsgfVxuZnVuY3Rpb24gQiAoYUExLCBhQTIpIHsgcmV0dXJuIDMuMCAqIGFBMiAtIDYuMCAqIGFBMTsgfVxuZnVuY3Rpb24gQyAoYUExKSAgICAgIHsgcmV0dXJuIDMuMCAqIGFBMTsgfVxuXG4vLyBSZXR1cm5zIHgodCkgZ2l2ZW4gdCwgeDEsIGFuZCB4Miwgb3IgeSh0KSBnaXZlbiB0LCB5MSwgYW5kIHkyLlxuZnVuY3Rpb24gY2FsY0JlemllciAoYVQsIGFBMSwgYUEyKSB7IHJldHVybiAoKEEoYUExLCBhQTIpICogYVQgKyBCKGFBMSwgYUEyKSkgKiBhVCArIEMoYUExKSkgKiBhVDsgfVxuXG4vLyBSZXR1cm5zIGR4L2R0IGdpdmVuIHQsIHgxLCBhbmQgeDIsIG9yIGR5L2R0IGdpdmVuIHQsIHkxLCBhbmQgeTIuXG5mdW5jdGlvbiBnZXRTbG9wZSAoYVQsIGFBMSwgYUEyKSB7IHJldHVybiAzLjAgKiBBKGFBMSwgYUEyKSAqIGFUICogYVQgKyAyLjAgKiBCKGFBMSwgYUEyKSAqIGFUICsgQyhhQTEpOyB9XG5cbmZ1bmN0aW9uIGJpbmFyeVN1YmRpdmlkZSAoYVgsIGFBLCBhQiwgbVgxLCBtWDIpIHtcbiAgdmFyIGN1cnJlbnRYLCBjdXJyZW50VCwgaSA9IDA7XG4gIGRvIHtcbiAgICBjdXJyZW50VCA9IGFBICsgKGFCIC0gYUEpIC8gMi4wO1xuICAgIGN1cnJlbnRYID0gY2FsY0JlemllcihjdXJyZW50VCwgbVgxLCBtWDIpIC0gYVg7XG4gICAgaWYgKGN1cnJlbnRYID4gMC4wKSB7XG4gICAgICBhQiA9IGN1cnJlbnRUO1xuICAgIH0gZWxzZSB7XG4gICAgICBhQSA9IGN1cnJlbnRUO1xuICAgIH1cbiAgfSB3aGlsZSAoTWF0aC5hYnMoY3VycmVudFgpID4gU1VCRElWSVNJT05fUFJFQ0lTSU9OICYmICsraSA8IFNVQkRJVklTSU9OX01BWF9JVEVSQVRJT05TKTtcbiAgcmV0dXJuIGN1cnJlbnRUO1xufVxuXG5mdW5jdGlvbiBuZXd0b25SYXBoc29uSXRlcmF0ZSAoYVgsIGFHdWVzc1QsIG1YMSwgbVgyKSB7XG4gZm9yICh2YXIgaSA9IDA7IGkgPCBORVdUT05fSVRFUkFUSU9OUzsgKytpKSB7XG4gICB2YXIgY3VycmVudFNsb3BlID0gZ2V0U2xvcGUoYUd1ZXNzVCwgbVgxLCBtWDIpO1xuICAgaWYgKGN1cnJlbnRTbG9wZSA9PT0gMC4wKSB7XG4gICAgIHJldHVybiBhR3Vlc3NUO1xuICAgfVxuICAgdmFyIGN1cnJlbnRYID0gY2FsY0JlemllcihhR3Vlc3NULCBtWDEsIG1YMikgLSBhWDtcbiAgIGFHdWVzc1QgLT0gY3VycmVudFggLyBjdXJyZW50U2xvcGU7XG4gfVxuIHJldHVybiBhR3Vlc3NUO1xufVxuXG5mdW5jdGlvbiBMaW5lYXJFYXNpbmcgKHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmV6aWVyIChtWDEsIG1ZMSwgbVgyLCBtWTIpIHtcbiAgaWYgKCEoMCA8PSBtWDEgJiYgbVgxIDw9IDEgJiYgMCA8PSBtWDIgJiYgbVgyIDw9IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdiZXppZXIgeCB2YWx1ZXMgbXVzdCBiZSBpbiBbMCwgMV0gcmFuZ2UnKTtcbiAgfVxuXG4gIGlmIChtWDEgPT09IG1ZMSAmJiBtWDIgPT09IG1ZMikge1xuICAgIHJldHVybiBMaW5lYXJFYXNpbmc7XG4gIH1cblxuICAvLyBQcmVjb21wdXRlIHNhbXBsZXMgdGFibGVcbiAgdmFyIHNhbXBsZVZhbHVlcyA9IGZsb2F0MzJBcnJheVN1cHBvcnRlZCA/IG5ldyBGbG9hdDMyQXJyYXkoa1NwbGluZVRhYmxlU2l6ZSkgOiBuZXcgQXJyYXkoa1NwbGluZVRhYmxlU2l6ZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga1NwbGluZVRhYmxlU2l6ZTsgKytpKSB7XG4gICAgc2FtcGxlVmFsdWVzW2ldID0gY2FsY0JlemllcihpICoga1NhbXBsZVN0ZXBTaXplLCBtWDEsIG1YMik7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRURm9yWCAoYVgpIHtcbiAgICB2YXIgaW50ZXJ2YWxTdGFydCA9IDAuMDtcbiAgICB2YXIgY3VycmVudFNhbXBsZSA9IDE7XG4gICAgdmFyIGxhc3RTYW1wbGUgPSBrU3BsaW5lVGFibGVTaXplIC0gMTtcblxuICAgIGZvciAoOyBjdXJyZW50U2FtcGxlICE9PSBsYXN0U2FtcGxlICYmIHNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSA8PSBhWDsgKytjdXJyZW50U2FtcGxlKSB7XG4gICAgICBpbnRlcnZhbFN0YXJ0ICs9IGtTYW1wbGVTdGVwU2l6ZTtcbiAgICB9XG4gICAgLS1jdXJyZW50U2FtcGxlO1xuXG4gICAgLy8gSW50ZXJwb2xhdGUgdG8gcHJvdmlkZSBhbiBpbml0aWFsIGd1ZXNzIGZvciB0XG4gICAgdmFyIGRpc3QgPSAoYVggLSBzYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pIC8gKHNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlICsgMV0gLSBzYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pO1xuICAgIHZhciBndWVzc0ZvclQgPSBpbnRlcnZhbFN0YXJ0ICsgZGlzdCAqIGtTYW1wbGVTdGVwU2l6ZTtcblxuICAgIHZhciBpbml0aWFsU2xvcGUgPSBnZXRTbG9wZShndWVzc0ZvclQsIG1YMSwgbVgyKTtcbiAgICBpZiAoaW5pdGlhbFNsb3BlID49IE5FV1RPTl9NSU5fU0xPUEUpIHtcbiAgICAgIHJldHVybiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgZ3Vlc3NGb3JULCBtWDEsIG1YMik7XG4gICAgfSBlbHNlIGlmIChpbml0aWFsU2xvcGUgPT09IDAuMCkge1xuICAgICAgcmV0dXJuIGd1ZXNzRm9yVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJpbmFyeVN1YmRpdmlkZShhWCwgaW50ZXJ2YWxTdGFydCwgaW50ZXJ2YWxTdGFydCArIGtTYW1wbGVTdGVwU2l6ZSwgbVgxLCBtWDIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBCZXppZXJFYXNpbmcgKHgpIHtcbiAgICAvLyBCZWNhdXNlIEphdmFTY3JpcHQgbnVtYmVyIGFyZSBpbXByZWNpc2UsIHdlIHNob3VsZCBndWFyYW50ZWUgdGhlIGV4dHJlbWVzIGFyZSByaWdodC5cbiAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICh4ID09PSAxKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGNCZXppZXIoZ2V0VEZvclgoeCksIG1ZMSwgbVkyKTtcbiAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3431\n")},1924:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar GetIntrinsic = __webpack_require__(210);\n\nvar callBind = __webpack_require__(5559);\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkyNC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvY2FsbEJvdW5kLmpzPzU0NWUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1924\n")},5559:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar bind = __webpack_require__(8612);\nvar GetIntrinsic = __webpack_require__(210);\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\nvar $max = GetIntrinsic('%Math.max%');\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = $reflectApply(bind, $call, arguments);\n\tif ($gOPD && $defineProperty) {\n\t\tvar desc = $gOPD(func, 'length');\n\t\tif (desc.configurable) {\n\t\t\t// original length, plus the receiver, minus any additional arguments (after the receiver)\n\t\t\t$defineProperty(\n\t\t\t\tfunc,\n\t\t\t\t'length',\n\t\t\t\t{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }\n\t\t\t);\n\t\t}\n\t}\n\treturn func;\n};\n\nvar applyBind = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1OS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2luZGV4LmpzPzNlYjEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciAkYXBwbHkgPSBHZXRJbnRyaW5zaWMoJyVGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHklJyk7XG52YXIgJGNhbGwgPSBHZXRJbnRyaW5zaWMoJyVGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCUnKTtcbnZhciAkcmVmbGVjdEFwcGx5ID0gR2V0SW50cmluc2ljKCclUmVmbGVjdC5hcHBseSUnLCB0cnVlKSB8fCBiaW5kLmNhbGwoJGNhbGwsICRhcHBseSk7XG5cbnZhciAkZ09QRCA9IEdldEludHJpbnNpYygnJU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IlJywgdHJ1ZSk7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmRlZmluZVByb3BlcnR5JScsIHRydWUpO1xudmFyICRtYXggPSBHZXRJbnRyaW5zaWMoJyVNYXRoLm1heCUnKTtcblxuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHQkZGVmaW5lUHJvcGVydHkgPSBudWxsO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJpbmQob3JpZ2luYWxGdW5jdGlvbikge1xuXHR2YXIgZnVuYyA9ICRyZWZsZWN0QXBwbHkoYmluZCwgJGNhbGwsIGFyZ3VtZW50cyk7XG5cdGlmICgkZ09QRCAmJiAkZGVmaW5lUHJvcGVydHkpIHtcblx0XHR2YXIgZGVzYyA9ICRnT1BEKGZ1bmMsICdsZW5ndGgnKTtcblx0XHRpZiAoZGVzYy5jb25maWd1cmFibGUpIHtcblx0XHRcdC8vIG9yaWdpbmFsIGxlbmd0aCwgcGx1cyB0aGUgcmVjZWl2ZXIsIG1pbnVzIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyAoYWZ0ZXIgdGhlIHJlY2VpdmVyKVxuXHRcdFx0JGRlZmluZVByb3BlcnR5KFxuXHRcdFx0XHRmdW5jLFxuXHRcdFx0XHQnbGVuZ3RoJyxcblx0XHRcdFx0eyB2YWx1ZTogMSArICRtYXgoMCwgb3JpZ2luYWxGdW5jdGlvbi5sZW5ndGggLSAoYXJndW1lbnRzLmxlbmd0aCAtIDEpKSB9XG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZnVuYztcbn07XG5cbnZhciBhcHBseUJpbmQgPSBmdW5jdGlvbiBhcHBseUJpbmQoKSB7XG5cdHJldHVybiAkcmVmbGVjdEFwcGx5KGJpbmQsICRhcHBseSwgYXJndW1lbnRzKTtcbn07XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0JGRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnYXBwbHknLCB7IHZhbHVlOiBhcHBseUJpbmQgfSk7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cy5hcHBseSA9IGFwcGx5QmluZDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5559\n")},487:module=>{eval("var charenc = {\n // UTF-8 encoding\n utf8: {\n // Convert a string to a byte array\n stringToBytes: function(str) {\n return charenc.bin.stringToBytes(unescape(encodeURIComponent(str)));\n },\n\n // Convert a byte array to a string\n bytesToString: function(bytes) {\n return decodeURIComponent(escape(charenc.bin.bytesToString(bytes)));\n }\n },\n\n // Binary encoding\n bin: {\n // Convert a string to a byte array\n stringToBytes: function(str) {\n for (var bytes = [], i = 0; i < str.length; i++)\n bytes.push(str.charCodeAt(i) & 0xFF);\n return bytes;\n },\n\n // Convert a byte array to a string\n bytesToString: function(bytes) {\n for (var str = [], i = 0; i < bytes.length; i++)\n str.push(String.fromCharCode(bytes[i]));\n return str.join('');\n }\n }\n};\n\nmodule.exports = charenc;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg3LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2NoYXJlbmMvY2hhcmVuYy5qcz85YTYzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjaGFyZW5jID0ge1xuICAvLyBVVEYtOCBlbmNvZGluZ1xuICB1dGY4OiB7XG4gICAgLy8gQ29udmVydCBhIHN0cmluZyB0byBhIGJ5dGUgYXJyYXlcbiAgICBzdHJpbmdUb0J5dGVzOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgIHJldHVybiBjaGFyZW5jLmJpbi5zdHJpbmdUb0J5dGVzKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7XG4gICAgfSxcblxuICAgIC8vIENvbnZlcnQgYSBieXRlIGFycmF5IHRvIGEgc3RyaW5nXG4gICAgYnl0ZXNUb1N0cmluZzogZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGNoYXJlbmMuYmluLmJ5dGVzVG9TdHJpbmcoYnl0ZXMpKSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEJpbmFyeSBlbmNvZGluZ1xuICBiaW46IHtcbiAgICAvLyBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgYnl0ZSBhcnJheVxuICAgIHN0cmluZ1RvQnl0ZXM6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgZm9yICh2YXIgYnl0ZXMgPSBbXSwgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXG4gICAgICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKTtcbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9LFxuXG4gICAgLy8gQ29udmVydCBhIGJ5dGUgYXJyYXkgdG8gYSBzdHJpbmdcbiAgICBieXRlc1RvU3RyaW5nOiBmdW5jdGlvbihieXRlcykge1xuICAgICAgZm9yICh2YXIgc3RyID0gW10sIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHN0ci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pKTtcbiAgICAgIHJldHVybiBzdHIuam9pbignJyk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNoYXJlbmM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///487\n")},4184:(module,exports)=>{eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString === Object.prototype.toString) {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif ( true && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (true) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n\t\t\treturn classNames;\n\t\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {}\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE4NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2luZGV4LmpzPzRkMjYiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gIENvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLlxuICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICBodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGlmIChhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlubmVyID0gY2xhc3NOYW1lcy5hcHBseShudWxsLCBhcmcpO1xuXHRcdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0aWYgKGFyZy50b1N0cmluZyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuXHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdFx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRjbGFzc05hbWVzLmRlZmF1bHQgPSBjbGFzc05hbWVzO1xuXHRcdG1vZHVsZS5leHBvcnRzID0gY2xhc3NOYW1lcztcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gcmVnaXN0ZXIgYXMgJ2NsYXNzbmFtZXMnLCBjb25zaXN0ZW50IHdpdGggbnBtIHBhY2thZ2UgbmFtZVxuXHRcdGRlZmluZSgnY2xhc3NuYW1lcycsIFtdLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gY2xhc3NOYW1lcztcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7XG5cdH1cbn0oKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4184\n")},1012:module=>{eval("(function() {\n var base64map\n = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n\n crypt = {\n // Bit-wise rotation left\n rotl: function(n, b) {\n return (n << b) | (n >>> (32 - b));\n },\n\n // Bit-wise rotation right\n rotr: function(n, b) {\n return (n << (32 - b)) | (n >>> b);\n },\n\n // Swap big-endian to little-endian and vice versa\n endian: function(n) {\n // If number given, swap endian\n if (n.constructor == Number) {\n return crypt.rotl(n, 8) & 0x00FF00FF | crypt.rotl(n, 24) & 0xFF00FF00;\n }\n\n // Else, assume array and swap all items\n for (var i = 0; i < n.length; i++)\n n[i] = crypt.endian(n[i]);\n return n;\n },\n\n // Generate an array of any length of random bytes\n randomBytes: function(n) {\n for (var bytes = []; n > 0; n--)\n bytes.push(Math.floor(Math.random() * 256));\n return bytes;\n },\n\n // Convert a byte array to big-endian 32-bit words\n bytesToWords: function(bytes) {\n for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)\n words[b >>> 5] |= bytes[i] << (24 - b % 32);\n return words;\n },\n\n // Convert big-endian 32-bit words to a byte array\n wordsToBytes: function(words) {\n for (var bytes = [], b = 0; b < words.length * 32; b += 8)\n bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);\n return bytes;\n },\n\n // Convert a byte array to a hex string\n bytesToHex: function(bytes) {\n for (var hex = [], i = 0; i < bytes.length; i++) {\n hex.push((bytes[i] >>> 4).toString(16));\n hex.push((bytes[i] & 0xF).toString(16));\n }\n return hex.join('');\n },\n\n // Convert a hex string to a byte array\n hexToBytes: function(hex) {\n for (var bytes = [], c = 0; c < hex.length; c += 2)\n bytes.push(parseInt(hex.substr(c, 2), 16));\n return bytes;\n },\n\n // Convert a byte array to a base-64 string\n bytesToBase64: function(bytes) {\n for (var base64 = [], i = 0; i < bytes.length; i += 3) {\n var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\n for (var j = 0; j < 4; j++)\n if (i * 8 + j * 6 <= bytes.length * 8)\n base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));\n else\n base64.push('=');\n }\n return base64.join('');\n },\n\n // Convert a base-64 string to a byte array\n base64ToBytes: function(base64) {\n // Remove non-base-64 characters\n base64 = base64.replace(/[^A-Z0-9+\\/]/ig, '');\n\n for (var bytes = [], i = 0, imod4 = 0; i < base64.length;\n imod4 = ++i % 4) {\n if (imod4 == 0) continue;\n bytes.push(((base64map.indexOf(base64.charAt(i - 1))\n & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2))\n | (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));\n }\n return bytes;\n }\n };\n\n module.exports = crypt;\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAxMi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9jcnlwdC9jcnlwdC5qcz8wMGQ4Il0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpIHtcbiAgdmFyIGJhc2U2NG1hcFxuICAgICAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycsXG5cbiAgY3J5cHQgPSB7XG4gICAgLy8gQml0LXdpc2Ugcm90YXRpb24gbGVmdFxuICAgIHJvdGw6IGZ1bmN0aW9uKG4sIGIpIHtcbiAgICAgIHJldHVybiAobiA8PCBiKSB8IChuID4+PiAoMzIgLSBiKSk7XG4gICAgfSxcblxuICAgIC8vIEJpdC13aXNlIHJvdGF0aW9uIHJpZ2h0XG4gICAgcm90cjogZnVuY3Rpb24obiwgYikge1xuICAgICAgcmV0dXJuIChuIDw8ICgzMiAtIGIpKSB8IChuID4+PiBiKTtcbiAgICB9LFxuXG4gICAgLy8gU3dhcCBiaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYW5kIHZpY2UgdmVyc2FcbiAgICBlbmRpYW46IGZ1bmN0aW9uKG4pIHtcbiAgICAgIC8vIElmIG51bWJlciBnaXZlbiwgc3dhcCBlbmRpYW5cbiAgICAgIGlmIChuLmNvbnN0cnVjdG9yID09IE51bWJlcikge1xuICAgICAgICByZXR1cm4gY3J5cHQucm90bChuLCA4KSAmIDB4MDBGRjAwRkYgfCBjcnlwdC5yb3RsKG4sIDI0KSAmIDB4RkYwMEZGMDA7XG4gICAgICB9XG5cbiAgICAgIC8vIEVsc2UsIGFzc3VtZSBhcnJheSBhbmQgc3dhcCBhbGwgaXRlbXNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbi5sZW5ndGg7IGkrKylcbiAgICAgICAgbltpXSA9IGNyeXB0LmVuZGlhbihuW2ldKTtcbiAgICAgIHJldHVybiBuO1xuICAgIH0sXG5cbiAgICAvLyBHZW5lcmF0ZSBhbiBhcnJheSBvZiBhbnkgbGVuZ3RoIG9mIHJhbmRvbSBieXRlc1xuICAgIHJhbmRvbUJ5dGVzOiBmdW5jdGlvbihuKSB7XG4gICAgICBmb3IgKHZhciBieXRlcyA9IFtdOyBuID4gMDsgbi0tKVxuICAgICAgICBieXRlcy5wdXNoKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1NikpO1xuICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH0sXG5cbiAgICAvLyBDb252ZXJ0IGEgYnl0ZSBhcnJheSB0byBiaWctZW5kaWFuIDMyLWJpdCB3b3Jkc1xuICAgIGJ5dGVzVG9Xb3JkczogZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGZvciAodmFyIHdvcmRzID0gW10sIGkgPSAwLCBiID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrLCBiICs9IDgpXG4gICAgICAgIHdvcmRzW2IgPj4+IDVdIHw9IGJ5dGVzW2ldIDw8ICgyNCAtIGIgJSAzMik7XG4gICAgICByZXR1cm4gd29yZHM7XG4gICAgfSxcblxuICAgIC8vIENvbnZlcnQgYmlnLWVuZGlhbiAzMi1iaXQgd29yZHMgdG8gYSBieXRlIGFycmF5XG4gICAgd29yZHNUb0J5dGVzOiBmdW5jdGlvbih3b3Jkcykge1xuICAgICAgZm9yICh2YXIgYnl0ZXMgPSBbXSwgYiA9IDA7IGIgPCB3b3Jkcy5sZW5ndGggKiAzMjsgYiArPSA4KVxuICAgICAgICBieXRlcy5wdXNoKCh3b3Jkc1tiID4+PiA1XSA+Pj4gKDI0IC0gYiAlIDMyKSkgJiAweEZGKTtcbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9LFxuXG4gICAgLy8gQ29udmVydCBhIGJ5dGUgYXJyYXkgdG8gYSBoZXggc3RyaW5nXG4gICAgYnl0ZXNUb0hleDogZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGZvciAodmFyIGhleCA9IFtdLCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhleC5wdXNoKChieXRlc1tpXSA+Pj4gNCkudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgaGV4LnB1c2goKGJ5dGVzW2ldICYgMHhGKS50b1N0cmluZygxNikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhleC5qb2luKCcnKTtcbiAgICB9LFxuXG4gICAgLy8gQ29udmVydCBhIGhleCBzdHJpbmcgdG8gYSBieXRlIGFycmF5XG4gICAgaGV4VG9CeXRlczogZnVuY3Rpb24oaGV4KSB7XG4gICAgICBmb3IgKHZhciBieXRlcyA9IFtdLCBjID0gMDsgYyA8IGhleC5sZW5ndGg7IGMgKz0gMilcbiAgICAgICAgYnl0ZXMucHVzaChwYXJzZUludChoZXguc3Vic3RyKGMsIDIpLCAxNikpO1xuICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH0sXG5cbiAgICAvLyBDb252ZXJ0IGEgYnl0ZSBhcnJheSB0byBhIGJhc2UtNjQgc3RyaW5nXG4gICAgYnl0ZXNUb0Jhc2U2NDogZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGZvciAodmFyIGJhc2U2NCA9IFtdLCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciB0cmlwbGV0ID0gKGJ5dGVzW2ldIDw8IDE2KSB8IChieXRlc1tpICsgMV0gPDwgOCkgfCBieXRlc1tpICsgMl07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKVxuICAgICAgICAgIGlmIChpICogOCArIGogKiA2IDw9IGJ5dGVzLmxlbmd0aCAqIDgpXG4gICAgICAgICAgICBiYXNlNjQucHVzaChiYXNlNjRtYXAuY2hhckF0KCh0cmlwbGV0ID4+PiA2ICogKDMgLSBqKSkgJiAweDNGKSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgYmFzZTY0LnB1c2goJz0nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlNjQuam9pbignJyk7XG4gICAgfSxcblxuICAgIC8vIENvbnZlcnQgYSBiYXNlLTY0IHN0cmluZyB0byBhIGJ5dGUgYXJyYXlcbiAgICBiYXNlNjRUb0J5dGVzOiBmdW5jdGlvbihiYXNlNjQpIHtcbiAgICAgIC8vIFJlbW92ZSBub24tYmFzZS02NCBjaGFyYWN0ZXJzXG4gICAgICBiYXNlNjQgPSBiYXNlNjQucmVwbGFjZSgvW15BLVowLTkrXFwvXS9pZywgJycpO1xuXG4gICAgICBmb3IgKHZhciBieXRlcyA9IFtdLCBpID0gMCwgaW1vZDQgPSAwOyBpIDwgYmFzZTY0Lmxlbmd0aDtcbiAgICAgICAgICBpbW9kNCA9ICsraSAlIDQpIHtcbiAgICAgICAgaWYgKGltb2Q0ID09IDApIGNvbnRpbnVlO1xuICAgICAgICBieXRlcy5wdXNoKCgoYmFzZTY0bWFwLmluZGV4T2YoYmFzZTY0LmNoYXJBdChpIC0gMSkpXG4gICAgICAgICAgICAmIChNYXRoLnBvdygyLCAtMiAqIGltb2Q0ICsgOCkgLSAxKSkgPDwgKGltb2Q0ICogMikpXG4gICAgICAgICAgICB8IChiYXNlNjRtYXAuaW5kZXhPZihiYXNlNjQuY2hhckF0KGkpKSA+Pj4gKDYgLSBpbW9kNCAqIDIpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzID0gY3J5cHQ7XG59KSgpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1012\n")},600:(__unused_webpack_module,exports)=>{"use strict";eval("var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = ({ value: true });\n\nvar maybePromoteScalarValueIntoResponsive = function maybePromoteScalarValueIntoResponsive(value) {\n var isResponsive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n /**\n * Responsive value must necessarily have the desktop key attached to it\n */\n if (value && Object.keys(value).indexOf('desktop') > -1) {\n if (!isResponsive) {\n return value.desktop;\n }\n\n return value;\n }\n\n if (!isResponsive) {\n return value;\n }\n\n return {\n desktop: value,\n tablet: value,\n mobile: value\n };\n};\n\nexports.T = maybePromoteScalarValueIntoResponsive;\n//# sourceMappingURL=promote-into-responsive.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAwLmpzIiwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2N1c3RvbWl6ZXItc3luYy1oZWxwZXJzL2Rpc3QvcHJvbW90ZS1pbnRvLXJlc3BvbnNpdmUuanM/Y2NhYSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBtYXliZVByb21vdGVTY2FsYXJWYWx1ZUludG9SZXNwb25zaXZlID0gZnVuY3Rpb24gbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZSh2YWx1ZSkge1xuICB2YXIgaXNSZXNwb25zaXZlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gIC8qKlxuICAgKiBSZXNwb25zaXZlIHZhbHVlIG11c3QgbmVjZXNzYXJpbHkgaGF2ZSB0aGUgZGVza3RvcCBrZXkgYXR0YWNoZWQgdG8gaXRcbiAgICovXG4gIGlmICh2YWx1ZSAmJiBPYmplY3Qua2V5cyh2YWx1ZSkuaW5kZXhPZignZGVza3RvcCcpID4gLTEpIHtcbiAgICBpZiAoIWlzUmVzcG9uc2l2ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmRlc2t0b3A7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKCFpc1Jlc3BvbnNpdmUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRlc2t0b3A6IHZhbHVlLFxuICAgIHRhYmxldDogdmFsdWUsXG4gICAgbW9iaWxlOiB2YWx1ZVxuICB9O1xufTtcblxuZXhwb3J0cy5tYXliZVByb21vdGVTY2FsYXJWYWx1ZUludG9SZXNwb25zaXZlID0gbWF5YmVQcm9tb3RlU2NhbGFyVmFsdWVJbnRvUmVzcG9uc2l2ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb21vdGUtaW50by1yZXNwb25zaXZlLmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///600\n")},251:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var objectKeys = __webpack_require__(2215);\nvar isArguments = __webpack_require__(2584);\nvar is = __webpack_require__(609);\nvar isRegex = __webpack_require__(8420);\nvar flags = __webpack_require__(2847);\nvar isDate = __webpack_require__(8923);\n\nvar getTime = Date.prototype.getTime;\n\nfunction deepEqual(actual, expected, options) {\n var opts = options || {};\n\n // 7.1. All identical values are equivalent, as determined by ===.\n if (opts.strict ? is(actual, expected) : actual === expected) {\n return true;\n }\n\n // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==.\n if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {\n return opts.strict ? is(actual, expected) : actual == expected;\n }\n\n /*\n * 7.4. For all other Object pairs, including Array objects, equivalence is\n * determined by having the same number of owned properties (as verified\n * with Object.prototype.hasOwnProperty.call), the same set of keys\n * (although not necessarily the same order), equivalent values for every\n * corresponding key, and an identical 'prototype' property. Note: this\n * accounts for both named and indexed properties on Arrays.\n */\n // eslint-disable-next-line no-use-before-define\n return objEquiv(actual, expected, opts);\n}\n\nfunction isUndefinedOrNull(value) {\n return value === null || value === undefined;\n}\n\nfunction isBuffer(x) {\n if (!x || typeof x !== 'object' || typeof x.length !== 'number') {\n return false;\n }\n if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n return false;\n }\n if (x.length > 0 && typeof x[0] !== 'number') {\n return false;\n }\n return true;\n}\n\nfunction objEquiv(a, b, opts) {\n /* eslint max-statements: [2, 50] */\n var i, key;\n if (typeof a !== typeof b) { return false; }\n if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { return false; }\n\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) { return false; }\n\n if (isArguments(a) !== isArguments(b)) { return false; }\n\n var aIsRegex = isRegex(a);\n var bIsRegex = isRegex(b);\n if (aIsRegex !== bIsRegex) { return false; }\n if (aIsRegex || bIsRegex) {\n return a.source === b.source && flags(a) === flags(b);\n }\n\n if (isDate(a) && isDate(b)) {\n return getTime.call(a) === getTime.call(b);\n }\n\n var aIsBuffer = isBuffer(a);\n var bIsBuffer = isBuffer(b);\n if (aIsBuffer !== bIsBuffer) { return false; }\n if (aIsBuffer || bIsBuffer) { // && would work too, because both are true or both false here\n if (a.length !== b.length) { return false; }\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) { return false; }\n }\n return true;\n }\n\n if (typeof a !== typeof b) { return false; }\n\n try {\n var ka = objectKeys(a);\n var kb = objectKeys(b);\n } catch (e) { // happens when one is a string literal and the other isn't\n return false;\n }\n // having the same number of owned properties (keys incorporates hasOwnProperty)\n if (ka.length !== kb.length) { return false; }\n\n // the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n // ~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i]) { return false; }\n }\n // equivalent values for every corresponding key, and ~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], opts)) { return false; }\n }\n\n return true;\n}\n\nmodule.exports = deepEqual;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUxLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvZGVlcC1lcXVhbC9pbmRleC5qcz83ZmFlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJ2lzLWFyZ3VtZW50cycpO1xudmFyIGlzID0gcmVxdWlyZSgnb2JqZWN0LWlzJyk7XG52YXIgaXNSZWdleCA9IHJlcXVpcmUoJ2lzLXJlZ2V4Jyk7XG52YXIgZmxhZ3MgPSByZXF1aXJlKCdyZWdleHAucHJvdG90eXBlLmZsYWdzJyk7XG52YXIgaXNEYXRlID0gcmVxdWlyZSgnaXMtZGF0ZS1vYmplY3QnKTtcblxudmFyIGdldFRpbWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lO1xuXG5mdW5jdGlvbiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChvcHRzLnN0cmljdCA/IGlzKGFjdHVhbCwgZXhwZWN0ZWQpIDogYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gNy4zLiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLCBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQgfHwgKHR5cGVvZiBhY3R1YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gaXMoYWN0dWFsLCBleHBlY3RlZCkgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG4gIH1cblxuICAvKlxuICAgKiA3LjQuIEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgICogZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gICAqIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgICogKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAgKiBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAgKiBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cyk7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0J1ZmZlcih4KSB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHgubGVuZ3RoICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHguY29weSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeC5zbGljZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwICYmIHR5cGVvZiB4WzBdICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgb3B0cykge1xuICAvKiBlc2xpbnQgbWF4LXN0YXRlbWVudHM6IFsyLCA1MF0gKi9cbiAgdmFyIGksIGtleTtcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKGlzVW5kZWZpbmVkT3JOdWxsKGEpIHx8IGlzVW5kZWZpbmVkT3JOdWxsKGIpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS5cbiAgaWYgKGEucHJvdG90eXBlICE9PSBiLnByb3RvdHlwZSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoaXNBcmd1bWVudHMoYSkgIT09IGlzQXJndW1lbnRzKGIpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHZhciBhSXNSZWdleCA9IGlzUmVnZXgoYSk7XG4gIHZhciBiSXNSZWdleCA9IGlzUmVnZXgoYik7XG4gIGlmIChhSXNSZWdleCAhPT0gYklzUmVnZXgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhSXNSZWdleCB8fCBiSXNSZWdleCkge1xuICAgIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgZmxhZ3MoYSkgPT09IGZsYWdzKGIpO1xuICB9XG5cbiAgaWYgKGlzRGF0ZShhKSAmJiBpc0RhdGUoYikpIHtcbiAgICByZXR1cm4gZ2V0VGltZS5jYWxsKGEpID09PSBnZXRUaW1lLmNhbGwoYik7XG4gIH1cblxuICB2YXIgYUlzQnVmZmVyID0gaXNCdWZmZXIoYSk7XG4gIHZhciBiSXNCdWZmZXIgPSBpc0J1ZmZlcihiKTtcbiAgaWYgKGFJc0J1ZmZlciAhPT0gYklzQnVmZmVyKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoYUlzQnVmZmVyIHx8IGJJc0J1ZmZlcikgeyAvLyAmJiB3b3VsZCB3b3JrIHRvbywgYmVjYXVzZSBib3RoIGFyZSB0cnVlIG9yIGJvdGggZmFsc2UgaGVyZVxuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgdHJ5IHtcbiAgICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICAgIHZhciBrYiA9IG9iamVjdEtleXMoYik7XG4gIH0gY2F0Y2ggKGUpIHsgLy8gaGFwcGVucyB3aGVuIG9uZSBpcyBhIHN0cmluZyBsaXRlcmFsIGFuZCB0aGUgb3RoZXIgaXNuJ3RcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlcyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIHRoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy8gfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT0ga2JbaV0pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIH1cbiAgLy8gZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZXBFcXVhbDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///251\n")},4289:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar keys = __webpack_require__(2215);\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';\n\nvar toStr = Object.prototype.toString;\nvar concat = Array.prototype.concat;\nvar origDefineProperty = Object.defineProperty;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar hasPropertyDescriptors = __webpack_require__(1044)();\n\nvar supportsDescriptors = origDefineProperty && hasPropertyDescriptors;\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\torigDefineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: value,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\tobject[name] = value; // eslint-disable-line no-param-reassign\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = concat.call(props, Object.getOwnPropertySymbols(map));\n\t}\n\tfor (var i = 0; i < props.length; i += 1) {\n\t\tdefineProperty(object, props[i], map[props[i]], predicates[props[i]]);\n\t}\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI4OS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvZGVmaW5lLXByb3BlcnRpZXMvaW5kZXguanM/ZjM2NyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCdmb28nKSA9PT0gJ3N5bWJvbCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBvcmlnRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9ycyA9IHJlcXVpcmUoJ2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpKCk7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gb3JpZ0RlZmluZVByb3BlcnR5ICYmIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWUsIHZhbHVlLCBwcmVkaWNhdGUpIHtcblx0aWYgKG5hbWUgaW4gb2JqZWN0ICYmICghaXNGdW5jdGlvbihwcmVkaWNhdGUpIHx8ICFwcmVkaWNhdGUoKSkpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcblx0XHRvcmlnRGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdHdyaXRhYmxlOiB0cnVlXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b2JqZWN0W25hbWVdID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBjb25jYXQuY2FsbChwcm9wcywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wc1tpXSwgbWFwW3Byb3BzW2ldXSwgcHJlZGljYXRlc1twcm9wc1tpXV0pO1xuXHR9XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4289\n")},6781:(__unused_webpack_module,exports)=>{"use strict";eval('var __webpack_unused_export__;\n/** @license React v17.0.2\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar b=60103,c=60106,d=60107,e=60108,f=60114,g=60109,h=60110,k=60112,l=60113,m=60120,n=60115,p=60116,q=60121,r=60122,u=60117,v=60129,w=60131;\nif("function"===typeof Symbol&&Symbol.for){var x=Symbol.for;b=x("react.element");c=x("react.portal");d=x("react.fragment");e=x("react.strict_mode");f=x("react.profiler");g=x("react.provider");h=x("react.context");k=x("react.forward_ref");l=x("react.suspense");m=x("react.suspense_list");n=x("react.memo");p=x("react.lazy");q=x("react.block");r=x("react.server.block");u=x("react.fundamental");v=x("react.debug_trace_mode");w=x("react.legacy_hidden")}\nfunction y(a){if("object"===typeof a&&null!==a){var t=a.$$typeof;switch(t){case b:switch(a=a.type,a){case d:case f:case e:case l:case m:return a;default:switch(a=a&&a.$$typeof,a){case h:case k:case p:case n:case g:return a;default:return t}}case c:return t}}}var z=g,A=b,B=k,C=d,D=p,E=n,F=c,G=f,H=e,I=l;__webpack_unused_export__=h;__webpack_unused_export__=z;__webpack_unused_export__=A;__webpack_unused_export__=B;__webpack_unused_export__=C;__webpack_unused_export__=D;__webpack_unused_export__=E;__webpack_unused_export__=F;__webpack_unused_export__=G;__webpack_unused_export__=H;\n__webpack_unused_export__=I;__webpack_unused_export__=function(){return!1};__webpack_unused_export__=function(){return!1};__webpack_unused_export__=function(a){return y(a)===h};__webpack_unused_export__=function(a){return y(a)===g};__webpack_unused_export__=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===b};__webpack_unused_export__=function(a){return y(a)===k};__webpack_unused_export__=function(a){return y(a)===d};__webpack_unused_export__=function(a){return y(a)===p};__webpack_unused_export__=function(a){return y(a)===n};\n__webpack_unused_export__=function(a){return y(a)===c};__webpack_unused_export__=function(a){return y(a)===f};__webpack_unused_export__=function(a){return y(a)===e};__webpack_unused_export__=function(a){return y(a)===l};__webpack_unused_export__=function(a){return"string"===typeof a||"function"===typeof a||a===d||a===f||a===v||a===e||a===l||a===m||a===w||"object"===typeof a&&null!==a&&(a.$$typeof===p||a.$$typeof===n||a.$$typeof===g||a.$$typeof===h||a.$$typeof===k||a.$$typeof===u||a.$$typeof===q||a[0]===r)?!0:!1};\n__webpack_unused_export__=y;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc4MS5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2Rvd25zaGlmdC9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzP2U1YTAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0Jzt2YXIgYj02MDEwMyxjPTYwMTA2LGQ9NjAxMDcsZT02MDEwOCxmPTYwMTE0LGc9NjAxMDksaD02MDExMCxrPTYwMTEyLGw9NjAxMTMsbT02MDEyMCxuPTYwMTE1LHA9NjAxMTYscT02MDEyMSxyPTYwMTIyLHU9NjAxMTcsdj02MDEyOSx3PTYwMTMxO1xuaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvcil7dmFyIHg9U3ltYm9sLmZvcjtiPXgoXCJyZWFjdC5lbGVtZW50XCIpO2M9eChcInJlYWN0LnBvcnRhbFwiKTtkPXgoXCJyZWFjdC5mcmFnbWVudFwiKTtlPXgoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTtmPXgoXCJyZWFjdC5wcm9maWxlclwiKTtnPXgoXCJyZWFjdC5wcm92aWRlclwiKTtoPXgoXCJyZWFjdC5jb250ZXh0XCIpO2s9eChcInJlYWN0LmZvcndhcmRfcmVmXCIpO2w9eChcInJlYWN0LnN1c3BlbnNlXCIpO209eChcInJlYWN0LnN1c3BlbnNlX2xpc3RcIik7bj14KFwicmVhY3QubWVtb1wiKTtwPXgoXCJyZWFjdC5sYXp5XCIpO3E9eChcInJlYWN0LmJsb2NrXCIpO3I9eChcInJlYWN0LnNlcnZlci5ibG9ja1wiKTt1PXgoXCJyZWFjdC5mdW5kYW1lbnRhbFwiKTt2PXgoXCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlXCIpO3c9eChcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIil9XG5mdW5jdGlvbiB5KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB0PWEuJCR0eXBlb2Y7c3dpdGNoKHQpe2Nhc2UgYjpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBkOmNhc2UgZjpjYXNlIGU6Y2FzZSBsOmNhc2UgbTpyZXR1cm4gYTtkZWZhdWx0OnN3aXRjaChhPWEmJmEuJCR0eXBlb2YsYSl7Y2FzZSBoOmNhc2UgazpjYXNlIHA6Y2FzZSBuOmNhc2UgZzpyZXR1cm4gYTtkZWZhdWx0OnJldHVybiB0fX1jYXNlIGM6cmV0dXJuIHR9fX12YXIgej1nLEE9YixCPWssQz1kLEQ9cCxFPW4sRj1jLEc9ZixIPWUsST1sO2V4cG9ydHMuQ29udGV4dENvbnN1bWVyPWg7ZXhwb3J0cy5Db250ZXh0UHJvdmlkZXI9ejtleHBvcnRzLkVsZW1lbnQ9QTtleHBvcnRzLkZvcndhcmRSZWY9QjtleHBvcnRzLkZyYWdtZW50PUM7ZXhwb3J0cy5MYXp5PUQ7ZXhwb3J0cy5NZW1vPUU7ZXhwb3J0cy5Qb3J0YWw9RjtleHBvcnRzLlByb2ZpbGVyPUc7ZXhwb3J0cy5TdHJpY3RNb2RlPUg7XG5leHBvcnRzLlN1c3BlbnNlPUk7ZXhwb3J0cy5pc0FzeW5jTW9kZT1mdW5jdGlvbigpe3JldHVybiExfTtleHBvcnRzLmlzQ29uY3VycmVudE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX07ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWh9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1nfTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Yn07ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1rfTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1kfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PXB9O2V4cG9ydHMuaXNNZW1vPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09bn07XG5leHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09Y307ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09Zn07ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1lfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1sfTtleHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZT1mdW5jdGlvbihhKXtyZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGF8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhfHxhPT09ZHx8YT09PWZ8fGE9PT12fHxhPT09ZXx8YT09PWx8fGE9PT1tfHxhPT09d3x8XCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmKGEuJCR0eXBlb2Y9PT1wfHxhLiQkdHlwZW9mPT09bnx8YS4kJHR5cGVvZj09PWd8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PXV8fGEuJCR0eXBlb2Y9PT1xfHxhWzBdPT09cik/ITA6ITF9O1xuZXhwb3J0cy50eXBlT2Y9eTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6781\n')},1726:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nif (true) {\n /* unused reexport */ __webpack_require__(6781);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcyNi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvZG93bnNoaWZ0L25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcz83MDNkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1726\n")},3172:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var tabbable = __webpack_require__(4760);\nvar xtend = __webpack_require__(7529);\n\nvar listeningFocusTrap = null;\n\nfunction focusTrap(element, userOptions) {\n var doc = document;\n var container =\n typeof element === 'string' ? doc.querySelector(element) : element;\n\n var config = xtend(\n {\n returnFocusOnDeactivate: true,\n escapeDeactivates: true\n },\n userOptions\n );\n\n var state = {\n firstTabbableNode: null,\n lastTabbableNode: null,\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false\n };\n\n var trap = {\n activate: activate,\n deactivate: deactivate,\n pause: pause,\n unpause: unpause\n };\n\n return trap;\n\n function activate(activateOptions) {\n if (state.active) return;\n\n updateTabbableNodes();\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n var onActivate =\n activateOptions && activateOptions.onActivate\n ? activateOptions.onActivate\n : config.onActivate;\n if (onActivate) {\n onActivate();\n }\n\n addListeners();\n return trap;\n }\n\n function deactivate(deactivateOptions) {\n if (!state.active) return;\n\n removeListeners();\n state.active = false;\n state.paused = false;\n\n var onDeactivate =\n deactivateOptions && deactivateOptions.onDeactivate !== undefined\n ? deactivateOptions.onDeactivate\n : config.onDeactivate;\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus =\n deactivateOptions && deactivateOptions.returnFocus !== undefined\n ? deactivateOptions.returnFocus\n : config.returnFocusOnDeactivate;\n if (returnFocus) {\n delay(function() {\n tryFocus(state.nodeFocusedBeforeActivation);\n });\n }\n\n return trap;\n }\n\n function pause() {\n if (state.paused || !state.active) return;\n state.paused = true;\n removeListeners();\n }\n\n function unpause() {\n if (!state.paused || !state.active) return;\n state.paused = false;\n addListeners();\n }\n\n function addListeners() {\n if (!state.active) return;\n\n // There can be only one listening focus trap at a time\n if (listeningFocusTrap) {\n listeningFocusTrap.pause();\n }\n listeningFocusTrap = trap;\n\n updateTabbableNodes();\n\n // Delay ensures that the focused element doesn't capture the event\n // that caused the focus trap activation.\n delay(function() {\n tryFocus(getInitialFocusNode());\n });\n doc.addEventListener('focusin', checkFocusIn, true);\n doc.addEventListener('mousedown', checkPointerDown, true);\n doc.addEventListener('touchstart', checkPointerDown, true);\n doc.addEventListener('click', checkClick, true);\n doc.addEventListener('keydown', checkKey, true);\n\n return trap;\n }\n\n function removeListeners() {\n if (!state.active || listeningFocusTrap !== trap) return;\n\n doc.removeEventListener('focusin', checkFocusIn, true);\n doc.removeEventListener('mousedown', checkPointerDown, true);\n doc.removeEventListener('touchstart', checkPointerDown, true);\n doc.removeEventListener('click', checkClick, true);\n doc.removeEventListener('keydown', checkKey, true);\n\n listeningFocusTrap = null;\n\n return trap;\n }\n\n function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n var node = optionValue;\n if (!optionValue) {\n return null;\n }\n if (typeof optionValue === 'string') {\n node = doc.querySelector(optionValue);\n if (!node) {\n throw new Error('`' + optionName + '` refers to no known node');\n }\n }\n if (typeof optionValue === 'function') {\n node = optionValue();\n if (!node) {\n throw new Error('`' + optionName + '` did not return a node');\n }\n }\n return node;\n }\n\n function getInitialFocusNode() {\n var node;\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (container.contains(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n node = state.firstTabbableNode || getNodeForOption('fallbackFocus');\n }\n\n if (!node) {\n throw new Error(\n \"You can't have a focus-trap without at least one focusable element\"\n );\n }\n\n return node;\n }\n\n // This needs to be done on mousedown and touchstart instead of click\n // so that it precedes the focus event.\n function checkPointerDown(e) {\n if (container.contains(e.target)) return;\n if (config.clickOutsideDeactivates) {\n deactivate({\n returnFocus: !tabbable.isFocusable(e.target)\n });\n } else {\n e.preventDefault();\n }\n }\n\n // In case focus escapes the trap for some strange reason, pull it back in.\n function checkFocusIn(e) {\n // In Firefox when you Tab out of an iframe the Document is briefly focused.\n if (container.contains(e.target) || e.target instanceof Document) {\n return;\n }\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n\n function checkKey(e) {\n if (config.escapeDeactivates !== false && isEscapeEvent(e)) {\n e.preventDefault();\n deactivate();\n return;\n }\n if (isTabEvent(e)) {\n checkTab(e);\n return;\n }\n }\n\n // Hijack Tab events on the first and last focusable nodes of the trap,\n // in order to prevent focus from escaping. If it escapes for even a\n // moment it can end up scrolling the page and causing confusion so we\n // kind of need to capture the action at the keydown phase.\n function checkTab(e) {\n updateTabbableNodes();\n if (e.shiftKey && e.target === state.firstTabbableNode) {\n e.preventDefault();\n tryFocus(state.lastTabbableNode);\n return;\n }\n if (!e.shiftKey && e.target === state.lastTabbableNode) {\n e.preventDefault();\n tryFocus(state.firstTabbableNode);\n return;\n }\n }\n\n function checkClick(e) {\n if (config.clickOutsideDeactivates) return;\n if (container.contains(e.target)) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n function updateTabbableNodes() {\n var tabbableNodes = tabbable(container);\n state.firstTabbableNode = tabbableNodes[0] || getInitialFocusNode();\n state.lastTabbableNode =\n tabbableNodes[tabbableNodes.length - 1] || getInitialFocusNode();\n }\n\n function tryFocus(node) {\n if (node === doc.activeElement) return;\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n\n node.focus();\n state.mostRecentlyFocusedNode = node;\n if (isSelectableInput(node)) {\n node.select();\n }\n }\n}\n\nfunction isSelectableInput(node) {\n return (\n node.tagName &&\n node.tagName.toLowerCase() === 'input' &&\n typeof node.select === 'function'\n );\n}\n\nfunction isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n}\n\nfunction isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n}\n\nfunction delay(fn) {\n return setTimeout(fn, 0);\n}\n\nmodule.exports = focusTrap;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE3Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9mb2N1cy10cmFwL2luZGV4LmpzPzZjOTIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHRhYmJhYmxlID0gcmVxdWlyZSgndGFiYmFibGUnKTtcbnZhciB4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJyk7XG5cbnZhciBsaXN0ZW5pbmdGb2N1c1RyYXAgPSBudWxsO1xuXG5mdW5jdGlvbiBmb2N1c1RyYXAoZWxlbWVudCwgdXNlck9wdGlvbnMpIHtcbiAgdmFyIGRvYyA9IGRvY3VtZW50O1xuICB2YXIgY29udGFpbmVyID1cbiAgICB0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBkb2MucXVlcnlTZWxlY3RvcihlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgdmFyIGNvbmZpZyA9IHh0ZW5kKFxuICAgIHtcbiAgICAgIHJldHVybkZvY3VzT25EZWFjdGl2YXRlOiB0cnVlLFxuICAgICAgZXNjYXBlRGVhY3RpdmF0ZXM6IHRydWVcbiAgICB9LFxuICAgIHVzZXJPcHRpb25zXG4gICk7XG5cbiAgdmFyIHN0YXRlID0ge1xuICAgIGZpcnN0VGFiYmFibGVOb2RlOiBudWxsLFxuICAgIGxhc3RUYWJiYWJsZU5vZGU6IG51bGwsXG4gICAgbm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uOiBudWxsLFxuICAgIG1vc3RSZWNlbnRseUZvY3VzZWROb2RlOiBudWxsLFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgcGF1c2VkOiBmYWxzZVxuICB9O1xuXG4gIHZhciB0cmFwID0ge1xuICAgIGFjdGl2YXRlOiBhY3RpdmF0ZSxcbiAgICBkZWFjdGl2YXRlOiBkZWFjdGl2YXRlLFxuICAgIHBhdXNlOiBwYXVzZSxcbiAgICB1bnBhdXNlOiB1bnBhdXNlXG4gIH07XG5cbiAgcmV0dXJuIHRyYXA7XG5cbiAgZnVuY3Rpb24gYWN0aXZhdGUoYWN0aXZhdGVPcHRpb25zKSB7XG4gICAgaWYgKHN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuXG4gICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuXG4gICAgc3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICBzdGF0ZS5ub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb24gPSBkb2MuYWN0aXZlRWxlbWVudDtcblxuICAgIHZhciBvbkFjdGl2YXRlID1cbiAgICAgIGFjdGl2YXRlT3B0aW9ucyAmJiBhY3RpdmF0ZU9wdGlvbnMub25BY3RpdmF0ZVxuICAgICAgICA/IGFjdGl2YXRlT3B0aW9ucy5vbkFjdGl2YXRlXG4gICAgICAgIDogY29uZmlnLm9uQWN0aXZhdGU7XG4gICAgaWYgKG9uQWN0aXZhdGUpIHtcbiAgICAgIG9uQWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBhZGRMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdHJhcDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYWN0aXZhdGUoZGVhY3RpdmF0ZU9wdGlvbnMpIHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuXG4gICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gICAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG5cbiAgICB2YXIgb25EZWFjdGl2YXRlID1cbiAgICAgIGRlYWN0aXZhdGVPcHRpb25zICYmIGRlYWN0aXZhdGVPcHRpb25zLm9uRGVhY3RpdmF0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gZGVhY3RpdmF0ZU9wdGlvbnMub25EZWFjdGl2YXRlXG4gICAgICAgIDogY29uZmlnLm9uRGVhY3RpdmF0ZTtcbiAgICBpZiAob25EZWFjdGl2YXRlKSB7XG4gICAgICBvbkRlYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICB2YXIgcmV0dXJuRm9jdXMgPVxuICAgICAgZGVhY3RpdmF0ZU9wdGlvbnMgJiYgZGVhY3RpdmF0ZU9wdGlvbnMucmV0dXJuRm9jdXMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGRlYWN0aXZhdGVPcHRpb25zLnJldHVybkZvY3VzXG4gICAgICAgIDogY29uZmlnLnJldHVybkZvY3VzT25EZWFjdGl2YXRlO1xuICAgIGlmIChyZXR1cm5Gb2N1cykge1xuICAgICAgZGVsYXkoZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeUZvY3VzKHN0YXRlLm5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhcDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIGlmIChzdGF0ZS5wYXVzZWQgfHwgIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuICAgIHN0YXRlLnBhdXNlZCA9IHRydWU7XG4gICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gIH1cblxuICBmdW5jdGlvbiB1bnBhdXNlKCkge1xuICAgIGlmICghc3RhdGUucGF1c2VkIHx8ICFzdGF0ZS5hY3RpdmUpIHJldHVybjtcbiAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICBhZGRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZExpc3RlbmVycygpIHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gVGhlcmUgY2FuIGJlIG9ubHkgb25lIGxpc3RlbmluZyBmb2N1cyB0cmFwIGF0IGEgdGltZVxuICAgIGlmIChsaXN0ZW5pbmdGb2N1c1RyYXApIHtcbiAgICAgIGxpc3RlbmluZ0ZvY3VzVHJhcC5wYXVzZSgpO1xuICAgIH1cbiAgICBsaXN0ZW5pbmdGb2N1c1RyYXAgPSB0cmFwO1xuXG4gICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuXG4gICAgLy8gRGVsYXkgZW5zdXJlcyB0aGF0IHRoZSBmb2N1c2VkIGVsZW1lbnQgZG9lc24ndCBjYXB0dXJlIHRoZSBldmVudFxuICAgIC8vIHRoYXQgY2F1c2VkIHRoZSBmb2N1cyB0cmFwIGFjdGl2YXRpb24uXG4gICAgZGVsYXkoZnVuY3Rpb24oKSB7XG4gICAgICB0cnlGb2N1cyhnZXRJbml0aWFsRm9jdXNOb2RlKCkpO1xuICAgIH0pO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgY2hlY2tGb2N1c0luLCB0cnVlKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2hlY2tQb2ludGVyRG93biwgdHJ1ZSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBjaGVja1BvaW50ZXJEb3duLCB0cnVlKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGVja0NsaWNrLCB0cnVlKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGNoZWNrS2V5LCB0cnVlKTtcblxuICAgIHJldHVybiB0cmFwO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCkge1xuICAgIGlmICghc3RhdGUuYWN0aXZlIHx8IGxpc3RlbmluZ0ZvY3VzVHJhcCAhPT0gdHJhcCkgcmV0dXJuO1xuXG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBjaGVja0ZvY3VzSW4sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGVja1BvaW50ZXJEb3duLCB0cnVlKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGNoZWNrUG9pbnRlckRvd24sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrQ2xpY2ssIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2hlY2tLZXksIHRydWUpO1xuXG4gICAgbGlzdGVuaW5nRm9jdXNUcmFwID0gbnVsbDtcblxuICAgIHJldHVybiB0cmFwO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Tm9kZUZvck9wdGlvbihvcHRpb25OYW1lKSB7XG4gICAgdmFyIG9wdGlvblZhbHVlID0gY29uZmlnW29wdGlvbk5hbWVdO1xuICAgIHZhciBub2RlID0gb3B0aW9uVmFsdWU7XG4gICAgaWYgKCFvcHRpb25WYWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBub2RlID0gZG9jLnF1ZXJ5U2VsZWN0b3Iob3B0aW9uVmFsdWUpO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYCcgKyBvcHRpb25OYW1lICsgJ2AgcmVmZXJzIHRvIG5vIGtub3duIG5vZGUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbm9kZSA9IG9wdGlvblZhbHVlKCk7XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgJyArIG9wdGlvbk5hbWUgKyAnYCBkaWQgbm90IHJldHVybiBhIG5vZGUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJbml0aWFsRm9jdXNOb2RlKCkge1xuICAgIHZhciBub2RlO1xuICAgIGlmIChnZXROb2RlRm9yT3B0aW9uKCdpbml0aWFsRm9jdXMnKSAhPT0gbnVsbCkge1xuICAgICAgbm9kZSA9IGdldE5vZGVGb3JPcHRpb24oJ2luaXRpYWxGb2N1cycpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbmVyLmNvbnRhaW5zKGRvYy5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgbm9kZSA9IGRvYy5hY3RpdmVFbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gc3RhdGUuZmlyc3RUYWJiYWJsZU5vZGUgfHwgZ2V0Tm9kZUZvck9wdGlvbignZmFsbGJhY2tGb2N1cycpO1xuICAgIH1cblxuICAgIGlmICghbm9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIllvdSBjYW4ndCBoYXZlIGEgZm9jdXMtdHJhcCB3aXRob3V0IGF0IGxlYXN0IG9uZSBmb2N1c2FibGUgZWxlbWVudFwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBkb25lIG9uIG1vdXNlZG93biBhbmQgdG91Y2hzdGFydCBpbnN0ZWFkIG9mIGNsaWNrXG4gIC8vIHNvIHRoYXQgaXQgcHJlY2VkZXMgdGhlIGZvY3VzIGV2ZW50LlxuICBmdW5jdGlvbiBjaGVja1BvaW50ZXJEb3duKGUpIHtcbiAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5zKGUudGFyZ2V0KSkgcmV0dXJuO1xuICAgIGlmIChjb25maWcuY2xpY2tPdXRzaWRlRGVhY3RpdmF0ZXMpIHtcbiAgICAgIGRlYWN0aXZhdGUoe1xuICAgICAgICByZXR1cm5Gb2N1czogIXRhYmJhYmxlLmlzRm9jdXNhYmxlKGUudGFyZ2V0KVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbiBjYXNlIGZvY3VzIGVzY2FwZXMgdGhlIHRyYXAgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIHB1bGwgaXQgYmFjayBpbi5cbiAgZnVuY3Rpb24gY2hlY2tGb2N1c0luKGUpIHtcbiAgICAvLyBJbiBGaXJlZm94IHdoZW4geW91IFRhYiBvdXQgb2YgYW4gaWZyYW1lIHRoZSBEb2N1bWVudCBpcyBicmllZmx5IGZvY3VzZWQuXG4gICAgaWYgKGNvbnRhaW5lci5jb250YWlucyhlLnRhcmdldCkgfHwgZS50YXJnZXQgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIHRyeUZvY3VzKHN0YXRlLm1vc3RSZWNlbnRseUZvY3VzZWROb2RlIHx8IGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0tleShlKSB7XG4gICAgaWYgKGNvbmZpZy5lc2NhcGVEZWFjdGl2YXRlcyAhPT0gZmFsc2UgJiYgaXNFc2NhcGVFdmVudChlKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZGVhY3RpdmF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNUYWJFdmVudChlKSkge1xuICAgICAgY2hlY2tUYWIoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gSGlqYWNrIFRhYiBldmVudHMgb24gdGhlIGZpcnN0IGFuZCBsYXN0IGZvY3VzYWJsZSBub2RlcyBvZiB0aGUgdHJhcCxcbiAgLy8gaW4gb3JkZXIgdG8gcHJldmVudCBmb2N1cyBmcm9tIGVzY2FwaW5nLiBJZiBpdCBlc2NhcGVzIGZvciBldmVuIGFcbiAgLy8gbW9tZW50IGl0IGNhbiBlbmQgdXAgc2Nyb2xsaW5nIHRoZSBwYWdlIGFuZCBjYXVzaW5nIGNvbmZ1c2lvbiBzbyB3ZVxuICAvLyBraW5kIG9mIG5lZWQgdG8gY2FwdHVyZSB0aGUgYWN0aW9uIGF0IHRoZSBrZXlkb3duIHBoYXNlLlxuICBmdW5jdGlvbiBjaGVja1RhYihlKSB7XG4gICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuICAgIGlmIChlLnNoaWZ0S2V5ICYmIGUudGFyZ2V0ID09PSBzdGF0ZS5maXJzdFRhYmJhYmxlTm9kZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdHJ5Rm9jdXMoc3RhdGUubGFzdFRhYmJhYmxlTm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZS5zaGlmdEtleSAmJiBlLnRhcmdldCA9PT0gc3RhdGUubGFzdFRhYmJhYmxlTm9kZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdHJ5Rm9jdXMoc3RhdGUuZmlyc3RUYWJiYWJsZU5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrQ2xpY2soZSkge1xuICAgIGlmIChjb25maWcuY2xpY2tPdXRzaWRlRGVhY3RpdmF0ZXMpIHJldHVybjtcbiAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5zKGUudGFyZ2V0KSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGFiYmFibGVOb2RlcygpIHtcbiAgICB2YXIgdGFiYmFibGVOb2RlcyA9IHRhYmJhYmxlKGNvbnRhaW5lcik7XG4gICAgc3RhdGUuZmlyc3RUYWJiYWJsZU5vZGUgPSB0YWJiYWJsZU5vZGVzWzBdIHx8IGdldEluaXRpYWxGb2N1c05vZGUoKTtcbiAgICBzdGF0ZS5sYXN0VGFiYmFibGVOb2RlID1cbiAgICAgIHRhYmJhYmxlTm9kZXNbdGFiYmFibGVOb2Rlcy5sZW5ndGggLSAxXSB8fCBnZXRJbml0aWFsRm9jdXNOb2RlKCk7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlGb2N1cyhub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IGRvYy5hY3RpdmVFbGVtZW50KSByZXR1cm47XG4gICAgaWYgKCFub2RlIHx8ICFub2RlLmZvY3VzKSB7XG4gICAgICB0cnlGb2N1cyhnZXRJbml0aWFsRm9jdXNOb2RlKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuZm9jdXMoKTtcbiAgICBzdGF0ZS5tb3N0UmVjZW50bHlGb2N1c2VkTm9kZSA9IG5vZGU7XG4gICAgaWYgKGlzU2VsZWN0YWJsZUlucHV0KG5vZGUpKSB7XG4gICAgICBub2RlLnNlbGVjdCgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlbGVjdGFibGVJbnB1dChub2RlKSB7XG4gIHJldHVybiAoXG4gICAgbm9kZS50YWdOYW1lICYmXG4gICAgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiZcbiAgICB0eXBlb2Ygbm9kZS5zZWxlY3QgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNFc2NhcGVFdmVudChlKSB7XG4gIHJldHVybiBlLmtleSA9PT0gJ0VzY2FwZScgfHwgZS5rZXkgPT09ICdFc2MnIHx8IGUua2V5Q29kZSA9PT0gMjc7XG59XG5cbmZ1bmN0aW9uIGlzVGFiRXZlbnQoZSkge1xuICByZXR1cm4gZS5rZXkgPT09ICdUYWInIHx8IGUua2V5Q29kZSA9PT0gOTtcbn1cblxuZnVuY3Rpb24gZGVsYXkoZm4pIHtcbiAgcmV0dXJuIHNldFRpbWVvdXQoZm4sIDApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvY3VzVHJhcDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3172\n")},7648:module=>{"use strict";eval("\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slice.call(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n }\n };\n\n var boundLength = Math.max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs.push('$' + i);\n }\n\n bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY0OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanM/Njg4ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBuby1pbnZhbGlkLXRoaXM6IDEgKi9cblxudmFyIEVSUk9SX01FU1NBR0UgPSAnRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAnO1xudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jVHlwZSA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicgfHwgdG9TdHIuY2FsbCh0YXJnZXQpICE9PSBmdW5jVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUk9SX01FU1NBR0UgKyB0YXJnZXQpO1xuICAgIH1cbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICAgIHZhciBib3VuZDtcbiAgICB2YXIgYmluZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGJvdW5kTGVuZ3RoID0gTWF0aC5tYXgoMCwgdGFyZ2V0Lmxlbmd0aCAtIGFyZ3MubGVuZ3RoKTtcbiAgICB2YXIgYm91bmRBcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZExlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJvdW5kQXJncy5wdXNoKCckJyArIGkpO1xuICAgIH1cblxuICAgIGJvdW5kID0gRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBib3VuZEFyZ3Muam9pbignLCcpICsgJyl7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9JykoYmluZGVyKTtcblxuICAgIGlmICh0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBFbXB0eSgpO1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7648\n")},8612:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar implementation = __webpack_require__(7648);\n\nmodule.exports = Function.prototype.bind || implementation;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYxMi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbmRleC5qcz8wZjdjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8612\n")},5972:module=>{"use strict";eval("\n\nvar functionsHaveNames = function functionsHaveNames() {\n\treturn typeof function f() {}.name === 'string';\n};\n\nvar gOPD = Object.getOwnPropertyDescriptor;\nif (gOPD) {\n\ttry {\n\t\tgOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\tgOPD = null;\n\t}\n}\n\nfunctionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {\n\tif (!functionsHaveNames() || !gOPD) {\n\t\treturn false;\n\t}\n\tvar desc = gOPD(function () {}, 'name');\n\treturn !!desc && !!desc.configurable;\n};\n\nvar $bind = Function.prototype.bind;\n\nfunctionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {\n\treturn functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';\n};\n\nmodule.exports = functionsHaveNames;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk3Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9ucy1oYXZlLW5hbWVzL2luZGV4LmpzPzI1MDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZnVuY3Rpb25zSGF2ZU5hbWVzID0gZnVuY3Rpb24gZnVuY3Rpb25zSGF2ZU5hbWVzKCkge1xuXHRyZXR1cm4gdHlwZW9mIGZ1bmN0aW9uIGYoKSB7fS5uYW1lID09PSAnc3RyaW5nJztcbn07XG5cbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbmlmIChnT1BEKSB7XG5cdHRyeSB7XG5cdFx0Z09QRChbXSwgJ2xlbmd0aCcpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZ09QRFxuXHRcdGdPUEQgPSBudWxsO1xuXHR9XG59XG5cbmZ1bmN0aW9uc0hhdmVOYW1lcy5mdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMgPSBmdW5jdGlvbiBmdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMoKSB7XG5cdGlmICghZnVuY3Rpb25zSGF2ZU5hbWVzKCkgfHwgIWdPUEQpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0dmFyIGRlc2MgPSBnT1BEKGZ1bmN0aW9uICgpIHt9LCAnbmFtZScpO1xuXHRyZXR1cm4gISFkZXNjICYmICEhZGVzYy5jb25maWd1cmFibGU7XG59O1xuXG52YXIgJGJpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcblxuZnVuY3Rpb25zSGF2ZU5hbWVzLmJvdW5kRnVuY3Rpb25zSGF2ZU5hbWVzID0gZnVuY3Rpb24gYm91bmRGdW5jdGlvbnNIYXZlTmFtZXMoKSB7XG5cdHJldHVybiBmdW5jdGlvbnNIYXZlTmFtZXMoKSAmJiB0eXBlb2YgJGJpbmQgPT09ICdmdW5jdGlvbicgJiYgZnVuY3Rpb24gZigpIHt9LmJpbmQoKS5uYW1lICE9PSAnJztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb25zSGF2ZU5hbWVzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5972\n")},210:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar undefined;\n\nvar $SyntaxError = SyntaxError;\nvar $Function = Function;\nvar $TypeError = TypeError;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = Object.getOwnPropertyDescriptor;\nif ($gOPD) {\n\ttry {\n\t\t$gOPD({}, '');\n\t} catch (e) {\n\t\t$gOPD = null; // this is IE 8, which has a broken gOPD\n\t}\n}\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = __webpack_require__(1405)();\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': EvalError,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': Object,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': RangeError,\n\t'%ReferenceError%': ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet\n};\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = __webpack_require__(8612);\nvar hasOwn = __webpack_require__(7642);\nvar $concat = bind.call(Function.call, Array.prototype.concat);\nvar $spliceApply = bind.call(Function.apply, Array.prototype.splice);\nvar $replace = bind.call(Function.call, String.prototype.replace);\nvar $strSlice = bind.call(Function.call, String.prototype.slice);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEwLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2dldC1pbnRyaW5zaWMvaW5kZXguanM/MDBjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBTeW50YXhFcnJvcjtcbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRCh7fSwgJycpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0JGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG5cdH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguX19wcm90b19fOyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cbnZhciBuZWVkc0V2YWwgPSB7fTtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdCclQWdncmVnYXRlRXJyb3IlJzogdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFnZ3JlZ2F0ZUVycm9yLFxuXHQnJUFycmF5JSc6IEFycmF5LFxuXHQnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogbmVlZHNFdmFsLFxuXHQnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyVCaWdJbnQlJzogdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQsXG5cdCclQm9vbGVhbiUnOiBCb29sZWFuLFxuXHQnJURhdGFWaWV3JSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBEYXRhVmlldyxcblx0JyVEYXRlJSc6IERhdGUsXG5cdCclZGVjb2RlVVJJJSc6IGRlY29kZVVSSSxcblx0JyVkZWNvZGVVUklDb21wb25lbnQlJzogZGVjb2RlVVJJQ29tcG9uZW50LFxuXHQnJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG5cdCclZW5jb2RlVVJJQ29tcG9uZW50JSc6IGVuY29kZVVSSUNvbXBvbmVudCxcblx0JyVFcnJvciUnOiBFcnJvcixcblx0JyVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJUV2YWxFcnJvciUnOiBFdmFsRXJyb3IsXG5cdCclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyVGaW5hbGl6YXRpb25SZWdpc3RyeSUnOiB0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmluYWxpemF0aW9uUmVnaXN0cnksXG5cdCclRnVuY3Rpb24lJzogJEZ1bmN0aW9uLFxuXHQnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyVpc05hTiUnOiBpc05hTixcblx0JyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkLFxuXHQnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBNYXAoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJU1hdGglJzogTWF0aCxcblx0JyVOdW1iZXIlJzogTnVtYmVyLFxuXHQnJU9iamVjdCUnOiBPYmplY3QsXG5cdCclcGFyc2VGbG9hdCUnOiBwYXJzZUZsb2F0LFxuXHQnJXBhcnNlSW50JSc6IHBhcnNlSW50LFxuXHQnJVByb21pc2UlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZSxcblx0JyVQcm94eSUnOiB0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJveHksXG5cdCclUmFuZ2VFcnJvciUnOiBSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6IFJlZmVyZW5jZUVycm9yLFxuXHQnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyVTdHJpbmclJzogU3RyaW5nLFxuXHQnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJVN5bnRheEVycm9yJSc6ICRTeW50YXhFcnJvcixcblx0JyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG5cdCclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uYXBwbHksIEFycmF5LnByb3RvdHlwZS5zcGxpY2UpO1xudmFyICRyZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcblx0dmFyIGludHJpbnNpY0Jhc2VOYW1lID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJyc7XG5cblx0dmFyIGludHJpbnNpYyA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cdHZhciBpbnRyaW5zaWNSZWFsTmFtZSA9IGludHJpbnNpYy5uYW1lO1xuXHR2YXIgdmFsdWUgPSBpbnRyaW5zaWMudmFsdWU7XG5cdHZhciBza2lwRnVydGhlckNhY2hpbmcgPSBmYWxzZTtcblxuXHR2YXIgYWxpYXMgPSBpbnRyaW5zaWMuYWxpYXM7XG5cdGlmIChhbGlhcykge1xuXHRcdGludHJpbnNpY0Jhc2VOYW1lID0gYWxpYXNbMF07XG5cdFx0JHNwbGljZUFwcGx5KHBhcnRzLCAkY29uY2F0KFswLCAxXSwgYWxpYXMpKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAxLCBpc093biA9IHRydWU7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBwYXJ0ID0gcGFydHNbaV07XG5cdFx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHBhcnQsIDAsIDEpO1xuXHRcdHZhciBsYXN0ID0gJHN0clNsaWNlKHBhcnQsIC0xKTtcblx0XHRpZiAoXG5cdFx0XHQoXG5cdFx0XHRcdChmaXJzdCA9PT0gJ1wiJyB8fCBmaXJzdCA9PT0gXCInXCIgfHwgZmlyc3QgPT09ICdgJylcblx0XHRcdFx0fHwgKGxhc3QgPT09ICdcIicgfHwgbGFzdCA9PT0gXCInXCIgfHwgbGFzdCA9PT0gJ2AnKVxuXHRcdFx0KVxuXHRcdFx0JiYgZmlyc3QgIT09IGxhc3Rcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Byb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMnKTtcblx0XHR9XG5cdFx0aWYgKHBhcnQgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWlzT3duKSB7XG5cdFx0XHRza2lwRnVydGhlckNhY2hpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGludHJpbnNpY0Jhc2VOYW1lICs9ICcuJyArIHBhcnQ7XG5cdFx0aW50cmluc2ljUmVhbE5hbWUgPSAnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJztcblxuXHRcdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljUmVhbE5hbWUpKSB7XG5cdFx0XHR2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0aWYgKCEocGFydCBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0aWYgKCFhbGxvd01pc3NpbmcpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGdPUEQgJiYgKGkgKyAxKSA+PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdGlzT3duID0gISFkZXNjO1xuXG5cdFx0XHRcdC8vIEJ5IGNvbnZlbnRpb24sIHdoZW4gYSBkYXRhIHByb3BlcnR5IGlzIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvclxuXHRcdFx0XHQvLyBwcm9wZXJ0eSB0byBlbXVsYXRlIGEgZGF0YSBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IHN1ZmZlciBmcm9tXG5cdFx0XHRcdC8vIHRoZSBvdmVycmlkZSBtaXN0YWtlLCB0aGF0IGFjY2Vzc29yJ3MgZ2V0dGVyIGlzIG1hcmtlZCB3aXRoXG5cdFx0XHRcdC8vIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eS4gSGVyZSwgd2hlbiB3ZSBkZXRlY3QgdGhpcywgd2Vcblx0XHRcdFx0Ly8gdXBob2xkIHRoZSBpbGx1c2lvbiBieSBwcmV0ZW5kaW5nIHRvIHNlZSB0aGF0IG9yaWdpbmFsIGRhdGFcblx0XHRcdFx0Ly8gcHJvcGVydHksIGkuZS4sIHJldHVybmluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdldHRlclxuXHRcdFx0XHQvLyBpdHNlbGYuXG5cdFx0XHRcdGlmIChpc093biAmJiAnZ2V0JyBpbiBkZXNjICYmICEoJ29yaWdpbmFsVmFsdWUnIGluIGRlc2MuZ2V0KSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVzYy5nZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXNPd24gPSBoYXNPd24odmFsdWUsIHBhcnQpO1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPd24gJiYgIXNraXBGdXJ0aGVyQ2FjaGluZykge1xuXHRcdFx0XHRJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///210\n")},1044:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar GetIntrinsic = __webpack_require__(210);\n\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\n\nvar hasPropertyDescriptors = function hasPropertyDescriptors() {\n\tif ($defineProperty) {\n\t\ttry {\n\t\t\t$defineProperty({}, 'a', { value: 1 });\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\t// IE 8 has a broken defineProperty\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn false;\n};\n\nhasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {\n\t// node v0.6 has a bug where array lengths can be Set but not Defined\n\tif (!hasPropertyDescriptors()) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn $defineProperty([], 'length', { value: 1 }).length !== 1;\n\t} catch (e) {\n\t\t// In Firefox 4-22, defining length on an array throws an exception.\n\t\treturn true;\n\t}\n};\n\nmodule.exports = hasPropertyDescriptors;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9oYXMtcHJvcGVydHktZGVzY3JpcHRvcnMvaW5kZXguanM/NjRiMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZGVmaW5lUHJvcGVydHklJywgdHJ1ZSk7XG5cbnZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3JzID0gZnVuY3Rpb24gaGFzUHJvcGVydHlEZXNjcmlwdG9ycygpIHtcblx0aWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdHRyeSB7XG5cdFx0XHQkZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyB2YWx1ZTogMSB9KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGRlZmluZVByb3BlcnR5XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5cbmhhc1Byb3BlcnR5RGVzY3JpcHRvcnMuaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWcgPSBmdW5jdGlvbiBoYXNBcnJheUxlbmd0aERlZmluZUJ1ZygpIHtcblx0Ly8gbm9kZSB2MC42IGhhcyBhIGJ1ZyB3aGVyZSBhcnJheSBsZW5ndGhzIGNhbiBiZSBTZXQgYnV0IG5vdCBEZWZpbmVkXG5cdGlmICghaGFzUHJvcGVydHlEZXNjcmlwdG9ycygpKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0dHJ5IHtcblx0XHRyZXR1cm4gJGRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB2YWx1ZTogMSB9KS5sZW5ndGggIT09IDE7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBGaXJlZm94IDQtMjIsIGRlZmluaW5nIGxlbmd0aCBvbiBhbiBhcnJheSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1044\n")},1405:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = __webpack_require__(5419);\n\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQwNS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL2luZGV4LmpzPzUxNTYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHJldHVybiBoYXNTeW1ib2xTaGFtKCk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1405\n")},5419:module=>{"use strict";eval("\n\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(obj, sym);\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQxOS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcz8xNjk2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IGNvbXBsZXhpdHk6IFsyLCAxOF0sIG1heC1zdGF0ZW1lbnRzOiBbMiwgMzNdICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1N5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHsgcmV0dXJuIHRydWU7IH1cblxuXHR2YXIgb2JqID0ge307XG5cdHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcblx0dmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXHRpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG5cdC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuXHQvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltVmFsID0gNDI7XG5cdG9ialtzeW1dID0gc3ltVmFsO1xuXHRmb3IgKHN5bSBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLXVucmVhY2hhYmxlLWxvb3Bcblx0aWYgKHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuXHRpZiAoc3ltcy5sZW5ndGggIT09IDEgfHwgc3ltc1swXSAhPT0gc3ltKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pO1xuXHRcdGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5419\n")},6410:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar hasSymbols = __webpack_require__(5419);\n\nmodule.exports = function hasToStringTagShams() {\n\treturn hasSymbols() && !!Symbol.toStringTag;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQxMC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2hhcy10b3N0cmluZ3RhZy9zaGFtcy5qcz8wN2E0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scy9zaGFtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1RvU3RyaW5nVGFnU2hhbXMoKSB7XG5cdHJldHVybiBoYXNTeW1ib2xzKCkgJiYgISFTeW1ib2wudG9TdHJpbmdUYWc7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6410\n")},7642:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar bind = __webpack_require__(8612);\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY0Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvaGFzL3NyYy9pbmRleC5qcz9hMGQzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7642\n")},1143:module=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {}\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE0My5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9pbnZhcmlhbnQvYnJvd3Nlci5qcz80MGI2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgaW52YXJpYW50ID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAnTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArXG4gICAgICAgICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7IHJldHVybiBhcmdzW2FyZ0luZGV4KytdOyB9KVxuICAgICAgKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1143\n")},2584:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar hasToStringTag = __webpack_require__(6410)();\nvar callBound = __webpack_require__(1924);\n\nvar $toString = callBound('Object.prototype.toString');\n\nvar isStandardArguments = function isArguments(value) {\n\tif (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {\n\t\treturn false;\n\t}\n\treturn $toString(value) === '[object Arguments]';\n};\n\nvar isLegacyArguments = function isArguments(value) {\n\tif (isStandardArguments(value)) {\n\t\treturn true;\n\t}\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.length === 'number' &&\n\t\tvalue.length >= 0 &&\n\t\t$toString(value) !== '[object Array]' &&\n\t\t$toString(value.callee) === '[object Function]';\n};\n\nvar supportsStandardArguments = (function () {\n\treturn isStandardArguments(arguments);\n}());\n\nisStandardArguments.isLegacyArguments = isLegacyArguments; // for tests\n\nmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU4NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9pcy1hcmd1bWVudHMvaW5kZXguanM/ZTM5YyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xuXG52YXIgJHRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG5cbnZhciBpc1N0YW5kYXJkQXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcblx0aWYgKGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiAkdG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn07XG5cbnZhciBpc0xlZ2FjeUFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdGlmIChpc1N0YW5kYXJkQXJndW1lbnRzKHZhbHVlKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJlxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcblx0XHR0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJyAmJlxuXHRcdHZhbHVlLmxlbmd0aCA+PSAwICYmXG5cdFx0JHRvU3RyaW5nKHZhbHVlKSAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJlxuXHRcdCR0b1N0cmluZyh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcblxudmFyIHN1cHBvcnRzU3RhbmRhcmRBcmd1bWVudHMgPSAoZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gaXNTdGFuZGFyZEFyZ3VtZW50cyhhcmd1bWVudHMpO1xufSgpKTtcblxuaXNTdGFuZGFyZEFyZ3VtZW50cy5pc0xlZ2FjeUFyZ3VtZW50cyA9IGlzTGVnYWN5QXJndW1lbnRzOyAvLyBmb3IgdGVzdHNcblxubW9kdWxlLmV4cG9ydHMgPSBzdXBwb3J0c1N0YW5kYXJkQXJndW1lbnRzID8gaXNTdGFuZGFyZEFyZ3VtZW50cyA6IGlzTGVnYWN5QXJndW1lbnRzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2584\n")},8738:module=>{eval("/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODczOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanM/MDQ0YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXJcbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8738\n")},8923:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar getDay = Date.prototype.getDay;\nvar tryDateObject = function tryDateGetDayCall(value) {\n\ttry {\n\t\tgetDay.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar toStr = Object.prototype.toString;\nvar dateClass = '[object Date]';\nvar hasToStringTag = __webpack_require__(6410)();\n\nmodule.exports = function isDateObject(value) {\n\tif (typeof value !== 'object' || value === null) {\n\t\treturn false;\n\t}\n\treturn hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkyMy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2lzLWRhdGUtb2JqZWN0L2luZGV4LmpzPzBlNjUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0RGF5ID0gRGF0ZS5wcm90b3R5cGUuZ2V0RGF5O1xudmFyIHRyeURhdGVPYmplY3QgPSBmdW5jdGlvbiB0cnlEYXRlR2V0RGF5Q2FsbCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGdldERheS5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gaGFzVG9TdHJpbmdUYWcgPyB0cnlEYXRlT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBkYXRlQ2xhc3M7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8923\n")},8420:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar callBound = __webpack_require__(1924);\nvar hasToStringTag = __webpack_require__(6410)();\nvar has;\nvar $exec;\nvar isRegexMarker;\nvar badStringifier;\n\nif (hasToStringTag) {\n\thas = callBound('Object.prototype.hasOwnProperty');\n\t$exec = callBound('RegExp.prototype.exec');\n\tisRegexMarker = {};\n\n\tvar throwRegexMarker = function () {\n\t\tthrow isRegexMarker;\n\t};\n\tbadStringifier = {\n\t\ttoString: throwRegexMarker,\n\t\tvalueOf: throwRegexMarker\n\t};\n\n\tif (typeof Symbol.toPrimitive === 'symbol') {\n\t\tbadStringifier[Symbol.toPrimitive] = throwRegexMarker;\n\t}\n}\n\nvar $toString = callBound('Object.prototype.toString');\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar regexClass = '[object RegExp]';\n\nmodule.exports = hasToStringTag\n\t// eslint-disable-next-line consistent-return\n\t? function isRegex(value) {\n\t\tif (!value || typeof value !== 'object') {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar descriptor = gOPD(value, 'lastIndex');\n\t\tvar hasLastIndexDataProperty = descriptor && has(descriptor, 'value');\n\t\tif (!hasLastIndexDataProperty) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t$exec(value, badStringifier);\n\t\t} catch (e) {\n\t\t\treturn e === isRegexMarker;\n\t\t}\n\t}\n\t: function isRegex(value) {\n\t\t// In older browsers, typeof regex incorrectly returns 'function'\n\t\tif (!value || (typeof value !== 'object' && typeof value !== 'function')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn $toString(value) === regexClass;\n\t};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQyMC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL2lzLXJlZ2V4L2luZGV4LmpzP2Q4ZDgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBoYXM7XG52YXIgJGV4ZWM7XG52YXIgaXNSZWdleE1hcmtlcjtcbnZhciBiYWRTdHJpbmdpZmllcjtcblxuaWYgKGhhc1RvU3RyaW5nVGFnKSB7XG5cdGhhcyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eScpO1xuXHQkZXhlYyA9IGNhbGxCb3VuZCgnUmVnRXhwLnByb3RvdHlwZS5leGVjJyk7XG5cdGlzUmVnZXhNYXJrZXIgPSB7fTtcblxuXHR2YXIgdGhyb3dSZWdleE1hcmtlciA9IGZ1bmN0aW9uICgpIHtcblx0XHR0aHJvdyBpc1JlZ2V4TWFya2VyO1xuXHR9O1xuXHRiYWRTdHJpbmdpZmllciA9IHtcblx0XHR0b1N0cmluZzogdGhyb3dSZWdleE1hcmtlcixcblx0XHR2YWx1ZU9mOiB0aHJvd1JlZ2V4TWFya2VyXG5cdH07XG5cblx0aWYgKHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgPT09ICdzeW1ib2wnKSB7XG5cdFx0YmFkU3RyaW5naWZpZXJbU3ltYm9sLnRvUHJpbWl0aXZlXSA9IHRocm93UmVnZXhNYXJrZXI7XG5cdH1cbn1cblxudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIHJlZ2V4Q2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJztcblxubW9kdWxlLmV4cG9ydHMgPSBoYXNUb1N0cmluZ1RhZ1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0PyBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7XG5cdFx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKHZhbHVlLCAnbGFzdEluZGV4Jyk7XG5cdFx0dmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRcdGlmICghaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdCRleGVjKHZhbHVlLCBiYWRTdHJpbmdpZmllcik7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGUgPT09IGlzUmVnZXhNYXJrZXI7XG5cdFx0fVxuXHR9XG5cdDogZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuXHRcdC8vIEluIG9sZGVyIGJyb3dzZXJzLCB0eXBlb2YgcmVnZXggaW5jb3JyZWN0bHkgcmV0dXJucyAnZnVuY3Rpb24nXG5cdFx0aWYgKCF2YWx1ZSB8fCAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICR0b1N0cmluZyh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG5cdH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8420\n")},7465:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"KY\": () => (/* binding */ normalizeCondition),\n/* harmony export */ \"Nj\": () => (/* binding */ matchValuesWithCondition)\n/* harmony export */ });\n/* unused harmony export opg */\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar slicedToArray = function () {\n function sliceIterator(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n}();\n\nvar toArray = function (arr) {\n return Array.isArray(arr) ? arr : Array.from(arr);\n};\n\n/**\n * Get nested property value\n *\n * Usage:\n * var obj = {foo: {bar: 'ok'}};\n * opg('foo/bar', obj); // 'ok'\n *\n * @param {String} properties 'a.b.c'\n * @param {Object} obj\n * @param {*} [defaultValue] If property will not exist\n * @param {String} [delimiter] Default '/'\n */\nvar opg = function opg(properties, obj, defaultValue) {\n var delimiter = '/';\n\n if (typeof properties == 'string') {\n properties = properties.split(delimiter);\n } else {\n properties = [properties];\n }\n\n var property = properties.shift();\n\n if (!obj || typeof obj[property] == 'undefined') {\n return defaultValue;\n }\n\n if (properties.length) {\n properties = properties.join(delimiter);\n\n return opg(properties, obj[property], defaultValue, delimiter);\n } else {\n return obj[property];\n }\n};\n\nvar propertiesWithoutLast = function propertiesWithoutLast(properties) {\n var delimiter = '/';\n\n if (typeof properties == 'string') {\n properties = properties.split(delimiter);\n }\n\n if (properties.length > 1) {\n properties.pop();\n }\n\n return properties;\n};\n\nvar normalizeCondition = function normalizeCondition(conditionDescriptor) {\n if (!conditionDescriptor.all) {\n if (!conditionDescriptor.any) {\n conditionDescriptor = {\n all: conditionDescriptor\n };\n }\n }\n\n return conditionDescriptor;\n};\n\n/**\n * Support:\n *\n * // TODO: maybe implement short circuits for conditions\n *\n * {\n * 'path/to/elem': 'exact_value',\n * 'path/to/other_elem': '! negated_exact_value',\n * 'path/to/other_elem_1': 'first_val | second_val | third_possible_val',\n * 'path/to/other_elem_2': '! first_val | second_val',\n * }\n */\nvar matchValuesWithCondition = function matchValuesWithCondition(conditionDescriptor, inferedValuesForContext) {\n var conditionsObject = Object.values(conditionDescriptor)[0];\n\n var maybeGetMatcher = function maybeGetMatcher(matcher) {\n if (matcher.length > 4) {\n return false;\n }\n\n if (matcher.indexOf('any') === 0) {\n return 'any';\n }\n\n if (matcher.indexOf('all') === 0) {\n return 'all';\n }\n\n return false;\n };\n\n var valuesToCheck = Object.keys(conditionsObject).map(function (singleOptionPath, index) {\n var maybeThat = Object.values(conditionsObject)[index];\n\n if (maybeGetMatcher(singleOptionPath) === 'all' || maybeGetMatcher(singleOptionPath) === 'any') {\n return matchValuesWithCondition(defineProperty({}, singleOptionPath, maybeThat), inferedValuesForContext);\n }\n\n return tryToMatchValueWithOptionPath(maybeThat, singleOptionPath, inferedValuesForContext);\n });\n\n if (maybeGetMatcher(Object.keys(conditionDescriptor)[0]) === 'all') {\n return valuesToCheck.every(function (v) {\n return !!v;\n });\n }\n\n if (maybeGetMatcher(Object.keys(conditionDescriptor)[0]) === 'any') {\n return valuesToCheck.some(function (v) {\n return !!v;\n });\n }\n};\n\nfunction extractScalarValueFor(singleOptionPath, inferedValuesForContext) {\n var getAsInfered = function getAsInfered(path) {\n var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : inferedValuesForContext;\n return opg(path, values);\n };\n\n if (singleOptionPath.indexOf(':') > -1) {\n /**\n * Congrats, gentlemans, we are having a custom matcher here\n * To be honest, this is the dumbest thing I can figure out right now.\n * There probably is a better way to handle that. One could go about\n * getting an interface here or smth like that.\n *\n * WARNING: Hardcoded to ct-select.\n * Also doesn't work with ct-inherit, will report the value\n * incorrectly. Will be fixed properly when implementing the context\n * asbtraction properly.\n *\n * choices matcher\n * option_id:choices => LENGTH\n */\n\n var value = null;(function (thing, cb) {\n return cb(thing);\n })(singleOptionPath.split(':'), function (_ref) {\n var _ref2 = toArray(_ref),\n singleOptionPath = _ref2[0],\n matcher = _ref2.slice(1);\n\n // TODO: start implementing matchers after we are done with\n // everything else with Vue renderer\n\n matcher = matcher.join(':');\n\n if (matcher === 'visibility') {\n value = getAsInfered(singleOptionPath, _extends({}, inferedValuesForContext, defineProperty({}, propertiesWithoutLast(singleOptionPath), opg(propertiesWithoutLast(singleOptionPath), inferedValuesForContext)[inferedValuesForContext.wp_customizer_current_view] ? 'yes' : 'no')));\n }\n\n if (matcher === 'responsive') {\n value = getAsInfered(singleOptionPath, _extends({}, inferedValuesForContext, defineProperty({}, propertiesWithoutLast(singleOptionPath), opg(propertiesWithoutLast(singleOptionPath), inferedValuesForContext)[inferedValuesForContext.wp_customizer_current_view] || opg(propertiesWithoutLast(singleOptionPath), inferedValuesForContext))));\n }\n\n if (matcher === 'truthy') {\n value = !!getAsInfered(singleOptionPath) ? 'yes' : 'no';\n }\n\n if (matcher.indexOf('array-ids:') > -1) {\n var _matcher$split = matcher.split(':'),\n _matcher$split2 = slicedToArray(_matcher$split, 3),\n _ = _matcher$split2[0],\n id = _matcher$split2[1],\n path = _matcher$split2[2];\n\n var _properValue = getAsInfered(singleOptionPath).find(function (v) {\n return v.id === id;\n });\n\n value = !_properValue ? 'no' : opg(path, _properValue) || 'no';\n }\n\n if (matcher.indexOf('json:') > -1) {\n value = getAsInfered(singleOptionPath + '/' + matcher.split(':')[1]).toString();\n }\n\n if (matcher === 'array_length') {\n var _properValue2 = getAsInfered(singleOptionPath);\n\n value = (_properValue2 || []).length.toString();\n }\n\n if (!value) {\n throw new Error('Unknown matcher received. Please verify for typos. The received matcher: ' + matcher + '.');\n }\n });\n\n /**\n * Matcher got _matched_.\n */\n if (value) {\n return value;\n } else {\n // Fall back to raw value check, but omit the matcher.\n singleOptionPath = singleOptionPath.split(':')[0];\n }\n }\n\n var properValue = getAsInfered(singleOptionPath);\n\n if (!properValue) return false;\n\n if (properValue.desktop) {\n return properValue;\n }\n\n return properValue.toString();\n}\n\nfunction tryToMatchValueWithOptionPath(maybeThat, singleOptionPath, inferedValuesForContext) {\n var properValue = extractScalarValueFor(singleOptionPath, inferedValuesForContext);\n\n if (maybeThat && maybeThat.toString() && maybeThat.toString().indexOf('~') === 0) {\n var toMatch = maybeThat.replace('~', '');\n\n if (properValue.desktop) {\n return properValue.desktop === toMatch || properValue.tablet === toMatch || properValue.mobile === toMatch;\n }\n\n return properValue === toMatch;\n }\n\n properValue = properValue.toString();\n maybeThat = maybeThat.toString();\n\n /**\n * The context value is not yet stabilized\n */\n if (!properValue) return false;\n\n /**\n * Pipe operator\n */\n if (maybeThat.indexOf('|') > -1) {\n if (maybeThat.indexOf('!') === 0) {\n return maybeThat.substring(1).split('|').map(function (el) {\n return el.trim();\n }).includes(properValue.trim()) === -1;\n } else {\n return maybeThat.split('|').map(function (el) {\n return el.trim();\n }).indexOf(properValue.trim()) > -1;\n }\n }\n\n /**\n * Negation operator\n */\n if (maybeThat.indexOf('!') === 0) {\n return properValue !== maybeThat.substring(1).trim();\n }\n\n /**\n * Contains operator\n */\n if (maybeThat.indexOf('*') === 0) {\n return properValue.indexOf(maybeThat.trim().substring(1).trim()) > -1;\n }\n\n /**\n * Simple equality\n */\n return properValue === maybeThat.trim();\n}\n\n\n//# sourceMappingURL=index.es.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQ2NS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL21hdGNoLWNvbmRpdGlvbnMvZGlzdC9pbmRleC5lcy5qcz82NThjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBzbGljZWRUb0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkge1xuICAgIHZhciBfYXJyID0gW107XG4gICAgdmFyIF9uID0gdHJ1ZTtcbiAgICB2YXIgX2QgPSBmYWxzZTtcbiAgICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9kID0gdHJ1ZTtcbiAgICAgIF9lID0gZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2FycjtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkge1xuICAgICAgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG4gICAgfVxuICB9O1xufSgpO1xuXG52YXIgdG9BcnJheSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSA/IGFyciA6IEFycmF5LmZyb20oYXJyKTtcbn07XG5cbi8qKlxuICogR2V0IG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZVxuICpcbiAqIFVzYWdlOlxuICogdmFyIG9iaiA9IHtmb286IHtiYXI6ICdvayd9fTtcbiAqIG9wZygnZm9vL2JhcicsIG9iaik7IC8vICdvaydcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydGllcyAnYS5iLmMnXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIElmIHByb3BlcnR5IHdpbGwgbm90IGV4aXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gW2RlbGltaXRlcl0gRGVmYXVsdCAnLydcbiAqL1xudmFyIG9wZyA9IGZ1bmN0aW9uIG9wZyhwcm9wZXJ0aWVzLCBvYmosIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgZGVsaW1pdGVyID0gJy8nO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydGllcyA9PSAnc3RyaW5nJykge1xuICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLnNwbGl0KGRlbGltaXRlcik7XG4gIH0gZWxzZSB7XG4gICAgcHJvcGVydGllcyA9IFtwcm9wZXJ0aWVzXTtcbiAgfVxuXG4gIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuc2hpZnQoKTtcblxuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqW3Byb3BlcnR5XSA9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBpZiAocHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcy5qb2luKGRlbGltaXRlcik7XG5cbiAgICByZXR1cm4gb3BnKHByb3BlcnRpZXMsIG9ialtwcm9wZXJ0eV0sIGRlZmF1bHRWYWx1ZSwgZGVsaW1pdGVyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqW3Byb3BlcnR5XTtcbiAgfVxufTtcblxudmFyIHByb3BlcnRpZXNXaXRob3V0TGFzdCA9IGZ1bmN0aW9uIHByb3BlcnRpZXNXaXRob3V0TGFzdChwcm9wZXJ0aWVzKSB7XG4gIHZhciBkZWxpbWl0ZXIgPSAnLyc7XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09ICdzdHJpbmcnKSB7XG4gICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMuc3BsaXQoZGVsaW1pdGVyKTtcbiAgfVxuXG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA+IDEpIHtcbiAgICBwcm9wZXJ0aWVzLnBvcCgpO1xuICB9XG5cbiAgcmV0dXJuIHByb3BlcnRpZXM7XG59O1xuXG52YXIgbm9ybWFsaXplQ29uZGl0aW9uID0gZnVuY3Rpb24gbm9ybWFsaXplQ29uZGl0aW9uKGNvbmRpdGlvbkRlc2NyaXB0b3IpIHtcbiAgaWYgKCFjb25kaXRpb25EZXNjcmlwdG9yLmFsbCkge1xuICAgIGlmICghY29uZGl0aW9uRGVzY3JpcHRvci5hbnkpIHtcbiAgICAgIGNvbmRpdGlvbkRlc2NyaXB0b3IgPSB7XG4gICAgICAgIGFsbDogY29uZGl0aW9uRGVzY3JpcHRvclxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9uRGVzY3JpcHRvcjtcbn07XG5cbi8qKlxuICogU3VwcG9ydDpcbiAqXG4gKiAvLyBUT0RPOiBtYXliZSBpbXBsZW1lbnQgc2hvcnQgY2lyY3VpdHMgZm9yIGNvbmRpdGlvbnNcbiAqXG4gKiB7XG4gKiAgICdwYXRoL3RvL2VsZW0nOiAgICAgICAgICdleGFjdF92YWx1ZScsXG4gKiAgICdwYXRoL3RvL290aGVyX2VsZW0nOiAgICchIG5lZ2F0ZWRfZXhhY3RfdmFsdWUnLFxuICogICAncGF0aC90by9vdGhlcl9lbGVtXzEnOiAnZmlyc3RfdmFsIHwgc2Vjb25kX3ZhbCB8IHRoaXJkX3Bvc3NpYmxlX3ZhbCcsXG4gKiAgICdwYXRoL3RvL290aGVyX2VsZW1fMic6ICchIGZpcnN0X3ZhbCB8IHNlY29uZF92YWwnLFxuICogfVxuICovXG52YXIgbWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uID0gZnVuY3Rpb24gbWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uKGNvbmRpdGlvbkRlc2NyaXB0b3IsIGluZmVyZWRWYWx1ZXNGb3JDb250ZXh0KSB7XG4gIHZhciBjb25kaXRpb25zT2JqZWN0ID0gT2JqZWN0LnZhbHVlcyhjb25kaXRpb25EZXNjcmlwdG9yKVswXTtcblxuICB2YXIgbWF5YmVHZXRNYXRjaGVyID0gZnVuY3Rpb24gbWF5YmVHZXRNYXRjaGVyKG1hdGNoZXIpIHtcbiAgICBpZiAobWF0Y2hlci5sZW5ndGggPiA0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoZXIuaW5kZXhPZignYW55JykgPT09IDApIHtcbiAgICAgIHJldHVybiAnYW55JztcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hlci5pbmRleE9mKCdhbGwnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuICdhbGwnO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB2YXIgdmFsdWVzVG9DaGVjayA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbnNPYmplY3QpLm1hcChmdW5jdGlvbiAoc2luZ2xlT3B0aW9uUGF0aCwgaW5kZXgpIHtcbiAgICB2YXIgbWF5YmVUaGF0ID0gT2JqZWN0LnZhbHVlcyhjb25kaXRpb25zT2JqZWN0KVtpbmRleF07XG5cbiAgICBpZiAobWF5YmVHZXRNYXRjaGVyKHNpbmdsZU9wdGlvblBhdGgpID09PSAnYWxsJyB8fCBtYXliZUdldE1hdGNoZXIoc2luZ2xlT3B0aW9uUGF0aCkgPT09ICdhbnknKSB7XG4gICAgICByZXR1cm4gbWF0Y2hWYWx1ZXNXaXRoQ29uZGl0aW9uKGRlZmluZVByb3BlcnR5KHt9LCBzaW5nbGVPcHRpb25QYXRoLCBtYXliZVRoYXQpLCBpbmZlcmVkVmFsdWVzRm9yQ29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyeVRvTWF0Y2hWYWx1ZVdpdGhPcHRpb25QYXRoKG1heWJlVGhhdCwgc2luZ2xlT3B0aW9uUGF0aCwgaW5mZXJlZFZhbHVlc0ZvckNvbnRleHQpO1xuICB9KTtcblxuICBpZiAobWF5YmVHZXRNYXRjaGVyKE9iamVjdC5rZXlzKGNvbmRpdGlvbkRlc2NyaXB0b3IpWzBdKSA9PT0gJ2FsbCcpIHtcbiAgICByZXR1cm4gdmFsdWVzVG9DaGVjay5ldmVyeShmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuICEhdjtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChtYXliZUdldE1hdGNoZXIoT2JqZWN0LmtleXMoY29uZGl0aW9uRGVzY3JpcHRvcilbMF0pID09PSAnYW55Jykge1xuICAgIHJldHVybiB2YWx1ZXNUb0NoZWNrLnNvbWUoZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiAhIXY7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGV4dHJhY3RTY2FsYXJWYWx1ZUZvcihzaW5nbGVPcHRpb25QYXRoLCBpbmZlcmVkVmFsdWVzRm9yQ29udGV4dCkge1xuICB2YXIgZ2V0QXNJbmZlcmVkID0gZnVuY3Rpb24gZ2V0QXNJbmZlcmVkKHBhdGgpIHtcbiAgICB2YXIgdmFsdWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBpbmZlcmVkVmFsdWVzRm9yQ29udGV4dDtcbiAgICByZXR1cm4gb3BnKHBhdGgsIHZhbHVlcyk7XG4gIH07XG5cbiAgaWYgKHNpbmdsZU9wdGlvblBhdGguaW5kZXhPZignOicpID4gLTEpIHtcbiAgICAvKipcbiAgICAgKiBDb25ncmF0cywgZ2VudGxlbWFucywgd2UgYXJlIGhhdmluZyBhIGN1c3RvbSBtYXRjaGVyIGhlcmVcbiAgICAgKiBUbyBiZSBob25lc3QsIHRoaXMgaXMgdGhlIGR1bWJlc3QgdGhpbmcgSSBjYW4gZmlndXJlIG91dCByaWdodCBub3cuXG4gICAgICogVGhlcmUgcHJvYmFibHkgaXMgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGF0LiBPbmUgY291bGQgZ28gYWJvdXRcbiAgICAgKiBnZXR0aW5nIGFuIGludGVyZmFjZSBoZXJlIG9yIHNtdGggbGlrZSB0aGF0LlxuICAgICAqXG4gICAgICogV0FSTklORzogSGFyZGNvZGVkIHRvIGN0LXNlbGVjdC5cbiAgICAgKiBBbHNvIGRvZXNuJ3Qgd29yayB3aXRoIGN0LWluaGVyaXQsIHdpbGwgcmVwb3J0IHRoZSB2YWx1ZVxuICAgICAqIGluY29ycmVjdGx5LiBXaWxsIGJlIGZpeGVkIHByb3Blcmx5IHdoZW4gaW1wbGVtZW50aW5nIHRoZSBjb250ZXh0XG4gICAgICogYXNidHJhY3Rpb24gcHJvcGVybHkuXG4gICAgICpcbiAgICAgKiBjaG9pY2VzIG1hdGNoZXJcbiAgICAgKiBvcHRpb25faWQ6Y2hvaWNlcyA9PiBMRU5HVEhcbiAgICAgKi9cblxuICAgIHZhciB2YWx1ZSA9IG51bGw7KGZ1bmN0aW9uICh0aGluZywgY2IpIHtcbiAgICAgIHJldHVybiBjYih0aGluZyk7XG4gICAgfSkoc2luZ2xlT3B0aW9uUGF0aC5zcGxpdCgnOicpLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9yZWYyID0gdG9BcnJheShfcmVmKSxcbiAgICAgICAgICBzaW5nbGVPcHRpb25QYXRoID0gX3JlZjJbMF0sXG4gICAgICAgICAgbWF0Y2hlciA9IF9yZWYyLnNsaWNlKDEpO1xuXG4gICAgICAvLyBUT0RPOiBzdGFydCBpbXBsZW1lbnRpbmcgbWF0Y2hlcnMgYWZ0ZXIgd2UgYXJlIGRvbmUgd2l0aFxuICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIHdpdGggVnVlIHJlbmRlcmVyXG5cbiAgICAgIG1hdGNoZXIgPSBtYXRjaGVyLmpvaW4oJzonKTtcblxuICAgICAgaWYgKG1hdGNoZXIgPT09ICd2aXNpYmlsaXR5Jykge1xuICAgICAgICB2YWx1ZSA9IGdldEFzSW5mZXJlZChzaW5nbGVPcHRpb25QYXRoLCBfZXh0ZW5kcyh7fSwgaW5mZXJlZFZhbHVlc0ZvckNvbnRleHQsIGRlZmluZVByb3BlcnR5KHt9LCBwcm9wZXJ0aWVzV2l0aG91dExhc3Qoc2luZ2xlT3B0aW9uUGF0aCksIG9wZyhwcm9wZXJ0aWVzV2l0aG91dExhc3Qoc2luZ2xlT3B0aW9uUGF0aCksIGluZmVyZWRWYWx1ZXNGb3JDb250ZXh0KVtpbmZlcmVkVmFsdWVzRm9yQ29udGV4dC53cF9jdXN0b21pemVyX2N1cnJlbnRfdmlld10gPyAneWVzJyA6ICdubycpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaGVyID09PSAncmVzcG9uc2l2ZScpIHtcbiAgICAgICAgdmFsdWUgPSBnZXRBc0luZmVyZWQoc2luZ2xlT3B0aW9uUGF0aCwgX2V4dGVuZHMoe30sIGluZmVyZWRWYWx1ZXNGb3JDb250ZXh0LCBkZWZpbmVQcm9wZXJ0eSh7fSwgcHJvcGVydGllc1dpdGhvdXRMYXN0KHNpbmdsZU9wdGlvblBhdGgpLCBvcGcocHJvcGVydGllc1dpdGhvdXRMYXN0KHNpbmdsZU9wdGlvblBhdGgpLCBpbmZlcmVkVmFsdWVzRm9yQ29udGV4dClbaW5mZXJlZFZhbHVlc0ZvckNvbnRleHQud3BfY3VzdG9taXplcl9jdXJyZW50X3ZpZXddIHx8IG9wZyhwcm9wZXJ0aWVzV2l0aG91dExhc3Qoc2luZ2xlT3B0aW9uUGF0aCksIGluZmVyZWRWYWx1ZXNGb3JDb250ZXh0KSkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoZXIgPT09ICd0cnV0aHknKSB7XG4gICAgICAgIHZhbHVlID0gISFnZXRBc0luZmVyZWQoc2luZ2xlT3B0aW9uUGF0aCkgPyAneWVzJyA6ICdubyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaGVyLmluZGV4T2YoJ2FycmF5LWlkczonKSA+IC0xKSB7XG4gICAgICAgIHZhciBfbWF0Y2hlciRzcGxpdCA9IG1hdGNoZXIuc3BsaXQoJzonKSxcbiAgICAgICAgICAgIF9tYXRjaGVyJHNwbGl0MiA9IHNsaWNlZFRvQXJyYXkoX21hdGNoZXIkc3BsaXQsIDMpLFxuICAgICAgICAgICAgXyA9IF9tYXRjaGVyJHNwbGl0MlswXSxcbiAgICAgICAgICAgIGlkID0gX21hdGNoZXIkc3BsaXQyWzFdLFxuICAgICAgICAgICAgcGF0aCA9IF9tYXRjaGVyJHNwbGl0MlsyXTtcblxuICAgICAgICB2YXIgX3Byb3BlclZhbHVlID0gZ2V0QXNJbmZlcmVkKHNpbmdsZU9wdGlvblBhdGgpLmZpbmQoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICByZXR1cm4gdi5pZCA9PT0gaWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhbHVlID0gIV9wcm9wZXJWYWx1ZSA/ICdubycgOiBvcGcocGF0aCwgX3Byb3BlclZhbHVlKSB8fCAnbm8nO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hlci5pbmRleE9mKCdqc29uOicpID4gLTEpIHtcbiAgICAgICAgdmFsdWUgPSBnZXRBc0luZmVyZWQoc2luZ2xlT3B0aW9uUGF0aCArICcvJyArIG1hdGNoZXIuc3BsaXQoJzonKVsxXSkudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoZXIgPT09ICdhcnJheV9sZW5ndGgnKSB7XG4gICAgICAgIHZhciBfcHJvcGVyVmFsdWUyID0gZ2V0QXNJbmZlcmVkKHNpbmdsZU9wdGlvblBhdGgpO1xuXG4gICAgICAgIHZhbHVlID0gKF9wcm9wZXJWYWx1ZTIgfHwgW10pLmxlbmd0aC50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtYXRjaGVyIHJlY2VpdmVkLiBQbGVhc2UgdmVyaWZ5IGZvciB0eXBvcy4gVGhlIHJlY2VpdmVkIG1hdGNoZXI6ICcgKyBtYXRjaGVyICsgJy4nKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIE1hdGNoZXIgZ290IF9tYXRjaGVkXy5cbiAgICAgKi9cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIHJhdyB2YWx1ZSBjaGVjaywgYnV0IG9taXQgdGhlIG1hdGNoZXIuXG4gICAgICBzaW5nbGVPcHRpb25QYXRoID0gc2luZ2xlT3B0aW9uUGF0aC5zcGxpdCgnOicpWzBdO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcm9wZXJWYWx1ZSA9IGdldEFzSW5mZXJlZChzaW5nbGVPcHRpb25QYXRoKTtcblxuICBpZiAoIXByb3BlclZhbHVlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHByb3BlclZhbHVlLmRlc2t0b3ApIHtcbiAgICByZXR1cm4gcHJvcGVyVmFsdWU7XG4gIH1cblxuICByZXR1cm4gcHJvcGVyVmFsdWUudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gdHJ5VG9NYXRjaFZhbHVlV2l0aE9wdGlvblBhdGgobWF5YmVUaGF0LCBzaW5nbGVPcHRpb25QYXRoLCBpbmZlcmVkVmFsdWVzRm9yQ29udGV4dCkge1xuICB2YXIgcHJvcGVyVmFsdWUgPSBleHRyYWN0U2NhbGFyVmFsdWVGb3Ioc2luZ2xlT3B0aW9uUGF0aCwgaW5mZXJlZFZhbHVlc0ZvckNvbnRleHQpO1xuXG4gIGlmIChtYXliZVRoYXQgJiYgbWF5YmVUaGF0LnRvU3RyaW5nKCkgJiYgbWF5YmVUaGF0LnRvU3RyaW5nKCkuaW5kZXhPZignficpID09PSAwKSB7XG4gICAgdmFyIHRvTWF0Y2ggPSBtYXliZVRoYXQucmVwbGFjZSgnficsICcnKTtcblxuICAgIGlmIChwcm9wZXJWYWx1ZS5kZXNrdG9wKSB7XG4gICAgICByZXR1cm4gcHJvcGVyVmFsdWUuZGVza3RvcCA9PT0gdG9NYXRjaCB8fCBwcm9wZXJWYWx1ZS50YWJsZXQgPT09IHRvTWF0Y2ggfHwgcHJvcGVyVmFsdWUubW9iaWxlID09PSB0b01hdGNoO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wZXJWYWx1ZSA9PT0gdG9NYXRjaDtcbiAgfVxuXG4gIHByb3BlclZhbHVlID0gcHJvcGVyVmFsdWUudG9TdHJpbmcoKTtcbiAgbWF5YmVUaGF0ID0gbWF5YmVUaGF0LnRvU3RyaW5nKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IHZhbHVlIGlzIG5vdCB5ZXQgc3RhYmlsaXplZFxuICAgKi9cbiAgaWYgKCFwcm9wZXJWYWx1ZSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQaXBlIG9wZXJhdG9yXG4gICAqL1xuICBpZiAobWF5YmVUaGF0LmluZGV4T2YoJ3wnKSA+IC0xKSB7XG4gICAgaWYgKG1heWJlVGhhdC5pbmRleE9mKCchJykgPT09IDApIHtcbiAgICAgIHJldHVybiBtYXliZVRoYXQuc3Vic3RyaW5nKDEpLnNwbGl0KCd8JykubWFwKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICByZXR1cm4gZWwudHJpbSgpO1xuICAgICAgfSkuaW5jbHVkZXMocHJvcGVyVmFsdWUudHJpbSgpKSA9PT0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtYXliZVRoYXQuc3BsaXQoJ3wnKS5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHJldHVybiBlbC50cmltKCk7XG4gICAgICB9KS5pbmRleE9mKHByb3BlclZhbHVlLnRyaW0oKSkgPiAtMTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTmVnYXRpb24gb3BlcmF0b3JcbiAgICovXG4gIGlmIChtYXliZVRoYXQuaW5kZXhPZignIScpID09PSAwKSB7XG4gICAgcmV0dXJuIHByb3BlclZhbHVlICE9PSBtYXliZVRoYXQuc3Vic3RyaW5nKDEpLnRyaW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250YWlucyBvcGVyYXRvclxuICAgKi9cbiAgaWYgKG1heWJlVGhhdC5pbmRleE9mKCcqJykgPT09IDApIHtcbiAgICByZXR1cm4gcHJvcGVyVmFsdWUuaW5kZXhPZihtYXliZVRoYXQudHJpbSgpLnN1YnN0cmluZygxKS50cmltKCkpID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogU2ltcGxlIGVxdWFsaXR5XG4gICAqL1xuICByZXR1cm4gcHJvcGVyVmFsdWUgPT09IG1heWJlVGhhdC50cmltKCk7XG59XG5cbmV4cG9ydCB7IG9wZywgbm9ybWFsaXplQ29uZGl0aW9uLCBtYXRjaFZhbHVlc1dpdGhDb25kaXRpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzLmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7465\n")},2568:(module,__unused_webpack_exports,__webpack_require__)=>{eval("(function(){\r\n var crypt = __webpack_require__(1012),\r\n utf8 = (__webpack_require__(487).utf8),\r\n isBuffer = __webpack_require__(8738),\r\n bin = (__webpack_require__(487).bin),\r\n\r\n // The core\r\n md5 = function (message, options) {\r\n // Convert to byte array\r\n if (message.constructor == String)\r\n if (options && options.encoding === 'binary')\r\n message = bin.stringToBytes(message);\r\n else\r\n message = utf8.stringToBytes(message);\r\n else if (isBuffer(message))\r\n message = Array.prototype.slice.call(message, 0);\r\n else if (!Array.isArray(message) && message.constructor !== Uint8Array)\r\n message = message.toString();\r\n // else, assume byte array already\r\n\r\n var m = crypt.bytesToWords(message),\r\n l = message.length * 8,\r\n a = 1732584193,\r\n b = -271733879,\r\n c = -1732584194,\r\n d = 271733878;\r\n\r\n // Swap endian\r\n for (var i = 0; i < m.length; i++) {\r\n m[i] = ((m[i] << 8) | (m[i] >>> 24)) & 0x00FF00FF |\r\n ((m[i] << 24) | (m[i] >>> 8)) & 0xFF00FF00;\r\n }\r\n\r\n // Padding\r\n m[l >>> 5] |= 0x80 << (l % 32);\r\n m[(((l + 64) >>> 9) << 4) + 14] = l;\r\n\r\n // Method shortcuts\r\n var FF = md5._ff,\r\n GG = md5._gg,\r\n HH = md5._hh,\r\n II = md5._ii;\r\n\r\n for (var i = 0; i < m.length; i += 16) {\r\n\r\n var aa = a,\r\n bb = b,\r\n cc = c,\r\n dd = d;\r\n\r\n a = FF(a, b, c, d, m[i+ 0], 7, -680876936);\r\n d = FF(d, a, b, c, m[i+ 1], 12, -389564586);\r\n c = FF(c, d, a, b, m[i+ 2], 17, 606105819);\r\n b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);\r\n a = FF(a, b, c, d, m[i+ 4], 7, -176418897);\r\n d = FF(d, a, b, c, m[i+ 5], 12, 1200080426);\r\n c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);\r\n b = FF(b, c, d, a, m[i+ 7], 22, -45705983);\r\n a = FF(a, b, c, d, m[i+ 8], 7, 1770035416);\r\n d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);\r\n c = FF(c, d, a, b, m[i+10], 17, -42063);\r\n b = FF(b, c, d, a, m[i+11], 22, -1990404162);\r\n a = FF(a, b, c, d, m[i+12], 7, 1804603682);\r\n d = FF(d, a, b, c, m[i+13], 12, -40341101);\r\n c = FF(c, d, a, b, m[i+14], 17, -1502002290);\r\n b = FF(b, c, d, a, m[i+15], 22, 1236535329);\r\n\r\n a = GG(a, b, c, d, m[i+ 1], 5, -165796510);\r\n d = GG(d, a, b, c, m[i+ 6], 9, -1069501632);\r\n c = GG(c, d, a, b, m[i+11], 14, 643717713);\r\n b = GG(b, c, d, a, m[i+ 0], 20, -373897302);\r\n a = GG(a, b, c, d, m[i+ 5], 5, -701558691);\r\n d = GG(d, a, b, c, m[i+10], 9, 38016083);\r\n c = GG(c, d, a, b, m[i+15], 14, -660478335);\r\n b = GG(b, c, d, a, m[i+ 4], 20, -405537848);\r\n a = GG(a, b, c, d, m[i+ 9], 5, 568446438);\r\n d = GG(d, a, b, c, m[i+14], 9, -1019803690);\r\n c = GG(c, d, a, b, m[i+ 3], 14, -187363961);\r\n b = GG(b, c, d, a, m[i+ 8], 20, 1163531501);\r\n a = GG(a, b, c, d, m[i+13], 5, -1444681467);\r\n d = GG(d, a, b, c, m[i+ 2], 9, -51403784);\r\n c = GG(c, d, a, b, m[i+ 7], 14, 1735328473);\r\n b = GG(b, c, d, a, m[i+12], 20, -1926607734);\r\n\r\n a = HH(a, b, c, d, m[i+ 5], 4, -378558);\r\n d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);\r\n c = HH(c, d, a, b, m[i+11], 16, 1839030562);\r\n b = HH(b, c, d, a, m[i+14], 23, -35309556);\r\n a = HH(a, b, c, d, m[i+ 1], 4, -1530992060);\r\n d = HH(d, a, b, c, m[i+ 4], 11, 1272893353);\r\n c = HH(c, d, a, b, m[i+ 7], 16, -155497632);\r\n b = HH(b, c, d, a, m[i+10], 23, -1094730640);\r\n a = HH(a, b, c, d, m[i+13], 4, 681279174);\r\n d = HH(d, a, b, c, m[i+ 0], 11, -358537222);\r\n c = HH(c, d, a, b, m[i+ 3], 16, -722521979);\r\n b = HH(b, c, d, a, m[i+ 6], 23, 76029189);\r\n a = HH(a, b, c, d, m[i+ 9], 4, -640364487);\r\n d = HH(d, a, b, c, m[i+12], 11, -421815835);\r\n c = HH(c, d, a, b, m[i+15], 16, 530742520);\r\n b = HH(b, c, d, a, m[i+ 2], 23, -995338651);\r\n\r\n a = II(a, b, c, d, m[i+ 0], 6, -198630844);\r\n d = II(d, a, b, c, m[i+ 7], 10, 1126891415);\r\n c = II(c, d, a, b, m[i+14], 15, -1416354905);\r\n b = II(b, c, d, a, m[i+ 5], 21, -57434055);\r\n a = II(a, b, c, d, m[i+12], 6, 1700485571);\r\n d = II(d, a, b, c, m[i+ 3], 10, -1894986606);\r\n c = II(c, d, a, b, m[i+10], 15, -1051523);\r\n b = II(b, c, d, a, m[i+ 1], 21, -2054922799);\r\n a = II(a, b, c, d, m[i+ 8], 6, 1873313359);\r\n d = II(d, a, b, c, m[i+15], 10, -30611744);\r\n c = II(c, d, a, b, m[i+ 6], 15, -1560198380);\r\n b = II(b, c, d, a, m[i+13], 21, 1309151649);\r\n a = II(a, b, c, d, m[i+ 4], 6, -145523070);\r\n d = II(d, a, b, c, m[i+11], 10, -1120210379);\r\n c = II(c, d, a, b, m[i+ 2], 15, 718787259);\r\n b = II(b, c, d, a, m[i+ 9], 21, -343485551);\r\n\r\n a = (a + aa) >>> 0;\r\n b = (b + bb) >>> 0;\r\n c = (c + cc) >>> 0;\r\n d = (d + dd) >>> 0;\r\n }\r\n\r\n return crypt.endian([a, b, c, d]);\r\n };\r\n\r\n // Auxiliary functions\r\n md5._ff = function (a, b, c, d, x, s, t) {\r\n var n = a + (b & c | ~b & d) + (x >>> 0) + t;\r\n return ((n << s) | (n >>> (32 - s))) + b;\r\n };\r\n md5._gg = function (a, b, c, d, x, s, t) {\r\n var n = a + (b & d | c & ~d) + (x >>> 0) + t;\r\n return ((n << s) | (n >>> (32 - s))) + b;\r\n };\r\n md5._hh = function (a, b, c, d, x, s, t) {\r\n var n = a + (b ^ c ^ d) + (x >>> 0) + t;\r\n return ((n << s) | (n >>> (32 - s))) + b;\r\n };\r\n md5._ii = function (a, b, c, d, x, s, t) {\r\n var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;\r\n return ((n << s) | (n >>> (32 - s))) + b;\r\n };\r\n\r\n // Package private blocksize\r\n md5._blocksize = 16;\r\n md5._digestsize = 16;\r\n\r\n module.exports = function (message, options) {\r\n if (message === undefined || message === null)\r\n throw new Error('Illegal argument ' + message);\r\n\r\n var digestbytes = crypt.wordsToBytes(md5(message, options));\r\n return options && options.asBytes ? digestbytes :\r\n options && options.asString ? bin.bytesToString(digestbytes) :\r\n crypt.bytesToHex(digestbytes);\r\n };\r\n\r\n})();\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU2OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL21kNS9tZDUuanM/NjgyMSJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtcclxuICB2YXIgY3J5cHQgPSByZXF1aXJlKCdjcnlwdCcpLFxyXG4gICAgICB1dGY4ID0gcmVxdWlyZSgnY2hhcmVuYycpLnV0ZjgsXHJcbiAgICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyksXHJcbiAgICAgIGJpbiA9IHJlcXVpcmUoJ2NoYXJlbmMnKS5iaW4sXHJcblxyXG4gIC8vIFRoZSBjb3JlXHJcbiAgbWQ1ID0gZnVuY3Rpb24gKG1lc3NhZ2UsIG9wdGlvbnMpIHtcclxuICAgIC8vIENvbnZlcnQgdG8gYnl0ZSBhcnJheVxyXG4gICAgaWYgKG1lc3NhZ2UuY29uc3RydWN0b3IgPT0gU3RyaW5nKVxyXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVuY29kaW5nID09PSAnYmluYXJ5JylcclxuICAgICAgICBtZXNzYWdlID0gYmluLnN0cmluZ1RvQnl0ZXMobWVzc2FnZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBtZXNzYWdlID0gdXRmOC5zdHJpbmdUb0J5dGVzKG1lc3NhZ2UpO1xyXG4gICAgZWxzZSBpZiAoaXNCdWZmZXIobWVzc2FnZSkpXHJcbiAgICAgIG1lc3NhZ2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChtZXNzYWdlLCAwKTtcclxuICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG1lc3NhZ2UpICYmIG1lc3NhZ2UuY29uc3RydWN0b3IgIT09IFVpbnQ4QXJyYXkpXHJcbiAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnRvU3RyaW5nKCk7XHJcbiAgICAvLyBlbHNlLCBhc3N1bWUgYnl0ZSBhcnJheSBhbHJlYWR5XHJcblxyXG4gICAgdmFyIG0gPSBjcnlwdC5ieXRlc1RvV29yZHMobWVzc2FnZSksXHJcbiAgICAgICAgbCA9IG1lc3NhZ2UubGVuZ3RoICogOCxcclxuICAgICAgICBhID0gIDE3MzI1ODQxOTMsXHJcbiAgICAgICAgYiA9IC0yNzE3MzM4NzksXHJcbiAgICAgICAgYyA9IC0xNzMyNTg0MTk0LFxyXG4gICAgICAgIGQgPSAgMjcxNzMzODc4O1xyXG5cclxuICAgIC8vIFN3YXAgZW5kaWFuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbVtpXSA9ICgobVtpXSA8PCAgOCkgfCAobVtpXSA+Pj4gMjQpKSAmIDB4MDBGRjAwRkYgfFxyXG4gICAgICAgICAgICAgKChtW2ldIDw8IDI0KSB8IChtW2ldID4+PiAgOCkpICYgMHhGRjAwRkYwMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQYWRkaW5nXHJcbiAgICBtW2wgPj4+IDVdIHw9IDB4ODAgPDwgKGwgJSAzMik7XHJcbiAgICBtWygoKGwgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTRdID0gbDtcclxuXHJcbiAgICAvLyBNZXRob2Qgc2hvcnRjdXRzXHJcbiAgICB2YXIgRkYgPSBtZDUuX2ZmLFxyXG4gICAgICAgIEdHID0gbWQ1Ll9nZyxcclxuICAgICAgICBISCA9IG1kNS5faGgsXHJcbiAgICAgICAgSUkgPSBtZDUuX2lpO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkgKz0gMTYpIHtcclxuXHJcbiAgICAgIHZhciBhYSA9IGEsXHJcbiAgICAgICAgICBiYiA9IGIsXHJcbiAgICAgICAgICBjYyA9IGMsXHJcbiAgICAgICAgICBkZCA9IGQ7XHJcblxyXG4gICAgICBhID0gRkYoYSwgYiwgYywgZCwgbVtpKyAwXSwgIDcsIC02ODA4NzY5MzYpO1xyXG4gICAgICBkID0gRkYoZCwgYSwgYiwgYywgbVtpKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xyXG4gICAgICBjID0gRkYoYywgZCwgYSwgYiwgbVtpKyAyXSwgMTcsICA2MDYxMDU4MTkpO1xyXG4gICAgICBiID0gRkYoYiwgYywgZCwgYSwgbVtpKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcclxuICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIG1baSsgNF0sICA3LCAtMTc2NDE4ODk3KTtcclxuICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIG1baSsgNV0sIDEyLCAgMTIwMDA4MDQyNik7XHJcbiAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBtW2krIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xyXG4gICAgICBiID0gRkYoYiwgYywgZCwgYSwgbVtpKyA3XSwgMjIsIC00NTcwNTk4Myk7XHJcbiAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBtW2krIDhdLCAgNywgIDE3NzAwMzU0MTYpO1xyXG4gICAgICBkID0gRkYoZCwgYSwgYiwgYywgbVtpKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcclxuICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIG1baSsxMF0sIDE3LCAtNDIwNjMpO1xyXG4gICAgICBiID0gRkYoYiwgYywgZCwgYSwgbVtpKzExXSwgMjIsIC0xOTkwNDA0MTYyKTtcclxuICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIG1baSsxMl0sICA3LCAgMTgwNDYwMzY4Mik7XHJcbiAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBtW2krMTNdLCAxMiwgLTQwMzQxMTAxKTtcclxuICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIG1baSsxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XHJcbiAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBtW2krMTVdLCAyMiwgIDEyMzY1MzUzMjkpO1xyXG5cclxuICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIG1baSsgMV0sICA1LCAtMTY1Nzk2NTEwKTtcclxuICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIG1baSsgNl0sICA5LCAtMTA2OTUwMTYzMik7XHJcbiAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBtW2krMTFdLCAxNCwgIDY0MzcxNzcxMyk7XHJcbiAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBtW2krIDBdLCAyMCwgLTM3Mzg5NzMwMik7XHJcbiAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBtW2krIDVdLCAgNSwgLTcwMTU1ODY5MSk7XHJcbiAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBtW2krMTBdLCAgOSwgIDM4MDE2MDgzKTtcclxuICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIG1baSsxNV0sIDE0LCAtNjYwNDc4MzM1KTtcclxuICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIG1baSsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcclxuICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIG1baSsgOV0sICA1LCAgNTY4NDQ2NDM4KTtcclxuICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIG1baSsxNF0sICA5LCAtMTAxOTgwMzY5MCk7XHJcbiAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBtW2krIDNdLCAxNCwgLTE4NzM2Mzk2MSk7XHJcbiAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBtW2krIDhdLCAyMCwgIDExNjM1MzE1MDEpO1xyXG4gICAgICBhID0gR0coYSwgYiwgYywgZCwgbVtpKzEzXSwgIDUsIC0xNDQ0NjgxNDY3KTtcclxuICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIG1baSsgMl0sICA5LCAtNTE0MDM3ODQpO1xyXG4gICAgICBjID0gR0coYywgZCwgYSwgYiwgbVtpKyA3XSwgMTQsICAxNzM1MzI4NDczKTtcclxuICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIG1baSsxMl0sIDIwLCAtMTkyNjYwNzczNCk7XHJcblxyXG4gICAgICBhID0gSEgoYSwgYiwgYywgZCwgbVtpKyA1XSwgIDQsIC0zNzg1NTgpO1xyXG4gICAgICBkID0gSEgoZCwgYSwgYiwgYywgbVtpKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcclxuICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIG1baSsxMV0sIDE2LCAgMTgzOTAzMDU2Mik7XHJcbiAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBtW2krMTRdLCAyMywgLTM1MzA5NTU2KTtcclxuICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIG1baSsgMV0sICA0LCAtMTUzMDk5MjA2MCk7XHJcbiAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBtW2krIDRdLCAxMSwgIDEyNzI4OTMzNTMpO1xyXG4gICAgICBjID0gSEgoYywgZCwgYSwgYiwgbVtpKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xyXG4gICAgICBiID0gSEgoYiwgYywgZCwgYSwgbVtpKzEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcclxuICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIG1baSsxM10sICA0LCAgNjgxMjc5MTc0KTtcclxuICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIG1baSsgMF0sIDExLCAtMzU4NTM3MjIyKTtcclxuICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIG1baSsgM10sIDE2LCAtNzIyNTIxOTc5KTtcclxuICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIG1baSsgNl0sIDIzLCAgNzYwMjkxODkpO1xyXG4gICAgICBhID0gSEgoYSwgYiwgYywgZCwgbVtpKyA5XSwgIDQsIC02NDAzNjQ0ODcpO1xyXG4gICAgICBkID0gSEgoZCwgYSwgYiwgYywgbVtpKzEyXSwgMTEsIC00MjE4MTU4MzUpO1xyXG4gICAgICBjID0gSEgoYywgZCwgYSwgYiwgbVtpKzE1XSwgMTYsICA1MzA3NDI1MjApO1xyXG4gICAgICBiID0gSEgoYiwgYywgZCwgYSwgbVtpKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xyXG5cclxuICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIG1baSsgMF0sICA2LCAtMTk4NjMwODQ0KTtcclxuICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIG1baSsgN10sIDEwLCAgMTEyNjg5MTQxNSk7XHJcbiAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBtW2krMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xyXG4gICAgICBiID0gSUkoYiwgYywgZCwgYSwgbVtpKyA1XSwgMjEsIC01NzQzNDA1NSk7XHJcbiAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBtW2krMTJdLCAgNiwgIDE3MDA0ODU1NzEpO1xyXG4gICAgICBkID0gSUkoZCwgYSwgYiwgYywgbVtpKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcclxuICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIG1baSsxMF0sIDE1LCAtMTA1MTUyMyk7XHJcbiAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBtW2krIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xyXG4gICAgICBhID0gSUkoYSwgYiwgYywgZCwgbVtpKyA4XSwgIDYsICAxODczMzEzMzU5KTtcclxuICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIG1baSsxNV0sIDEwLCAtMzA2MTE3NDQpO1xyXG4gICAgICBjID0gSUkoYywgZCwgYSwgYiwgbVtpKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcclxuICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIG1baSsxM10sIDIxLCAgMTMwOTE1MTY0OSk7XHJcbiAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBtW2krIDRdLCAgNiwgLTE0NTUyMzA3MCk7XHJcbiAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBtW2krMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xyXG4gICAgICBjID0gSUkoYywgZCwgYSwgYiwgbVtpKyAyXSwgMTUsICA3MTg3ODcyNTkpO1xyXG4gICAgICBiID0gSUkoYiwgYywgZCwgYSwgbVtpKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xyXG5cclxuICAgICAgYSA9IChhICsgYWEpID4+PiAwO1xyXG4gICAgICBiID0gKGIgKyBiYikgPj4+IDA7XHJcbiAgICAgIGMgPSAoYyArIGNjKSA+Pj4gMDtcclxuICAgICAgZCA9IChkICsgZGQpID4+PiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjcnlwdC5lbmRpYW4oW2EsIGIsIGMsIGRdKTtcclxuICB9O1xyXG5cclxuICAvLyBBdXhpbGlhcnkgZnVuY3Rpb25zXHJcbiAgbWQ1Ll9mZiAgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgeCwgcywgdCkge1xyXG4gICAgdmFyIG4gPSBhICsgKGIgJiBjIHwgfmIgJiBkKSArICh4ID4+PiAwKSArIHQ7XHJcbiAgICByZXR1cm4gKChuIDw8IHMpIHwgKG4gPj4+ICgzMiAtIHMpKSkgKyBiO1xyXG4gIH07XHJcbiAgbWQ1Ll9nZyAgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgeCwgcywgdCkge1xyXG4gICAgdmFyIG4gPSBhICsgKGIgJiBkIHwgYyAmIH5kKSArICh4ID4+PiAwKSArIHQ7XHJcbiAgICByZXR1cm4gKChuIDw8IHMpIHwgKG4gPj4+ICgzMiAtIHMpKSkgKyBiO1xyXG4gIH07XHJcbiAgbWQ1Ll9oaCAgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgeCwgcywgdCkge1xyXG4gICAgdmFyIG4gPSBhICsgKGIgXiBjIF4gZCkgKyAoeCA+Pj4gMCkgKyB0O1xyXG4gICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcclxuICB9O1xyXG4gIG1kNS5faWkgID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcclxuICAgIHZhciBuID0gYSArIChjIF4gKGIgfCB+ZCkpICsgKHggPj4+IDApICsgdDtcclxuICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XHJcbiAgfTtcclxuXHJcbiAgLy8gUGFja2FnZSBwcml2YXRlIGJsb2Nrc2l6ZVxyXG4gIG1kNS5fYmxvY2tzaXplID0gMTY7XHJcbiAgbWQ1Ll9kaWdlc3RzaXplID0gMTY7XHJcblxyXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1lc3NhZ2UsIG9wdGlvbnMpIHtcclxuICAgIGlmIChtZXNzYWdlID09PSB1bmRlZmluZWQgfHwgbWVzc2FnZSA9PT0gbnVsbClcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50ICcgKyBtZXNzYWdlKTtcclxuXHJcbiAgICB2YXIgZGlnZXN0Ynl0ZXMgPSBjcnlwdC53b3Jkc1RvQnl0ZXMobWQ1KG1lc3NhZ2UsIG9wdGlvbnMpKTtcclxuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuYXNCeXRlcyA/IGRpZ2VzdGJ5dGVzIDpcclxuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuYXNTdHJpbmcgPyBiaW4uYnl0ZXNUb1N0cmluZyhkaWdlc3RieXRlcykgOlxyXG4gICAgICAgIGNyeXB0LmJ5dGVzVG9IZXgoZGlnZXN0Ynl0ZXMpO1xyXG4gIH07XHJcblxyXG59KSgpO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2568\n")},1496:module=>{eval("// This file replaces `index.js` in bundlers like webpack or Rollup,\n// according to `browser` config in `package.json`.\n\nif (false) {}\n\nvar crypto = self.crypto || self.msCrypto\n\n// This alphabet uses a-z A-Z 0-9 _- symbols.\n// Symbols are generated for smaller size.\n// -_zyxwvutsrqponmlkjihgfedcba9876543210ZYXWVUTSRQPONMLKJIHGFEDCBA\nvar url = '-_'\n// Loop from 36 to 0 (from z to a and 9 to 0 in Base36).\nvar i = 36\nwhile (i--) {\n // 36 is radix. Number.prototype.toString(36) returns number\n // in Base36 representation. Base36 is like hex, but it uses 0–9 and a-z.\n url += i.toString(36)\n}\n// Loop from 36 to 10 (from Z to A in Base36).\ni = 36\nwhile (i-- - 10) {\n url += i.toString(36).toUpperCase()\n}\n\nmodule.exports = function (size) {\n var id = ''\n var bytes = crypto.getRandomValues(new Uint8Array(size || 21))\n i = size || 21\n\n // Compact alternative for `for (var i = 0; i < size; i++)`\n while (i--) {\n // We can’t use bytes bigger than the alphabet. 63 is 00111111 bitmask.\n // This mask reduces random byte 0-255 to 0-63 values.\n // There is no need in `|| ''` and `* 1.6` hacks in here,\n // because bitmask trim bytes exact to alphabet size.\n id += url[bytes[i] & 63]\n }\n return id\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvbmFub2lkL2luZGV4LmJyb3dzZXIuanM/ZTFiZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGZpbGUgcmVwbGFjZXMgYGluZGV4LmpzYCBpbiBidW5kbGVycyBsaWtlIHdlYnBhY2sgb3IgUm9sbHVwLFxuLy8gYWNjb3JkaW5nIHRvIGBicm93c2VyYCBjb25maWcgaW4gYHBhY2thZ2UuanNvbmAuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIEFsbCBidW5kbGVycyB3aWxsIHJlbW92ZSB0aGlzIGJsb2NrIGluIHByb2R1Y3Rpb24gYnVuZGxlXG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdSZWFjdCBOYXRpdmUgZG9lcyBub3QgaGF2ZSBhIGJ1aWx0LWluIHNlY3VyZSByYW5kb20gZ2VuZXJhdG9yLiAnICtcbiAgICAgICdJZiB5b3UgZG9u4oCZdCBuZWVkIHVucHJlZGljdGFibGUgSURzLCB5b3UgY2FuIHVzZSBgbmFub2lkL25vbi1zZWN1cmVgLiAnICtcbiAgICAgICdGb3Igc2VjdXJlIElEIGluc3RhbGwgYGV4cG8tcmFuZG9tYCBsb2NhbGx5IGFuZCB1c2UgYG5hbm9pZC9hc3luY2AuJ1xuICAgIClcbiAgfVxuICBpZiAodHlwZW9mIHNlbGYgPT09ICd1bmRlZmluZWQnIHx8ICghc2VsZi5jcnlwdG8gJiYgIXNlbGYubXNDcnlwdG8pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBoYXZlIHNlY3VyZSByYW5kb20gZ2VuZXJhdG9yLiAnICtcbiAgICAgICdJZiB5b3UgZG9u4oCZdCBuZWVkIHVucHJlZGljdGFibGUgSURzLCB5b3UgY2FuIHVzZSBuYW5vaWQvbm9uLXNlY3VyZS4nXG4gICAgKVxuICB9XG59XG5cbnZhciBjcnlwdG8gPSBzZWxmLmNyeXB0byB8fCBzZWxmLm1zQ3J5cHRvXG5cbi8vIFRoaXMgYWxwaGFiZXQgdXNlcyBhLXogQS1aIDAtOSBfLSBzeW1ib2xzLlxuLy8gU3ltYm9scyBhcmUgZ2VuZXJhdGVkIGZvciBzbWFsbGVyIHNpemUuXG4vLyAtX3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhOTg3NjU0MzIxMFpZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBXG52YXIgdXJsID0gJy1fJ1xuLy8gTG9vcCBmcm9tIDM2IHRvIDAgKGZyb20geiB0byBhIGFuZCA5IHRvIDAgaW4gQmFzZTM2KS5cbnZhciBpID0gMzZcbndoaWxlIChpLS0pIHtcbiAgLy8gMzYgaXMgcmFkaXguIE51bWJlci5wcm90b3R5cGUudG9TdHJpbmcoMzYpIHJldHVybnMgbnVtYmVyXG4gIC8vIGluIEJhc2UzNiByZXByZXNlbnRhdGlvbi4gQmFzZTM2IGlzIGxpa2UgaGV4LCBidXQgaXQgdXNlcyAw4oCTOSBhbmQgYS16LlxuICB1cmwgKz0gaS50b1N0cmluZygzNilcbn1cbi8vIExvb3AgZnJvbSAzNiB0byAxMCAoZnJvbSBaIHRvIEEgaW4gQmFzZTM2KS5cbmkgPSAzNlxud2hpbGUgKGktLSAtIDEwKSB7XG4gIHVybCArPSBpLnRvU3RyaW5nKDM2KS50b1VwcGVyQ2FzZSgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgdmFyIGlkID0gJydcbiAgdmFyIGJ5dGVzID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShzaXplIHx8IDIxKSlcbiAgaSA9IHNpemUgfHwgMjFcblxuICAvLyBDb21wYWN0IGFsdGVybmF0aXZlIGZvciBgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspYFxuICB3aGlsZSAoaS0tKSB7XG4gICAgLy8gV2UgY2Fu4oCZdCB1c2UgYnl0ZXMgYmlnZ2VyIHRoYW4gdGhlIGFscGhhYmV0LiA2MyBpcyAwMDExMTExMSBiaXRtYXNrLlxuICAgIC8vIFRoaXMgbWFzayByZWR1Y2VzIHJhbmRvbSBieXRlIDAtMjU1IHRvIDAtNjMgdmFsdWVzLlxuICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgaW4gYHx8ICcnYCBhbmQgYCogMS42YCBoYWNrcyBpbiBoZXJlLFxuICAgIC8vIGJlY2F1c2UgYml0bWFzayB0cmltIGJ5dGVzIGV4YWN0IHRvIGFscGhhYmV0IHNpemUuXG4gICAgaWQgKz0gdXJsW2J5dGVzW2ldICYgNjNdXG4gIH1cbiAgcmV0dXJuIGlkXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1496\n")},4244:module=>{"use strict";eval("\n\nvar numberIsNaN = function (value) {\n\treturn value !== value;\n};\n\nmodule.exports = function is(a, b) {\n\tif (a === 0 && b === 0) {\n\t\treturn 1 / a === 1 / b;\n\t}\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (numberIsNaN(a) && numberIsNaN(b)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI0NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9pbXBsZW1lbnRhdGlvbi5qcz9kNmVmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIG51bWJlcklzTmFOID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzKGEsIGIpIHtcblx0aWYgKGEgPT09IDAgJiYgYiA9PT0gMCkge1xuXHRcdHJldHVybiAxIC8gYSA9PT0gMSAvIGI7XG5cdH1cblx0aWYgKGEgPT09IGIpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRpZiAobnVtYmVySXNOYU4oYSkgJiYgbnVtYmVySXNOYU4oYikpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4244\n")},609:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar define = __webpack_require__(4289);\nvar callBind = __webpack_require__(5559);\n\nvar implementation = __webpack_require__(4244);\nvar getPolyfill = __webpack_require__(5624);\nvar shim = __webpack_require__(2281);\n\nvar polyfill = callBind(getPolyfill(), Object);\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9pbmRleC5qcz82ZGI3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIHBvbHlmaWxsID0gY2FsbEJpbmQoZ2V0UG9seWZpbGwoKSwgT2JqZWN0KTtcblxuZGVmaW5lKHBvbHlmaWxsLCB7XG5cdGdldFBvbHlmaWxsOiBnZXRQb2x5ZmlsbCxcblx0aW1wbGVtZW50YXRpb246IGltcGxlbWVudGF0aW9uLFxuXHRzaGltOiBzaGltXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBwb2x5ZmlsbDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///609\n")},5624:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar implementation = __webpack_require__(4244);\n\nmodule.exports = function getPolyfill() {\n\treturn typeof Object.is === 'function' ? Object.is : implementation;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYyNC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9wb2x5ZmlsbC5qcz81ODM0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRyZXR1cm4gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGltcGxlbWVudGF0aW9uO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5624\n")},2281:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar getPolyfill = __webpack_require__(5624);\nvar define = __webpack_require__(4289);\n\nmodule.exports = function shimObjectIs() {\n\tvar polyfill = getPolyfill();\n\tdefine(Object, { is: polyfill }, {\n\t\tis: function testObjectIs() {\n\t\t\treturn Object.is !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI4MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWlzL3NoaW0uanM/YzE1YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1PYmplY3RJcygpIHtcblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0ZGVmaW5lKE9iamVjdCwgeyBpczogcG9seWZpbGwgfSwge1xuXHRcdGlzOiBmdW5jdGlvbiB0ZXN0T2JqZWN0SXMoKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmlzICE9PSBwb2x5ZmlsbDtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2281\n")},8987:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar keysShim;\nif (!Object.keys) {\n\t// modified from https://github.com/es-shims/es5-shim\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\tvar isArgs = __webpack_require__(1414); // eslint-disable-line global-require\n\tvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\tvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\n\tvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\n\tvar dontEnums = [\n\t\t'toString',\n\t\t'toLocaleString',\n\t\t'valueOf',\n\t\t'hasOwnProperty',\n\t\t'isPrototypeOf',\n\t\t'propertyIsEnumerable',\n\t\t'constructor'\n\t];\n\tvar equalsConstructorPrototype = function (o) {\n\t\tvar ctor = o.constructor;\n\t\treturn ctor && ctor.prototype === o;\n\t};\n\tvar excludedKeys = {\n\t\t$applicationCache: true,\n\t\t$console: true,\n\t\t$external: true,\n\t\t$frame: true,\n\t\t$frameElement: true,\n\t\t$frames: true,\n\t\t$innerHeight: true,\n\t\t$innerWidth: true,\n\t\t$onmozfullscreenchange: true,\n\t\t$onmozfullscreenerror: true,\n\t\t$outerHeight: true,\n\t\t$outerWidth: true,\n\t\t$pageXOffset: true,\n\t\t$pageYOffset: true,\n\t\t$parent: true,\n\t\t$scrollLeft: true,\n\t\t$scrollTop: true,\n\t\t$scrollX: true,\n\t\t$scrollY: true,\n\t\t$self: true,\n\t\t$webkitIndexedDB: true,\n\t\t$webkitStorageInfo: true,\n\t\t$window: true\n\t};\n\tvar hasAutomationEqualityBug = (function () {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined') { return false; }\n\t\tfor (var k in window) {\n\t\t\ttry {\n\t\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}());\n\tvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t}\n\t\ttry {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tkeysShim = function keys(object) {\n\t\tvar isObject = object !== null && typeof object === 'object';\n\t\tvar isFunction = toStr.call(object) === '[object Function]';\n\t\tvar isArguments = isArgs(object);\n\t\tvar isString = isObject && toStr.call(object) === '[object String]';\n\t\tvar theKeys = [];\n\n\t\tif (!isObject && !isFunction && !isArguments) {\n\t\t\tthrow new TypeError('Object.keys called on a non-object');\n\t\t}\n\n\t\tvar skipProto = hasProtoEnumBug && isFunction;\n\t\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\t\ttheKeys.push(String(i));\n\t\t\t}\n\t\t}\n\n\t\tif (isArguments && object.length > 0) {\n\t\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\t\ttheKeys.push(String(j));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var name in object) {\n\t\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\t\ttheKeys.push(String(name));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDontEnumBug) {\n\t\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn theKeys;\n\t};\n}\nmodule.exports = keysShim;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODk4Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW1wbGVtZW50YXRpb24uanM/YjE4OSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzU2hpbTtcbmlmICghT2JqZWN0LmtleXMpIHtcblx0Ly8gbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW1cblx0dmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cdHZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cdHZhciBpc0FyZ3MgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2xvYmFsLXJlcXVpcmVcblx0dmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cdHZhciBoYXNEb250RW51bUJ1ZyA9ICFpc0VudW1lcmFibGUuY2FsbCh7IHRvU3RyaW5nOiBudWxsIH0sICd0b1N0cmluZycpO1xuXHR2YXIgaGFzUHJvdG9FbnVtQnVnID0gaXNFbnVtZXJhYmxlLmNhbGwoZnVuY3Rpb24gKCkge30sICdwcm90b3R5cGUnKTtcblx0dmFyIGRvbnRFbnVtcyA9IFtcblx0XHQndG9TdHJpbmcnLFxuXHRcdCd0b0xvY2FsZVN0cmluZycsXG5cdFx0J3ZhbHVlT2YnLFxuXHRcdCdoYXNPd25Qcm9wZXJ0eScsXG5cdFx0J2lzUHJvdG90eXBlT2YnLFxuXHRcdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG5cdFx0J2NvbnN0cnVjdG9yJ1xuXHRdO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUgPSBmdW5jdGlvbiAobykge1xuXHRcdHZhciBjdG9yID0gby5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gY3RvciAmJiBjdG9yLnByb3RvdHlwZSA9PT0gbztcblx0fTtcblx0dmFyIGV4Y2x1ZGVkS2V5cyA9IHtcblx0XHQkYXBwbGljYXRpb25DYWNoZTogdHJ1ZSxcblx0XHQkY29uc29sZTogdHJ1ZSxcblx0XHQkZXh0ZXJuYWw6IHRydWUsXG5cdFx0JGZyYW1lOiB0cnVlLFxuXHRcdCRmcmFtZUVsZW1lbnQ6IHRydWUsXG5cdFx0JGZyYW1lczogdHJ1ZSxcblx0XHQkaW5uZXJIZWlnaHQ6IHRydWUsXG5cdFx0JGlubmVyV2lkdGg6IHRydWUsXG5cdFx0JG9ubW96ZnVsbHNjcmVlbmNoYW5nZTogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuZXJyb3I6IHRydWUsXG5cdFx0JG91dGVySGVpZ2h0OiB0cnVlLFxuXHRcdCRvdXRlcldpZHRoOiB0cnVlLFxuXHRcdCRwYWdlWE9mZnNldDogdHJ1ZSxcblx0XHQkcGFnZVlPZmZzZXQ6IHRydWUsXG5cdFx0JHBhcmVudDogdHJ1ZSxcblx0XHQkc2Nyb2xsTGVmdDogdHJ1ZSxcblx0XHQkc2Nyb2xsVG9wOiB0cnVlLFxuXHRcdCRzY3JvbGxYOiB0cnVlLFxuXHRcdCRzY3JvbGxZOiB0cnVlLFxuXHRcdCRzZWxmOiB0cnVlLFxuXHRcdCR3ZWJraXRJbmRleGVkREI6IHRydWUsXG5cdFx0JHdlYmtpdFN0b3JhZ2VJbmZvOiB0cnVlLFxuXHRcdCR3aW5kb3c6IHRydWVcblx0fTtcblx0dmFyIGhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1ZyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRmb3IgKHZhciBrIGluIHdpbmRvdykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKCFleGNsdWRlZEtleXNbJyQnICsga10gJiYgaGFzLmNhbGwod2luZG93LCBrKSAmJiB3aW5kb3dba10gIT09IG51bGwgJiYgdHlwZW9mIHdpbmRvd1trXSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0ZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUod2luZG93W2tdKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSgpKTtcblx0dmFyIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnKSB7XG5cdFx0XHRyZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fTtcblxuXHRrZXlzU2hpbSA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG5cdFx0dmFyIGlzT2JqZWN0ID0gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnO1xuXHRcdHZhciBpc0Z1bmN0aW9uID0gdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXHRcdHZhciBpc0FyZ3VtZW50cyA9IGlzQXJncyhvYmplY3QpO1xuXHRcdHZhciBpc1N0cmluZyA9IGlzT2JqZWN0ICYmIHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cdFx0dmFyIHRoZUtleXMgPSBbXTtcblxuXHRcdGlmICghaXNPYmplY3QgJiYgIWlzRnVuY3Rpb24gJiYgIWlzQXJndW1lbnRzKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0dmFyIHNraXBQcm90byA9IGhhc1Byb3RvRW51bUJ1ZyAmJiBpc0Z1bmN0aW9uO1xuXHRcdGlmIChpc1N0cmluZyAmJiBvYmplY3QubGVuZ3RoID4gMCAmJiAhaGFzLmNhbGwob2JqZWN0LCAwKSkge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhpKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGlzQXJndW1lbnRzICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IG9iamVjdC5sZW5ndGg7ICsraikge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGopKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICh2YXIgbmFtZSBpbiBvYmplY3QpIHtcblx0XHRcdFx0aWYgKCEoc2tpcFByb3RvICYmIG5hbWUgPT09ICdwcm90b3R5cGUnKSAmJiBoYXMuY2FsbChvYmplY3QsIG5hbWUpKSB7XG5cdFx0XHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhuYW1lKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaGFzRG9udEVudW1CdWcpIHtcblx0XHRcdHZhciBza2lwQ29uc3RydWN0b3IgPSBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kob2JqZWN0KTtcblxuXHRcdFx0Zm9yICh2YXIgayA9IDA7IGsgPCBkb250RW51bXMubGVuZ3RoOyArK2spIHtcblx0XHRcdFx0aWYgKCEoc2tpcENvbnN0cnVjdG9yICYmIGRvbnRFbnVtc1trXSA9PT0gJ2NvbnN0cnVjdG9yJykgJiYgaGFzLmNhbGwob2JqZWN0LCBkb250RW51bXNba10pKSB7XG5cdFx0XHRcdFx0dGhlS2V5cy5wdXNoKGRvbnRFbnVtc1trXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoZUtleXM7XG5cdH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8987\n")},2215:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar slice = Array.prototype.slice;\nvar isArgs = __webpack_require__(1414);\n\nvar origKeys = Object.keys;\nvar keysShim = origKeys ? function keys(o) { return origKeys(o); } : __webpack_require__(8987);\n\nvar originalKeys = Object.keys;\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\tvar args = Object.keys(arguments);\n\t\t\treturn args && args.length === arguments.length;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t}\n\t\t\t\treturn originalKeys(object);\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIxNS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW5kZXguanM/ZDZjNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpc0FyZ3MgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyk7XG5cbnZhciBvcmlnS2V5cyA9IE9iamVjdC5rZXlzO1xudmFyIGtleXNTaGltID0gb3JpZ0tleXMgPyBmdW5jdGlvbiBrZXlzKG8pIHsgcmV0dXJuIG9yaWdLZXlzKG8pOyB9IDogcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG52YXIgb3JpZ2luYWxLZXlzID0gT2JqZWN0LmtleXM7XG5cbmtleXNTaGltLnNoaW0gPSBmdW5jdGlvbiBzaGltT2JqZWN0S2V5cygpIHtcblx0aWYgKE9iamVjdC5rZXlzKSB7XG5cdFx0dmFyIGtleXNXb3Jrc1dpdGhBcmd1bWVudHMgPSAoZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gU2FmYXJpIDUuMCBidWdcblx0XHRcdHZhciBhcmdzID0gT2JqZWN0LmtleXMoYXJndW1lbnRzKTtcblx0XHRcdHJldHVybiBhcmdzICYmIGFyZ3MubGVuZ3RoID09PSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdH0oMSwgMikpO1xuXHRcdGlmICgha2V5c1dvcmtzV2l0aEFyZ3VtZW50cykge1xuXHRcdFx0T2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuXHRcdFx0XHRpZiAoaXNBcmdzKG9iamVjdCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKHNsaWNlLmNhbGwob2JqZWN0KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhvYmplY3QpO1xuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMgPSBrZXlzU2hpbTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2215\n")},1414:module=>{"use strict";eval("\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQxNC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaXNBcmd1bWVudHMuanM/ZDRhYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcblx0dmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuXHR2YXIgaXNBcmdzID0gc3RyID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcblx0aWYgKCFpc0FyZ3MpIHtcblx0XHRpc0FyZ3MgPSBzdHIgIT09ICdbb2JqZWN0IEFycmF5XScgJiZcblx0XHRcdHZhbHVlICE9PSBudWxsICYmXG5cdFx0XHR0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG5cdFx0XHR0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJyAmJlxuXHRcdFx0dmFsdWUubGVuZ3RoID49IDAgJiZcblx0XHRcdHRvU3RyLmNhbGwodmFsdWUuY2FsbGVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblx0fVxuXHRyZXR1cm4gaXNBcmdzO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1414\n")},2703:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = __webpack_require__(414);\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcwMy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanM/ZDdhMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9XG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0KCkge31cbmVtcHR5RnVuY3Rpb25XaXRoUmVzZXQucmVzZXRXYXJuaW5nQ2FjaGUgPSBlbXB0eUZ1bmN0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBzaGltKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgaWYgKHNlY3JldCA9PT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgIC8vIEl0IGlzIHN0aWxsIHNhZmUgd2hlbiBjYWxsZWQgZnJvbSBSZWFjdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICdVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICk7XG4gICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgdGhyb3cgZXJyO1xuICB9O1xuICBzaGltLmlzUmVxdWlyZWQgPSBzaGltO1xuICBmdW5jdGlvbiBnZXRTaGltKCkge1xuICAgIHJldHVybiBzaGltO1xuICB9O1xuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IHNoaW0sXG4gICAgYmlnaW50OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGVsZW1lbnRUeXBlOiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW0sXG5cbiAgICBjaGVja1Byb3BUeXBlczogZW1wdHlGdW5jdGlvbldpdGhSZXNldCxcbiAgICByZXNldFdhcm5pbmdDYWNoZTogZW1wdHlGdW5jdGlvblxuICB9O1xuXG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2703\n")},5697:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (false) { var throwOnDirectAccess, ReactIs; } else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = __webpack_require__(2703)();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY5Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2luZGV4LmpzP2Q3YmMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5697\n")},414:module=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzPzU5YjAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///414\n")},6362:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "JN": () => (/* binding */ sortableContainer),\n "W8": () => (/* binding */ sortableElement),\n "W6": () => (/* binding */ sortableHandle)\n});\n\n// UNUSED EXPORTS: arrayMove, sortableContainer, sortableElement, sortableHandle\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nvar esm_extends = __webpack_require__(7462);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\nfunction _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"] != null) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\nfunction _nonIterableRest() {\n throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\n\n\n\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectSpread.js\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? Object(arguments[i]) : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === \'function\') {\n ownKeys.push.apply(ownKeys, Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/createClass.js\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, "prototype", {\n writable: false\n });\n return Constructor;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js\nfunction _typeof(obj) {\n "@babel/helpers - typeof";\n\n return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n }, _typeof(obj);\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\nvar assertThisInitialized = __webpack_require__(7326);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js\n\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === "object" || typeof call === "function")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError("Derived constructors may only return object or undefined");\n }\n\n return (0,assertThisInitialized/* default */.Z)(self);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js\nvar setPrototypeOf = __webpack_require__(9611);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/inherits.js\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, "prototype", {\n writable: false\n });\n if (superClass) (0,setPrototypeOf/* default */.Z)(subClass, superClass);\n}\n// EXTERNAL MODULE: external "React"\nvar external_React_ = __webpack_require__(7363);\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n// EXTERNAL MODULE: external "ReactDOM"\nvar external_ReactDOM_ = __webpack_require__(1533);\n// EXTERNAL MODULE: ./node_modules/invariant/browser.js\nvar browser = __webpack_require__(1143);\nvar browser_default = /*#__PURE__*/__webpack_require__.n(browser);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js\nfunction _nonIterableSpread() {\n throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\n\n\n\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n;// CONCATENATED MODULE: ./node_modules/react-sortable-hoc/dist/react-sortable-hoc.esm.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar Manager = function () {\n function Manager() {\n _classCallCheck(this, Manager);\n\n _defineProperty(this, "refs", {});\n }\n\n _createClass(Manager, [{\n key: "add",\n value: function add(collection, ref) {\n if (!this.refs[collection]) {\n this.refs[collection] = [];\n }\n\n this.refs[collection].push(ref);\n }\n }, {\n key: "remove",\n value: function remove(collection, ref) {\n var index = this.getIndex(collection, ref);\n\n if (index !== -1) {\n this.refs[collection].splice(index, 1);\n }\n }\n }, {\n key: "isActive",\n value: function isActive() {\n return this.active;\n }\n }, {\n key: "getActive",\n value: function getActive() {\n var _this = this;\n\n return this.refs[this.active.collection].find(function (_ref) {\n var node = _ref.node;\n return node.sortableInfo.index == _this.active.index;\n });\n }\n }, {\n key: "getIndex",\n value: function getIndex(collection, ref) {\n return this.refs[collection].indexOf(ref);\n }\n }, {\n key: "getOrderedRefs",\n value: function getOrderedRefs() {\n var collection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.active.collection;\n return this.refs[collection].sort(sortByIndex);\n }\n }]);\n\n return Manager;\n}();\n\nfunction sortByIndex(_ref2, _ref3) {\n var index1 = _ref2.node.sortableInfo.index;\n var index2 = _ref3.node.sortableInfo.index;\n return index1 - index2;\n}\n\nfunction arrayMove(array, from, to) {\n if (false) {}\n\n array = array.slice();\n array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);\n return array;\n}\nfunction omit(obj, keysToOmit) {\n return Object.keys(obj).reduce(function (acc, key) {\n if (keysToOmit.indexOf(key) === -1) {\n acc[key] = obj[key];\n }\n\n return acc;\n }, {});\n}\nvar events = {\n end: [\'touchend\', \'touchcancel\', \'mouseup\'],\n move: [\'touchmove\', \'mousemove\'],\n start: [\'touchstart\', \'mousedown\']\n};\nvar vendorPrefix = function () {\n if (typeof window === \'undefined\' || typeof document === \'undefined\') {\n return \'\';\n }\n\n var styles = window.getComputedStyle(document.documentElement, \'\') || [\'-moz-hidden-iframe\'];\n var pre = (Array.prototype.slice.call(styles).join(\'\').match(/-(moz|webkit|ms)-/) || styles.OLink === \'\' && [\'\', \'o\'])[1];\n\n switch (pre) {\n case \'ms\':\n return \'ms\';\n\n default:\n return pre && pre.length ? pre[0].toUpperCase() + pre.substr(1) : \'\';\n }\n}();\nfunction setInlineStyles(node, styles) {\n Object.keys(styles).forEach(function (key) {\n node.style[key] = styles[key];\n });\n}\nfunction setTranslate3d(node, translate) {\n node.style["".concat(vendorPrefix, "Transform")] = translate == null ? \'\' : "translate3d(".concat(translate.x, "px,").concat(translate.y, "px,0)");\n}\nfunction setTransitionDuration(node, duration) {\n node.style["".concat(vendorPrefix, "TransitionDuration")] = duration == null ? \'\' : "".concat(duration, "ms");\n}\nfunction closest(el, fn) {\n while (el) {\n if (fn(el)) {\n return el;\n }\n\n el = el.parentNode;\n }\n\n return null;\n}\nfunction limit(min, max, value) {\n return Math.max(min, Math.min(value, max));\n}\n\nfunction getPixelValue(stringValue) {\n if (stringValue.substr(-2) === \'px\') {\n return parseFloat(stringValue);\n }\n\n return 0;\n}\n\nfunction getElementMargin(element) {\n var style = window.getComputedStyle(element);\n return {\n bottom: getPixelValue(style.marginBottom),\n left: getPixelValue(style.marginLeft),\n right: getPixelValue(style.marginRight),\n top: getPixelValue(style.marginTop)\n };\n}\nfunction provideDisplayName(prefix, Component$$1) {\n var componentName = Component$$1.displayName || Component$$1.name;\n return componentName ? "".concat(prefix, "(").concat(componentName, ")") : prefix;\n}\nfunction getScrollAdjustedBoundingClientRect(node, scrollDelta) {\n var boundingClientRect = node.getBoundingClientRect();\n return {\n top: boundingClientRect.top + scrollDelta.top,\n left: boundingClientRect.left + scrollDelta.left\n };\n}\nfunction getPosition(event) {\n if (event.touches && event.touches.length) {\n return {\n x: event.touches[0].pageX,\n y: event.touches[0].pageY\n };\n } else if (event.changedTouches && event.changedTouches.length) {\n return {\n x: event.changedTouches[0].pageX,\n y: event.changedTouches[0].pageY\n };\n } else {\n return {\n x: event.pageX,\n y: event.pageY\n };\n }\n}\nfunction isTouchEvent(event) {\n return event.touches && event.touches.length || event.changedTouches && event.changedTouches.length;\n}\nfunction getEdgeOffset(node, parent) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n left: 0,\n top: 0\n };\n\n if (!node) {\n return undefined;\n }\n\n var nodeOffset = {\n left: offset.left + node.offsetLeft,\n top: offset.top + node.offsetTop\n };\n\n if (node.parentNode === parent) {\n return nodeOffset;\n }\n\n return getEdgeOffset(node.parentNode, parent, nodeOffset);\n}\nfunction getTargetIndex(newIndex, prevIndex, oldIndex) {\n if (newIndex < oldIndex && newIndex > prevIndex) {\n return newIndex - 1;\n } else if (newIndex > oldIndex && newIndex < prevIndex) {\n return newIndex + 1;\n } else {\n return newIndex;\n }\n}\nfunction getLockPixelOffset(_ref) {\n var lockOffset = _ref.lockOffset,\n width = _ref.width,\n height = _ref.height;\n var offsetX = lockOffset;\n var offsetY = lockOffset;\n var unit = \'px\';\n\n if (typeof lockOffset === \'string\') {\n var match = /^[+-]?\\d*(?:\\.\\d*)?(px|%)$/.exec(lockOffset);\n browser_default()(match !== null, \'lockOffset value should be a number or a string of a \' + \'number followed by "px" or "%". Given %s\', lockOffset);\n offsetX = parseFloat(lockOffset);\n offsetY = parseFloat(lockOffset);\n unit = match[1];\n }\n\n browser_default()(isFinite(offsetX) && isFinite(offsetY), \'lockOffset value should be a finite. Given %s\', lockOffset);\n\n if (unit === \'%\') {\n offsetX = offsetX * width / 100;\n offsetY = offsetY * height / 100;\n }\n\n return {\n x: offsetX,\n y: offsetY\n };\n}\nfunction getLockPixelOffsets(_ref2) {\n var height = _ref2.height,\n width = _ref2.width,\n lockOffset = _ref2.lockOffset;\n var offsets = Array.isArray(lockOffset) ? lockOffset : [lockOffset, lockOffset];\n browser_default()(offsets.length === 2, \'lockOffset prop of SortableContainer should be a single \' + \'value or an array of exactly two values. Given %s\', lockOffset);\n\n var _offsets = _slicedToArray(offsets, 2),\n minLockOffset = _offsets[0],\n maxLockOffset = _offsets[1];\n\n return [getLockPixelOffset({\n height: height,\n lockOffset: minLockOffset,\n width: width\n }), getLockPixelOffset({\n height: height,\n lockOffset: maxLockOffset,\n width: width\n })];\n}\n\nfunction isScrollable(el) {\n var computedStyle = window.getComputedStyle(el);\n var overflowRegex = /(auto|scroll)/;\n var properties = [\'overflow\', \'overflowX\', \'overflowY\'];\n return properties.find(function (property) {\n return overflowRegex.test(computedStyle[property]);\n });\n}\n\nfunction getScrollingParent(el) {\n if (!(el instanceof HTMLElement)) {\n return null;\n } else if (isScrollable(el)) {\n return el;\n } else {\n return getScrollingParent(el.parentNode);\n }\n}\nfunction getContainerGridGap(element) {\n var style = window.getComputedStyle(element);\n\n if (style.display === \'grid\') {\n return {\n x: getPixelValue(style.gridColumnGap),\n y: getPixelValue(style.gridRowGap)\n };\n }\n\n return {\n x: 0,\n y: 0\n };\n}\nvar KEYCODE = {\n TAB: 9,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40\n};\nvar NodeType = {\n Anchor: \'A\',\n Button: \'BUTTON\',\n Canvas: \'CANVAS\',\n Input: \'INPUT\',\n Option: \'OPTION\',\n Textarea: \'TEXTAREA\',\n Select: \'SELECT\'\n};\nfunction cloneNode(node) {\n var selector = \'input, textarea, select, canvas, [contenteditable]\';\n var fields = node.querySelectorAll(selector);\n var clonedNode = node.cloneNode(true);\n\n var clonedFields = _toConsumableArray(clonedNode.querySelectorAll(selector));\n\n clonedFields.forEach(function (field, i) {\n if (field.type !== \'file\') {\n field.value = fields[i].value;\n }\n\n if (field.type === \'radio\' && field.name) {\n field.name = "__sortableClone__".concat(field.name);\n }\n\n if (field.tagName === NodeType.Canvas && fields[i].width > 0 && fields[i].height > 0) {\n var destCtx = field.getContext(\'2d\');\n destCtx.drawImage(fields[i], 0, 0);\n }\n });\n return clonedNode;\n}\n\nfunction sortableHandle(WrappedComponent) {\n var _class, _temp;\n\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n withRef: false\n };\n return _temp = _class = function (_React$Component) {\n _inherits(WithSortableHandle, _React$Component);\n\n function WithSortableHandle() {\n _classCallCheck(this, WithSortableHandle);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(WithSortableHandle).apply(this, arguments));\n }\n\n _createClass(WithSortableHandle, [{\n key: "componentDidMount",\n value: function componentDidMount() {\n var node = (0,external_ReactDOM_.findDOMNode)(this);\n node.sortableHandle = true;\n }\n }, {\n key: "getWrappedInstance",\n value: function getWrappedInstance() {\n browser_default()(config.withRef, \'To access the wrapped instance, you need to pass in {withRef: true} as the second argument of the SortableHandle() call\');\n return this.refs.wrappedInstance;\n }\n }, {\n key: "render",\n value: function render() {\n var ref = config.withRef ? \'wrappedInstance\' : null;\n return (0,external_React_.createElement)(WrappedComponent, (0,esm_extends["default"])({\n ref: ref\n }, this.props));\n }\n }]);\n\n return WithSortableHandle;\n }(external_React_.Component), _defineProperty(_class, "displayName", provideDisplayName(\'sortableHandle\', WrappedComponent)), _temp;\n}\nfunction isSortableHandle(node) {\n return node.sortableHandle != null;\n}\n\nvar AutoScroller = function () {\n function AutoScroller(container, onScrollCallback) {\n _classCallCheck(this, AutoScroller);\n\n this.container = container;\n this.onScrollCallback = onScrollCallback;\n }\n\n _createClass(AutoScroller, [{\n key: "clear",\n value: function clear() {\n if (this.interval == null) {\n return;\n }\n\n clearInterval(this.interval);\n this.interval = null;\n }\n }, {\n key: "update",\n value: function update(_ref) {\n var _this = this;\n\n var translate = _ref.translate,\n minTranslate = _ref.minTranslate,\n maxTranslate = _ref.maxTranslate,\n width = _ref.width,\n height = _ref.height;\n var direction = {\n x: 0,\n y: 0\n };\n var speed = {\n x: 1,\n y: 1\n };\n var acceleration = {\n x: 10,\n y: 10\n };\n var _this$container = this.container,\n scrollTop = _this$container.scrollTop,\n scrollLeft = _this$container.scrollLeft,\n scrollHeight = _this$container.scrollHeight,\n scrollWidth = _this$container.scrollWidth,\n clientHeight = _this$container.clientHeight,\n clientWidth = _this$container.clientWidth;\n var isTop = scrollTop === 0;\n var isBottom = scrollHeight - scrollTop - clientHeight === 0;\n var isLeft = scrollLeft === 0;\n var isRight = scrollWidth - scrollLeft - clientWidth === 0;\n\n if (translate.y >= maxTranslate.y - height / 2 && !isBottom) {\n direction.y = 1;\n speed.y = acceleration.y * Math.abs((maxTranslate.y - height / 2 - translate.y) / height);\n } else if (translate.x >= maxTranslate.x - width / 2 && !isRight) {\n direction.x = 1;\n speed.x = acceleration.x * Math.abs((maxTranslate.x - width / 2 - translate.x) / width);\n } else if (translate.y <= minTranslate.y + height / 2 && !isTop) {\n direction.y = -1;\n speed.y = acceleration.y * Math.abs((translate.y - height / 2 - minTranslate.y) / height);\n } else if (translate.x <= minTranslate.x + width / 2 && !isLeft) {\n direction.x = -1;\n speed.x = acceleration.x * Math.abs((translate.x - width / 2 - minTranslate.x) / width);\n }\n\n if (this.interval) {\n this.clear();\n this.isAutoScrolling = false;\n }\n\n if (direction.x !== 0 || direction.y !== 0) {\n this.interval = setInterval(function () {\n _this.isAutoScrolling = true;\n var offset = {\n left: speed.x * direction.x,\n top: speed.y * direction.y\n };\n _this.container.scrollTop += offset.top;\n _this.container.scrollLeft += offset.left;\n\n _this.onScrollCallback(offset);\n }, 5);\n }\n }\n }]);\n\n return AutoScroller;\n}();\n\nfunction defaultGetHelperDimensions(_ref) {\n var node = _ref.node;\n return {\n height: node.offsetHeight,\n width: node.offsetWidth\n };\n}\n\nfunction defaultShouldCancelStart(event) {\n var interactiveElements = [NodeType.Input, NodeType.Textarea, NodeType.Select, NodeType.Option, NodeType.Button];\n\n if (interactiveElements.indexOf(event.target.tagName) !== -1) {\n return true;\n }\n\n if (closest(event.target, function (el) {\n return el.contentEditable === \'true\';\n })) {\n return true;\n }\n\n return false;\n}\n\nvar propTypes = {\n axis: prop_types_default().oneOf([\'x\', \'y\', \'xy\']),\n contentWindow: (prop_types_default()).any,\n disableAutoscroll: (prop_types_default()).bool,\n distance: (prop_types_default()).number,\n getContainer: (prop_types_default()).func,\n getHelperDimensions: (prop_types_default()).func,\n helperClass: (prop_types_default()).string,\n helperContainer: prop_types_default().oneOfType([(prop_types_default()).func, typeof HTMLElement === \'undefined\' ? (prop_types_default()).any : prop_types_default().instanceOf(HTMLElement)]),\n hideSortableGhost: (prop_types_default()).bool,\n keyboardSortingTransitionDuration: (prop_types_default()).number,\n lockAxis: (prop_types_default()).string,\n lockOffset: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string, prop_types_default().arrayOf(prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]))]),\n lockToContainerEdges: (prop_types_default()).bool,\n onSortEnd: (prop_types_default()).func,\n onSortMove: (prop_types_default()).func,\n onSortOver: (prop_types_default()).func,\n onSortStart: (prop_types_default()).func,\n pressDelay: (prop_types_default()).number,\n pressThreshold: (prop_types_default()).number,\n keyCodes: prop_types_default().shape({\n lift: prop_types_default().arrayOf((prop_types_default()).number),\n drop: prop_types_default().arrayOf((prop_types_default()).number),\n cancel: prop_types_default().arrayOf((prop_types_default()).number),\n up: prop_types_default().arrayOf((prop_types_default()).number),\n down: prop_types_default().arrayOf((prop_types_default()).number)\n }),\n shouldCancelStart: (prop_types_default()).func,\n transitionDuration: (prop_types_default()).number,\n updateBeforeSortStart: (prop_types_default()).func,\n useDragHandle: (prop_types_default()).bool,\n useWindowAsScrollContainer: (prop_types_default()).bool\n};\nvar defaultKeyCodes = {\n lift: [KEYCODE.SPACE],\n drop: [KEYCODE.SPACE],\n cancel: [KEYCODE.ESC],\n up: [KEYCODE.UP, KEYCODE.LEFT],\n down: [KEYCODE.DOWN, KEYCODE.RIGHT]\n};\nvar defaultProps = {\n axis: \'y\',\n disableAutoscroll: false,\n distance: 0,\n getHelperDimensions: defaultGetHelperDimensions,\n hideSortableGhost: true,\n lockOffset: \'50%\',\n lockToContainerEdges: false,\n pressDelay: 0,\n pressThreshold: 5,\n keyCodes: defaultKeyCodes,\n shouldCancelStart: defaultShouldCancelStart,\n transitionDuration: 300,\n useWindowAsScrollContainer: false\n};\nvar omittedProps = Object.keys(propTypes);\nfunction validateProps(props) {\n browser_default()(!(props.distance && props.pressDelay), \'Attempted to set both `pressDelay` and `distance` on SortableContainer, you may only use one or the other, not both at the same time.\');\n}\n\nfunction _finallyRethrows(body, finalizer) {\n try {\n var result = body();\n } catch (e) {\n return finalizer(true, e);\n }\n\n if (result && result.then) {\n return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n }\n\n return finalizer(false, value);\n}\nfunction sortableContainer(WrappedComponent) {\n var _class, _temp;\n\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n withRef: false\n };\n return _temp = _class = function (_React$Component) {\n _inherits(WithSortableContainer, _React$Component);\n\n function WithSortableContainer(props) {\n var _this;\n\n _classCallCheck(this, WithSortableContainer);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(WithSortableContainer).call(this, props));\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "state", {});\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "handleStart", function (event) {\n var _this$props = _this.props,\n distance = _this$props.distance,\n shouldCancelStart = _this$props.shouldCancelStart;\n\n if (event.button === 2 || shouldCancelStart(event)) {\n return;\n }\n\n _this.touched = true;\n _this.position = getPosition(event);\n var node = closest(event.target, function (el) {\n return el.sortableInfo != null;\n });\n\n if (node && node.sortableInfo && _this.nodeIsChild(node) && !_this.state.sorting) {\n var useDragHandle = _this.props.useDragHandle;\n var _node$sortableInfo = node.sortableInfo,\n index = _node$sortableInfo.index,\n collection = _node$sortableInfo.collection,\n disabled = _node$sortableInfo.disabled;\n\n if (disabled) {\n return;\n }\n\n if (useDragHandle && !closest(event.target, isSortableHandle)) {\n return;\n }\n\n _this.manager.active = {\n collection: collection,\n index: index\n };\n\n if (!isTouchEvent(event) && event.target.tagName === NodeType.Anchor) {\n event.preventDefault();\n }\n\n if (!distance) {\n if (_this.props.pressDelay === 0) {\n _this.handlePress(event);\n } else {\n _this.pressTimer = setTimeout(function () {\n return _this.handlePress(event);\n }, _this.props.pressDelay);\n }\n }\n }\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "nodeIsChild", function (node) {\n return node.sortableInfo.manager === _this.manager;\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "handleMove", function (event) {\n var _this$props2 = _this.props,\n distance = _this$props2.distance,\n pressThreshold = _this$props2.pressThreshold;\n\n if (!_this.state.sorting && _this.touched && !_this._awaitingUpdateBeforeSortStart) {\n var position = getPosition(event);\n var delta = {\n x: _this.position.x - position.x,\n y: _this.position.y - position.y\n };\n var combinedDelta = Math.abs(delta.x) + Math.abs(delta.y);\n _this.delta = delta;\n\n if (!distance && (!pressThreshold || combinedDelta >= pressThreshold)) {\n clearTimeout(_this.cancelTimer);\n _this.cancelTimer = setTimeout(_this.cancel, 0);\n } else if (distance && combinedDelta >= distance && _this.manager.isActive()) {\n _this.handlePress(event);\n }\n }\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "handleEnd", function () {\n _this.touched = false;\n\n _this.cancel();\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "cancel", function () {\n var distance = _this.props.distance;\n var sorting = _this.state.sorting;\n\n if (!sorting) {\n if (!distance) {\n clearTimeout(_this.pressTimer);\n }\n\n _this.manager.active = null;\n }\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "handlePress", function (event) {\n try {\n var active = _this.manager.getActive();\n\n var _temp6 = function () {\n if (active) {\n var _temp7 = function _temp7() {\n var index = _node.sortableInfo.index;\n var margin = getElementMargin(_node);\n var gridGap = getContainerGridGap(_this.container);\n\n var containerBoundingRect = _this.scrollContainer.getBoundingClientRect();\n\n var dimensions = _getHelperDimensions({\n index: index,\n node: _node,\n collection: _collection\n });\n\n _this.node = _node;\n _this.margin = margin;\n _this.gridGap = gridGap;\n _this.width = dimensions.width;\n _this.height = dimensions.height;\n _this.marginOffset = {\n x: _this.margin.left + _this.margin.right + _this.gridGap.x,\n y: Math.max(_this.margin.top, _this.margin.bottom, _this.gridGap.y)\n };\n _this.boundingClientRect = _node.getBoundingClientRect();\n _this.containerBoundingRect = containerBoundingRect;\n _this.index = index;\n _this.newIndex = index;\n _this.axis = {\n x: _axis.indexOf(\'x\') >= 0,\n y: _axis.indexOf(\'y\') >= 0\n };\n _this.offsetEdge = getEdgeOffset(_node, _this.container);\n\n if (_isKeySorting) {\n _this.initialOffset = getPosition(_objectSpread({}, event, {\n pageX: _this.boundingClientRect.left,\n pageY: _this.boundingClientRect.top\n }));\n } else {\n _this.initialOffset = getPosition(event);\n }\n\n _this.initialScroll = {\n left: _this.scrollContainer.scrollLeft,\n top: _this.scrollContainer.scrollTop\n };\n _this.initialWindowScroll = {\n left: window.pageXOffset,\n top: window.pageYOffset\n };\n _this.helper = _this.helperContainer.appendChild(cloneNode(_node));\n setInlineStyles(_this.helper, {\n boxSizing: \'border-box\',\n height: "".concat(_this.height, "px"),\n left: "".concat(_this.boundingClientRect.left - margin.left, "px"),\n pointerEvents: \'none\',\n position: \'fixed\',\n top: "".concat(_this.boundingClientRect.top - margin.top, "px"),\n width: "".concat(_this.width, "px")\n });\n\n if (_isKeySorting) {\n _this.helper.focus();\n }\n\n if (_hideSortableGhost) {\n _this.sortableGhost = _node;\n setInlineStyles(_node, {\n opacity: 0,\n visibility: \'hidden\'\n });\n }\n\n _this.minTranslate = {};\n _this.maxTranslate = {};\n\n if (_isKeySorting) {\n var _ref = _useWindowAsScrollContainer ? {\n top: 0,\n left: 0,\n width: _this.contentWindow.innerWidth,\n height: _this.contentWindow.innerHeight\n } : _this.containerBoundingRect,\n containerTop = _ref.top,\n containerLeft = _ref.left,\n containerWidth = _ref.width,\n containerHeight = _ref.height;\n\n var containerBottom = containerTop + containerHeight;\n var containerRight = containerLeft + containerWidth;\n\n if (_this.axis.x) {\n _this.minTranslate.x = containerLeft - _this.boundingClientRect.left;\n _this.maxTranslate.x = containerRight - (_this.boundingClientRect.left + _this.width);\n }\n\n if (_this.axis.y) {\n _this.minTranslate.y = containerTop - _this.boundingClientRect.top;\n _this.maxTranslate.y = containerBottom - (_this.boundingClientRect.top + _this.height);\n }\n } else {\n if (_this.axis.x) {\n _this.minTranslate.x = (_useWindowAsScrollContainer ? 0 : containerBoundingRect.left) - _this.boundingClientRect.left - _this.width / 2;\n _this.maxTranslate.x = (_useWindowAsScrollContainer ? _this.contentWindow.innerWidth : containerBoundingRect.left + containerBoundingRect.width) - _this.boundingClientRect.left - _this.width / 2;\n }\n\n if (_this.axis.y) {\n _this.minTranslate.y = (_useWindowAsScrollContainer ? 0 : containerBoundingRect.top) - _this.boundingClientRect.top - _this.height / 2;\n _this.maxTranslate.y = (_useWindowAsScrollContainer ? _this.contentWindow.innerHeight : containerBoundingRect.top + containerBoundingRect.height) - _this.boundingClientRect.top - _this.height / 2;\n }\n }\n\n if (_helperClass) {\n _helperClass.split(\' \').forEach(function (className) {\n return _this.helper.classList.add(className);\n });\n }\n\n _this.listenerNode = event.touches ? _node : _this.contentWindow;\n\n if (_isKeySorting) {\n _this.listenerNode.addEventListener(\'wheel\', _this.handleKeyEnd, true);\n\n _this.listenerNode.addEventListener(\'mousedown\', _this.handleKeyEnd, true);\n\n _this.listenerNode.addEventListener(\'keydown\', _this.handleKeyDown);\n } else {\n events.move.forEach(function (eventName) {\n return _this.listenerNode.addEventListener(eventName, _this.handleSortMove, false);\n });\n events.end.forEach(function (eventName) {\n return _this.listenerNode.addEventListener(eventName, _this.handleSortEnd, false);\n });\n }\n\n _this.setState({\n sorting: true,\n sortingIndex: index\n });\n\n if (_onSortStart) {\n _onSortStart({\n node: _node,\n index: index,\n collection: _collection,\n isKeySorting: _isKeySorting,\n nodes: _this.manager.getOrderedRefs(),\n helper: _this.helper\n }, event);\n }\n\n if (_isKeySorting) {\n _this.keyMove(0);\n }\n };\n\n var _this$props3 = _this.props,\n _axis = _this$props3.axis,\n _getHelperDimensions = _this$props3.getHelperDimensions,\n _helperClass = _this$props3.helperClass,\n _hideSortableGhost = _this$props3.hideSortableGhost,\n updateBeforeSortStart = _this$props3.updateBeforeSortStart,\n _onSortStart = _this$props3.onSortStart,\n _useWindowAsScrollContainer = _this$props3.useWindowAsScrollContainer;\n var _node = active.node,\n _collection = active.collection;\n var _isKeySorting = _this.manager.isKeySorting;\n\n var _temp8 = function () {\n if (typeof updateBeforeSortStart === \'function\') {\n _this._awaitingUpdateBeforeSortStart = true;\n\n var _temp9 = _finallyRethrows(function () {\n var index = _node.sortableInfo.index;\n return Promise.resolve(updateBeforeSortStart({\n collection: _collection,\n index: index,\n node: _node,\n isKeySorting: _isKeySorting\n }, event)).then(function () {});\n }, function (_wasThrown, _result) {\n _this._awaitingUpdateBeforeSortStart = false;\n if (_wasThrown) throw _result;\n return _result;\n });\n\n if (_temp9 && _temp9.then) return _temp9.then(function () {});\n }\n }();\n\n return _temp8 && _temp8.then ? _temp8.then(_temp7) : _temp7(_temp8);\n }\n }();\n\n return Promise.resolve(_temp6 && _temp6.then ? _temp6.then(function () {}) : void 0);\n } catch (e) {\n return Promise.reject(e);\n }\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "handleSortMove", function (event) {\n var onSortMove = _this.props.onSortMove;\n\n if (typeof event.preventDefault === \'function\') {\n event.preventDefault();\n }\n\n _this.updateHelperPosition(event);\n\n _this.animateNodes();\n\n _this.autoscroll();\n\n if (onSortMove) {\n onSortMove(event);\n }\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "handleSortEnd", function (event) {\n var _this$props4 = _this.props,\n hideSortableGhost = _this$props4.hideSortableGhost,\n onSortEnd = _this$props4.onSortEnd;\n var _this$manager = _this.manager,\n collection = _this$manager.active.collection,\n isKeySorting = _this$manager.isKeySorting;\n\n var nodes = _this.manager.getOrderedRefs();\n\n if (_this.listenerNode) {\n if (isKeySorting) {\n _this.listenerNode.removeEventListener(\'wheel\', _this.handleKeyEnd, true);\n\n _this.listenerNode.removeEventListener(\'mousedown\', _this.handleKeyEnd, true);\n\n _this.listenerNode.removeEventListener(\'keydown\', _this.handleKeyDown);\n } else {\n events.move.forEach(function (eventName) {\n return _this.listenerNode.removeEventListener(eventName, _this.handleSortMove);\n });\n events.end.forEach(function (eventName) {\n return _this.listenerNode.removeEventListener(eventName, _this.handleSortEnd);\n });\n }\n }\n\n _this.helper.parentNode.removeChild(_this.helper);\n\n if (hideSortableGhost && _this.sortableGhost) {\n setInlineStyles(_this.sortableGhost, {\n opacity: \'\',\n visibility: \'\'\n });\n }\n\n for (var i = 0, len = nodes.length; i < len; i++) {\n var _node2 = nodes[i];\n var el = _node2.node;\n _node2.edgeOffset = null;\n _node2.boundingClientRect = null;\n setTranslate3d(el, null);\n setTransitionDuration(el, null);\n _node2.translate = null;\n }\n\n _this.autoScroller.clear();\n\n _this.manager.active = null;\n _this.manager.isKeySorting = false;\n\n _this.setState({\n sorting: false,\n sortingIndex: null\n });\n\n if (typeof onSortEnd === \'function\') {\n onSortEnd({\n collection: collection,\n newIndex: _this.newIndex,\n oldIndex: _this.index,\n isKeySorting: isKeySorting,\n nodes: nodes\n }, event);\n }\n\n _this.touched = false;\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "autoscroll", function () {\n var disableAutoscroll = _this.props.disableAutoscroll;\n var isKeySorting = _this.manager.isKeySorting;\n\n if (disableAutoscroll) {\n _this.autoScroller.clear();\n\n return;\n }\n\n if (isKeySorting) {\n var translate = _objectSpread({}, _this.translate);\n\n var scrollX = 0;\n var scrollY = 0;\n\n if (_this.axis.x) {\n translate.x = Math.min(_this.maxTranslate.x, Math.max(_this.minTranslate.x, _this.translate.x));\n scrollX = _this.translate.x - translate.x;\n }\n\n if (_this.axis.y) {\n translate.y = Math.min(_this.maxTranslate.y, Math.max(_this.minTranslate.y, _this.translate.y));\n scrollY = _this.translate.y - translate.y;\n }\n\n _this.translate = translate;\n setTranslate3d(_this.helper, _this.translate);\n _this.scrollContainer.scrollLeft += scrollX;\n _this.scrollContainer.scrollTop += scrollY;\n return;\n }\n\n _this.autoScroller.update({\n height: _this.height,\n maxTranslate: _this.maxTranslate,\n minTranslate: _this.minTranslate,\n translate: _this.translate,\n width: _this.width\n });\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "onAutoScroll", function (offset) {\n _this.translate.x += offset.left;\n _this.translate.y += offset.top;\n\n _this.animateNodes();\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "handleKeyDown", function (event) {\n var keyCode = event.keyCode;\n var _this$props5 = _this.props,\n shouldCancelStart = _this$props5.shouldCancelStart,\n _this$props5$keyCodes = _this$props5.keyCodes,\n customKeyCodes = _this$props5$keyCodes === void 0 ? {} : _this$props5$keyCodes;\n\n var keyCodes = _objectSpread({}, defaultKeyCodes, customKeyCodes);\n\n if (_this.manager.active && !_this.manager.isKeySorting || !_this.manager.active && (!keyCodes.lift.includes(keyCode) || shouldCancelStart(event) || !_this.isValidSortingTarget(event))) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n\n if (keyCodes.lift.includes(keyCode) && !_this.manager.active) {\n _this.keyLift(event);\n } else if (keyCodes.drop.includes(keyCode) && _this.manager.active) {\n _this.keyDrop(event);\n } else if (keyCodes.cancel.includes(keyCode)) {\n _this.newIndex = _this.manager.active.index;\n\n _this.keyDrop(event);\n } else if (keyCodes.up.includes(keyCode)) {\n _this.keyMove(-1);\n } else if (keyCodes.down.includes(keyCode)) {\n _this.keyMove(1);\n }\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "keyLift", function (event) {\n var target = event.target;\n var node = closest(target, function (el) {\n return el.sortableInfo != null;\n });\n var _node$sortableInfo2 = node.sortableInfo,\n index = _node$sortableInfo2.index,\n collection = _node$sortableInfo2.collection;\n _this.initialFocusedNode = target;\n _this.manager.isKeySorting = true;\n _this.manager.active = {\n index: index,\n collection: collection\n };\n\n _this.handlePress(event);\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "keyMove", function (shift) {\n var nodes = _this.manager.getOrderedRefs();\n\n var lastIndex = nodes[nodes.length - 1].node.sortableInfo.index;\n var newIndex = _this.newIndex + shift;\n var prevIndex = _this.newIndex;\n\n if (newIndex < 0 || newIndex > lastIndex) {\n return;\n }\n\n _this.prevIndex = prevIndex;\n _this.newIndex = newIndex;\n var targetIndex = getTargetIndex(_this.newIndex, _this.prevIndex, _this.index);\n var target = nodes.find(function (_ref2) {\n var node = _ref2.node;\n return node.sortableInfo.index === targetIndex;\n });\n var targetNode = target.node;\n var scrollDelta = _this.containerScrollDelta;\n var targetBoundingClientRect = target.boundingClientRect || getScrollAdjustedBoundingClientRect(targetNode, scrollDelta);\n var targetTranslate = target.translate || {\n x: 0,\n y: 0\n };\n var targetPosition = {\n top: targetBoundingClientRect.top + targetTranslate.y - scrollDelta.top,\n left: targetBoundingClientRect.left + targetTranslate.x - scrollDelta.left\n };\n var shouldAdjustForSize = prevIndex < newIndex;\n var sizeAdjustment = {\n x: shouldAdjustForSize && _this.axis.x ? targetNode.offsetWidth - _this.width : 0,\n y: shouldAdjustForSize && _this.axis.y ? targetNode.offsetHeight - _this.height : 0\n };\n\n _this.handleSortMove({\n pageX: targetPosition.left + sizeAdjustment.x,\n pageY: targetPosition.top + sizeAdjustment.y,\n ignoreTransition: shift === 0\n });\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "keyDrop", function (event) {\n _this.handleSortEnd(event);\n\n if (_this.initialFocusedNode) {\n _this.initialFocusedNode.focus();\n }\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "handleKeyEnd", function (event) {\n if (_this.manager.active) {\n _this.keyDrop(event);\n }\n });\n\n _defineProperty((0,assertThisInitialized/* default */.Z)((0,assertThisInitialized/* default */.Z)(_this)), "isValidSortingTarget", function (event) {\n var useDragHandle = _this.props.useDragHandle;\n var target = event.target;\n var node = closest(target, function (el) {\n return el.sortableInfo != null;\n });\n return node && node.sortableInfo && !node.sortableInfo.disabled && (useDragHandle ? isSortableHandle(target) : target.sortableInfo);\n });\n\n validateProps(props);\n _this.manager = new Manager();\n _this.events = {\n end: _this.handleEnd,\n move: _this.handleMove,\n start: _this.handleStart\n };\n return _this;\n }\n\n _createClass(WithSortableContainer, [{\n key: "getChildContext",\n value: function getChildContext() {\n return {\n manager: this.manager\n };\n }\n }, {\n key: "componentDidMount",\n value: function componentDidMount() {\n var _this2 = this;\n\n var useWindowAsScrollContainer = this.props.useWindowAsScrollContainer;\n var container = this.getContainer();\n Promise.resolve(container).then(function (containerNode) {\n _this2.container = containerNode;\n _this2.document = _this2.container.ownerDocument || document;\n var contentWindow = _this2.props.contentWindow || _this2.document.defaultView || window;\n _this2.contentWindow = typeof contentWindow === \'function\' ? contentWindow() : contentWindow;\n _this2.scrollContainer = useWindowAsScrollContainer ? _this2.document.scrollingElement || _this2.document.documentElement : getScrollingParent(_this2.container) || _this2.container;\n _this2.autoScroller = new AutoScroller(_this2.scrollContainer, _this2.onAutoScroll);\n Object.keys(_this2.events).forEach(function (key) {\n return events[key].forEach(function (eventName) {\n return _this2.container.addEventListener(eventName, _this2.events[key], false);\n });\n });\n\n _this2.container.addEventListener(\'keydown\', _this2.handleKeyDown);\n });\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n var _this3 = this;\n\n if (this.helper && this.helper.parentNode) {\n this.helper.parentNode.removeChild(this.helper);\n }\n\n if (!this.container) {\n return;\n }\n\n Object.keys(this.events).forEach(function (key) {\n return events[key].forEach(function (eventName) {\n return _this3.container.removeEventListener(eventName, _this3.events[key]);\n });\n });\n this.container.removeEventListener(\'keydown\', this.handleKeyDown);\n }\n }, {\n key: "updateHelperPosition",\n value: function updateHelperPosition(event) {\n var _this$props6 = this.props,\n lockAxis = _this$props6.lockAxis,\n lockOffset = _this$props6.lockOffset,\n lockToContainerEdges = _this$props6.lockToContainerEdges,\n transitionDuration = _this$props6.transitionDuration,\n _this$props6$keyboard = _this$props6.keyboardSortingTransitionDuration,\n keyboardSortingTransitionDuration = _this$props6$keyboard === void 0 ? transitionDuration : _this$props6$keyboard;\n var isKeySorting = this.manager.isKeySorting;\n var ignoreTransition = event.ignoreTransition;\n var offset = getPosition(event);\n var translate = {\n x: offset.x - this.initialOffset.x,\n y: offset.y - this.initialOffset.y\n };\n translate.y -= window.pageYOffset - this.initialWindowScroll.top;\n translate.x -= window.pageXOffset - this.initialWindowScroll.left;\n this.translate = translate;\n\n if (lockToContainerEdges) {\n var _getLockPixelOffsets = getLockPixelOffsets({\n height: this.height,\n lockOffset: lockOffset,\n width: this.width\n }),\n _getLockPixelOffsets2 = _slicedToArray(_getLockPixelOffsets, 2),\n minLockOffset = _getLockPixelOffsets2[0],\n maxLockOffset = _getLockPixelOffsets2[1];\n\n var minOffset = {\n x: this.width / 2 - minLockOffset.x,\n y: this.height / 2 - minLockOffset.y\n };\n var maxOffset = {\n x: this.width / 2 - maxLockOffset.x,\n y: this.height / 2 - maxLockOffset.y\n };\n translate.x = limit(this.minTranslate.x + minOffset.x, this.maxTranslate.x - maxOffset.x, translate.x);\n translate.y = limit(this.minTranslate.y + minOffset.y, this.maxTranslate.y - maxOffset.y, translate.y);\n }\n\n if (lockAxis === \'x\') {\n translate.y = 0;\n } else if (lockAxis === \'y\') {\n translate.x = 0;\n }\n\n if (isKeySorting && keyboardSortingTransitionDuration && !ignoreTransition) {\n setTransitionDuration(this.helper, keyboardSortingTransitionDuration);\n }\n\n setTranslate3d(this.helper, translate);\n }\n }, {\n key: "animateNodes",\n value: function animateNodes() {\n var _this$props7 = this.props,\n transitionDuration = _this$props7.transitionDuration,\n hideSortableGhost = _this$props7.hideSortableGhost,\n onSortOver = _this$props7.onSortOver;\n var containerScrollDelta = this.containerScrollDelta,\n windowScrollDelta = this.windowScrollDelta;\n var nodes = this.manager.getOrderedRefs();\n var sortingOffset = {\n left: this.offsetEdge.left + this.translate.x + containerScrollDelta.left,\n top: this.offsetEdge.top + this.translate.y + containerScrollDelta.top\n };\n var isKeySorting = this.manager.isKeySorting;\n var prevIndex = this.newIndex;\n this.newIndex = null;\n\n for (var i = 0, len = nodes.length; i < len; i++) {\n var _node3 = nodes[i].node;\n var index = _node3.sortableInfo.index;\n var width = _node3.offsetWidth;\n var height = _node3.offsetHeight;\n var offset = {\n height: this.height > height ? height / 2 : this.height / 2,\n width: this.width > width ? width / 2 : this.width / 2\n };\n var mustShiftBackward = isKeySorting && index > this.index && index <= prevIndex;\n var mustShiftForward = isKeySorting && index < this.index && index >= prevIndex;\n var translate = {\n x: 0,\n y: 0\n };\n var edgeOffset = nodes[i].edgeOffset;\n\n if (!edgeOffset) {\n edgeOffset = getEdgeOffset(_node3, this.container);\n nodes[i].edgeOffset = edgeOffset;\n\n if (isKeySorting) {\n nodes[i].boundingClientRect = getScrollAdjustedBoundingClientRect(_node3, containerScrollDelta);\n }\n }\n\n var nextNode = i < nodes.length - 1 && nodes[i + 1];\n var prevNode = i > 0 && nodes[i - 1];\n\n if (nextNode && !nextNode.edgeOffset) {\n nextNode.edgeOffset = getEdgeOffset(nextNode.node, this.container);\n\n if (isKeySorting) {\n nextNode.boundingClientRect = getScrollAdjustedBoundingClientRect(nextNode.node, containerScrollDelta);\n }\n }\n\n if (index === this.index) {\n if (hideSortableGhost) {\n this.sortableGhost = _node3;\n setInlineStyles(_node3, {\n opacity: 0,\n visibility: \'hidden\'\n });\n }\n\n continue;\n }\n\n if (transitionDuration) {\n setTransitionDuration(_node3, transitionDuration);\n }\n\n if (this.axis.x) {\n if (this.axis.y) {\n if (mustShiftForward || index < this.index && (sortingOffset.left + windowScrollDelta.left - offset.width <= edgeOffset.left && sortingOffset.top + windowScrollDelta.top <= edgeOffset.top + offset.height || sortingOffset.top + windowScrollDelta.top + offset.height <= edgeOffset.top)) {\n translate.x = this.width + this.marginOffset.x;\n\n if (edgeOffset.left + translate.x > this.containerBoundingRect.width - offset.width) {\n if (nextNode) {\n translate.x = nextNode.edgeOffset.left - edgeOffset.left;\n translate.y = nextNode.edgeOffset.top - edgeOffset.top;\n }\n }\n\n if (this.newIndex === null) {\n this.newIndex = index;\n }\n } else if (mustShiftBackward || index > this.index && (sortingOffset.left + windowScrollDelta.left + offset.width >= edgeOffset.left && sortingOffset.top + windowScrollDelta.top + offset.height >= edgeOffset.top || sortingOffset.top + windowScrollDelta.top + offset.height >= edgeOffset.top + height)) {\n translate.x = -(this.width + this.marginOffset.x);\n\n if (edgeOffset.left + translate.x < this.containerBoundingRect.left + offset.width) {\n if (prevNode) {\n translate.x = prevNode.edgeOffset.left - edgeOffset.left;\n translate.y = prevNode.edgeOffset.top - edgeOffset.top;\n }\n }\n\n this.newIndex = index;\n }\n } else {\n if (mustShiftBackward || index > this.index && sortingOffset.left + windowScrollDelta.left + offset.width >= edgeOffset.left) {\n translate.x = -(this.width + this.marginOffset.x);\n this.newIndex = index;\n } else if (mustShiftForward || index < this.index && sortingOffset.left + windowScrollDelta.left <= edgeOffset.left + offset.width) {\n translate.x = this.width + this.marginOffset.x;\n\n if (this.newIndex == null) {\n this.newIndex = index;\n }\n }\n }\n } else if (this.axis.y) {\n if (mustShiftBackward || index > this.index && sortingOffset.top + windowScrollDelta.top + offset.height >= edgeOffset.top) {\n translate.y = -(this.height + this.marginOffset.y);\n this.newIndex = index;\n } else if (mustShiftForward || index < this.index && sortingOffset.top + windowScrollDelta.top <= edgeOffset.top + offset.height) {\n translate.y = this.height + this.marginOffset.y;\n\n if (this.newIndex == null) {\n this.newIndex = index;\n }\n }\n }\n\n setTranslate3d(_node3, translate);\n nodes[i].translate = translate;\n }\n\n if (this.newIndex == null) {\n this.newIndex = this.index;\n }\n\n if (isKeySorting) {\n this.newIndex = prevIndex;\n }\n\n var oldIndex = isKeySorting ? this.prevIndex : prevIndex;\n\n if (onSortOver && this.newIndex !== oldIndex) {\n onSortOver({\n collection: this.manager.active.collection,\n index: this.index,\n newIndex: this.newIndex,\n oldIndex: oldIndex,\n isKeySorting: isKeySorting,\n nodes: nodes,\n helper: this.helper\n });\n }\n }\n }, {\n key: "getWrappedInstance",\n value: function getWrappedInstance() {\n browser_default()(config.withRef, \'To access the wrapped instance, you need to pass in {withRef: true} as the second argument of the SortableContainer() call\');\n return this.refs.wrappedInstance;\n }\n }, {\n key: "getContainer",\n value: function getContainer() {\n var getContainer = this.props.getContainer;\n\n if (typeof getContainer !== \'function\') {\n return (0,external_ReactDOM_.findDOMNode)(this);\n }\n\n return getContainer(config.withRef ? this.getWrappedInstance() : undefined);\n }\n }, {\n key: "render",\n value: function render() {\n var ref = config.withRef ? \'wrappedInstance\' : null;\n return (0,external_React_.createElement)(WrappedComponent, (0,esm_extends["default"])({\n ref: ref\n }, omit(this.props, omittedProps)));\n }\n }, {\n key: "helperContainer",\n get: function get() {\n var helperContainer = this.props.helperContainer;\n\n if (typeof helperContainer === \'function\') {\n return helperContainer();\n }\n\n return this.props.helperContainer || this.document.body;\n }\n }, {\n key: "containerScrollDelta",\n get: function get() {\n var useWindowAsScrollContainer = this.props.useWindowAsScrollContainer;\n\n if (useWindowAsScrollContainer) {\n return {\n left: 0,\n top: 0\n };\n }\n\n return {\n left: this.scrollContainer.scrollLeft - this.initialScroll.left,\n top: this.scrollContainer.scrollTop - this.initialScroll.top\n };\n }\n }, {\n key: "windowScrollDelta",\n get: function get() {\n return {\n left: this.contentWindow.pageXOffset - this.initialWindowScroll.left,\n top: this.contentWindow.pageYOffset - this.initialWindowScroll.top\n };\n }\n }]);\n\n return WithSortableContainer;\n }(external_React_.Component), _defineProperty(_class, "displayName", provideDisplayName(\'sortableList\', WrappedComponent)), _defineProperty(_class, "defaultProps", defaultProps), _defineProperty(_class, "propTypes", propTypes), _defineProperty(_class, "childContextTypes", {\n manager: (prop_types_default()).object.isRequired\n }), _temp;\n}\n\nvar propTypes$1 = {\n index: (prop_types_default()).number.isRequired,\n collection: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n disabled: (prop_types_default()).bool\n};\nvar omittedProps$1 = Object.keys(propTypes$1);\nfunction sortableElement(WrappedComponent) {\n var _class, _temp;\n\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n withRef: false\n };\n return _temp = _class = function (_React$Component) {\n _inherits(WithSortableElement, _React$Component);\n\n function WithSortableElement() {\n _classCallCheck(this, WithSortableElement);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(WithSortableElement).apply(this, arguments));\n }\n\n _createClass(WithSortableElement, [{\n key: "componentDidMount",\n value: function componentDidMount() {\n this.register();\n }\n }, {\n key: "componentDidUpdate",\n value: function componentDidUpdate(prevProps) {\n if (this.node) {\n if (prevProps.index !== this.props.index) {\n this.node.sortableInfo.index = this.props.index;\n }\n\n if (prevProps.disabled !== this.props.disabled) {\n this.node.sortableInfo.disabled = this.props.disabled;\n }\n }\n\n if (prevProps.collection !== this.props.collection) {\n this.unregister(prevProps.collection);\n this.register();\n }\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n this.unregister();\n }\n }, {\n key: "register",\n value: function register() {\n var _this$props = this.props,\n collection = _this$props.collection,\n disabled = _this$props.disabled,\n index = _this$props.index;\n var node = (0,external_ReactDOM_.findDOMNode)(this);\n node.sortableInfo = {\n collection: collection,\n disabled: disabled,\n index: index,\n manager: this.context.manager\n };\n this.node = node;\n this.ref = {\n node: node\n };\n this.context.manager.add(collection, this.ref);\n }\n }, {\n key: "unregister",\n value: function unregister() {\n var collection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props.collection;\n this.context.manager.remove(collection, this.ref);\n }\n }, {\n key: "getWrappedInstance",\n value: function getWrappedInstance() {\n browser_default()(config.withRef, \'To access the wrapped instance, you need to pass in {withRef: true} as the second argument of the SortableElement() call\');\n return this.refs.wrappedInstance;\n }\n }, {\n key: "render",\n value: function render() {\n var ref = config.withRef ? \'wrappedInstance\' : null;\n return (0,external_React_.createElement)(WrappedComponent, (0,esm_extends["default"])({\n ref: ref\n }, omit(this.props, omittedProps$1)));\n }\n }]);\n\n return WithSortableElement;\n }(external_React_.Component), _defineProperty(_class, "displayName", provideDisplayName(\'sortableElement\', WrappedComponent)), _defineProperty(_class, "contextTypes", {\n manager: (prop_types_default()).object.isRequired\n }), _defineProperty(_class, "propTypes", propTypes$1), _defineProperty(_class, "defaultProps", {\n collection: 0\n }), _temp;\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM2Mi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcz9jMTEyIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzP2QzNTQiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlMaWtlVG9BcnJheS5qcz9jMjRmIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzPzEwMDEiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzPzJlZjQiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcz8yMjdkIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzPzkzZGUiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkLmpzPzVjZWMiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanM/ZjJiNSIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcz83ZWEyIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcz8xMTlhIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanM/NzA4YiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZi5qcz9iYTZjIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzLmpzP2FlYjkiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRob3V0SG9sZXMuanM/YzNkYiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXkuanM/N2E1YyIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9ub25JdGVyYWJsZVNwcmVhZC5qcz85MjE0Iiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzPzlhMmUiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc29ydGFibGUtaG9jL2Rpc3QvcmVhY3Qtc29ydGFibGUtaG9jLmVzbS5qcz82MDkwIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcblxuICBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcblxuICB2YXIgX3MsIF9lO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufSIsImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn0iLCJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRoSG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXlMaW1pdCBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVSZXN0IGZyb20gXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn0iLCJpbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSBcIi4vZGVmaW5lUHJvcGVydHkuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gT2JqZWN0KGFyZ3VtZW50c1tpXSkgOiB7fTtcbiAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG93bktleXMucHVzaC5hcHBseShvd25LZXlzLCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufSIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59IiwiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufSIsImltcG9ydCBhcnJheVdpdGhvdXRIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhvdXRIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlU3ByZWFkIGZyb20gXCIuL25vbkl0ZXJhYmxlU3ByZWFkLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcyc7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheSc7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQnO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjayc7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzJztcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJztcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZ2V0UHJvdG90eXBlT2YnO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0cyc7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQnO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eSc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgZmluZERPTU5vZGUgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheSc7XG5cbnZhciBNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNYW5hZ2VyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYW5hZ2VyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlZnNcIiwge30pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hbmFnZXIsIFt7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQoY29sbGVjdGlvbiwgcmVmKSB7XG4gICAgICBpZiAoIXRoaXMucmVmc1tjb2xsZWN0aW9uXSkge1xuICAgICAgICB0aGlzLnJlZnNbY29sbGVjdGlvbl0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZWZzW2NvbGxlY3Rpb25dLnB1c2gocmVmKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZShjb2xsZWN0aW9uLCByZWYpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0SW5kZXgoY29sbGVjdGlvbiwgcmVmKTtcblxuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLnJlZnNbY29sbGVjdGlvbl0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNBY3RpdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEFjdGl2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBY3RpdmUoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZWZzW3RoaXMuYWN0aXZlLmNvbGxlY3Rpb25dLmZpbmQoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfcmVmLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlLnNvcnRhYmxlSW5mby5pbmRleCA9PSBfdGhpcy5hY3RpdmUuaW5kZXg7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SW5kZXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SW5kZXgoY29sbGVjdGlvbiwgcmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZzW2NvbGxlY3Rpb25dLmluZGV4T2YocmVmKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0T3JkZXJlZFJlZnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3JkZXJlZFJlZnMoKSB7XG4gICAgICB2YXIgY29sbGVjdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5hY3RpdmUuY29sbGVjdGlvbjtcbiAgICAgIHJldHVybiB0aGlzLnJlZnNbY29sbGVjdGlvbl0uc29ydChzb3J0QnlJbmRleCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1hbmFnZXI7XG59KCk7XG5cbmZ1bmN0aW9uIHNvcnRCeUluZGV4KF9yZWYyLCBfcmVmMykge1xuICB2YXIgaW5kZXgxID0gX3JlZjIubm9kZS5zb3J0YWJsZUluZm8uaW5kZXg7XG4gIHZhciBpbmRleDIgPSBfcmVmMy5ub2RlLnNvcnRhYmxlSW5mby5pbmRleDtcbiAgcmV0dXJuIGluZGV4MSAtIGluZGV4Mjtcbn1cblxuZnVuY3Rpb24gYXJyYXlNb3ZlKGFycmF5LCBmcm9tLCB0bykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkRlcHJlY2F0aW9uIHdhcm5pbmc6IGFycmF5TW92ZSB3aWxsIG5vIGxvbmdlciBiZSBleHBvcnRlZCBieSAncmVhY3Qtc29ydGFibGUtaG9jJyBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBQbGVhc2UgaW5zdGFsbCB0aGUgYGFycmF5LW1vdmVgIHBhY2thZ2UgbG9jYWxseSBpbnN0ZWFkLiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9hcnJheS1tb3ZlXCIpO1xuICAgIH1cbiAgfVxuXG4gIGFycmF5ID0gYXJyYXkuc2xpY2UoKTtcbiAgYXJyYXkuc3BsaWNlKHRvIDwgMCA/IGFycmF5Lmxlbmd0aCArIHRvIDogdG8sIDAsIGFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XG4gIHJldHVybiBhcnJheTtcbn1cbmZ1bmN0aW9uIG9taXQob2JqLCBrZXlzVG9PbWl0KSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBpZiAoa2V5c1RvT21pdC5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICBhY2Nba2V5XSA9IG9ialtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cbnZhciBldmVudHMgPSB7XG4gIGVuZDogWyd0b3VjaGVuZCcsICd0b3VjaGNhbmNlbCcsICdtb3VzZXVwJ10sXG4gIG1vdmU6IFsndG91Y2htb3ZlJywgJ21vdXNlbW92ZSddLFxuICBzdGFydDogWyd0b3VjaHN0YXJ0JywgJ21vdXNlZG93biddXG59O1xudmFyIHZlbmRvclByZWZpeCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnJykgfHwgWyctbW96LWhpZGRlbi1pZnJhbWUnXTtcbiAgdmFyIHByZSA9IChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzdHlsZXMpLmpvaW4oJycpLm1hdGNoKC8tKG1venx3ZWJraXR8bXMpLS8pIHx8IHN0eWxlcy5PTGluayA9PT0gJycgJiYgWycnLCAnbyddKVsxXTtcblxuICBzd2l0Y2ggKHByZSkge1xuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiAnbXMnO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBwcmUgJiYgcHJlLmxlbmd0aCA/IHByZVswXS50b1VwcGVyQ2FzZSgpICsgcHJlLnN1YnN0cigxKSA6ICcnO1xuICB9XG59KCk7XG5mdW5jdGlvbiBzZXRJbmxpbmVTdHlsZXMobm9kZSwgc3R5bGVzKSB7XG4gIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgbm9kZS5zdHlsZVtrZXldID0gc3R5bGVzW2tleV07XG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0VHJhbnNsYXRlM2Qobm9kZSwgdHJhbnNsYXRlKSB7XG4gIG5vZGUuc3R5bGVbXCJcIi5jb25jYXQodmVuZG9yUHJlZml4LCBcIlRyYW5zZm9ybVwiKV0gPSB0cmFuc2xhdGUgPT0gbnVsbCA/ICcnIDogXCJ0cmFuc2xhdGUzZChcIi5jb25jYXQodHJhbnNsYXRlLngsIFwicHgsXCIpLmNvbmNhdCh0cmFuc2xhdGUueSwgXCJweCwwKVwiKTtcbn1cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb25EdXJhdGlvbihub2RlLCBkdXJhdGlvbikge1xuICBub2RlLnN0eWxlW1wiXCIuY29uY2F0KHZlbmRvclByZWZpeCwgXCJUcmFuc2l0aW9uRHVyYXRpb25cIildID0gZHVyYXRpb24gPT0gbnVsbCA/ICcnIDogXCJcIi5jb25jYXQoZHVyYXRpb24sIFwibXNcIik7XG59XG5mdW5jdGlvbiBjbG9zZXN0KGVsLCBmbikge1xuICB3aGlsZSAoZWwpIHtcbiAgICBpZiAoZm4oZWwpKSB7XG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuXG4gICAgZWwgPSBlbC5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBsaW1pdChtaW4sIG1heCwgdmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4odmFsdWUsIG1heCkpO1xufVxuXG5mdW5jdGlvbiBnZXRQaXhlbFZhbHVlKHN0cmluZ1ZhbHVlKSB7XG4gIGlmIChzdHJpbmdWYWx1ZS5zdWJzdHIoLTIpID09PSAncHgnKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyaW5nVmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRNYXJnaW4oZWxlbWVudCkge1xuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgcmV0dXJuIHtcbiAgICBib3R0b206IGdldFBpeGVsVmFsdWUoc3R5bGUubWFyZ2luQm90dG9tKSxcbiAgICBsZWZ0OiBnZXRQaXhlbFZhbHVlKHN0eWxlLm1hcmdpbkxlZnQpLFxuICAgIHJpZ2h0OiBnZXRQaXhlbFZhbHVlKHN0eWxlLm1hcmdpblJpZ2h0KSxcbiAgICB0b3A6IGdldFBpeGVsVmFsdWUoc3R5bGUubWFyZ2luVG9wKVxuICB9O1xufVxuZnVuY3Rpb24gcHJvdmlkZURpc3BsYXlOYW1lKHByZWZpeCwgQ29tcG9uZW50JCQxKSB7XG4gIHZhciBjb21wb25lbnROYW1lID0gQ29tcG9uZW50JCQxLmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudCQkMS5uYW1lO1xuICByZXR1cm4gY29tcG9uZW50TmFtZSA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIoXCIpLmNvbmNhdChjb21wb25lbnROYW1lLCBcIilcIikgOiBwcmVmaXg7XG59XG5mdW5jdGlvbiBnZXRTY3JvbGxBZGp1c3RlZEJvdW5kaW5nQ2xpZW50UmVjdChub2RlLCBzY3JvbGxEZWx0YSkge1xuICB2YXIgYm91bmRpbmdDbGllbnRSZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IGJvdW5kaW5nQ2xpZW50UmVjdC50b3AgKyBzY3JvbGxEZWx0YS50b3AsXG4gICAgbGVmdDogYm91bmRpbmdDbGllbnRSZWN0LmxlZnQgKyBzY3JvbGxEZWx0YS5sZWZ0XG4gIH07XG59XG5mdW5jdGlvbiBnZXRQb3NpdGlvbihldmVudCkge1xuICBpZiAoZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBldmVudC50b3VjaGVzWzBdLnBhZ2VYLFxuICAgICAgeTogZXZlbnQudG91Y2hlc1swXS5wYWdlWVxuICAgIH07XG4gIH0gZWxzZSBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLFxuICAgICAgeTogZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBldmVudC5wYWdlWCxcbiAgICAgIHk6IGV2ZW50LnBhZ2VZXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gaXNUb3VjaEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoIHx8IGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGdldEVkZ2VPZmZzZXQobm9kZSwgcGFyZW50KSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHtcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMFxuICB9O1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgbm9kZU9mZnNldCA9IHtcbiAgICBsZWZ0OiBvZmZzZXQubGVmdCArIG5vZGUub2Zmc2V0TGVmdCxcbiAgICB0b3A6IG9mZnNldC50b3AgKyBub2RlLm9mZnNldFRvcFxuICB9O1xuXG4gIGlmIChub2RlLnBhcmVudE5vZGUgPT09IHBhcmVudCkge1xuICAgIHJldHVybiBub2RlT2Zmc2V0O1xuICB9XG5cbiAgcmV0dXJuIGdldEVkZ2VPZmZzZXQobm9kZS5wYXJlbnROb2RlLCBwYXJlbnQsIG5vZGVPZmZzZXQpO1xufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5kZXgobmV3SW5kZXgsIHByZXZJbmRleCwgb2xkSW5kZXgpIHtcbiAgaWYgKG5ld0luZGV4IDwgb2xkSW5kZXggJiYgbmV3SW5kZXggPiBwcmV2SW5kZXgpIHtcbiAgICByZXR1cm4gbmV3SW5kZXggLSAxO1xuICB9IGVsc2UgaWYgKG5ld0luZGV4ID4gb2xkSW5kZXggJiYgbmV3SW5kZXggPCBwcmV2SW5kZXgpIHtcbiAgICByZXR1cm4gbmV3SW5kZXggKyAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXdJbmRleDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0TG9ja1BpeGVsT2Zmc2V0KF9yZWYpIHtcbiAgdmFyIGxvY2tPZmZzZXQgPSBfcmVmLmxvY2tPZmZzZXQsXG4gICAgICB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcbiAgdmFyIG9mZnNldFggPSBsb2NrT2Zmc2V0O1xuICB2YXIgb2Zmc2V0WSA9IGxvY2tPZmZzZXQ7XG4gIHZhciB1bml0ID0gJ3B4JztcblxuICBpZiAodHlwZW9mIGxvY2tPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1hdGNoID0gL15bKy1dP1xcZCooPzpcXC5cXGQqKT8ocHh8JSkkLy5leGVjKGxvY2tPZmZzZXQpO1xuICAgIGludmFyaWFudChtYXRjaCAhPT0gbnVsbCwgJ2xvY2tPZmZzZXQgdmFsdWUgc2hvdWxkIGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIG9mIGEgJyArICdudW1iZXIgZm9sbG93ZWQgYnkgXCJweFwiIG9yIFwiJVwiLiBHaXZlbiAlcycsIGxvY2tPZmZzZXQpO1xuICAgIG9mZnNldFggPSBwYXJzZUZsb2F0KGxvY2tPZmZzZXQpO1xuICAgIG9mZnNldFkgPSBwYXJzZUZsb2F0KGxvY2tPZmZzZXQpO1xuICAgIHVuaXQgPSBtYXRjaFsxXTtcbiAgfVxuXG4gIGludmFyaWFudChpc0Zpbml0ZShvZmZzZXRYKSAmJiBpc0Zpbml0ZShvZmZzZXRZKSwgJ2xvY2tPZmZzZXQgdmFsdWUgc2hvdWxkIGJlIGEgZmluaXRlLiBHaXZlbiAlcycsIGxvY2tPZmZzZXQpO1xuXG4gIGlmICh1bml0ID09PSAnJScpIHtcbiAgICBvZmZzZXRYID0gb2Zmc2V0WCAqIHdpZHRoIC8gMTAwO1xuICAgIG9mZnNldFkgPSBvZmZzZXRZICogaGVpZ2h0IC8gMTAwO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBvZmZzZXRYLFxuICAgIHk6IG9mZnNldFlcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldExvY2tQaXhlbE9mZnNldHMoX3JlZjIpIHtcbiAgdmFyIGhlaWdodCA9IF9yZWYyLmhlaWdodCxcbiAgICAgIHdpZHRoID0gX3JlZjIud2lkdGgsXG4gICAgICBsb2NrT2Zmc2V0ID0gX3JlZjIubG9ja09mZnNldDtcbiAgdmFyIG9mZnNldHMgPSBBcnJheS5pc0FycmF5KGxvY2tPZmZzZXQpID8gbG9ja09mZnNldCA6IFtsb2NrT2Zmc2V0LCBsb2NrT2Zmc2V0XTtcbiAgaW52YXJpYW50KG9mZnNldHMubGVuZ3RoID09PSAyLCAnbG9ja09mZnNldCBwcm9wIG9mIFNvcnRhYmxlQ29udGFpbmVyIHNob3VsZCBiZSBhIHNpbmdsZSAnICsgJ3ZhbHVlIG9yIGFuIGFycmF5IG9mIGV4YWN0bHkgdHdvIHZhbHVlcy4gR2l2ZW4gJXMnLCBsb2NrT2Zmc2V0KTtcblxuICB2YXIgX29mZnNldHMgPSBfc2xpY2VkVG9BcnJheShvZmZzZXRzLCAyKSxcbiAgICAgIG1pbkxvY2tPZmZzZXQgPSBfb2Zmc2V0c1swXSxcbiAgICAgIG1heExvY2tPZmZzZXQgPSBfb2Zmc2V0c1sxXTtcblxuICByZXR1cm4gW2dldExvY2tQaXhlbE9mZnNldCh7XG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgbG9ja09mZnNldDogbWluTG9ja09mZnNldCxcbiAgICB3aWR0aDogd2lkdGhcbiAgfSksIGdldExvY2tQaXhlbE9mZnNldCh7XG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgbG9ja09mZnNldDogbWF4TG9ja09mZnNldCxcbiAgICB3aWR0aDogd2lkdGhcbiAgfSldO1xufVxuXG5mdW5jdGlvbiBpc1Njcm9sbGFibGUoZWwpIHtcbiAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gIHZhciBvdmVyZmxvd1JlZ2V4ID0gLyhhdXRvfHNjcm9sbCkvO1xuICB2YXIgcHJvcGVydGllcyA9IFsnb3ZlcmZsb3cnLCAnb3ZlcmZsb3dYJywgJ292ZXJmbG93WSddO1xuICByZXR1cm4gcHJvcGVydGllcy5maW5kKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgIHJldHVybiBvdmVyZmxvd1JlZ2V4LnRlc3QoY29tcHV0ZWRTdHlsZVtwcm9wZXJ0eV0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsaW5nUGFyZW50KGVsKSB7XG4gIGlmICghKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAoaXNTY3JvbGxhYmxlKGVsKSkge1xuICAgIHJldHVybiBlbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsaW5nUGFyZW50KGVsLnBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDb250YWluZXJHcmlkR2FwKGVsZW1lbnQpIHtcbiAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgaWYgKHN0eWxlLmRpc3BsYXkgPT09ICdncmlkJykge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBnZXRQaXhlbFZhbHVlKHN0eWxlLmdyaWRDb2x1bW5HYXApLFxuICAgICAgeTogZ2V0UGl4ZWxWYWx1ZShzdHlsZS5ncmlkUm93R2FwKVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufVxudmFyIEtFWUNPREUgPSB7XG4gIFRBQjogOSxcbiAgRVNDOiAyNyxcbiAgU1BBQ0U6IDMyLFxuICBMRUZUOiAzNyxcbiAgVVA6IDM4LFxuICBSSUdIVDogMzksXG4gIERPV046IDQwXG59O1xudmFyIE5vZGVUeXBlID0ge1xuICBBbmNob3I6ICdBJyxcbiAgQnV0dG9uOiAnQlVUVE9OJyxcbiAgQ2FudmFzOiAnQ0FOVkFTJyxcbiAgSW5wdXQ6ICdJTlBVVCcsXG4gIE9wdGlvbjogJ09QVElPTicsXG4gIFRleHRhcmVhOiAnVEVYVEFSRUEnLFxuICBTZWxlY3Q6ICdTRUxFQ1QnXG59O1xuZnVuY3Rpb24gY2xvbmVOb2RlKG5vZGUpIHtcbiAgdmFyIHNlbGVjdG9yID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBjYW52YXMsIFtjb250ZW50ZWRpdGFibGVdJztcbiAgdmFyIGZpZWxkcyA9IG5vZGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIHZhciBjbG9uZWROb2RlID0gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgdmFyIGNsb25lZEZpZWxkcyA9IF90b0NvbnN1bWFibGVBcnJheShjbG9uZWROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcblxuICBjbG9uZWRGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQsIGkpIHtcbiAgICBpZiAoZmllbGQudHlwZSAhPT0gJ2ZpbGUnKSB7XG4gICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkc1tpXS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3JhZGlvJyAmJiBmaWVsZC5uYW1lKSB7XG4gICAgICBmaWVsZC5uYW1lID0gXCJfX3NvcnRhYmxlQ2xvbmVfX1wiLmNvbmNhdChmaWVsZC5uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQudGFnTmFtZSA9PT0gTm9kZVR5cGUuQ2FudmFzICYmIGZpZWxkc1tpXS53aWR0aCA+IDAgJiYgZmllbGRzW2ldLmhlaWdodCA+IDApIHtcbiAgICAgIHZhciBkZXN0Q3R4ID0gZmllbGQuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIGRlc3RDdHguZHJhd0ltYWdlKGZpZWxkc1tpXSwgMCwgMCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNsb25lZE5vZGU7XG59XG5cbmZ1bmN0aW9uIHNvcnRhYmxlSGFuZGxlKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgdmFyIGNvbmZpZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIHdpdGhSZWY6IGZhbHNlXG4gIH07XG4gIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKFdpdGhTb3J0YWJsZUhhbmRsZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBXaXRoU29ydGFibGVIYW5kbGUoKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2l0aFNvcnRhYmxlSGFuZGxlKTtcblxuICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9nZXRQcm90b3R5cGVPZihXaXRoU29ydGFibGVIYW5kbGUpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhXaXRoU29ydGFibGVIYW5kbGUsIFt7XG4gICAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBmaW5kRE9NTm9kZSh0aGlzKTtcbiAgICAgICAgbm9kZS5zb3J0YWJsZUhhbmRsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFdyYXBwZWRJbnN0YW5jZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFdyYXBwZWRJbnN0YW5jZSgpIHtcbiAgICAgICAgaW52YXJpYW50KGNvbmZpZy53aXRoUmVmLCAnVG8gYWNjZXNzIHRoZSB3cmFwcGVkIGluc3RhbmNlLCB5b3UgbmVlZCB0byBwYXNzIGluIHt3aXRoUmVmOiB0cnVlfSBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBTb3J0YWJsZUhhbmRsZSgpIGNhbGwnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcy53cmFwcGVkSW5zdGFuY2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInJlbmRlclwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIHJlZiA9IGNvbmZpZy53aXRoUmVmID8gJ3dyYXBwZWRJbnN0YW5jZScgOiBudWxsO1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgICAgICAgcmVmOiByZWZcbiAgICAgICAgfSwgdGhpcy5wcm9wcykpO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBXaXRoU29ydGFibGVIYW5kbGU7XG4gIH0oQ29tcG9uZW50KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzcywgXCJkaXNwbGF5TmFtZVwiLCBwcm92aWRlRGlzcGxheU5hbWUoJ3NvcnRhYmxlSGFuZGxlJywgV3JhcHBlZENvbXBvbmVudCkpLCBfdGVtcDtcbn1cbmZ1bmN0aW9uIGlzU29ydGFibGVIYW5kbGUobm9kZSkge1xuICByZXR1cm4gbm9kZS5zb3J0YWJsZUhhbmRsZSAhPSBudWxsO1xufVxuXG52YXIgQXV0b1Njcm9sbGVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBdXRvU2Nyb2xsZXIoY29udGFpbmVyLCBvblNjcm9sbENhbGxiYWNrKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEF1dG9TY3JvbGxlcik7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLm9uU2Nyb2xsQ2FsbGJhY2sgPSBvblNjcm9sbENhbGxiYWNrO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEF1dG9TY3JvbGxlciwgW3tcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAgICAgIHRoaXMuaW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKF9yZWYpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciB0cmFuc2xhdGUgPSBfcmVmLnRyYW5zbGF0ZSxcbiAgICAgICAgICBtaW5UcmFuc2xhdGUgPSBfcmVmLm1pblRyYW5zbGF0ZSxcbiAgICAgICAgICBtYXhUcmFuc2xhdGUgPSBfcmVmLm1heFRyYW5zbGF0ZSxcbiAgICAgICAgICB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQ7XG4gICAgICB2YXIgZGlyZWN0aW9uID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9O1xuICAgICAgdmFyIHNwZWVkID0ge1xuICAgICAgICB4OiAxLFxuICAgICAgICB5OiAxXG4gICAgICB9O1xuICAgICAgdmFyIGFjY2VsZXJhdGlvbiA9IHtcbiAgICAgICAgeDogMTAsXG4gICAgICAgIHk6IDEwXG4gICAgICB9O1xuICAgICAgdmFyIF90aGlzJGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLFxuICAgICAgICAgIHNjcm9sbFRvcCA9IF90aGlzJGNvbnRhaW5lci5zY3JvbGxUb3AsXG4gICAgICAgICAgc2Nyb2xsTGVmdCA9IF90aGlzJGNvbnRhaW5lci5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHNjcm9sbEhlaWdodCA9IF90aGlzJGNvbnRhaW5lci5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgc2Nyb2xsV2lkdGggPSBfdGhpcyRjb250YWluZXIuc2Nyb2xsV2lkdGgsXG4gICAgICAgICAgY2xpZW50SGVpZ2h0ID0gX3RoaXMkY29udGFpbmVyLmNsaWVudEhlaWdodCxcbiAgICAgICAgICBjbGllbnRXaWR0aCA9IF90aGlzJGNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgICAgIHZhciBpc1RvcCA9IHNjcm9sbFRvcCA9PT0gMDtcbiAgICAgIHZhciBpc0JvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodCA9PT0gMDtcbiAgICAgIHZhciBpc0xlZnQgPSBzY3JvbGxMZWZ0ID09PSAwO1xuICAgICAgdmFyIGlzUmlnaHQgPSBzY3JvbGxXaWR0aCAtIHNjcm9sbExlZnQgLSBjbGllbnRXaWR0aCA9PT0gMDtcblxuICAgICAgaWYgKHRyYW5zbGF0ZS55ID49IG1heFRyYW5zbGF0ZS55IC0gaGVpZ2h0IC8gMiAmJiAhaXNCb3R0b20pIHtcbiAgICAgICAgZGlyZWN0aW9uLnkgPSAxO1xuICAgICAgICBzcGVlZC55ID0gYWNjZWxlcmF0aW9uLnkgKiBNYXRoLmFicygobWF4VHJhbnNsYXRlLnkgLSBoZWlnaHQgLyAyIC0gdHJhbnNsYXRlLnkpIC8gaGVpZ2h0KTtcbiAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlLnggPj0gbWF4VHJhbnNsYXRlLnggLSB3aWR0aCAvIDIgJiYgIWlzUmlnaHQpIHtcbiAgICAgICAgZGlyZWN0aW9uLnggPSAxO1xuICAgICAgICBzcGVlZC54ID0gYWNjZWxlcmF0aW9uLnggKiBNYXRoLmFicygobWF4VHJhbnNsYXRlLnggLSB3aWR0aCAvIDIgLSB0cmFuc2xhdGUueCkgLyB3aWR0aCk7XG4gICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZS55IDw9IG1pblRyYW5zbGF0ZS55ICsgaGVpZ2h0IC8gMiAmJiAhaXNUb3ApIHtcbiAgICAgICAgZGlyZWN0aW9uLnkgPSAtMTtcbiAgICAgICAgc3BlZWQueSA9IGFjY2VsZXJhdGlvbi55ICogTWF0aC5hYnMoKHRyYW5zbGF0ZS55IC0gaGVpZ2h0IC8gMiAtIG1pblRyYW5zbGF0ZS55KSAvIGhlaWdodCk7XG4gICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZS54IDw9IG1pblRyYW5zbGF0ZS54ICsgd2lkdGggLyAyICYmICFpc0xlZnQpIHtcbiAgICAgICAgZGlyZWN0aW9uLnggPSAtMTtcbiAgICAgICAgc3BlZWQueCA9IGFjY2VsZXJhdGlvbi54ICogTWF0aC5hYnMoKHRyYW5zbGF0ZS54IC0gd2lkdGggLyAyIC0gbWluVHJhbnNsYXRlLngpIC8gd2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlY3Rpb24ueCAhPT0gMCB8fCBkaXJlY3Rpb24ueSAhPT0gMCkge1xuICAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgdmFyIG9mZnNldCA9IHtcbiAgICAgICAgICAgIGxlZnQ6IHNwZWVkLnggKiBkaXJlY3Rpb24ueCxcbiAgICAgICAgICAgIHRvcDogc3BlZWQueSAqIGRpcmVjdGlvbi55XG4gICAgICAgICAgfTtcbiAgICAgICAgICBfdGhpcy5jb250YWluZXIuc2Nyb2xsVG9wICs9IG9mZnNldC50b3A7XG4gICAgICAgICAgX3RoaXMuY29udGFpbmVyLnNjcm9sbExlZnQgKz0gb2Zmc2V0LmxlZnQ7XG5cbiAgICAgICAgICBfdGhpcy5vblNjcm9sbENhbGxiYWNrKG9mZnNldCk7XG4gICAgICAgIH0sIDUpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBdXRvU2Nyb2xsZXI7XG59KCk7XG5cbmZ1bmN0aW9uIGRlZmF1bHRHZXRIZWxwZXJEaW1lbnNpb25zKF9yZWYpIHtcbiAgdmFyIG5vZGUgPSBfcmVmLm5vZGU7XG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBub2RlLm9mZnNldEhlaWdodCxcbiAgICB3aWR0aDogbm9kZS5vZmZzZXRXaWR0aFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U2hvdWxkQ2FuY2VsU3RhcnQoZXZlbnQpIHtcbiAgdmFyIGludGVyYWN0aXZlRWxlbWVudHMgPSBbTm9kZVR5cGUuSW5wdXQsIE5vZGVUeXBlLlRleHRhcmVhLCBOb2RlVHlwZS5TZWxlY3QsIE5vZGVUeXBlLk9wdGlvbiwgTm9kZVR5cGUuQnV0dG9uXTtcblxuICBpZiAoaW50ZXJhY3RpdmVFbGVtZW50cy5pbmRleE9mKGV2ZW50LnRhcmdldC50YWdOYW1lKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChjbG9zZXN0KGV2ZW50LnRhcmdldCwgZnVuY3Rpb24gKGVsKSB7XG4gICAgcmV0dXJuIGVsLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnO1xuICB9KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBheGlzOiBQcm9wVHlwZXMub25lT2YoWyd4JywgJ3knLCAneHknXSksXG4gIGNvbnRlbnRXaW5kb3c6IFByb3BUeXBlcy5hbnksXG4gIGRpc2FibGVBdXRvc2Nyb2xsOiBQcm9wVHlwZXMuYm9vbCxcbiAgZGlzdGFuY2U6IFByb3BUeXBlcy5udW1iZXIsXG4gIGdldENvbnRhaW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gIGdldEhlbHBlckRpbWVuc2lvbnM6IFByb3BUeXBlcy5mdW5jLFxuICBoZWxwZXJDbGFzczogUHJvcFR5cGVzLnN0cmluZyxcbiAgaGVscGVyQ29udGFpbmVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgdHlwZW9mIEhUTUxFbGVtZW50ID09PSAndW5kZWZpbmVkJyA/IFByb3BUeXBlcy5hbnkgOiBQcm9wVHlwZXMuaW5zdGFuY2VPZihIVE1MRWxlbWVudCldKSxcbiAgaGlkZVNvcnRhYmxlR2hvc3Q6IFByb3BUeXBlcy5ib29sLFxuICBrZXlib2FyZFNvcnRpbmdUcmFuc2l0aW9uRHVyYXRpb246IFByb3BUeXBlcy5udW1iZXIsXG4gIGxvY2tBeGlzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsb2NrT2Zmc2V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSkpXSksXG4gIGxvY2tUb0NvbnRhaW5lckVkZ2VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25Tb3J0RW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Tb3J0TW92ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uU29ydE92ZXI6IFByb3BUeXBlcy5mdW5jLFxuICBvblNvcnRTdGFydDogUHJvcFR5cGVzLmZ1bmMsXG4gIHByZXNzRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gIHByZXNzVGhyZXNob2xkOiBQcm9wVHlwZXMubnVtYmVyLFxuICBrZXlDb2RlczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBsaWZ0OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSxcbiAgICBkcm9wOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSxcbiAgICBjYW5jZWw6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLFxuICAgIHVwOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSxcbiAgICBkb3duOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKVxuICB9KSxcbiAgc2hvdWxkQ2FuY2VsU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICB0cmFuc2l0aW9uRHVyYXRpb246IFByb3BUeXBlcy5udW1iZXIsXG4gIHVwZGF0ZUJlZm9yZVNvcnRTdGFydDogUHJvcFR5cGVzLmZ1bmMsXG4gIHVzZURyYWdIYW5kbGU6IFByb3BUeXBlcy5ib29sLFxuICB1c2VXaW5kb3dBc1Njcm9sbENvbnRhaW5lcjogUHJvcFR5cGVzLmJvb2xcbn07XG52YXIgZGVmYXVsdEtleUNvZGVzID0ge1xuICBsaWZ0OiBbS0VZQ09ERS5TUEFDRV0sXG4gIGRyb3A6IFtLRVlDT0RFLlNQQUNFXSxcbiAgY2FuY2VsOiBbS0VZQ09ERS5FU0NdLFxuICB1cDogW0tFWUNPREUuVVAsIEtFWUNPREUuTEVGVF0sXG4gIGRvd246IFtLRVlDT0RFLkRPV04sIEtFWUNPREUuUklHSFRdXG59O1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYXhpczogJ3knLFxuICBkaXNhYmxlQXV0b3Njcm9sbDogZmFsc2UsXG4gIGRpc3RhbmNlOiAwLFxuICBnZXRIZWxwZXJEaW1lbnNpb25zOiBkZWZhdWx0R2V0SGVscGVyRGltZW5zaW9ucyxcbiAgaGlkZVNvcnRhYmxlR2hvc3Q6IHRydWUsXG4gIGxvY2tPZmZzZXQ6ICc1MCUnLFxuICBsb2NrVG9Db250YWluZXJFZGdlczogZmFsc2UsXG4gIHByZXNzRGVsYXk6IDAsXG4gIHByZXNzVGhyZXNob2xkOiA1LFxuICBrZXlDb2RlczogZGVmYXVsdEtleUNvZGVzLFxuICBzaG91bGRDYW5jZWxTdGFydDogZGVmYXVsdFNob3VsZENhbmNlbFN0YXJ0LFxuICB0cmFuc2l0aW9uRHVyYXRpb246IDMwMCxcbiAgdXNlV2luZG93QXNTY3JvbGxDb250YWluZXI6IGZhbHNlXG59O1xudmFyIG9taXR0ZWRQcm9wcyA9IE9iamVjdC5rZXlzKHByb3BUeXBlcyk7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKHByb3BzKSB7XG4gIGludmFyaWFudCghKHByb3BzLmRpc3RhbmNlICYmIHByb3BzLnByZXNzRGVsYXkpLCAnQXR0ZW1wdGVkIHRvIHNldCBib3RoIGBwcmVzc0RlbGF5YCBhbmQgYGRpc3RhbmNlYCBvbiBTb3J0YWJsZUNvbnRhaW5lciwgeW91IG1heSBvbmx5IHVzZSBvbmUgb3IgdGhlIG90aGVyLCBub3QgYm90aCBhdCB0aGUgc2FtZSB0aW1lLicpO1xufVxuXG5mdW5jdGlvbiBfZmluYWxseVJldGhyb3dzKGJvZHksIGZpbmFsaXplcikge1xuICB0cnkge1xuICAgIHZhciByZXN1bHQgPSBib2R5KCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmluYWxpemVyKHRydWUsIGUpO1xuICB9XG5cbiAgaWYgKHJlc3VsdCAmJiByZXN1bHQudGhlbikge1xuICAgIHJldHVybiByZXN1bHQudGhlbihmaW5hbGl6ZXIuYmluZChudWxsLCBmYWxzZSksIGZpbmFsaXplci5iaW5kKG51bGwsIHRydWUpKTtcbiAgfVxuXG4gIHJldHVybiBmaW5hbGl6ZXIoZmFsc2UsIHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHNvcnRhYmxlQ29udGFpbmVyKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgdmFyIGNvbmZpZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIHdpdGhSZWY6IGZhbHNlXG4gIH07XG4gIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKFdpdGhTb3J0YWJsZUNvbnRhaW5lciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBXaXRoU29ydGFibGVDb250YWluZXIocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdpdGhTb3J0YWJsZUNvbnRhaW5lcik7XG5cbiAgICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKFdpdGhTb3J0YWJsZUNvbnRhaW5lcikuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIFwic3RhdGVcIiwge30pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIFwiaGFuZGxlU3RhcnRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgZGlzdGFuY2UgPSBfdGhpcyRwcm9wcy5kaXN0YW5jZSxcbiAgICAgICAgICAgIHNob3VsZENhbmNlbFN0YXJ0ID0gX3RoaXMkcHJvcHMuc2hvdWxkQ2FuY2VsU3RhcnQ7XG5cbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMiB8fCBzaG91bGRDYW5jZWxTdGFydChldmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMucG9zaXRpb24gPSBnZXRQb3NpdGlvbihldmVudCk7XG4gICAgICAgIHZhciBub2RlID0gY2xvc2VzdChldmVudC50YXJnZXQsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5zb3J0YWJsZUluZm8gIT0gbnVsbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5zb3J0YWJsZUluZm8gJiYgX3RoaXMubm9kZUlzQ2hpbGQobm9kZSkgJiYgIV90aGlzLnN0YXRlLnNvcnRpbmcpIHtcbiAgICAgICAgICB2YXIgdXNlRHJhZ0hhbmRsZSA9IF90aGlzLnByb3BzLnVzZURyYWdIYW5kbGU7XG4gICAgICAgICAgdmFyIF9ub2RlJHNvcnRhYmxlSW5mbyA9IG5vZGUuc29ydGFibGVJbmZvLFxuICAgICAgICAgICAgICBpbmRleCA9IF9ub2RlJHNvcnRhYmxlSW5mby5pbmRleCxcbiAgICAgICAgICAgICAgY29sbGVjdGlvbiA9IF9ub2RlJHNvcnRhYmxlSW5mby5jb2xsZWN0aW9uLFxuICAgICAgICAgICAgICBkaXNhYmxlZCA9IF9ub2RlJHNvcnRhYmxlSW5mby5kaXNhYmxlZDtcblxuICAgICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1c2VEcmFnSGFuZGxlICYmICFjbG9zZXN0KGV2ZW50LnRhcmdldCwgaXNTb3J0YWJsZUhhbmRsZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5tYW5hZ2VyLmFjdGl2ZSA9IHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKCFpc1RvdWNoRXZlbnQoZXZlbnQpICYmIGV2ZW50LnRhcmdldC50YWdOYW1lID09PSBOb2RlVHlwZS5BbmNob3IpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkaXN0YW5jZSkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnByb3BzLnByZXNzRGVsYXkgPT09IDApIHtcbiAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlUHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMucHJlc3NUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVQcmVzcyhldmVudCk7XG4gICAgICAgICAgICAgIH0sIF90aGlzLnByb3BzLnByZXNzRGVsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJub2RlSXNDaGlsZFwiLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5zb3J0YWJsZUluZm8ubWFuYWdlciA9PT0gX3RoaXMubWFuYWdlcjtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIFwiaGFuZGxlTW92ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgZGlzdGFuY2UgPSBfdGhpcyRwcm9wczIuZGlzdGFuY2UsXG4gICAgICAgICAgICBwcmVzc1RocmVzaG9sZCA9IF90aGlzJHByb3BzMi5wcmVzc1RocmVzaG9sZDtcblxuICAgICAgICBpZiAoIV90aGlzLnN0YXRlLnNvcnRpbmcgJiYgX3RoaXMudG91Y2hlZCAmJiAhX3RoaXMuX2F3YWl0aW5nVXBkYXRlQmVmb3JlU29ydFN0YXJ0KSB7XG4gICAgICAgICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgIHZhciBkZWx0YSA9IHtcbiAgICAgICAgICAgIHg6IF90aGlzLnBvc2l0aW9uLnggLSBwb3NpdGlvbi54LFxuICAgICAgICAgICAgeTogX3RoaXMucG9zaXRpb24ueSAtIHBvc2l0aW9uLnlcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBjb21iaW5lZERlbHRhID0gTWF0aC5hYnMoZGVsdGEueCkgKyBNYXRoLmFicyhkZWx0YS55KTtcbiAgICAgICAgICBfdGhpcy5kZWx0YSA9IGRlbHRhO1xuXG4gICAgICAgICAgaWYgKCFkaXN0YW5jZSAmJiAoIXByZXNzVGhyZXNob2xkIHx8IGNvbWJpbmVkRGVsdGEgPj0gcHJlc3NUaHJlc2hvbGQpKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuY2FuY2VsVGltZXIpO1xuICAgICAgICAgICAgX3RoaXMuY2FuY2VsVGltZXIgPSBzZXRUaW1lb3V0KF90aGlzLmNhbmNlbCwgMCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSAmJiBjb21iaW5lZERlbHRhID49IGRpc3RhbmNlICYmIF90aGlzLm1hbmFnZXIuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgX3RoaXMuaGFuZGxlUHJlc3MoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJoYW5kbGVFbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy50b3VjaGVkID0gZmFsc2U7XG5cbiAgICAgICAgX3RoaXMuY2FuY2VsKCk7XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcImNhbmNlbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9IF90aGlzLnByb3BzLmRpc3RhbmNlO1xuICAgICAgICB2YXIgc29ydGluZyA9IF90aGlzLnN0YXRlLnNvcnRpbmc7XG5cbiAgICAgICAgaWYgKCFzb3J0aW5nKSB7XG4gICAgICAgICAgaWYgKCFkaXN0YW5jZSkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLnByZXNzVGltZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLm1hbmFnZXIuYWN0aXZlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJoYW5kbGVQcmVzc1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgYWN0aXZlID0gX3RoaXMubWFuYWdlci5nZXRBY3RpdmUoKTtcblxuICAgICAgICAgIHZhciBfdGVtcDYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgICAgIHZhciBfdGVtcDcgPSBmdW5jdGlvbiBfdGVtcDcoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX25vZGUuc29ydGFibGVJbmZvLmluZGV4O1xuICAgICAgICAgICAgICAgIHZhciBtYXJnaW4gPSBnZXRFbGVtZW50TWFyZ2luKF9ub2RlKTtcbiAgICAgICAgICAgICAgICB2YXIgZ3JpZEdhcCA9IGdldENvbnRhaW5lckdyaWRHYXAoX3RoaXMuY29udGFpbmVyKTtcblxuICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJCb3VuZGluZ1JlY3QgPSBfdGhpcy5zY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgZGltZW5zaW9ucyA9IF9nZXRIZWxwZXJEaW1lbnNpb25zKHtcbiAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgIG5vZGU6IF9ub2RlLFxuICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbjogX2NvbGxlY3Rpb25cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIF90aGlzLm5vZGUgPSBfbm9kZTtcbiAgICAgICAgICAgICAgICBfdGhpcy5tYXJnaW4gPSBtYXJnaW47XG4gICAgICAgICAgICAgICAgX3RoaXMuZ3JpZEdhcCA9IGdyaWRHYXA7XG4gICAgICAgICAgICAgICAgX3RoaXMud2lkdGggPSBkaW1lbnNpb25zLndpZHRoO1xuICAgICAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIF90aGlzLm1hcmdpbk9mZnNldCA9IHtcbiAgICAgICAgICAgICAgICAgIHg6IF90aGlzLm1hcmdpbi5sZWZ0ICsgX3RoaXMubWFyZ2luLnJpZ2h0ICsgX3RoaXMuZ3JpZEdhcC54LFxuICAgICAgICAgICAgICAgICAgeTogTWF0aC5tYXgoX3RoaXMubWFyZ2luLnRvcCwgX3RoaXMubWFyZ2luLmJvdHRvbSwgX3RoaXMuZ3JpZEdhcC55KVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgX3RoaXMuYm91bmRpbmdDbGllbnRSZWN0ID0gX25vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udGFpbmVyQm91bmRpbmdSZWN0ID0gY29udGFpbmVyQm91bmRpbmdSZWN0O1xuICAgICAgICAgICAgICAgIF90aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgX3RoaXMubmV3SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICBfdGhpcy5heGlzID0ge1xuICAgICAgICAgICAgICAgICAgeDogX2F4aXMuaW5kZXhPZigneCcpID49IDAsXG4gICAgICAgICAgICAgICAgICB5OiBfYXhpcy5pbmRleE9mKCd5JykgPj0gMFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgX3RoaXMub2Zmc2V0RWRnZSA9IGdldEVkZ2VPZmZzZXQoX25vZGUsIF90aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgICAgICBpZiAoX2lzS2V5U29ydGluZykge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldCA9IGdldFBvc2l0aW9uKF9vYmplY3RTcHJlYWQoe30sIGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VYOiBfdGhpcy5ib3VuZGluZ0NsaWVudFJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVk6IF90aGlzLmJvdW5kaW5nQ2xpZW50UmVjdC50b3BcbiAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldCA9IGdldFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5pbml0aWFsU2Nyb2xsID0ge1xuICAgICAgICAgICAgICAgICAgbGVmdDogX3RoaXMuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbExlZnQsXG4gICAgICAgICAgICAgICAgICB0b3A6IF90aGlzLnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3BcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIF90aGlzLmluaXRpYWxXaW5kb3dTY3JvbGwgPSB7XG4gICAgICAgICAgICAgICAgICBsZWZ0OiB3aW5kb3cucGFnZVhPZmZzZXQsXG4gICAgICAgICAgICAgICAgICB0b3A6IHdpbmRvdy5wYWdlWU9mZnNldFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgX3RoaXMuaGVscGVyID0gX3RoaXMuaGVscGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lTm9kZShfbm9kZSkpO1xuICAgICAgICAgICAgICAgIHNldElubGluZVN0eWxlcyhfdGhpcy5oZWxwZXIsIHtcbiAgICAgICAgICAgICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIlwiLmNvbmNhdChfdGhpcy5oZWlnaHQsIFwicHhcIiksXG4gICAgICAgICAgICAgICAgICBsZWZ0OiBcIlwiLmNvbmNhdChfdGhpcy5ib3VuZGluZ0NsaWVudFJlY3QubGVmdCAtIG1hcmdpbi5sZWZ0LCBcInB4XCIpLFxuICAgICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgICB0b3A6IFwiXCIuY29uY2F0KF90aGlzLmJvdW5kaW5nQ2xpZW50UmVjdC50b3AgLSBtYXJnaW4udG9wLCBcInB4XCIpLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KF90aGlzLndpZHRoLCBcInB4XCIpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoX2lzS2V5U29ydGluZykge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuaGVscGVyLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKF9oaWRlU29ydGFibGVHaG9zdCkge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuc29ydGFibGVHaG9zdCA9IF9ub2RlO1xuICAgICAgICAgICAgICAgICAgc2V0SW5saW5lU3R5bGVzKF9ub2RlLCB7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5taW5UcmFuc2xhdGUgPSB7fTtcbiAgICAgICAgICAgICAgICBfdGhpcy5tYXhUcmFuc2xhdGUgPSB7fTtcblxuICAgICAgICAgICAgICAgIGlmIChfaXNLZXlTb3J0aW5nKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgX3JlZiA9IF91c2VXaW5kb3dBc1Njcm9sbENvbnRhaW5lciA/IHtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogX3RoaXMuY29udGVudFdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IF90aGlzLmNvbnRlbnRXaW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgICAgICAgICAgICAgIH0gOiBfdGhpcy5jb250YWluZXJCb3VuZGluZ1JlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyVG9wID0gX3JlZi50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyTGVmdCA9IF9yZWYubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXaWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVySGVpZ2h0ID0gX3JlZi5oZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJCb3R0b20gPSBjb250YWluZXJUb3AgKyBjb250YWluZXJIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyUmlnaHQgPSBjb250YWluZXJMZWZ0ICsgY29udGFpbmVyV2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5heGlzLngpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubWluVHJhbnNsYXRlLnggPSBjb250YWluZXJMZWZ0IC0gX3RoaXMuYm91bmRpbmdDbGllbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1heFRyYW5zbGF0ZS54ID0gY29udGFpbmVyUmlnaHQgLSAoX3RoaXMuYm91bmRpbmdDbGllbnRSZWN0LmxlZnQgKyBfdGhpcy53aWR0aCk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5heGlzLnkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubWluVHJhbnNsYXRlLnkgPSBjb250YWluZXJUb3AgLSBfdGhpcy5ib3VuZGluZ0NsaWVudFJlY3QudG9wO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5tYXhUcmFuc2xhdGUueSA9IGNvbnRhaW5lckJvdHRvbSAtIChfdGhpcy5ib3VuZGluZ0NsaWVudFJlY3QudG9wICsgX3RoaXMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmF4aXMueCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5taW5UcmFuc2xhdGUueCA9IChfdXNlV2luZG93QXNTY3JvbGxDb250YWluZXIgPyAwIDogY29udGFpbmVyQm91bmRpbmdSZWN0LmxlZnQpIC0gX3RoaXMuYm91bmRpbmdDbGllbnRSZWN0LmxlZnQgLSBfdGhpcy53aWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1heFRyYW5zbGF0ZS54ID0gKF91c2VXaW5kb3dBc1Njcm9sbENvbnRhaW5lciA/IF90aGlzLmNvbnRlbnRXaW5kb3cuaW5uZXJXaWR0aCA6IGNvbnRhaW5lckJvdW5kaW5nUmVjdC5sZWZ0ICsgY29udGFpbmVyQm91bmRpbmdSZWN0LndpZHRoKSAtIF90aGlzLmJvdW5kaW5nQ2xpZW50UmVjdC5sZWZ0IC0gX3RoaXMud2lkdGggLyAyO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuYXhpcy55KSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1pblRyYW5zbGF0ZS55ID0gKF91c2VXaW5kb3dBc1Njcm9sbENvbnRhaW5lciA/IDAgOiBjb250YWluZXJCb3VuZGluZ1JlY3QudG9wKSAtIF90aGlzLmJvdW5kaW5nQ2xpZW50UmVjdC50b3AgLSBfdGhpcy5oZWlnaHQgLyAyO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5tYXhUcmFuc2xhdGUueSA9IChfdXNlV2luZG93QXNTY3JvbGxDb250YWluZXIgPyBfdGhpcy5jb250ZW50V2luZG93LmlubmVySGVpZ2h0IDogY29udGFpbmVyQm91bmRpbmdSZWN0LnRvcCArIGNvbnRhaW5lckJvdW5kaW5nUmVjdC5oZWlnaHQpIC0gX3RoaXMuYm91bmRpbmdDbGllbnRSZWN0LnRvcCAtIF90aGlzLmhlaWdodCAvIDI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKF9oZWxwZXJDbGFzcykge1xuICAgICAgICAgICAgICAgICAgX2hlbHBlckNsYXNzLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5oZWxwZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX3RoaXMubGlzdGVuZXJOb2RlID0gZXZlbnQudG91Y2hlcyA/IF9ub2RlIDogX3RoaXMuY29udGVudFdpbmRvdztcblxuICAgICAgICAgICAgICAgIGlmIChfaXNLZXlTb3J0aW5nKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5saXN0ZW5lck5vZGUuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBfdGhpcy5oYW5kbGVLZXlFbmQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICBfdGhpcy5saXN0ZW5lck5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgX3RoaXMuaGFuZGxlS2V5RW5kLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgX3RoaXMubGlzdGVuZXJOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfdGhpcy5oYW5kbGVLZXlEb3duKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZXZlbnRzLm1vdmUuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5saXN0ZW5lck5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIF90aGlzLmhhbmRsZVNvcnRNb3ZlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGV2ZW50cy5lbmQuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5saXN0ZW5lck5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIF90aGlzLmhhbmRsZVNvcnRFbmQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgIHNvcnRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICBzb3J0aW5nSW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoX29uU29ydFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICBfb25Tb3J0U3RhcnQoe1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBfbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBfY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaXNLZXlTb3J0aW5nOiBfaXNLZXlTb3J0aW5nLFxuICAgICAgICAgICAgICAgICAgICBub2RlczogX3RoaXMubWFuYWdlci5nZXRPcmRlcmVkUmVmcygpLFxuICAgICAgICAgICAgICAgICAgICBoZWxwZXI6IF90aGlzLmhlbHBlclxuICAgICAgICAgICAgICAgICAgfSwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChfaXNLZXlTb3J0aW5nKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5rZXlNb3ZlKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgICBfYXhpcyA9IF90aGlzJHByb3BzMy5heGlzLFxuICAgICAgICAgICAgICAgICAgX2dldEhlbHBlckRpbWVuc2lvbnMgPSBfdGhpcyRwcm9wczMuZ2V0SGVscGVyRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgIF9oZWxwZXJDbGFzcyA9IF90aGlzJHByb3BzMy5oZWxwZXJDbGFzcyxcbiAgICAgICAgICAgICAgICAgIF9oaWRlU29ydGFibGVHaG9zdCA9IF90aGlzJHByb3BzMy5oaWRlU29ydGFibGVHaG9zdCxcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZUJlZm9yZVNvcnRTdGFydCA9IF90aGlzJHByb3BzMy51cGRhdGVCZWZvcmVTb3J0U3RhcnQsXG4gICAgICAgICAgICAgICAgICBfb25Tb3J0U3RhcnQgPSBfdGhpcyRwcm9wczMub25Tb3J0U3RhcnQsXG4gICAgICAgICAgICAgICAgICBfdXNlV2luZG93QXNTY3JvbGxDb250YWluZXIgPSBfdGhpcyRwcm9wczMudXNlV2luZG93QXNTY3JvbGxDb250YWluZXI7XG4gICAgICAgICAgICAgIHZhciBfbm9kZSA9IGFjdGl2ZS5ub2RlLFxuICAgICAgICAgICAgICAgICAgX2NvbGxlY3Rpb24gPSBhY3RpdmUuY29sbGVjdGlvbjtcbiAgICAgICAgICAgICAgdmFyIF9pc0tleVNvcnRpbmcgPSBfdGhpcy5tYW5hZ2VyLmlzS2V5U29ydGluZztcblxuICAgICAgICAgICAgICB2YXIgX3RlbXA4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXBkYXRlQmVmb3JlU29ydFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5fYXdhaXRpbmdVcGRhdGVCZWZvcmVTb3J0U3RhcnQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICB2YXIgX3RlbXA5ID0gX2ZpbmFsbHlSZXRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IF9ub2RlLnNvcnRhYmxlSW5mby5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cGRhdGVCZWZvcmVTb3J0U3RhcnQoe1xuICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IF9jb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICBub2RlOiBfbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICBpc0tleVNvcnRpbmc6IF9pc0tleVNvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSwgZXZlbnQpKS50aGVuKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChfd2FzVGhyb3duLCBfcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9hd2FpdGluZ1VwZGF0ZUJlZm9yZVNvcnRTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3dhc1Rocm93bikgdGhyb3cgX3Jlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgaWYgKF90ZW1wOSAmJiBfdGVtcDkudGhlbikgcmV0dXJuIF90ZW1wOS50aGVuKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0oKTtcblxuICAgICAgICAgICAgICByZXR1cm4gX3RlbXA4ICYmIF90ZW1wOC50aGVuID8gX3RlbXA4LnRoZW4oX3RlbXA3KSA6IF90ZW1wNyhfdGVtcDgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0oKTtcblxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RlbXA2ICYmIF90ZW1wNi50aGVuID8gX3RlbXA2LnRoZW4oZnVuY3Rpb24gKCkge30pIDogdm9pZCAwKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJoYW5kbGVTb3J0TW92ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIG9uU29ydE1vdmUgPSBfdGhpcy5wcm9wcy5vblNvcnRNb3ZlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQucHJldmVudERlZmF1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMudXBkYXRlSGVscGVyUG9zaXRpb24oZXZlbnQpO1xuXG4gICAgICAgIF90aGlzLmFuaW1hdGVOb2RlcygpO1xuXG4gICAgICAgIF90aGlzLmF1dG9zY3JvbGwoKTtcblxuICAgICAgICBpZiAob25Tb3J0TW92ZSkge1xuICAgICAgICAgIG9uU29ydE1vdmUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcImhhbmRsZVNvcnRFbmRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGhpZGVTb3J0YWJsZUdob3N0ID0gX3RoaXMkcHJvcHM0LmhpZGVTb3J0YWJsZUdob3N0LFxuICAgICAgICAgICAgb25Tb3J0RW5kID0gX3RoaXMkcHJvcHM0Lm9uU29ydEVuZDtcbiAgICAgICAgdmFyIF90aGlzJG1hbmFnZXIgPSBfdGhpcy5tYW5hZ2VyLFxuICAgICAgICAgICAgY29sbGVjdGlvbiA9IF90aGlzJG1hbmFnZXIuYWN0aXZlLmNvbGxlY3Rpb24sXG4gICAgICAgICAgICBpc0tleVNvcnRpbmcgPSBfdGhpcyRtYW5hZ2VyLmlzS2V5U29ydGluZztcblxuICAgICAgICB2YXIgbm9kZXMgPSBfdGhpcy5tYW5hZ2VyLmdldE9yZGVyZWRSZWZzKCk7XG5cbiAgICAgICAgaWYgKF90aGlzLmxpc3RlbmVyTm9kZSkge1xuICAgICAgICAgIGlmIChpc0tleVNvcnRpbmcpIHtcbiAgICAgICAgICAgIF90aGlzLmxpc3RlbmVyTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIF90aGlzLmhhbmRsZUtleUVuZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIF90aGlzLmxpc3RlbmVyTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBfdGhpcy5oYW5kbGVLZXlFbmQsIHRydWUpO1xuXG4gICAgICAgICAgICBfdGhpcy5saXN0ZW5lck5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF90aGlzLmhhbmRsZUtleURvd24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudHMubW92ZS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmxpc3RlbmVyTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgX3RoaXMuaGFuZGxlU29ydE1vdmUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBldmVudHMuZW5kLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMubGlzdGVuZXJOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBfdGhpcy5oYW5kbGVTb3J0RW5kKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmhlbHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF90aGlzLmhlbHBlcik7XG5cbiAgICAgICAgaWYgKGhpZGVTb3J0YWJsZUdob3N0ICYmIF90aGlzLnNvcnRhYmxlR2hvc3QpIHtcbiAgICAgICAgICBzZXRJbmxpbmVTdHlsZXMoX3RoaXMuc29ydGFibGVHaG9zdCwge1xuICAgICAgICAgICAgb3BhY2l0eTogJycsXG4gICAgICAgICAgICB2aXNpYmlsaXR5OiAnJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9ub2RlMiA9IG5vZGVzW2ldO1xuICAgICAgICAgIHZhciBlbCA9IF9ub2RlMi5ub2RlO1xuICAgICAgICAgIF9ub2RlMi5lZGdlT2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgICBfbm9kZTIuYm91bmRpbmdDbGllbnRSZWN0ID0gbnVsbDtcbiAgICAgICAgICBzZXRUcmFuc2xhdGUzZChlbCwgbnVsbCk7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkR1cmF0aW9uKGVsLCBudWxsKTtcbiAgICAgICAgICBfbm9kZTIudHJhbnNsYXRlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmF1dG9TY3JvbGxlci5jbGVhcigpO1xuXG4gICAgICAgIF90aGlzLm1hbmFnZXIuYWN0aXZlID0gbnVsbDtcbiAgICAgICAgX3RoaXMubWFuYWdlci5pc0tleVNvcnRpbmcgPSBmYWxzZTtcblxuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc29ydGluZzogZmFsc2UsXG4gICAgICAgICAgc29ydGluZ0luZGV4OiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb25Tb3J0RW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25Tb3J0RW5kKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICBuZXdJbmRleDogX3RoaXMubmV3SW5kZXgsXG4gICAgICAgICAgICBvbGRJbmRleDogX3RoaXMuaW5kZXgsXG4gICAgICAgICAgICBpc0tleVNvcnRpbmc6IGlzS2V5U29ydGluZyxcbiAgICAgICAgICAgIG5vZGVzOiBub2Rlc1xuICAgICAgICAgIH0sIGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnRvdWNoZWQgPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIFwiYXV0b3Njcm9sbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXNhYmxlQXV0b3Njcm9sbCA9IF90aGlzLnByb3BzLmRpc2FibGVBdXRvc2Nyb2xsO1xuICAgICAgICB2YXIgaXNLZXlTb3J0aW5nID0gX3RoaXMubWFuYWdlci5pc0tleVNvcnRpbmc7XG5cbiAgICAgICAgaWYgKGRpc2FibGVBdXRvc2Nyb2xsKSB7XG4gICAgICAgICAgX3RoaXMuYXV0b1Njcm9sbGVyLmNsZWFyKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNLZXlTb3J0aW5nKSB7XG4gICAgICAgICAgdmFyIHRyYW5zbGF0ZSA9IF9vYmplY3RTcHJlYWQoe30sIF90aGlzLnRyYW5zbGF0ZSk7XG5cbiAgICAgICAgICB2YXIgc2Nyb2xsWCA9IDA7XG4gICAgICAgICAgdmFyIHNjcm9sbFkgPSAwO1xuXG4gICAgICAgICAgaWYgKF90aGlzLmF4aXMueCkge1xuICAgICAgICAgICAgdHJhbnNsYXRlLnggPSBNYXRoLm1pbihfdGhpcy5tYXhUcmFuc2xhdGUueCwgTWF0aC5tYXgoX3RoaXMubWluVHJhbnNsYXRlLngsIF90aGlzLnRyYW5zbGF0ZS54KSk7XG4gICAgICAgICAgICBzY3JvbGxYID0gX3RoaXMudHJhbnNsYXRlLnggLSB0cmFuc2xhdGUueDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMuYXhpcy55KSB7XG4gICAgICAgICAgICB0cmFuc2xhdGUueSA9IE1hdGgubWluKF90aGlzLm1heFRyYW5zbGF0ZS55LCBNYXRoLm1heChfdGhpcy5taW5UcmFuc2xhdGUueSwgX3RoaXMudHJhbnNsYXRlLnkpKTtcbiAgICAgICAgICAgIHNjcm9sbFkgPSBfdGhpcy50cmFuc2xhdGUueSAtIHRyYW5zbGF0ZS55O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLnRyYW5zbGF0ZSA9IHRyYW5zbGF0ZTtcbiAgICAgICAgICBzZXRUcmFuc2xhdGUzZChfdGhpcy5oZWxwZXIsIF90aGlzLnRyYW5zbGF0ZSk7XG4gICAgICAgICAgX3RoaXMuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbExlZnQgKz0gc2Nyb2xsWDtcbiAgICAgICAgICBfdGhpcy5zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wICs9IHNjcm9sbFk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuYXV0b1Njcm9sbGVyLnVwZGF0ZSh7XG4gICAgICAgICAgaGVpZ2h0OiBfdGhpcy5oZWlnaHQsXG4gICAgICAgICAgbWF4VHJhbnNsYXRlOiBfdGhpcy5tYXhUcmFuc2xhdGUsXG4gICAgICAgICAgbWluVHJhbnNsYXRlOiBfdGhpcy5taW5UcmFuc2xhdGUsXG4gICAgICAgICAgdHJhbnNsYXRlOiBfdGhpcy50cmFuc2xhdGUsXG4gICAgICAgICAgd2lkdGg6IF90aGlzLndpZHRoXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJvbkF1dG9TY3JvbGxcIiwgZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICBfdGhpcy50cmFuc2xhdGUueCArPSBvZmZzZXQubGVmdDtcbiAgICAgICAgX3RoaXMudHJhbnNsYXRlLnkgKz0gb2Zmc2V0LnRvcDtcblxuICAgICAgICBfdGhpcy5hbmltYXRlTm9kZXMoKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIFwiaGFuZGxlS2V5RG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICBzaG91bGRDYW5jZWxTdGFydCA9IF90aGlzJHByb3BzNS5zaG91bGRDYW5jZWxTdGFydCxcbiAgICAgICAgICAgIF90aGlzJHByb3BzNSRrZXlDb2RlcyA9IF90aGlzJHByb3BzNS5rZXlDb2RlcyxcbiAgICAgICAgICAgIGN1c3RvbUtleUNvZGVzID0gX3RoaXMkcHJvcHM1JGtleUNvZGVzID09PSB2b2lkIDAgPyB7fSA6IF90aGlzJHByb3BzNSRrZXlDb2RlcztcblxuICAgICAgICB2YXIga2V5Q29kZXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBkZWZhdWx0S2V5Q29kZXMsIGN1c3RvbUtleUNvZGVzKTtcblxuICAgICAgICBpZiAoX3RoaXMubWFuYWdlci5hY3RpdmUgJiYgIV90aGlzLm1hbmFnZXIuaXNLZXlTb3J0aW5nIHx8ICFfdGhpcy5tYW5hZ2VyLmFjdGl2ZSAmJiAoIWtleUNvZGVzLmxpZnQuaW5jbHVkZXMoa2V5Q29kZSkgfHwgc2hvdWxkQ2FuY2VsU3RhcnQoZXZlbnQpIHx8ICFfdGhpcy5pc1ZhbGlkU29ydGluZ1RhcmdldChldmVudCkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKGtleUNvZGVzLmxpZnQuaW5jbHVkZXMoa2V5Q29kZSkgJiYgIV90aGlzLm1hbmFnZXIuYWN0aXZlKSB7XG4gICAgICAgICAgX3RoaXMua2V5TGlmdChldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZXMuZHJvcC5pbmNsdWRlcyhrZXlDb2RlKSAmJiBfdGhpcy5tYW5hZ2VyLmFjdGl2ZSkge1xuICAgICAgICAgIF90aGlzLmtleURyb3AoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGVzLmNhbmNlbC5pbmNsdWRlcyhrZXlDb2RlKSkge1xuICAgICAgICAgIF90aGlzLm5ld0luZGV4ID0gX3RoaXMubWFuYWdlci5hY3RpdmUuaW5kZXg7XG5cbiAgICAgICAgICBfdGhpcy5rZXlEcm9wKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2Rlcy51cC5pbmNsdWRlcyhrZXlDb2RlKSkge1xuICAgICAgICAgIF90aGlzLmtleU1vdmUoLTEpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGVzLmRvd24uaW5jbHVkZXMoa2V5Q29kZSkpIHtcbiAgICAgICAgICBfdGhpcy5rZXlNb3ZlKDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcImtleUxpZnRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIHZhciBub2RlID0gY2xvc2VzdCh0YXJnZXQsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5zb3J0YWJsZUluZm8gIT0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBfbm9kZSRzb3J0YWJsZUluZm8yID0gbm9kZS5zb3J0YWJsZUluZm8sXG4gICAgICAgICAgICBpbmRleCA9IF9ub2RlJHNvcnRhYmxlSW5mbzIuaW5kZXgsXG4gICAgICAgICAgICBjb2xsZWN0aW9uID0gX25vZGUkc29ydGFibGVJbmZvMi5jb2xsZWN0aW9uO1xuICAgICAgICBfdGhpcy5pbml0aWFsRm9jdXNlZE5vZGUgPSB0YXJnZXQ7XG4gICAgICAgIF90aGlzLm1hbmFnZXIuaXNLZXlTb3J0aW5nID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMubWFuYWdlci5hY3RpdmUgPSB7XG4gICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25cbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5oYW5kbGVQcmVzcyhldmVudCk7XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcImtleU1vdmVcIiwgZnVuY3Rpb24gKHNoaWZ0KSB7XG4gICAgICAgIHZhciBub2RlcyA9IF90aGlzLm1hbmFnZXIuZ2V0T3JkZXJlZFJlZnMoKTtcblxuICAgICAgICB2YXIgbGFzdEluZGV4ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0ubm9kZS5zb3J0YWJsZUluZm8uaW5kZXg7XG4gICAgICAgIHZhciBuZXdJbmRleCA9IF90aGlzLm5ld0luZGV4ICsgc2hpZnQ7XG4gICAgICAgIHZhciBwcmV2SW5kZXggPSBfdGhpcy5uZXdJbmRleDtcblxuICAgICAgICBpZiAobmV3SW5kZXggPCAwIHx8IG5ld0luZGV4ID4gbGFzdEluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMucHJldkluZGV4ID0gcHJldkluZGV4O1xuICAgICAgICBfdGhpcy5uZXdJbmRleCA9IG5ld0luZGV4O1xuICAgICAgICB2YXIgdGFyZ2V0SW5kZXggPSBnZXRUYXJnZXRJbmRleChfdGhpcy5uZXdJbmRleCwgX3RoaXMucHJldkluZGV4LCBfdGhpcy5pbmRleCk7XG4gICAgICAgIHZhciB0YXJnZXQgPSBub2Rlcy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgIHZhciBub2RlID0gX3JlZjIubm9kZTtcbiAgICAgICAgICByZXR1cm4gbm9kZS5zb3J0YWJsZUluZm8uaW5kZXggPT09IHRhcmdldEluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXQubm9kZTtcbiAgICAgICAgdmFyIHNjcm9sbERlbHRhID0gX3RoaXMuY29udGFpbmVyU2Nyb2xsRGVsdGE7XG4gICAgICAgIHZhciB0YXJnZXRCb3VuZGluZ0NsaWVudFJlY3QgPSB0YXJnZXQuYm91bmRpbmdDbGllbnRSZWN0IHx8IGdldFNjcm9sbEFkanVzdGVkQm91bmRpbmdDbGllbnRSZWN0KHRhcmdldE5vZGUsIHNjcm9sbERlbHRhKTtcbiAgICAgICAgdmFyIHRhcmdldFRyYW5zbGF0ZSA9IHRhcmdldC50cmFuc2xhdGUgfHwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgICB2YXIgdGFyZ2V0UG9zaXRpb24gPSB7XG4gICAgICAgICAgdG9wOiB0YXJnZXRCb3VuZGluZ0NsaWVudFJlY3QudG9wICsgdGFyZ2V0VHJhbnNsYXRlLnkgLSBzY3JvbGxEZWx0YS50b3AsXG4gICAgICAgICAgbGVmdDogdGFyZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmxlZnQgKyB0YXJnZXRUcmFuc2xhdGUueCAtIHNjcm9sbERlbHRhLmxlZnRcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNob3VsZEFkanVzdEZvclNpemUgPSBwcmV2SW5kZXggPCBuZXdJbmRleDtcbiAgICAgICAgdmFyIHNpemVBZGp1c3RtZW50ID0ge1xuICAgICAgICAgIHg6IHNob3VsZEFkanVzdEZvclNpemUgJiYgX3RoaXMuYXhpcy54ID8gdGFyZ2V0Tm9kZS5vZmZzZXRXaWR0aCAtIF90aGlzLndpZHRoIDogMCxcbiAgICAgICAgICB5OiBzaG91bGRBZGp1c3RGb3JTaXplICYmIF90aGlzLmF4aXMueSA/IHRhcmdldE5vZGUub2Zmc2V0SGVpZ2h0IC0gX3RoaXMuaGVpZ2h0IDogMFxuICAgICAgICB9O1xuXG4gICAgICAgIF90aGlzLmhhbmRsZVNvcnRNb3ZlKHtcbiAgICAgICAgICBwYWdlWDogdGFyZ2V0UG9zaXRpb24ubGVmdCArIHNpemVBZGp1c3RtZW50LngsXG4gICAgICAgICAgcGFnZVk6IHRhcmdldFBvc2l0aW9uLnRvcCArIHNpemVBZGp1c3RtZW50LnksXG4gICAgICAgICAgaWdub3JlVHJhbnNpdGlvbjogc2hpZnQgPT09IDBcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcImtleURyb3BcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZVNvcnRFbmQoZXZlbnQpO1xuXG4gICAgICAgIGlmIChfdGhpcy5pbml0aWFsRm9jdXNlZE5vZGUpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsRm9jdXNlZE5vZGUuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJoYW5kbGVLZXlFbmRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChfdGhpcy5tYW5hZ2VyLmFjdGl2ZSkge1xuICAgICAgICAgIF90aGlzLmtleURyb3AoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcImlzVmFsaWRTb3J0aW5nVGFyZ2V0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgdXNlRHJhZ0hhbmRsZSA9IF90aGlzLnByb3BzLnVzZURyYWdIYW5kbGU7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIHZhciBub2RlID0gY2xvc2VzdCh0YXJnZXQsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5zb3J0YWJsZUluZm8gIT0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBub2RlICYmIG5vZGUuc29ydGFibGVJbmZvICYmICFub2RlLnNvcnRhYmxlSW5mby5kaXNhYmxlZCAmJiAodXNlRHJhZ0hhbmRsZSA/IGlzU29ydGFibGVIYW5kbGUodGFyZ2V0KSA6IHRhcmdldC5zb3J0YWJsZUluZm8pO1xuICAgICAgfSk7XG5cbiAgICAgIHZhbGlkYXRlUHJvcHMocHJvcHMpO1xuICAgICAgX3RoaXMubWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7XG4gICAgICBfdGhpcy5ldmVudHMgPSB7XG4gICAgICAgIGVuZDogX3RoaXMuaGFuZGxlRW5kLFxuICAgICAgICBtb3ZlOiBfdGhpcy5oYW5kbGVNb3ZlLFxuICAgICAgICBzdGFydDogX3RoaXMuaGFuZGxlU3RhcnRcbiAgICAgIH07XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFdpdGhTb3J0YWJsZUNvbnRhaW5lciwgW3tcbiAgICAgIGtleTogXCJnZXRDaGlsZENvbnRleHRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWFuYWdlcjogdGhpcy5tYW5hZ2VyXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIHZhciB1c2VXaW5kb3dBc1Njcm9sbENvbnRhaW5lciA9IHRoaXMucHJvcHMudXNlV2luZG93QXNTY3JvbGxDb250YWluZXI7XG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lcigpO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoY29udGFpbmVyKS50aGVuKGZ1bmN0aW9uIChjb250YWluZXJOb2RlKSB7XG4gICAgICAgICAgX3RoaXMyLmNvbnRhaW5lciA9IGNvbnRhaW5lck5vZGU7XG4gICAgICAgICAgX3RoaXMyLmRvY3VtZW50ID0gX3RoaXMyLmNvbnRhaW5lci5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICAgICAgICAgIHZhciBjb250ZW50V2luZG93ID0gX3RoaXMyLnByb3BzLmNvbnRlbnRXaW5kb3cgfHwgX3RoaXMyLmRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICAgICAgICBfdGhpczIuY29udGVudFdpbmRvdyA9IHR5cGVvZiBjb250ZW50V2luZG93ID09PSAnZnVuY3Rpb24nID8gY29udGVudFdpbmRvdygpIDogY29udGVudFdpbmRvdztcbiAgICAgICAgICBfdGhpczIuc2Nyb2xsQ29udGFpbmVyID0gdXNlV2luZG93QXNTY3JvbGxDb250YWluZXIgPyBfdGhpczIuZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBfdGhpczIuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogZ2V0U2Nyb2xsaW5nUGFyZW50KF90aGlzMi5jb250YWluZXIpIHx8IF90aGlzMi5jb250YWluZXI7XG4gICAgICAgICAgX3RoaXMyLmF1dG9TY3JvbGxlciA9IG5ldyBBdXRvU2Nyb2xsZXIoX3RoaXMyLnNjcm9sbENvbnRhaW5lciwgX3RoaXMyLm9uQXV0b1Njcm9sbCk7XG4gICAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMyLmV2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczIuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBfdGhpczIuZXZlbnRzW2tleV0sIGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX3RoaXMyLmhhbmRsZUtleURvd24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuaGVscGVyICYmIHRoaXMuaGVscGVyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICB0aGlzLmhlbHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuaGVscGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmV2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50c1trZXldLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIF90aGlzMy5ldmVudHNba2V5XSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwidXBkYXRlSGVscGVyUG9zaXRpb25cIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVIZWxwZXJQb3NpdGlvbihldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGxvY2tBeGlzID0gX3RoaXMkcHJvcHM2LmxvY2tBeGlzLFxuICAgICAgICAgICAgbG9ja09mZnNldCA9IF90aGlzJHByb3BzNi5sb2NrT2Zmc2V0LFxuICAgICAgICAgICAgbG9ja1RvQ29udGFpbmVyRWRnZXMgPSBfdGhpcyRwcm9wczYubG9ja1RvQ29udGFpbmVyRWRnZXMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSBfdGhpcyRwcm9wczYudHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgICAgICAgX3RoaXMkcHJvcHM2JGtleWJvYXJkID0gX3RoaXMkcHJvcHM2LmtleWJvYXJkU29ydGluZ1RyYW5zaXRpb25EdXJhdGlvbixcbiAgICAgICAgICAgIGtleWJvYXJkU29ydGluZ1RyYW5zaXRpb25EdXJhdGlvbiA9IF90aGlzJHByb3BzNiRrZXlib2FyZCA9PT0gdm9pZCAwID8gdHJhbnNpdGlvbkR1cmF0aW9uIDogX3RoaXMkcHJvcHM2JGtleWJvYXJkO1xuICAgICAgICB2YXIgaXNLZXlTb3J0aW5nID0gdGhpcy5tYW5hZ2VyLmlzS2V5U29ydGluZztcbiAgICAgICAgdmFyIGlnbm9yZVRyYW5zaXRpb24gPSBldmVudC5pZ25vcmVUcmFuc2l0aW9uO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gZ2V0UG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB2YXIgdHJhbnNsYXRlID0ge1xuICAgICAgICAgIHg6IG9mZnNldC54IC0gdGhpcy5pbml0aWFsT2Zmc2V0LngsXG4gICAgICAgICAgeTogb2Zmc2V0LnkgLSB0aGlzLmluaXRpYWxPZmZzZXQueVxuICAgICAgICB9O1xuICAgICAgICB0cmFuc2xhdGUueSAtPSB3aW5kb3cucGFnZVlPZmZzZXQgLSB0aGlzLmluaXRpYWxXaW5kb3dTY3JvbGwudG9wO1xuICAgICAgICB0cmFuc2xhdGUueCAtPSB3aW5kb3cucGFnZVhPZmZzZXQgLSB0aGlzLmluaXRpYWxXaW5kb3dTY3JvbGwubGVmdDtcbiAgICAgICAgdGhpcy50cmFuc2xhdGUgPSB0cmFuc2xhdGU7XG5cbiAgICAgICAgaWYgKGxvY2tUb0NvbnRhaW5lckVkZ2VzKSB7XG4gICAgICAgICAgdmFyIF9nZXRMb2NrUGl4ZWxPZmZzZXRzID0gZ2V0TG9ja1BpeGVsT2Zmc2V0cyh7XG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgICAgICAgbG9ja09mZnNldDogbG9ja09mZnNldCxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoXG4gICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF9nZXRMb2NrUGl4ZWxPZmZzZXRzMiA9IF9zbGljZWRUb0FycmF5KF9nZXRMb2NrUGl4ZWxPZmZzZXRzLCAyKSxcbiAgICAgICAgICAgICAgbWluTG9ja09mZnNldCA9IF9nZXRMb2NrUGl4ZWxPZmZzZXRzMlswXSxcbiAgICAgICAgICAgICAgbWF4TG9ja09mZnNldCA9IF9nZXRMb2NrUGl4ZWxPZmZzZXRzMlsxXTtcblxuICAgICAgICAgIHZhciBtaW5PZmZzZXQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLndpZHRoIC8gMiAtIG1pbkxvY2tPZmZzZXQueCxcbiAgICAgICAgICAgIHk6IHRoaXMuaGVpZ2h0IC8gMiAtIG1pbkxvY2tPZmZzZXQueVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIG1heE9mZnNldCA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMud2lkdGggLyAyIC0gbWF4TG9ja09mZnNldC54LFxuICAgICAgICAgICAgeTogdGhpcy5oZWlnaHQgLyAyIC0gbWF4TG9ja09mZnNldC55XG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cmFuc2xhdGUueCA9IGxpbWl0KHRoaXMubWluVHJhbnNsYXRlLnggKyBtaW5PZmZzZXQueCwgdGhpcy5tYXhUcmFuc2xhdGUueCAtIG1heE9mZnNldC54LCB0cmFuc2xhdGUueCk7XG4gICAgICAgICAgdHJhbnNsYXRlLnkgPSBsaW1pdCh0aGlzLm1pblRyYW5zbGF0ZS55ICsgbWluT2Zmc2V0LnksIHRoaXMubWF4VHJhbnNsYXRlLnkgLSBtYXhPZmZzZXQueSwgdHJhbnNsYXRlLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvY2tBeGlzID09PSAneCcpIHtcbiAgICAgICAgICB0cmFuc2xhdGUueSA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAobG9ja0F4aXMgPT09ICd5Jykge1xuICAgICAgICAgIHRyYW5zbGF0ZS54ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0tleVNvcnRpbmcgJiYga2V5Ym9hcmRTb3J0aW5nVHJhbnNpdGlvbkR1cmF0aW9uICYmICFpZ25vcmVUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkR1cmF0aW9uKHRoaXMuaGVscGVyLCBrZXlib2FyZFNvcnRpbmdUcmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VHJhbnNsYXRlM2QodGhpcy5oZWxwZXIsIHRyYW5zbGF0ZSk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImFuaW1hdGVOb2Rlc1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFuaW1hdGVOb2RlcygpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzNyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSBfdGhpcyRwcm9wczcudHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgICAgICAgaGlkZVNvcnRhYmxlR2hvc3QgPSBfdGhpcyRwcm9wczcuaGlkZVNvcnRhYmxlR2hvc3QsXG4gICAgICAgICAgICBvblNvcnRPdmVyID0gX3RoaXMkcHJvcHM3Lm9uU29ydE92ZXI7XG4gICAgICAgIHZhciBjb250YWluZXJTY3JvbGxEZWx0YSA9IHRoaXMuY29udGFpbmVyU2Nyb2xsRGVsdGEsXG4gICAgICAgICAgICB3aW5kb3dTY3JvbGxEZWx0YSA9IHRoaXMud2luZG93U2Nyb2xsRGVsdGE7XG4gICAgICAgIHZhciBub2RlcyA9IHRoaXMubWFuYWdlci5nZXRPcmRlcmVkUmVmcygpO1xuICAgICAgICB2YXIgc29ydGluZ09mZnNldCA9IHtcbiAgICAgICAgICBsZWZ0OiB0aGlzLm9mZnNldEVkZ2UubGVmdCArIHRoaXMudHJhbnNsYXRlLnggKyBjb250YWluZXJTY3JvbGxEZWx0YS5sZWZ0LFxuICAgICAgICAgIHRvcDogdGhpcy5vZmZzZXRFZGdlLnRvcCArIHRoaXMudHJhbnNsYXRlLnkgKyBjb250YWluZXJTY3JvbGxEZWx0YS50b3BcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGlzS2V5U29ydGluZyA9IHRoaXMubWFuYWdlci5pc0tleVNvcnRpbmc7XG4gICAgICAgIHZhciBwcmV2SW5kZXggPSB0aGlzLm5ld0luZGV4O1xuICAgICAgICB0aGlzLm5ld0luZGV4ID0gbnVsbDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgX25vZGUzID0gbm9kZXNbaV0ubm9kZTtcbiAgICAgICAgICB2YXIgaW5kZXggPSBfbm9kZTMuc29ydGFibGVJbmZvLmluZGV4O1xuICAgICAgICAgIHZhciB3aWR0aCA9IF9ub2RlMy5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGVpZ2h0ID0gX25vZGUzLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0ge1xuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCA+IGhlaWdodCA/IGhlaWdodCAvIDIgOiB0aGlzLmhlaWdodCAvIDIsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCA+IHdpZHRoID8gd2lkdGggLyAyIDogdGhpcy53aWR0aCAvIDJcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBtdXN0U2hpZnRCYWNrd2FyZCA9IGlzS2V5U29ydGluZyAmJiBpbmRleCA+IHRoaXMuaW5kZXggJiYgaW5kZXggPD0gcHJldkluZGV4O1xuICAgICAgICAgIHZhciBtdXN0U2hpZnRGb3J3YXJkID0gaXNLZXlTb3J0aW5nICYmIGluZGV4IDwgdGhpcy5pbmRleCAmJiBpbmRleCA+PSBwcmV2SW5kZXg7XG4gICAgICAgICAgdmFyIHRyYW5zbGF0ZSA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgZWRnZU9mZnNldCA9IG5vZGVzW2ldLmVkZ2VPZmZzZXQ7XG5cbiAgICAgICAgICBpZiAoIWVkZ2VPZmZzZXQpIHtcbiAgICAgICAgICAgIGVkZ2VPZmZzZXQgPSBnZXRFZGdlT2Zmc2V0KF9ub2RlMywgdGhpcy5jb250YWluZXIpO1xuICAgICAgICAgICAgbm9kZXNbaV0uZWRnZU9mZnNldCA9IGVkZ2VPZmZzZXQ7XG5cbiAgICAgICAgICAgIGlmIChpc0tleVNvcnRpbmcpIHtcbiAgICAgICAgICAgICAgbm9kZXNbaV0uYm91bmRpbmdDbGllbnRSZWN0ID0gZ2V0U2Nyb2xsQWRqdXN0ZWRCb3VuZGluZ0NsaWVudFJlY3QoX25vZGUzLCBjb250YWluZXJTY3JvbGxEZWx0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5leHROb2RlID0gaSA8IG5vZGVzLmxlbmd0aCAtIDEgJiYgbm9kZXNbaSArIDFdO1xuICAgICAgICAgIHZhciBwcmV2Tm9kZSA9IGkgPiAwICYmIG5vZGVzW2kgLSAxXTtcblxuICAgICAgICAgIGlmIChuZXh0Tm9kZSAmJiAhbmV4dE5vZGUuZWRnZU9mZnNldCkge1xuICAgICAgICAgICAgbmV4dE5vZGUuZWRnZU9mZnNldCA9IGdldEVkZ2VPZmZzZXQobmV4dE5vZGUubm9kZSwgdGhpcy5jb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAoaXNLZXlTb3J0aW5nKSB7XG4gICAgICAgICAgICAgIG5leHROb2RlLmJvdW5kaW5nQ2xpZW50UmVjdCA9IGdldFNjcm9sbEFkanVzdGVkQm91bmRpbmdDbGllbnRSZWN0KG5leHROb2RlLm5vZGUsIGNvbnRhaW5lclNjcm9sbERlbHRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChoaWRlU29ydGFibGVHaG9zdCkge1xuICAgICAgICAgICAgICB0aGlzLnNvcnRhYmxlR2hvc3QgPSBfbm9kZTM7XG4gICAgICAgICAgICAgIHNldElubGluZVN0eWxlcyhfbm9kZTMsIHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJhbnNpdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgICBzZXRUcmFuc2l0aW9uRHVyYXRpb24oX25vZGUzLCB0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmF4aXMueCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXhpcy55KSB7XG4gICAgICAgICAgICAgIGlmIChtdXN0U2hpZnRGb3J3YXJkIHx8IGluZGV4IDwgdGhpcy5pbmRleCAmJiAoc29ydGluZ09mZnNldC5sZWZ0ICsgd2luZG93U2Nyb2xsRGVsdGEubGVmdCAtIG9mZnNldC53aWR0aCA8PSBlZGdlT2Zmc2V0LmxlZnQgJiYgc29ydGluZ09mZnNldC50b3AgKyB3aW5kb3dTY3JvbGxEZWx0YS50b3AgPD0gZWRnZU9mZnNldC50b3AgKyBvZmZzZXQuaGVpZ2h0IHx8IHNvcnRpbmdPZmZzZXQudG9wICsgd2luZG93U2Nyb2xsRGVsdGEudG9wICsgb2Zmc2V0LmhlaWdodCA8PSBlZGdlT2Zmc2V0LnRvcCkpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGUueCA9IHRoaXMud2lkdGggKyB0aGlzLm1hcmdpbk9mZnNldC54O1xuXG4gICAgICAgICAgICAgICAgaWYgKGVkZ2VPZmZzZXQubGVmdCArIHRyYW5zbGF0ZS54ID4gdGhpcy5jb250YWluZXJCb3VuZGluZ1JlY3Qud2lkdGggLSBvZmZzZXQud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChuZXh0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUueCA9IG5leHROb2RlLmVkZ2VPZmZzZXQubGVmdCAtIGVkZ2VPZmZzZXQubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlLnkgPSBuZXh0Tm9kZS5lZGdlT2Zmc2V0LnRvcCAtIGVkZ2VPZmZzZXQudG9wO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5ld0luZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm5ld0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG11c3RTaGlmdEJhY2t3YXJkIHx8IGluZGV4ID4gdGhpcy5pbmRleCAmJiAoc29ydGluZ09mZnNldC5sZWZ0ICsgd2luZG93U2Nyb2xsRGVsdGEubGVmdCArIG9mZnNldC53aWR0aCA+PSBlZGdlT2Zmc2V0LmxlZnQgJiYgc29ydGluZ09mZnNldC50b3AgKyB3aW5kb3dTY3JvbGxEZWx0YS50b3AgKyBvZmZzZXQuaGVpZ2h0ID49IGVkZ2VPZmZzZXQudG9wIHx8IHNvcnRpbmdPZmZzZXQudG9wICsgd2luZG93U2Nyb2xsRGVsdGEudG9wICsgb2Zmc2V0LmhlaWdodCA+PSBlZGdlT2Zmc2V0LnRvcCArIGhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGUueCA9IC0odGhpcy53aWR0aCArIHRoaXMubWFyZ2luT2Zmc2V0LngpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVkZ2VPZmZzZXQubGVmdCArIHRyYW5zbGF0ZS54IDwgdGhpcy5jb250YWluZXJCb3VuZGluZ1JlY3QubGVmdCArIG9mZnNldC53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHByZXZOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZS54ID0gcHJldk5vZGUuZWRnZU9mZnNldC5sZWZ0IC0gZWRnZU9mZnNldC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUueSA9IHByZXZOb2RlLmVkZ2VPZmZzZXQudG9wIC0gZWRnZU9mZnNldC50b3A7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5uZXdJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAobXVzdFNoaWZ0QmFja3dhcmQgfHwgaW5kZXggPiB0aGlzLmluZGV4ICYmIHNvcnRpbmdPZmZzZXQubGVmdCArIHdpbmRvd1Njcm9sbERlbHRhLmxlZnQgKyBvZmZzZXQud2lkdGggPj0gZWRnZU9mZnNldC5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlLnggPSAtKHRoaXMud2lkdGggKyB0aGlzLm1hcmdpbk9mZnNldC54KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5ld0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobXVzdFNoaWZ0Rm9yd2FyZCB8fCBpbmRleCA8IHRoaXMuaW5kZXggJiYgc29ydGluZ09mZnNldC5sZWZ0ICsgd2luZG93U2Nyb2xsRGVsdGEubGVmdCA8PSBlZGdlT2Zmc2V0LmxlZnQgKyBvZmZzZXQud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGUueCA9IHRoaXMud2lkdGggKyB0aGlzLm1hcmdpbk9mZnNldC54O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmV3SW5kZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5uZXdJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5heGlzLnkpIHtcbiAgICAgICAgICAgIGlmIChtdXN0U2hpZnRCYWNrd2FyZCB8fCBpbmRleCA+IHRoaXMuaW5kZXggJiYgc29ydGluZ09mZnNldC50b3AgKyB3aW5kb3dTY3JvbGxEZWx0YS50b3AgKyBvZmZzZXQuaGVpZ2h0ID49IGVkZ2VPZmZzZXQudG9wKSB7XG4gICAgICAgICAgICAgIHRyYW5zbGF0ZS55ID0gLSh0aGlzLmhlaWdodCArIHRoaXMubWFyZ2luT2Zmc2V0LnkpO1xuICAgICAgICAgICAgICB0aGlzLm5ld0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG11c3RTaGlmdEZvcndhcmQgfHwgaW5kZXggPCB0aGlzLmluZGV4ICYmIHNvcnRpbmdPZmZzZXQudG9wICsgd2luZG93U2Nyb2xsRGVsdGEudG9wIDw9IGVkZ2VPZmZzZXQudG9wICsgb2Zmc2V0LmhlaWdodCkge1xuICAgICAgICAgICAgICB0cmFuc2xhdGUueSA9IHRoaXMuaGVpZ2h0ICsgdGhpcy5tYXJnaW5PZmZzZXQueTtcblxuICAgICAgICAgICAgICBpZiAodGhpcy5uZXdJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0VHJhbnNsYXRlM2QoX25vZGUzLCB0cmFuc2xhdGUpO1xuICAgICAgICAgIG5vZGVzW2ldLnRyYW5zbGF0ZSA9IHRyYW5zbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5ld0luZGV4ID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLm5ld0luZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0tleVNvcnRpbmcpIHtcbiAgICAgICAgICB0aGlzLm5ld0luZGV4ID0gcHJldkluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9sZEluZGV4ID0gaXNLZXlTb3J0aW5nID8gdGhpcy5wcmV2SW5kZXggOiBwcmV2SW5kZXg7XG5cbiAgICAgICAgaWYgKG9uU29ydE92ZXIgJiYgdGhpcy5uZXdJbmRleCAhPT0gb2xkSW5kZXgpIHtcbiAgICAgICAgICBvblNvcnRPdmVyKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMubWFuYWdlci5hY3RpdmUuY29sbGVjdGlvbixcbiAgICAgICAgICAgIGluZGV4OiB0aGlzLmluZGV4LFxuICAgICAgICAgICAgbmV3SW5kZXg6IHRoaXMubmV3SW5kZXgsXG4gICAgICAgICAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgICAgICAgICBpc0tleVNvcnRpbmc6IGlzS2V5U29ydGluZyxcbiAgICAgICAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgICAgICAgIGhlbHBlcjogdGhpcy5oZWxwZXJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJnZXRXcmFwcGVkSW5zdGFuY2VcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRXcmFwcGVkSW5zdGFuY2UoKSB7XG4gICAgICAgIGludmFyaWFudChjb25maWcud2l0aFJlZiwgJ1RvIGFjY2VzcyB0aGUgd3JhcHBlZCBpbnN0YW5jZSwgeW91IG5lZWQgdG8gcGFzcyBpbiB7d2l0aFJlZjogdHJ1ZX0gYXMgdGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgU29ydGFibGVDb250YWluZXIoKSBjYWxsJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZnMud3JhcHBlZEluc3RhbmNlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJnZXRDb250YWluZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb250YWluZXIoKSB7XG4gICAgICAgIHZhciBnZXRDb250YWluZXIgPSB0aGlzLnByb3BzLmdldENvbnRhaW5lcjtcblxuICAgICAgICBpZiAodHlwZW9mIGdldENvbnRhaW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmaW5kRE9NTm9kZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb250YWluZXIoY29uZmlnLndpdGhSZWYgPyB0aGlzLmdldFdyYXBwZWRJbnN0YW5jZSgpIDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgcmVmID0gY29uZmlnLndpdGhSZWYgPyAnd3JhcHBlZEluc3RhbmNlJyA6IG51bGw7XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgICByZWY6IHJlZlxuICAgICAgICB9LCBvbWl0KHRoaXMucHJvcHMsIG9taXR0ZWRQcm9wcykpKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaGVscGVyQ29udGFpbmVyXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgdmFyIGhlbHBlckNvbnRhaW5lciA9IHRoaXMucHJvcHMuaGVscGVyQ29udGFpbmVyO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaGVscGVyQ29udGFpbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGhlbHBlckNvbnRhaW5lcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaGVscGVyQ29udGFpbmVyIHx8IHRoaXMuZG9jdW1lbnQuYm9keTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY29udGFpbmVyU2Nyb2xsRGVsdGFcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB2YXIgdXNlV2luZG93QXNTY3JvbGxDb250YWluZXIgPSB0aGlzLnByb3BzLnVzZVdpbmRvd0FzU2Nyb2xsQ29udGFpbmVyO1xuXG4gICAgICAgIGlmICh1c2VXaW5kb3dBc1Njcm9sbENvbnRhaW5lcikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgdG9wOiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGVmdDogdGhpcy5zY3JvbGxDb250YWluZXIuc2Nyb2xsTGVmdCAtIHRoaXMuaW5pdGlhbFNjcm9sbC5sZWZ0LFxuICAgICAgICAgIHRvcDogdGhpcy5zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wIC0gdGhpcy5pbml0aWFsU2Nyb2xsLnRvcFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJ3aW5kb3dTY3JvbGxEZWx0YVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGVmdDogdGhpcy5jb250ZW50V2luZG93LnBhZ2VYT2Zmc2V0IC0gdGhpcy5pbml0aWFsV2luZG93U2Nyb2xsLmxlZnQsXG4gICAgICAgICAgdG9wOiB0aGlzLmNvbnRlbnRXaW5kb3cucGFnZVlPZmZzZXQgLSB0aGlzLmluaXRpYWxXaW5kb3dTY3JvbGwudG9wXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFdpdGhTb3J0YWJsZUNvbnRhaW5lcjtcbiAgfShDb21wb25lbnQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRpc3BsYXlOYW1lXCIsIHByb3ZpZGVEaXNwbGF5TmFtZSgnc29ydGFibGVMaXN0JywgV3JhcHBlZENvbXBvbmVudCkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRlZmF1bHRQcm9wc1wiLCBkZWZhdWx0UHJvcHMpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcInByb3BUeXBlc1wiLCBwcm9wVHlwZXMpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImNoaWxkQ29udGV4dFR5cGVzXCIsIHtcbiAgICBtYW5hZ2VyOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbiAgfSksIF90ZW1wO1xufVxuXG52YXIgcHJvcFR5cGVzJDEgPSB7XG4gIGluZGV4OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGNvbGxlY3Rpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sXG59O1xudmFyIG9taXR0ZWRQcm9wcyQxID0gT2JqZWN0LmtleXMocHJvcFR5cGVzJDEpO1xuZnVuY3Rpb24gc29ydGFibGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQpIHtcbiAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgdmFyIGNvbmZpZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIHdpdGhSZWY6IGZhbHNlXG4gIH07XG4gIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKFdpdGhTb3J0YWJsZUVsZW1lbnQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gV2l0aFNvcnRhYmxlRWxlbWVudCgpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXaXRoU29ydGFibGVFbGVtZW50KTtcblxuICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9nZXRQcm90b3R5cGVPZihXaXRoU29ydGFibGVFbGVtZW50KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoV2l0aFNvcnRhYmxlRWxlbWVudCwgW3tcbiAgICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgICAgIGlmIChwcmV2UHJvcHMuaW5kZXggIT09IHRoaXMucHJvcHMuaW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZS5zb3J0YWJsZUluZm8uaW5kZXggPSB0aGlzLnByb3BzLmluZGV4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcmV2UHJvcHMuZGlzYWJsZWQgIT09IHRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZS5zb3J0YWJsZUluZm8uZGlzYWJsZWQgPSB0aGlzLnByb3BzLmRpc2FibGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2UHJvcHMuY29sbGVjdGlvbiAhPT0gdGhpcy5wcm9wcy5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy51bnJlZ2lzdGVyKHByZXZQcm9wcy5jb2xsZWN0aW9uKTtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdGhpcy51bnJlZ2lzdGVyKCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInJlZ2lzdGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBjb2xsZWN0aW9uID0gX3RoaXMkcHJvcHMuY29sbGVjdGlvbixcbiAgICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgICAgICBpbmRleCA9IF90aGlzJHByb3BzLmluZGV4O1xuICAgICAgICB2YXIgbm9kZSA9IGZpbmRET01Ob2RlKHRoaXMpO1xuICAgICAgICBub2RlLnNvcnRhYmxlSW5mbyA9IHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgbWFuYWdlcjogdGhpcy5jb250ZXh0Lm1hbmFnZXJcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5yZWYgPSB7XG4gICAgICAgICAgbm9kZTogbm9kZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbnRleHQubWFuYWdlci5hZGQoY29sbGVjdGlvbiwgdGhpcy5yZWYpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJ1bnJlZ2lzdGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gdW5yZWdpc3RlcigpIHtcbiAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucHJvcHMuY29sbGVjdGlvbjtcbiAgICAgICAgdGhpcy5jb250ZXh0Lm1hbmFnZXIucmVtb3ZlKGNvbGxlY3Rpb24sIHRoaXMucmVmKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0V3JhcHBlZEluc3RhbmNlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0V3JhcHBlZEluc3RhbmNlKCkge1xuICAgICAgICBpbnZhcmlhbnQoY29uZmlnLndpdGhSZWYsICdUbyBhY2Nlc3MgdGhlIHdyYXBwZWQgaW5zdGFuY2UsIHlvdSBuZWVkIHRvIHBhc3MgaW4ge3dpdGhSZWY6IHRydWV9IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIFNvcnRhYmxlRWxlbWVudCgpIGNhbGwnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcy53cmFwcGVkSW5zdGFuY2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInJlbmRlclwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIHJlZiA9IGNvbmZpZy53aXRoUmVmID8gJ3dyYXBwZWRJbnN0YW5jZScgOiBudWxsO1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgICAgICAgcmVmOiByZWZcbiAgICAgICAgfSwgb21pdCh0aGlzLnByb3BzLCBvbWl0dGVkUHJvcHMkMSkpKTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gV2l0aFNvcnRhYmxlRWxlbWVudDtcbiAgfShDb21wb25lbnQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRpc3BsYXlOYW1lXCIsIHByb3ZpZGVEaXNwbGF5TmFtZSgnc29ydGFibGVFbGVtZW50JywgV3JhcHBlZENvbXBvbmVudCkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImNvbnRleHRUeXBlc1wiLCB7XG4gICAgbWFuYWdlcjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG4gIH0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcInByb3BUeXBlc1wiLCBwcm9wVHlwZXMkMSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgICBjb2xsZWN0aW9uOiAwXG4gIH0pLCBfdGVtcDtcbn1cblxuZXhwb3J0IHsgc29ydGFibGVDb250YWluZXIgYXMgU29ydGFibGVDb250YWluZXIsIHNvcnRhYmxlQ29udGFpbmVyLCBzb3J0YWJsZUVsZW1lbnQgYXMgU29ydGFibGVFbGVtZW50LCBzb3J0YWJsZUVsZW1lbnQsIHNvcnRhYmxlSGFuZGxlIGFzIFNvcnRhYmxlSGFuZGxlLCBzb3J0YWJsZUhhbmRsZSwgYXJyYXlNb3ZlIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6362\n')},4823:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = ({ value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar _objectWithoutPropertiesLoose = _interopDefault(__webpack_require__(3366));\nvar _extends = _interopDefault(__webpack_require__(7462));\nvar React = __webpack_require__(7363);\nvar React__default = _interopDefault(React);\nvar ReactDOM = _interopDefault(__webpack_require__(1533));\n\nlet bugfixes = undefined;\nlet applyAnimatedValues = undefined;\nlet colorNames = [];\nlet requestFrame = cb => typeof window !== 'undefined' && window.requestAnimationFrame(cb);\nlet cancelFrame = cb => typeof window !== 'undefined' && window.cancelAnimationFrame(cb);\nlet interpolation = undefined;\nlet now = () => Date.now();\nlet defaultElement = undefined;\nlet createAnimatedStyle = undefined;\nconst injectApplyAnimatedValues = (fn, transform) => applyAnimatedValues = {\n fn,\n transform\n};\nconst injectColorNames = names => colorNames = names;\nconst injectBugfixes = fn => bugfixes = fn;\nconst injectInterpolation = cls => interpolation = cls;\nconst injectFrame = (raf, caf) => {\n var _ref = [raf, caf];\n requestFrame = _ref[0];\n cancelFrame = _ref[1];\n return _ref;\n};\nconst injectNow = nowFn => now = nowFn;\nconst injectDefaultElement = el => defaultElement = el;\nconst injectCreateAnimatedStyle = factory => createAnimatedStyle = factory;\n\nvar Globals = /*#__PURE__*/Object.freeze({\n get bugfixes () { return bugfixes; },\n get applyAnimatedValues () { return applyAnimatedValues; },\n get colorNames () { return colorNames; },\n get requestFrame () { return requestFrame; },\n get cancelFrame () { return cancelFrame; },\n get interpolation () { return interpolation; },\n get now () { return now; },\n get defaultElement () { return defaultElement; },\n get createAnimatedStyle () { return createAnimatedStyle; },\n injectApplyAnimatedValues: injectApplyAnimatedValues,\n injectColorNames: injectColorNames,\n injectBugfixes: injectBugfixes,\n injectInterpolation: injectInterpolation,\n injectFrame: injectFrame,\n injectNow: injectNow,\n injectDefaultElement: injectDefaultElement,\n injectCreateAnimatedStyle: injectCreateAnimatedStyle\n});\n\nclass Animated {\n attach() {}\n\n detach() {}\n\n getValue() {}\n\n getAnimatedValue() {\n return this.getValue();\n }\n\n addChild(child) {}\n\n removeChild(child) {}\n\n getChildren() {\n return [];\n }\n\n}\n\nconst getValues = object => Object.keys(object).map(k => object[k]);\n\nclass AnimatedWithChildren extends Animated {\n constructor() {\n var _this;\n\n super(...arguments);\n _this = this;\n this.children = [];\n\n this.getChildren = () => this.children;\n\n this.getPayload = function (index) {\n if (index === void 0) {\n index = undefined;\n }\n\n return index !== void 0 && _this.payload ? _this.payload[index] : _this.payload || _this;\n };\n }\n\n addChild(child) {\n if (this.children.length === 0) this.attach();\n this.children.push(child);\n }\n\n removeChild(child) {\n const index = this.children.indexOf(child);\n this.children.splice(index, 1);\n if (this.children.length === 0) this.detach();\n }\n\n}\nclass AnimatedArrayWithChildren extends AnimatedWithChildren {\n constructor() {\n super(...arguments);\n this.payload = [];\n\n this.getAnimatedValue = () => this.getValue();\n\n this.attach = () => this.payload.forEach(p => p instanceof Animated && p.addChild(this));\n\n this.detach = () => this.payload.forEach(p => p instanceof Animated && p.removeChild(this));\n }\n\n}\nclass AnimatedObjectWithChildren extends AnimatedWithChildren {\n constructor() {\n super(...arguments);\n this.payload = {};\n\n this.getAnimatedValue = () => this.getValue(true);\n\n this.attach = () => getValues(this.payload).forEach(s => s instanceof Animated && s.addChild(this));\n\n this.detach = () => getValues(this.payload).forEach(s => s instanceof Animated && s.removeChild(this));\n }\n\n getValue(animated) {\n if (animated === void 0) {\n animated = false;\n }\n\n const payload = {};\n\n for (const key in this.payload) {\n const value = this.payload[key];\n if (animated && !(value instanceof Animated)) continue;\n payload[key] = value instanceof Animated ? value[animated ? 'getAnimatedValue' : 'getValue']() : value;\n }\n\n return payload;\n }\n\n}\n\nclass AnimatedStyle extends AnimatedObjectWithChildren {\n constructor(style) {\n super();\n style = style || {};\n if (style.transform && !(style.transform instanceof Animated)) style = applyAnimatedValues.transform(style);\n this.payload = style;\n }\n\n}\n\n// http://www.w3.org/TR/css3-color/#svg-color\nconst colors = {\n transparent: 0x00000000,\n aliceblue: 0xf0f8ffff,\n antiquewhite: 0xfaebd7ff,\n aqua: 0x00ffffff,\n aquamarine: 0x7fffd4ff,\n azure: 0xf0ffffff,\n beige: 0xf5f5dcff,\n bisque: 0xffe4c4ff,\n black: 0x000000ff,\n blanchedalmond: 0xffebcdff,\n blue: 0x0000ffff,\n blueviolet: 0x8a2be2ff,\n brown: 0xa52a2aff,\n burlywood: 0xdeb887ff,\n burntsienna: 0xea7e5dff,\n cadetblue: 0x5f9ea0ff,\n chartreuse: 0x7fff00ff,\n chocolate: 0xd2691eff,\n coral: 0xff7f50ff,\n cornflowerblue: 0x6495edff,\n cornsilk: 0xfff8dcff,\n crimson: 0xdc143cff,\n cyan: 0x00ffffff,\n darkblue: 0x00008bff,\n darkcyan: 0x008b8bff,\n darkgoldenrod: 0xb8860bff,\n darkgray: 0xa9a9a9ff,\n darkgreen: 0x006400ff,\n darkgrey: 0xa9a9a9ff,\n darkkhaki: 0xbdb76bff,\n darkmagenta: 0x8b008bff,\n darkolivegreen: 0x556b2fff,\n darkorange: 0xff8c00ff,\n darkorchid: 0x9932ccff,\n darkred: 0x8b0000ff,\n darksalmon: 0xe9967aff,\n darkseagreen: 0x8fbc8fff,\n darkslateblue: 0x483d8bff,\n darkslategray: 0x2f4f4fff,\n darkslategrey: 0x2f4f4fff,\n darkturquoise: 0x00ced1ff,\n darkviolet: 0x9400d3ff,\n deeppink: 0xff1493ff,\n deepskyblue: 0x00bfffff,\n dimgray: 0x696969ff,\n dimgrey: 0x696969ff,\n dodgerblue: 0x1e90ffff,\n firebrick: 0xb22222ff,\n floralwhite: 0xfffaf0ff,\n forestgreen: 0x228b22ff,\n fuchsia: 0xff00ffff,\n gainsboro: 0xdcdcdcff,\n ghostwhite: 0xf8f8ffff,\n gold: 0xffd700ff,\n goldenrod: 0xdaa520ff,\n gray: 0x808080ff,\n green: 0x008000ff,\n greenyellow: 0xadff2fff,\n grey: 0x808080ff,\n honeydew: 0xf0fff0ff,\n hotpink: 0xff69b4ff,\n indianred: 0xcd5c5cff,\n indigo: 0x4b0082ff,\n ivory: 0xfffff0ff,\n khaki: 0xf0e68cff,\n lavender: 0xe6e6faff,\n lavenderblush: 0xfff0f5ff,\n lawngreen: 0x7cfc00ff,\n lemonchiffon: 0xfffacdff,\n lightblue: 0xadd8e6ff,\n lightcoral: 0xf08080ff,\n lightcyan: 0xe0ffffff,\n lightgoldenrodyellow: 0xfafad2ff,\n lightgray: 0xd3d3d3ff,\n lightgreen: 0x90ee90ff,\n lightgrey: 0xd3d3d3ff,\n lightpink: 0xffb6c1ff,\n lightsalmon: 0xffa07aff,\n lightseagreen: 0x20b2aaff,\n lightskyblue: 0x87cefaff,\n lightslategray: 0x778899ff,\n lightslategrey: 0x778899ff,\n lightsteelblue: 0xb0c4deff,\n lightyellow: 0xffffe0ff,\n lime: 0x00ff00ff,\n limegreen: 0x32cd32ff,\n linen: 0xfaf0e6ff,\n magenta: 0xff00ffff,\n maroon: 0x800000ff,\n mediumaquamarine: 0x66cdaaff,\n mediumblue: 0x0000cdff,\n mediumorchid: 0xba55d3ff,\n mediumpurple: 0x9370dbff,\n mediumseagreen: 0x3cb371ff,\n mediumslateblue: 0x7b68eeff,\n mediumspringgreen: 0x00fa9aff,\n mediumturquoise: 0x48d1ccff,\n mediumvioletred: 0xc71585ff,\n midnightblue: 0x191970ff,\n mintcream: 0xf5fffaff,\n mistyrose: 0xffe4e1ff,\n moccasin: 0xffe4b5ff,\n navajowhite: 0xffdeadff,\n navy: 0x000080ff,\n oldlace: 0xfdf5e6ff,\n olive: 0x808000ff,\n olivedrab: 0x6b8e23ff,\n orange: 0xffa500ff,\n orangered: 0xff4500ff,\n orchid: 0xda70d6ff,\n palegoldenrod: 0xeee8aaff,\n palegreen: 0x98fb98ff,\n paleturquoise: 0xafeeeeff,\n palevioletred: 0xdb7093ff,\n papayawhip: 0xffefd5ff,\n peachpuff: 0xffdab9ff,\n peru: 0xcd853fff,\n pink: 0xffc0cbff,\n plum: 0xdda0ddff,\n powderblue: 0xb0e0e6ff,\n purple: 0x800080ff,\n rebeccapurple: 0x663399ff,\n red: 0xff0000ff,\n rosybrown: 0xbc8f8fff,\n royalblue: 0x4169e1ff,\n saddlebrown: 0x8b4513ff,\n salmon: 0xfa8072ff,\n sandybrown: 0xf4a460ff,\n seagreen: 0x2e8b57ff,\n seashell: 0xfff5eeff,\n sienna: 0xa0522dff,\n silver: 0xc0c0c0ff,\n skyblue: 0x87ceebff,\n slateblue: 0x6a5acdff,\n slategray: 0x708090ff,\n slategrey: 0x708090ff,\n snow: 0xfffafaff,\n springgreen: 0x00ff7fff,\n steelblue: 0x4682b4ff,\n tan: 0xd2b48cff,\n teal: 0x008080ff,\n thistle: 0xd8bfd8ff,\n tomato: 0xff6347ff,\n turquoise: 0x40e0d0ff,\n violet: 0xee82eeff,\n wheat: 0xf5deb3ff,\n white: 0xffffffff,\n whitesmoke: 0xf5f5f5ff,\n yellow: 0xffff00ff,\n yellowgreen: 0x9acd32ff\n};\n\nclass Interpolation {\n // Default config = config, args\n // Short config = range, output, extrapolate\n static create(config, output, extra) {\n if (typeof config === 'function') return config;else if (interpolation && config.output && typeof config.output[0] === 'string') return interpolation(config);else if (Array.isArray(config)) return Interpolation.create({\n range: config,\n output,\n extrapolate: extra || 'extend'\n });\n let outputRange = config.output;\n let inputRange = config.range || [0, 1];\n\n let easing = config.easing || (t => t);\n\n let extrapolateLeft = 'extend';\n let map = config.map;\n if (config.extrapolateLeft !== undefined) extrapolateLeft = config.extrapolateLeft;else if (config.extrapolate !== undefined) extrapolateLeft = config.extrapolate;\n let extrapolateRight = 'extend';\n if (config.extrapolateRight !== undefined) extrapolateRight = config.extrapolateRight;else if (config.extrapolate !== undefined) extrapolateRight = config.extrapolate;\n return input => {\n let range = findRange(input, inputRange);\n return interpolate(input, inputRange[range], inputRange[range + 1], outputRange[range], outputRange[range + 1], easing, extrapolateLeft, extrapolateRight, map);\n };\n }\n\n}\n\nfunction interpolate(input, inputMin, inputMax, outputMin, outputMax, easing, extrapolateLeft, extrapolateRight, map) {\n let result = map ? map(input) : input; // Extrapolate\n\n if (result < inputMin) {\n if (extrapolateLeft === 'identity') return result;else if (extrapolateLeft === 'clamp') result = inputMin;\n }\n\n if (result > inputMax) {\n if (extrapolateRight === 'identity') return result;else if (extrapolateRight === 'clamp') result = inputMax;\n }\n\n if (outputMin === outputMax) return outputMin;\n if (inputMin === inputMax) return input <= inputMin ? outputMin : outputMax; // Input Range\n\n if (inputMin === -Infinity) result = -result;else if (inputMax === Infinity) result = result - inputMin;else result = (result - inputMin) / (inputMax - inputMin); // Easing\n\n result = easing(result); // Output Range\n\n if (outputMin === -Infinity) result = -result;else if (outputMax === Infinity) result = result + outputMin;else result = result * (outputMax - outputMin) + outputMin;\n return result;\n}\n\nfunction findRange(input, inputRange) {\n for (var i = 1; i < inputRange.length - 1; ++i) if (inputRange[i] >= input) break;\n\n return i - 1;\n}\n\n// const INTEGER = '[-+]?\\\\d+';\nconst NUMBER = '[-+]?\\\\d*\\\\.?\\\\d+';\nconst PERCENTAGE = NUMBER + '%';\n\nfunction call() {\n return '\\\\(\\\\s*(' + Array.prototype.slice.call(arguments).join(')\\\\s*,\\\\s*(') + ')\\\\s*\\\\)';\n}\n\nconst rgb = new RegExp('rgb' + call(NUMBER, NUMBER, NUMBER));\nconst rgba = new RegExp('rgba' + call(NUMBER, NUMBER, NUMBER, NUMBER));\nconst hsl = new RegExp('hsl' + call(NUMBER, PERCENTAGE, PERCENTAGE));\nconst hsla = new RegExp('hsla' + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER));\nconst hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nconst hex4 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nconst hex6 = /^#([0-9a-fA-F]{6})$/;\nconst hex8 = /^#([0-9a-fA-F]{8})$/;\n\n/*\nhttps://github.com/react-community/normalize-css-color\n\nBSD 3-Clause License\n\nCopyright (c) 2016, React Community\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\nfunction normalizeColor(color) {\n let match;\n\n if (typeof color === 'number') {\n return color >>> 0 === color && color >= 0 && color <= 0xffffffff ? color : null;\n } // Ordered based on occurrences on Facebook codebase\n\n\n if (match = hex6.exec(color)) return parseInt(match[1] + 'ff', 16) >>> 0;\n if (colors.hasOwnProperty(color)) return colors[color];\n\n if (match = rgb.exec(color)) {\n return (parse255(match[1]) << 24 | // r\n parse255(match[2]) << 16 | // g\n parse255(match[3]) << 8 | // b\n 0x000000ff) >>> // a\n 0;\n }\n\n if (match = rgba.exec(color)) {\n return (parse255(match[1]) << 24 | // r\n parse255(match[2]) << 16 | // g\n parse255(match[3]) << 8 | // b\n parse1(match[4])) >>> // a\n 0;\n }\n\n if (match = hex3.exec(color)) {\n return parseInt(match[1] + match[1] + // r\n match[2] + match[2] + // g\n match[3] + match[3] + // b\n 'ff', // a\n 16) >>> 0;\n } // https://drafts.csswg.org/css-color-4/#hex-notation\n\n\n if (match = hex8.exec(color)) return parseInt(match[1], 16) >>> 0;\n\n if (match = hex4.exec(color)) {\n return parseInt(match[1] + match[1] + // r\n match[2] + match[2] + // g\n match[3] + match[3] + // b\n match[4] + match[4], // a\n 16) >>> 0;\n }\n\n if (match = hsl.exec(color)) {\n return (hslToRgb(parse360(match[1]), // h\n parsePercentage(match[2]), // s\n parsePercentage(match[3]) // l\n ) | 0x000000ff) >>> // a\n 0;\n }\n\n if (match = hsla.exec(color)) {\n return (hslToRgb(parse360(match[1]), // h\n parsePercentage(match[2]), // s\n parsePercentage(match[3]) // l\n ) | parse1(match[4])) >>> // a\n 0;\n }\n\n return null;\n}\n\nfunction hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\n\nfunction hslToRgb(h, s, l) {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const r = hue2rgb(p, q, h + 1 / 3);\n const g = hue2rgb(p, q, h);\n const b = hue2rgb(p, q, h - 1 / 3);\n return Math.round(r * 255) << 24 | Math.round(g * 255) << 16 | Math.round(b * 255) << 8;\n}\n\nfunction parse255(str) {\n const int = parseInt(str, 10);\n if (int < 0) return 0;\n if (int > 255) return 255;\n return int;\n}\n\nfunction parse360(str) {\n const int = parseFloat(str);\n return (int % 360 + 360) % 360 / 360;\n}\n\nfunction parse1(str) {\n const num = parseFloat(str);\n if (num < 0) return 0;\n if (num > 1) return 255;\n return Math.round(num * 255);\n}\n\nfunction parsePercentage(str) {\n // parseFloat conveniently ignores the final %\n const int = parseFloat(str);\n if (int < 0) return 0;\n if (int > 100) return 1;\n return int / 100;\n}\n\nfunction colorToRgba(input) {\n let int32Color = normalizeColor(input);\n if (int32Color === null) return input;\n int32Color = int32Color || 0;\n let r = (int32Color & 0xff000000) >>> 24;\n let g = (int32Color & 0x00ff0000) >>> 16;\n let b = (int32Color & 0x0000ff00) >>> 8;\n let a = (int32Color & 0x000000ff) / 255;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n} // Problem: https://github.com/animatedjs/animated/pull/102\n// Solution: https://stackoverflow.com/questions/638565/parsing-scientific-notation-sensibly/658662\n\n\nconst stringShapeRegex = /[+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g; // Covers rgb, rgba, hsl, hsla\n// Taken from https://gist.github.com/olmokramer/82ccce673f86db7cda5e\n\nconst colorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?\\d+%?[,\\s]+){2,3}\\s*[\\d\\.]+%?\\))/gi; // Covers color names (transparent, blue, etc.)\n\nconst colorNamesRegex = new RegExp(`(${Object.keys(colors).join('|')})`, 'g');\n/**\n * Supports string shapes by extracting numbers so new values can be computed,\n * and recombines those values into new strings of the same shape. Supports\n * things like:\n *\n * rgba(123, 42, 99, 0.36) // colors\n * -45deg // values with units\n * 0 2px 2px 0px rgba(0, 0, 0, 0.12) // box shadows\n */\n\nfunction createInterpolation(config) {\n // Replace colors with rgba\n const outputRange = config.output.map(rangeValue => rangeValue.replace(colorRegex, colorToRgba)).map(rangeValue => rangeValue.replace(colorNamesRegex, colorToRgba)); // ->\n // [\n // [0, 50],\n // [100, 150],\n // [200, 250],\n // [0, 0.5],\n // ]\n\n const outputRanges = outputRange[0].match(stringShapeRegex).map(() => []);\n outputRange.forEach(value => {\n value.match(stringShapeRegex).forEach((number, i) => outputRanges[i].push(+number));\n });\n const interpolations = outputRange[0].match(stringShapeRegex).map((value, i) => {\n return Interpolation.create(_extends({}, config, {\n output: outputRanges[i]\n }));\n });\n return input => {\n let i = 0;\n return outputRange[0] // 'rgba(0, 100, 200, 0)'\n // ->\n // 'rgba(${interpolations[0](input)}, ${interpolations[1](input)}, ...'\n .replace(stringShapeRegex, () => interpolations[i++](input)) // rgba requires that the r,g,b are integers.... so we want to round them, but we *dont* want to\n // round the opacity (4th column).\n .replace(/rgba\\(([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+)\\)/gi, (_, p1, p2, p3, p4) => `rgba(${Math.round(p1)}, ${Math.round(p2)}, ${Math.round(p3)}, ${p4})`);\n };\n}\n\nclass AnimatedInterpolation extends AnimatedArrayWithChildren {\n constructor(parents, _config, _arg) {\n super();\n\n this.getValue = () => this.calc(...this.payload.map(value => value.getValue()));\n\n this.updateConfig = (config, arg) => this.calc = Interpolation.create(config, arg);\n\n this.interpolate = (config, arg) => new AnimatedInterpolation(this, config, arg);\n\n this.payload = // AnimatedArrays should unfold, except AnimatedInterpolation which is taken as is\n parents instanceof AnimatedArrayWithChildren && !parents.updateConfig ? parents.payload : Array.isArray(parents) ? parents : [parents];\n this.calc = Interpolation.create(_config, _arg);\n }\n\n}\nconst interpolate$1 = (parents, config, arg) => parents && new AnimatedInterpolation(parents, config, arg);\n\n/**\n * Animated works by building a directed acyclic graph of dependencies\n * transparently when you render your Animated components.\n *\n * new Animated.Value(0)\n * .interpolate() .interpolate() new Animated.Value(1)\n * opacity translateY scale\n * style transform\n * View#234 style\n * View#123\n *\n * A) Top Down phase\n * When an Animated.Value is updated, we recursively go down through this\n * graph in order to find leaf nodes: the views that we flag as needing\n * an update.\n *\n * B) Bottom Up phase\n * When a view is flagged as needing an update, we recursively go back up\n * in order to build the new value that it needs. The reason why we need\n * this two-phases process is to deal with composite props such as\n * transform which can receive values from multiple parents.\n */\n\nfunction findAnimatedStyles(node, styles) {\n if (typeof node.update === 'function') styles.add(node);else node.getChildren().forEach(child => findAnimatedStyles(child, styles));\n}\n/**\n * Standard value for driving animations. One `Animated.Value` can drive\n * multiple properties in a synchronized fashion, but can only be driven by one\n * mechanism at a time. Using a new mechanism (e.g. starting a new animation,\n * or calling `setValue`) will stop any previous ones.\n */\n\n\nclass AnimatedValue extends AnimatedWithChildren {\n constructor(_value) {\n var _this;\n\n super();\n _this = this;\n\n this.setValue = function (value, flush) {\n if (flush === void 0) {\n flush = true;\n }\n\n _this.value = value;\n if (flush) _this.flush();\n };\n\n this.getValue = () => this.value;\n\n this.updateStyles = () => findAnimatedStyles(this, this.animatedStyles);\n\n this.updateValue = value => this.flush(this.value = value);\n\n this.interpolate = (config, arg) => new AnimatedInterpolation(this, config, arg);\n\n this.value = _value;\n this.animatedStyles = new Set();\n this.done = false;\n this.startPosition = _value;\n this.lastPosition = _value;\n this.lastVelocity = undefined;\n this.lastTime = undefined;\n this.controller = undefined;\n }\n\n flush() {\n if (this.animatedStyles.size === 0) this.updateStyles();\n this.animatedStyles.forEach(animatedStyle => animatedStyle.update());\n }\n\n prepare(controller) {\n // Values stay loyal to their original controller, this is also a way to\n // detect trailing values originating from a foreign controller\n if (this.controller === undefined) this.controller = controller;\n\n if (this.controller === controller) {\n this.startPosition = this.value;\n this.lastPosition = this.value;\n this.lastVelocity = controller.isActive ? this.lastVelocity : undefined;\n this.lastTime = controller.isActive ? this.lastTime : undefined;\n this.done = false;\n this.animatedStyles.clear();\n }\n }\n\n}\n\nclass AnimatedArray extends AnimatedArrayWithChildren {\n constructor(array) {\n var _this;\n\n super();\n _this = this;\n\n this.setValue = function (value, flush) {\n if (flush === void 0) {\n flush = true;\n }\n\n if (Array.isArray(value)) {\n if (value.length === _this.payload.length) value.forEach((v, i) => _this.payload[i].setValue(v, flush));\n } else _this.payload.forEach((v, i) => _this.payload[i].setValue(value, flush));\n };\n\n this.getValue = () => this.payload.map(v => v.getValue());\n\n this.interpolate = (config, arg) => new AnimatedInterpolation(this, config, arg);\n\n this.payload = array.map(n => new AnimatedValue(n));\n }\n\n}\n\nfunction withDefault(value, defaultValue) {\n return value === undefined || value === null ? defaultValue : value;\n}\nfunction toArray(a) {\n return a !== void 0 ? Array.isArray(a) ? a : [a] : [];\n}\nfunction shallowEqual(a, b) {\n if (typeof a !== typeof b) return false;\n if (typeof a === 'string' || typeof a === 'number') return a === b;\n let i;\n\n for (i in a) if (!(i in b)) return false;\n\n for (i in b) if (a[i] !== b[i]) return false;\n\n return i === void 0 ? a === b : true;\n}\nfunction callProp(obj) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return typeof obj === 'function' ? obj(...args) : obj;\n}\nfunction getValues$1(object) {\n return Object.keys(object).map(k => object[k]);\n}\nfunction getForwardProps(props) {\n const to = props.to,\n from = props.from,\n config = props.config,\n native = props.native,\n onStart = props.onStart,\n onRest = props.onRest,\n onFrame = props.onFrame,\n children = props.children,\n reset = props.reset,\n reverse = props.reverse,\n force = props.force,\n immediate = props.immediate,\n impl = props.impl,\n inject = props.inject,\n delay = props.delay,\n attach = props.attach,\n destroyed = props.destroyed,\n interpolateTo = props.interpolateTo,\n autoStart = props.autoStart,\n ref = props.ref,\n forward = _objectWithoutPropertiesLoose(props, [\"to\", \"from\", \"config\", \"native\", \"onStart\", \"onRest\", \"onFrame\", \"children\", \"reset\", \"reverse\", \"force\", \"immediate\", \"impl\", \"inject\", \"delay\", \"attach\", \"destroyed\", \"interpolateTo\", \"autoStart\", \"ref\"]);\n\n return forward;\n}\nfunction interpolateTo(props) {\n const forward = getForwardProps(props);\n const rest = Object.keys(props).reduce((a, k) => forward[k] !== void 0 ? a : _extends({}, a, {\n [k]: props[k]\n }), {});\n return _extends({\n to: forward\n }, rest);\n}\nfunction convertToAnimatedValue(acc, _ref) {\n let name = _ref[0],\n value = _ref[1];\n return _extends({}, acc, {\n [name]: new (Array.isArray(value) ? AnimatedArray : AnimatedValue)(value)\n });\n}\nfunction convertValues(props) {\n const from = props.from,\n to = props.to,\n native = props.native;\n const allProps = Object.entries(_extends({}, from, to));\n return native ? allProps.reduce(convertToAnimatedValue, {}) : _extends({}, from, to);\n}\nfunction handleRef(ref, forward) {\n if (forward) {\n // If it's a function, assume it's a ref callback\n if (typeof forward === 'function') forward(ref);else if (typeof forward === 'object') {\n // If it's an object and has a 'current' property, assume it's a ref object\n forward.current = ref;\n }\n }\n\n return ref;\n}\n\nconst check = value => value === 'auto';\n\nconst overwrite = (width, height) => (acc, _ref) => {\n let name = _ref[0],\n value = _ref[1];\n return _extends({}, acc, {\n [name]: value === 'auto' ? ~name.indexOf('height') ? height : width : value\n });\n};\n\nfunction fixAuto(props, callback) {\n const from = props.from,\n to = props.to,\n children = props.children; // Dry-route props back if nothing's using 'auto' in there\n // TODO: deal with \"null\"\n\n if (!(getValues$1(to).some(check) || getValues$1(from).some(check))) return; // Fetch render v-dom\n\n let element = children(convertValues(props)); // A spring can return undefined/null, check against that (#153)\n\n if (!element) return; // Or it could be an array (#346) ...\n\n if (Array.isArray(element)) element = {\n type: 'div',\n props: {\n children: element\n } // Extract styles\n\n };\n const elementStyles = element.props.style; // Return v.dom with injected ref\n\n return React__default.createElement(element.type, _extends({\n key: element.key ? element.key : undefined\n }, element.props, {\n style: _extends({}, elementStyles, {\n position: 'absolute',\n visibility: 'hidden'\n }),\n ref: _ref2 => {\n if (_ref2) {\n // Once it's rendered out, fetch bounds (minus padding/margin/borders)\n let node = ReactDOM.findDOMNode(_ref2);\n let width, height;\n let cs = getComputedStyle(node);\n\n if (cs.boxSizing === 'border-box') {\n width = node.offsetWidth;\n height = node.offsetHeight;\n } else {\n const paddingX = parseFloat(cs.paddingLeft || 0) + parseFloat(cs.paddingRight || 0);\n const paddingY = parseFloat(cs.paddingTop || 0) + parseFloat(cs.paddingBottom || 0);\n const borderX = parseFloat(cs.borderLeftWidth || 0) + parseFloat(cs.borderRightWidth || 0);\n const borderY = parseFloat(cs.borderTopWidth || 0) + parseFloat(cs.borderBottomWidth || 0);\n width = node.offsetWidth - paddingX - borderX;\n height = node.offsetHeight - paddingY - borderY;\n }\n\n const convert = overwrite(width, height);\n callback(_extends({}, props, {\n from: Object.entries(from).reduce(convert, from),\n to: Object.entries(to).reduce(convert, to)\n }));\n }\n }\n }));\n}\n\nlet isUnitlessNumber = {\n animationIterationCount: true,\n borderImageOutset: true,\n borderImageSlice: true,\n borderImageWidth: true,\n boxFlex: true,\n boxFlexGroup: true,\n boxOrdinalGroup: true,\n columnCount: true,\n columns: true,\n flex: true,\n flexGrow: true,\n flexPositive: true,\n flexShrink: true,\n flexNegative: true,\n flexOrder: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowSpan: true,\n gridRowStart: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnSpan: true,\n gridColumnStart: true,\n fontWeight: true,\n lineClamp: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n tabSize: true,\n widows: true,\n zIndex: true,\n zoom: true,\n // SVG-related properties\n fillOpacity: true,\n floodOpacity: true,\n stopOpacity: true,\n strokeDasharray: true,\n strokeDashoffset: true,\n strokeMiterlimit: true,\n strokeOpacity: true,\n strokeWidth: true\n};\n\nconst prefixKey = (prefix, key) => prefix + key.charAt(0).toUpperCase() + key.substring(1);\n\nconst prefixes = ['Webkit', 'Ms', 'Moz', 'O'];\nisUnitlessNumber = Object.keys(isUnitlessNumber).reduce((acc, prop) => {\n prefixes.forEach(prefix => acc[prefixKey(prefix, prop)] = acc[prop]);\n return acc;\n}, isUnitlessNumber);\n\nfunction dangerousStyleValue(name, value, isCustomProperty) {\n if (value == null || typeof value === 'boolean' || value === '') return '';\n if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n\n return ('' + value).trim();\n}\n\nconst attributeCache = {};\ninjectCreateAnimatedStyle(style => new AnimatedStyle(style));\ninjectDefaultElement('div');\ninjectInterpolation(createInterpolation);\ninjectColorNames(colors);\ninjectBugfixes(fixAuto);\ninjectApplyAnimatedValues((instance, props) => {\n if (instance.nodeType && instance.setAttribute !== undefined) {\n const style = props.style,\n children = props.children,\n scrollTop = props.scrollTop,\n scrollLeft = props.scrollLeft,\n attributes = _objectWithoutPropertiesLoose(props, [\"style\", \"children\", \"scrollTop\", \"scrollLeft\"]);\n\n if (scrollTop !== void 0) instance.scrollTop = scrollTop;\n if (scrollLeft !== void 0) instance.scrollLeft = scrollLeft; // Set textContent, if children is an animatable value\n\n if (children !== void 0) instance.textContent = children; // Set styles ...\n\n for (let styleName in style) {\n if (!style.hasOwnProperty(styleName)) continue;\n var isCustomProperty = styleName.indexOf('--') === 0;\n var styleValue = dangerousStyleValue(styleName, style[styleName], isCustomProperty);\n if (styleName === 'float') styleName = 'cssFloat';\n if (isCustomProperty) instance.style.setProperty(styleName, styleValue);else instance.style[styleName] = styleValue;\n } // Set attributes ...\n\n\n for (let name in attributes) {\n // Attributes are written in dash case\n const dashCase = attributeCache[name] || (attributeCache[name] = name.replace(/([A-Z])/g, n => '-' + n.toLowerCase()));\n if (typeof instance.getAttribute(dashCase) !== 'undefined') instance.setAttribute(dashCase, attributes[name]);\n }\n } else return false;\n}, style => style);\n\nlet active = false;\nconst controllers = new Set();\n\nconst frameLoop = () => {\n let time = now();\n\n for (let controller of controllers) {\n let isDone = true;\n let noChange = true;\n\n for (let configIdx = 0; configIdx < controller.configs.length; configIdx++) {\n let config = controller.configs[configIdx];\n let endOfAnimation, lastTime;\n\n for (let valIdx = 0; valIdx < config.animatedValues.length; valIdx++) {\n let animation = config.animatedValues[valIdx]; // If an animation is done, skip, until all of them conclude\n\n if (animation.done) continue;\n let from = config.fromValues[valIdx];\n let to = config.toValues[valIdx];\n let position = animation.lastPosition;\n let isAnimated = to instanceof Animated;\n let velocity = Array.isArray(config.initialVelocity) ? config.initialVelocity[valIdx] : config.initialVelocity;\n if (isAnimated) to = to.getValue(); // Conclude animation if it's either immediate, or from-values match end-state\n\n if (config.immediate || !isAnimated && !config.decay && from === to) {\n animation.updateValue(to);\n animation.done = true;\n continue;\n } // Doing delay here instead of setTimeout is one async worry less\n\n\n if (config.delay && time - controller.startTime < config.delay) {\n isDone = false;\n continue;\n } // Flag change\n\n\n noChange = false; // Break animation when string values are involved\n\n if (typeof from === 'string' || typeof to === 'string') {\n animation.updateValue(to);\n animation.done = true;\n continue;\n }\n\n if (config.duration !== void 0) {\n /** Duration easing */\n position = from + config.easing((time - controller.startTime - config.delay) / config.duration) * (to - from);\n endOfAnimation = time >= controller.startTime + config.delay + config.duration;\n } else if (config.decay) {\n /** Decay easing */\n position = from + velocity / (1 - 0.998) * (1 - Math.exp(-(1 - 0.998) * (time - controller.startTime)));\n endOfAnimation = Math.abs(animation.lastPosition - position) < 0.1;\n if (endOfAnimation) to = position;\n } else {\n /** Spring easing */\n lastTime = animation.lastTime !== void 0 ? animation.lastTime : time;\n velocity = animation.lastVelocity !== void 0 ? animation.lastVelocity : config.initialVelocity; // If we lost a lot of frames just jump to the end.\n\n if (time > lastTime + 64) lastTime = time; // http://gafferongames.com/game-physics/fix-your-timestep/\n\n let numSteps = Math.floor(time - lastTime);\n\n for (let i = 0; i < numSteps; ++i) {\n let force = -config.tension * (position - to);\n let damping = -config.friction * velocity;\n let acceleration = (force + damping) / config.mass;\n velocity = velocity + acceleration * 1 / 1000;\n position = position + velocity * 1 / 1000;\n } // Conditions for stopping the spring animation\n\n\n let isOvershooting = config.clamp && config.tension !== 0 ? from < to ? position > to : position < to : false;\n let isVelocity = Math.abs(velocity) <= config.precision;\n let isDisplacement = config.tension !== 0 ? Math.abs(to - position) <= config.precision : true;\n endOfAnimation = isOvershooting || isVelocity && isDisplacement;\n animation.lastVelocity = velocity;\n animation.lastTime = time;\n } // Trails aren't done until their parents conclude\n\n\n if (isAnimated && !config.toValues[valIdx].done) endOfAnimation = false;\n\n if (endOfAnimation) {\n // Ensure that we end up with a round value\n if (animation.value !== to) position = to;\n animation.done = true;\n } else isDone = false;\n\n animation.updateValue(position);\n animation.lastPosition = position;\n } // Keep track of updated values only when necessary\n\n\n if (controller.props.onFrame || !controller.props.native) controller.animatedProps[config.name] = config.interpolation.getValue();\n } // Update callbacks in the end of the frame\n\n\n if (controller.props.onFrame || !controller.props.native) {\n if (!controller.props.native && controller.onUpdate) controller.onUpdate();\n if (controller.props.onFrame) controller.props.onFrame(controller.animatedProps);\n } // Either call onEnd or next frame\n\n\n if (isDone) {\n controllers.delete(controller);\n controller.debouncedOnEnd({\n finished: true,\n noChange\n });\n }\n } // Loop over as long as there are controllers ...\n\n\n if (controllers.size) requestFrame(frameLoop);else active = false;\n};\n\nconst addController = controller => {\n if (!controllers.has(controller)) {\n controllers.add(controller);\n if (!active) requestFrame(frameLoop);\n active = true;\n }\n};\n\nconst removeController = controller => {\n if (controllers.has(controller)) {\n controllers.delete(controller);\n }\n};\n\nclass Controller {\n constructor(props, config) {\n if (config === void 0) {\n config = {\n native: true,\n interpolateTo: true,\n autoStart: true\n };\n }\n\n this.getValues = () => this.props.native ? this.interpolations : this.animatedProps;\n\n this.dependents = new Set();\n this.isActive = false;\n this.hasChanged = false;\n this.props = {};\n this.merged = {};\n this.animations = {};\n this.interpolations = {};\n this.animatedProps = {};\n this.configs = [];\n this.frame = undefined;\n this.startTime = undefined;\n this.lastTime = undefined;\n this.update(_extends({}, props, config));\n }\n\n update(props) {\n this.props = _extends({}, this.props, props);\n\n let _ref = this.props.interpolateTo ? interpolateTo(this.props) : this.props,\n _ref$from = _ref.from,\n from = _ref$from === void 0 ? {} : _ref$from,\n _ref$to = _ref.to,\n to = _ref$to === void 0 ? {} : _ref$to,\n _ref$config = _ref.config,\n config = _ref$config === void 0 ? {} : _ref$config,\n _ref$delay = _ref.delay,\n delay = _ref$delay === void 0 ? 0 : _ref$delay,\n reverse = _ref.reverse,\n attach = _ref.attach,\n reset = _ref.reset,\n immediate = _ref.immediate,\n autoStart = _ref.autoStart,\n ref = _ref.ref; // Reverse values when requested\n\n\n if (reverse) {\n var _ref2 = [to, from];\n from = _ref2[0];\n to = _ref2[1];\n }\n\n this.hasChanged = false; // Attachment handling, trailed springs can \"attach\" themselves to a previous spring\n\n let target = attach && attach(this); // Reset merged props when necessary\n\n let extra = reset ? {} : this.merged; // This will collect all props that were ever set\n\n this.merged = _extends({}, from, extra, to); // Reduces input { name: value } pairs into animated values\n\n this.animations = Object.entries(this.merged).reduce((acc, _ref3, i) => {\n let name = _ref3[0],\n value = _ref3[1];\n // Issue cached entries, except on reset\n let entry = !reset && acc[name] || {}; // Figure out what the value is supposed to be\n\n const isNumber = typeof value === 'number';\n const isString = typeof value === 'string' && !value.startsWith('#') && !/\\d/.test(value) && !colorNames[value];\n const isArray = !isNumber && !isString && Array.isArray(value);\n let fromValue = from[name] !== undefined ? from[name] : value;\n let toValue = isNumber || isArray ? value : isString ? value : 1;\n let toConfig = callProp(config, name);\n if (target) toValue = target.animations[name].parent; // Detect changes, animated values will be checked in the raf-loop\n\n if (toConfig.decay !== void 0 || !shallowEqual(entry.changes, value)) {\n this.hasChanged = true;\n let parent, interpolation$$1;\n if (isNumber || isString) parent = interpolation$$1 = entry.parent || new AnimatedValue(fromValue);else if (isArray) parent = interpolation$$1 = entry.parent || new AnimatedArray(fromValue);else {\n const prev = entry.interpolation && entry.interpolation.calc(entry.parent.value);\n\n if (entry.parent) {\n parent = entry.parent;\n parent.setValue(0, false);\n } else parent = new AnimatedValue(0);\n\n const range = {\n output: [prev !== void 0 ? prev : fromValue, value]\n };\n\n if (entry.interpolation) {\n interpolation$$1 = entry.interpolation;\n entry.interpolation.updateConfig(range);\n } else interpolation$$1 = parent.interpolate(range);\n } // Set immediate values\n\n if (callProp(immediate, name)) parent.setValue(value, false); // Reset animated values\n\n const animatedValues = toArray(parent.getPayload());\n animatedValues.forEach(value => value.prepare(this));\n return _extends({}, acc, {\n [name]: _extends({}, entry, {\n name,\n parent,\n interpolation: interpolation$$1,\n animatedValues,\n changes: value,\n fromValues: toArray(parent.getValue()),\n toValues: toArray(target ? toValue.getPayload() : toValue),\n immediate: callProp(immediate, name),\n delay: withDefault(toConfig.delay, delay || 0),\n initialVelocity: withDefault(toConfig.velocity, 0),\n clamp: withDefault(toConfig.clamp, false),\n precision: withDefault(toConfig.precision, 0.01),\n tension: withDefault(toConfig.tension, 170),\n friction: withDefault(toConfig.friction, 26),\n mass: withDefault(toConfig.mass, 1),\n duration: toConfig.duration,\n easing: withDefault(toConfig.easing, t => t),\n decay: toConfig.decay\n })\n });\n } else return acc;\n }, this.animations);\n\n if (this.hasChanged) {\n this.configs = getValues$1(this.animations);\n this.animatedProps = {};\n this.interpolations = {};\n\n for (let key in this.animations) {\n this.interpolations[key] = this.animations[key].interpolation;\n this.animatedProps[key] = this.animations[key].interpolation.getValue();\n }\n } // TODO: clean up ref in controller\n\n\n for (var _len = arguments.length, start = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n start[_key - 1] = arguments[_key];\n }\n\n if (!ref && (autoStart || start.length)) this.start(...start);\n const onEnd = start[0],\n onUpdate = start[1];\n this.onEnd = typeof onEnd === 'function' && onEnd;\n this.onUpdate = onUpdate;\n return this.getValues();\n }\n\n start(onEnd, onUpdate) {\n this.startTime = now();\n if (this.isActive) this.stop();\n this.isActive = true;\n this.onEnd = typeof onEnd === 'function' && onEnd;\n this.onUpdate = onUpdate;\n if (this.props.onStart) this.props.onStart();\n addController(this);\n return new Promise(res => this.resolve = res);\n }\n\n stop(finished) {\n if (finished === void 0) {\n finished = false;\n }\n\n // Reset collected changes since the animation has been stopped cold turkey\n if (finished) getValues$1(this.animations).forEach(a => a.changes = undefined);\n this.debouncedOnEnd({\n finished\n });\n }\n\n destroy() {\n removeController(this);\n this.props = {};\n this.merged = {};\n this.animations = {};\n this.interpolations = {};\n this.animatedProps = {};\n this.configs = [];\n }\n\n debouncedOnEnd(result) {\n removeController(this);\n this.isActive = false;\n const onEnd = this.onEnd;\n this.onEnd = null;\n if (onEnd) onEnd(result);\n if (this.resolve) this.resolve();\n this.resolve = null;\n }\n\n}\n\nclass AnimatedProps extends AnimatedObjectWithChildren {\n constructor(props, callback) {\n super();\n if (props.style) props = _extends({}, props, {\n style: createAnimatedStyle(props.style)\n });\n this.payload = props;\n this.update = callback;\n this.attach();\n }\n\n}\n\nfunction createAnimatedComponent(Component) {\n class AnimatedComponent extends React__default.Component {\n constructor(props) {\n super();\n\n this.callback = () => {\n if (this.node) {\n const didUpdate = applyAnimatedValues.fn(this.node, this.propsAnimated.getAnimatedValue(), this);\n if (didUpdate === false) this.forceUpdate();\n }\n };\n\n this.attachProps(props);\n }\n\n componentWillUnmount() {\n this.propsAnimated && this.propsAnimated.detach();\n }\n\n setNativeProps(props) {\n const didUpdate = applyAnimatedValues.fn(this.node, props, this);\n if (didUpdate === false) this.forceUpdate();\n } // The system is best designed when setNativeProps is implemented. It is\n // able to avoid re-rendering and directly set the attributes that\n // changed. However, setNativeProps can only be implemented on leaf\n // native components. If you want to animate a composite component, you\n // need to re-render it. In this case, we have a fallback that uses\n // forceUpdate.\n\n\n attachProps(_ref) {\n let forwardRef = _ref.forwardRef,\n nextProps = _objectWithoutPropertiesLoose(_ref, [\"forwardRef\"]);\n\n const oldPropsAnimated = this.propsAnimated;\n this.propsAnimated = new AnimatedProps(nextProps, this.callback); // When you call detach, it removes the element from the parent list\n // of children. If it goes to 0, then the parent also detaches itself\n // and so on.\n // An optimization is to attach the new elements and THEN detach the old\n // ones instead of detaching and THEN attaching.\n // This way the intermediate state isn't to go to 0 and trigger\n // this expensive recursive detaching to then re-attach everything on\n // the very next operation.\n\n oldPropsAnimated && oldPropsAnimated.detach();\n }\n\n shouldComponentUpdate(props) {\n const style = props.style,\n nextProps = _objectWithoutPropertiesLoose(props, [\"style\"]);\n\n const _this$props = this.props,\n currentStyle = _this$props.style,\n currentProps = _objectWithoutPropertiesLoose(_this$props, [\"style\"]);\n\n if (!shallowEqual(currentProps, nextProps) || !shallowEqual(currentStyle, style)) {\n this.attachProps(props);\n return true;\n }\n\n return false;\n }\n\n render() {\n const _this$propsAnimated$g = this.propsAnimated.getValue(),\n scrollTop = _this$propsAnimated$g.scrollTop,\n scrollLeft = _this$propsAnimated$g.scrollLeft,\n animatedProps = _objectWithoutPropertiesLoose(_this$propsAnimated$g, [\"scrollTop\", \"scrollLeft\"]);\n\n return React__default.createElement(Component, _extends({}, animatedProps, {\n ref: node => this.node = handleRef(node, this.props.forwardRef)\n }));\n }\n\n }\n\n return React__default.forwardRef((props, ref) => React__default.createElement(AnimatedComponent, _extends({}, props, {\n forwardRef: ref\n })));\n}\n\nconst config = {\n default: {\n tension: 170,\n friction: 26\n },\n gentle: {\n tension: 120,\n friction: 14\n },\n wobbly: {\n tension: 180,\n friction: 12\n },\n stiff: {\n tension: 210,\n friction: 20\n },\n slow: {\n tension: 280,\n friction: 60\n },\n molasses: {\n tension: 280,\n friction: 120\n }\n};\n\nclass Spring extends React__default.Component {\n constructor() {\n super(...arguments);\n this.state = {\n lastProps: {\n from: {},\n to: {}\n },\n propsChanged: false,\n internal: false\n };\n this.controller = new Controller(null, null);\n this.didUpdate = false;\n this.didInject = false;\n this.finished = true;\n\n this.start = () => {\n this.finished = false;\n let wasMounted = this.mounted;\n this.controller.start(props => this.finish(_extends({}, props, {\n wasMounted\n })), this.update);\n };\n\n this.stop = () => this.controller.stop(true);\n\n this.update = () => this.mounted && this.setState({\n internal: true\n });\n\n this.finish = (_ref) => {\n let finished = _ref.finished,\n noChange = _ref.noChange,\n wasMounted = _ref.wasMounted;\n this.finished = true;\n\n if (this.mounted && finished) {\n // Only call onRest if either we *were* mounted, or when there were changes\n if (this.props.onRest && (wasMounted || !noChange)) this.props.onRest(this.controller.merged); // Restore end-state\n\n if (this.mounted && this.didInject) {\n this.afterInject = convertValues(this.props);\n this.setState({\n internal: true\n });\n } // If we have an inject or values to apply after the animation we ping here\n\n\n if (this.mounted && (this.didInject || this.props.after)) this.setState({\n internal: true\n });\n this.didInject = false;\n }\n };\n }\n\n componentDidMount() {\n // componentDidUpdate isn't called on mount, we call it here to start animating\n this.componentDidUpdate();\n this.mounted = true;\n }\n\n componentWillUnmount() {\n // Stop all ongoing animtions\n this.mounted = false;\n this.stop();\n }\n\n static getDerivedStateFromProps(props, _ref2) {\n let internal = _ref2.internal,\n lastProps = _ref2.lastProps;\n // The following is a test against props that could alter the animation\n const from = props.from,\n to = props.to,\n reset = props.reset,\n force = props.force;\n const propsChanged = !shallowEqual(to, lastProps.to) || !shallowEqual(from, lastProps.from) || reset && !internal || force && !internal;\n return {\n propsChanged,\n lastProps: props,\n internal: false\n };\n }\n\n render() {\n const children = this.props.children;\n const propsChanged = this.state.propsChanged; // Inject phase -----------------------------------------------------------\n // Handle injected frames, for instance targets/web/fix-auto\n // An inject will return an intermediary React node which measures itself out\n // .. and returns a callback when the values sought after are ready, usually \"auto\".\n\n if (this.props.inject && propsChanged && !this.injectProps) {\n const frame = this.props.inject(this.props, injectProps => {\n // The inject frame has rendered, now let's update animations...\n this.injectProps = injectProps;\n this.setState({\n internal: true\n });\n }); // Render out injected frame\n\n if (frame) return frame;\n } // Update phase -----------------------------------------------------------\n\n\n if (this.injectProps || propsChanged) {\n // We can potentially cause setState, but we're inside render, the flag prevents that\n this.didInject = false; // Update animations, this turns from/to props into AnimatedValues\n // An update can occur on injected props, or when own-props have changed.\n\n if (this.injectProps) {\n this.controller.update(this.injectProps); // didInject is needed, because there will be a 3rd stage, where the original values\n // .. will be restored after the animation is finished. When someone animates towards\n // .. \"auto\", the end-result should be \"auto\", not \"1999px\", which would block nested\n // .. height/width changes.\n\n this.didInject = true;\n } else if (propsChanged) this.controller.update(this.props); // Flag an update that occured, componentDidUpdate will start the animation later on\n\n\n this.didUpdate = true;\n this.afterInject = undefined;\n this.injectProps = undefined;\n } // Render phase -----------------------------------------------------------\n // Render out raw values or AnimatedValues depending on \"native\"\n\n\n let values = _extends({}, this.controller.getValues(), this.afterInject);\n\n if (this.finished) values = _extends({}, values, this.props.after);\n return Object.keys(values).length ? children(values) : null;\n }\n\n componentDidUpdate() {\n // The animation has to start *after* render, since at that point the scene\n // .. graph should be established, so we do it here. Unfortunatelly, non-native\n // .. animations as well as \"auto\"-injects call forceUpdate, so it's causing a loop.\n // .. didUpdate prevents that as it gets set only on prop changes.\n if (this.didUpdate) this.start();\n this.didUpdate = false;\n }\n\n}\nSpring.defaultProps = {\n from: {},\n to: {},\n config: config.default,\n native: false,\n immediate: false,\n reset: false,\n force: false,\n inject: bugfixes\n};\n\nclass Trail extends React__default.PureComponent {\n constructor() {\n super(...arguments);\n this.first = true;\n this.instances = new Set();\n\n this.hook = (instance, index, length, reverse) => {\n // Add instance to set\n this.instances.add(instance); // Return undefined on the first index and from then on the previous instance\n\n if (reverse ? index === length - 1 : index === 0) return undefined;else return Array.from(this.instances)[reverse ? index + 1 : index - 1];\n };\n }\n\n render() {\n const _this$props = this.props,\n items = _this$props.items,\n _children = _this$props.children,\n _this$props$from = _this$props.from,\n from = _this$props$from === void 0 ? {} : _this$props$from,\n initial = _this$props.initial,\n reverse = _this$props.reverse,\n keys = _this$props.keys,\n delay = _this$props.delay,\n onRest = _this$props.onRest,\n props = _objectWithoutPropertiesLoose(_this$props, [\"items\", \"children\", \"from\", \"initial\", \"reverse\", \"keys\", \"delay\", \"onRest\"]);\n\n const array = toArray(items);\n return toArray(array).map((item, i) => React__default.createElement(Spring, _extends({\n onRest: i === 0 ? onRest : null,\n key: typeof keys === 'function' ? keys(item) : toArray(keys)[i],\n from: this.first && initial !== void 0 ? initial || {} : from\n }, props, {\n delay: i === 0 && delay || undefined,\n attach: instance => this.hook(instance, i, array.length, reverse),\n children: props => {\n const child = _children(item, i);\n\n return child ? child(props) : null;\n }\n })));\n }\n\n componentDidUpdate(prevProps) {\n this.first = false;\n if (prevProps.items !== this.props.items) this.instances.clear();\n }\n\n}\nTrail.defaultProps = {\n keys: item => item\n};\n\nconst DEFAULT = '__default';\n\nclass KeyframesImpl extends React__default.PureComponent {\n constructor() {\n var _this;\n\n super(...arguments);\n _this = this;\n this.guid = 0;\n this.state = {\n props: {},\n resolve: () => null,\n last: true,\n index: 0\n };\n\n this.next = function (props, last, index) {\n if (last === void 0) {\n last = true;\n }\n\n if (index === void 0) {\n index = 0;\n }\n\n _this.running = true;\n return new Promise(resolve => {\n _this.mounted && _this.setState(state => ({\n props,\n resolve,\n last,\n index\n }), () => _this.running = false);\n });\n };\n }\n\n componentDidMount() {\n this.mounted = true;\n this.componentDidUpdate({});\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n componentDidUpdate(previous) {\n var _this2 = this;\n\n const _this$props = this.props,\n states = _this$props.states,\n f = _this$props.filter,\n state = _this$props.state;\n\n if (previous.state !== this.props.state || this.props.reset && !this.running || !shallowEqual(states[state], previous.states[previous.state])) {\n if (states && state && states[state]) {\n const localId = ++this.guid;\n const slots = states[state];\n\n if (slots) {\n if (Array.isArray(slots)) {\n let q = Promise.resolve();\n\n for (let i = 0; i < slots.length; i++) {\n let index = i;\n let slot = slots[index];\n let last = index === slots.length - 1;\n q = q.then(() => localId === this.guid && this.next(f(slot), last, index));\n }\n } else if (typeof slots === 'function') {\n let index = 0;\n slots( // next\n function (props, last) {\n if (last === void 0) {\n last = false;\n }\n\n return localId === _this2.guid && _this2.next(f(props), last, index++);\n }, // cancel\n () => requestFrame(() => this.instance && this.instance.stop()), // ownprops\n this.props);\n } else {\n this.next(f(states[state]));\n }\n }\n }\n }\n }\n\n render() {\n const _this$state = this.state,\n props = _this$state.props,\n resolve = _this$state.resolve,\n last = _this$state.last,\n index = _this$state.index;\n if (!props || Object.keys(props).length === 0) return null;\n\n let _this$props2 = this.props,\n state = _this$props2.state,\n filter = _this$props2.filter,\n states = _this$props2.states,\n config = _this$props2.config,\n Component = _this$props2.primitive,\n _onRest = _this$props2.onRest,\n forwardRef = _this$props2.forwardRef,\n rest = _objectWithoutPropertiesLoose(_this$props2, [\"state\", \"filter\", \"states\", \"config\", \"primitive\", \"onRest\", \"forwardRef\"]); // Arrayed configs need an index to process\n\n\n if (Array.isArray(config)) config = config[index];\n return React__default.createElement(Component, _extends({\n ref: _ref => this.instance = handleRef(_ref, forwardRef),\n config: config\n }, rest, props, {\n onRest: args => {\n resolve(args);\n if (_onRest && last) _onRest(args);\n }\n }));\n }\n\n}\n\nKeyframesImpl.defaultProps = {\n state: DEFAULT\n};\nconst Keyframes = React__default.forwardRef((props, ref) => React__default.createElement(KeyframesImpl, _extends({}, props, {\n forwardRef: ref\n})));\n\nKeyframes.create = primitive => function (states, filter) {\n if (filter === void 0) {\n filter = states => states;\n }\n\n if (typeof states === 'function' || Array.isArray(states)) states = {\n [DEFAULT]: states\n };\n return props => React__default.createElement(KeyframesImpl, _extends({\n primitive: primitive,\n states: states,\n filter: filter\n }, props));\n};\n\nKeyframes.Spring = states => Keyframes.create(Spring)(states, interpolateTo);\n\nKeyframes.Trail = states => Keyframes.create(Trail)(states, interpolateTo);\n\nlet guid = 0;\n\nlet get = props => {\n let items = props.items,\n keys = props.keys,\n rest = _objectWithoutPropertiesLoose(props, [\"items\", \"keys\"]);\n\n items = toArray(items !== void 0 ? items : null);\n keys = typeof keys === 'function' ? items.map(keys) : toArray(keys); // Make sure numeric keys are interpreted as Strings (5 !== \"5\")\n\n return _extends({\n items,\n keys: keys.map(key => String(key))\n }, rest);\n};\n\nclass Transition extends React__default.PureComponent {\n componentDidMount() {\n this.mounted = true;\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n constructor(prevProps) {\n super(prevProps);\n\n this.destroyItem = (item, key, state) => values => {\n const _this$props = this.props,\n onRest = _this$props.onRest,\n onDestroyed = _this$props.onDestroyed;\n\n if (this.mounted) {\n onDestroyed && onDestroyed(item);\n this.setState((_ref) => {\n let deleted = _ref.deleted;\n return {\n deleted: deleted.filter(t => t.key !== key)\n };\n });\n onRest && onRest(item, state, values);\n }\n };\n\n this.state = {\n first: true,\n transitions: [],\n current: {},\n deleted: [],\n prevProps\n };\n }\n\n static getDerivedStateFromProps(props, _ref2) {\n let first = _ref2.first,\n prevProps = _ref2.prevProps,\n state = _objectWithoutPropertiesLoose(_ref2, [\"first\", \"prevProps\"]);\n\n let _get = get(props),\n items = _get.items,\n keys = _get.keys,\n initial = _get.initial,\n from = _get.from,\n enter = _get.enter,\n leave = _get.leave,\n update = _get.update,\n _get$trail = _get.trail,\n trail = _get$trail === void 0 ? 0 : _get$trail,\n unique = _get.unique,\n config = _get.config;\n\n let _get2 = get(prevProps),\n _keys = _get2.keys,\n _items = _get2.items;\n\n let current = _extends({}, state.current);\n\n let deleted = [...state.deleted]; // Compare next keys with current keys\n\n let currentKeys = Object.keys(current);\n let currentSet = new Set(currentKeys);\n let nextSet = new Set(keys);\n let added = keys.filter(item => !currentSet.has(item));\n let removed = state.transitions.filter(item => !item.destroyed && !nextSet.has(item.originalKey)).map(i => i.originalKey);\n let updated = keys.filter(item => currentSet.has(item));\n let delay = 0;\n added.forEach(key => {\n // In unique mode, remove fading out transitions if their key comes in again\n if (unique && deleted.find(d => d.originalKey === key)) deleted = deleted.filter(t => t.originalKey !== key);\n const keyIndex = keys.indexOf(key);\n const item = items[keyIndex];\n const state = 'enter';\n current[key] = {\n state,\n originalKey: key,\n key: unique ? String(key) : guid++,\n item,\n trail: delay = delay + trail,\n config: callProp(config, item, state),\n from: callProp(first ? initial !== void 0 ? initial || {} : from : from, item),\n to: callProp(enter, item)\n };\n });\n removed.forEach(key => {\n const keyIndex = _keys.indexOf(key);\n\n const item = _items[keyIndex];\n const state = 'leave';\n deleted.push(_extends({}, current[key], {\n state,\n destroyed: true,\n left: _keys[Math.max(0, keyIndex - 1)],\n right: _keys[Math.min(_keys.length, keyIndex + 1)],\n trail: delay = delay + trail,\n config: callProp(config, item, state),\n to: callProp(leave, item)\n }));\n delete current[key];\n });\n updated.forEach(key => {\n const keyIndex = keys.indexOf(key);\n const item = items[keyIndex];\n const state = 'update';\n current[key] = _extends({}, current[key], {\n item,\n state,\n trail: delay = delay + trail,\n config: callProp(config, item, state),\n to: callProp(update, item)\n });\n }); // This tries to restore order for deleted items by finding their last known siblings\n\n let out = keys.map(key => current[key]);\n deleted.forEach((_ref3) => {\n let left = _ref3.left,\n right = _ref3.right,\n transition = _objectWithoutPropertiesLoose(_ref3, [\"left\", \"right\"]);\n\n let pos; // Was it the element on the left, if yes, move there ...\n\n if ((pos = out.findIndex(t => t.originalKey === left)) !== -1) pos += 1; // Or how about the element on the right ...\n\n if (pos === -1) pos = out.findIndex(t => t.originalKey === right); // Maybe we'll find it in the list of deleted items\n\n if (pos === -1) pos = deleted.findIndex(t => t.originalKey === left); // Checking right side as well\n\n if (pos === -1) pos = deleted.findIndex(t => t.originalKey === right); // And if nothing else helps, move it to the start ¯\\_(ツ)_/¯\n\n pos = Math.max(0, pos);\n out = [...out.slice(0, pos), transition, ...out.slice(pos)];\n });\n return {\n first: first && added.length === 0,\n transitions: out,\n current,\n deleted,\n prevProps: props\n };\n }\n\n render() {\n const _this$props2 = this.props,\n initial = _this$props2.initial,\n _this$props2$from = _this$props2.from,\n _this$props2$enter = _this$props2.enter,\n _this$props2$leave = _this$props2.leave,\n _this$props2$update = _this$props2.update,\n onDestroyed = _this$props2.onDestroyed,\n keys = _this$props2.keys,\n items = _this$props2.items,\n onFrame = _this$props2.onFrame,\n onRest = _this$props2.onRest,\n onStart = _this$props2.onStart,\n trail = _this$props2.trail,\n config = _this$props2.config,\n _children = _this$props2.children,\n unique = _this$props2.unique,\n reset = _this$props2.reset,\n extra = _objectWithoutPropertiesLoose(_this$props2, [\"initial\", \"from\", \"enter\", \"leave\", \"update\", \"onDestroyed\", \"keys\", \"items\", \"onFrame\", \"onRest\", \"onStart\", \"trail\", \"config\", \"children\", \"unique\", \"reset\"]);\n\n return this.state.transitions.map((_ref4, i) => {\n let state = _ref4.state,\n key = _ref4.key,\n item = _ref4.item,\n from = _ref4.from,\n to = _ref4.to,\n trail = _ref4.trail,\n config = _ref4.config,\n destroyed = _ref4.destroyed;\n return React__default.createElement(Keyframes, _extends({\n reset: reset && state === 'enter',\n primitive: Spring,\n state: state,\n filter: interpolateTo,\n states: {\n [state]: to\n },\n key: key,\n onRest: destroyed ? this.destroyItem(item, key, state) : onRest && (values => onRest(item, state, values)),\n onStart: onStart && (() => onStart(item, state)),\n onFrame: onFrame && (values => onFrame(item, state, values)),\n delay: trail,\n config: config\n }, extra, {\n from: from,\n children: props => {\n const child = _children(item, state, i);\n\n return child ? child(props) : null;\n }\n }));\n });\n }\n\n}\nTransition.defaultProps = {\n keys: item => item,\n unique: false,\n reset: false\n};\n\nconst domElements = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr', // SVG\n'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];\nconst extendedAnimated = domElements.reduce((acc, element) => {\n acc[element] = createAnimatedComponent(element);\n return acc;\n}, createAnimatedComponent);\n\n__webpack_unused_export__ = Spring;\n__webpack_unused_export__ = Keyframes;\nexports.uT = Transition;\n__webpack_unused_export__ = Trail;\n__webpack_unused_export__ = Controller;\n__webpack_unused_export__ = config;\nexports.q = extendedAnimated;\n__webpack_unused_export__ = interpolate$1;\n__webpack_unused_export__ = Globals;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgyMy5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3ByaW5nL3JlbmRlcnByb3BzLmpzPzNmODciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UnKSk7XG52YXIgX2V4dGVuZHMgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcycpKTtcbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgUmVhY3RfX2RlZmF1bHQgPSBfaW50ZXJvcERlZmF1bHQoUmVhY3QpO1xudmFyIFJlYWN0RE9NID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ3JlYWN0LWRvbScpKTtcblxubGV0IGJ1Z2ZpeGVzID0gdW5kZWZpbmVkO1xubGV0IGFwcGx5QW5pbWF0ZWRWYWx1ZXMgPSB1bmRlZmluZWQ7XG5sZXQgY29sb3JOYW1lcyA9IFtdO1xubGV0IHJlcXVlc3RGcmFtZSA9IGNiID0+IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpO1xubGV0IGNhbmNlbEZyYW1lID0gY2IgPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGNiKTtcbmxldCBpbnRlcnBvbGF0aW9uID0gdW5kZWZpbmVkO1xubGV0IG5vdyA9ICgpID0+IERhdGUubm93KCk7XG5sZXQgZGVmYXVsdEVsZW1lbnQgPSB1bmRlZmluZWQ7XG5sZXQgY3JlYXRlQW5pbWF0ZWRTdHlsZSA9IHVuZGVmaW5lZDtcbmNvbnN0IGluamVjdEFwcGx5QW5pbWF0ZWRWYWx1ZXMgPSAoZm4sIHRyYW5zZm9ybSkgPT4gYXBwbHlBbmltYXRlZFZhbHVlcyA9IHtcbiAgZm4sXG4gIHRyYW5zZm9ybVxufTtcbmNvbnN0IGluamVjdENvbG9yTmFtZXMgPSBuYW1lcyA9PiBjb2xvck5hbWVzID0gbmFtZXM7XG5jb25zdCBpbmplY3RCdWdmaXhlcyA9IGZuID0+IGJ1Z2ZpeGVzID0gZm47XG5jb25zdCBpbmplY3RJbnRlcnBvbGF0aW9uID0gY2xzID0+IGludGVycG9sYXRpb24gPSBjbHM7XG5jb25zdCBpbmplY3RGcmFtZSA9IChyYWYsIGNhZikgPT4ge1xuICB2YXIgX3JlZiA9IFtyYWYsIGNhZl07XG4gIHJlcXVlc3RGcmFtZSA9IF9yZWZbMF07XG4gIGNhbmNlbEZyYW1lID0gX3JlZlsxXTtcbiAgcmV0dXJuIF9yZWY7XG59O1xuY29uc3QgaW5qZWN0Tm93ID0gbm93Rm4gPT4gbm93ID0gbm93Rm47XG5jb25zdCBpbmplY3REZWZhdWx0RWxlbWVudCA9IGVsID0+IGRlZmF1bHRFbGVtZW50ID0gZWw7XG5jb25zdCBpbmplY3RDcmVhdGVBbmltYXRlZFN0eWxlID0gZmFjdG9yeSA9PiBjcmVhdGVBbmltYXRlZFN0eWxlID0gZmFjdG9yeTtcblxudmFyIEdsb2JhbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIGdldCBidWdmaXhlcyAoKSB7IHJldHVybiBidWdmaXhlczsgfSxcbiAgZ2V0IGFwcGx5QW5pbWF0ZWRWYWx1ZXMgKCkgeyByZXR1cm4gYXBwbHlBbmltYXRlZFZhbHVlczsgfSxcbiAgZ2V0IGNvbG9yTmFtZXMgKCkgeyByZXR1cm4gY29sb3JOYW1lczsgfSxcbiAgZ2V0IHJlcXVlc3RGcmFtZSAoKSB7IHJldHVybiByZXF1ZXN0RnJhbWU7IH0sXG4gIGdldCBjYW5jZWxGcmFtZSAoKSB7IHJldHVybiBjYW5jZWxGcmFtZTsgfSxcbiAgZ2V0IGludGVycG9sYXRpb24gKCkgeyByZXR1cm4gaW50ZXJwb2xhdGlvbjsgfSxcbiAgZ2V0IG5vdyAoKSB7IHJldHVybiBub3c7IH0sXG4gIGdldCBkZWZhdWx0RWxlbWVudCAoKSB7IHJldHVybiBkZWZhdWx0RWxlbWVudDsgfSxcbiAgZ2V0IGNyZWF0ZUFuaW1hdGVkU3R5bGUgKCkgeyByZXR1cm4gY3JlYXRlQW5pbWF0ZWRTdHlsZTsgfSxcbiAgaW5qZWN0QXBwbHlBbmltYXRlZFZhbHVlczogaW5qZWN0QXBwbHlBbmltYXRlZFZhbHVlcyxcbiAgaW5qZWN0Q29sb3JOYW1lczogaW5qZWN0Q29sb3JOYW1lcyxcbiAgaW5qZWN0QnVnZml4ZXM6IGluamVjdEJ1Z2ZpeGVzLFxuICBpbmplY3RJbnRlcnBvbGF0aW9uOiBpbmplY3RJbnRlcnBvbGF0aW9uLFxuICBpbmplY3RGcmFtZTogaW5qZWN0RnJhbWUsXG4gIGluamVjdE5vdzogaW5qZWN0Tm93LFxuICBpbmplY3REZWZhdWx0RWxlbWVudDogaW5qZWN0RGVmYXVsdEVsZW1lbnQsXG4gIGluamVjdENyZWF0ZUFuaW1hdGVkU3R5bGU6IGluamVjdENyZWF0ZUFuaW1hdGVkU3R5bGVcbn0pO1xuXG5jbGFzcyBBbmltYXRlZCB7XG4gIGF0dGFjaCgpIHt9XG5cbiAgZGV0YWNoKCkge31cblxuICBnZXRWYWx1ZSgpIHt9XG5cbiAgZ2V0QW5pbWF0ZWRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgYWRkQ2hpbGQoY2hpbGQpIHt9XG5cbiAgcmVtb3ZlQ2hpbGQoY2hpbGQpIHt9XG5cbiAgZ2V0Q2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbn1cblxuY29uc3QgZ2V0VmFsdWVzID0gb2JqZWN0ID0+IE9iamVjdC5rZXlzKG9iamVjdCkubWFwKGsgPT4gb2JqZWN0W2tdKTtcblxuY2xhc3MgQW5pbWF0ZWRXaXRoQ2hpbGRyZW4gZXh0ZW5kcyBBbmltYXRlZCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcblxuICAgIHRoaXMuZ2V0Q2hpbGRyZW4gPSAoKSA9PiB0aGlzLmNoaWxkcmVuO1xuXG4gICAgdGhpcy5nZXRQYXlsb2FkID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkge1xuICAgICAgICBpbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluZGV4ICE9PSB2b2lkIDAgJiYgX3RoaXMucGF5bG9hZCA/IF90aGlzLnBheWxvYWRbaW5kZXhdIDogX3RoaXMucGF5bG9hZCB8fCBfdGhpcztcbiAgICB9O1xuICB9XG5cbiAgYWRkQ2hpbGQoY2hpbGQpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDApIHRoaXMuYXR0YWNoKCk7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgfVxuXG4gIHJlbW92ZUNoaWxkKGNoaWxkKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoY2hpbGQpO1xuICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDApIHRoaXMuZGV0YWNoKCk7XG4gIH1cblxufVxuY2xhc3MgQW5pbWF0ZWRBcnJheVdpdGhDaGlsZHJlbiBleHRlbmRzIEFuaW1hdGVkV2l0aENoaWxkcmVuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnBheWxvYWQgPSBbXTtcblxuICAgIHRoaXMuZ2V0QW5pbWF0ZWRWYWx1ZSA9ICgpID0+IHRoaXMuZ2V0VmFsdWUoKTtcblxuICAgIHRoaXMuYXR0YWNoID0gKCkgPT4gdGhpcy5wYXlsb2FkLmZvckVhY2gocCA9PiBwIGluc3RhbmNlb2YgQW5pbWF0ZWQgJiYgcC5hZGRDaGlsZCh0aGlzKSk7XG5cbiAgICB0aGlzLmRldGFjaCA9ICgpID0+IHRoaXMucGF5bG9hZC5mb3JFYWNoKHAgPT4gcCBpbnN0YW5jZW9mIEFuaW1hdGVkICYmIHAucmVtb3ZlQ2hpbGQodGhpcykpO1xuICB9XG5cbn1cbmNsYXNzIEFuaW1hdGVkT2JqZWN0V2l0aENoaWxkcmVuIGV4dGVuZHMgQW5pbWF0ZWRXaXRoQ2hpbGRyZW4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMucGF5bG9hZCA9IHt9O1xuXG4gICAgdGhpcy5nZXRBbmltYXRlZFZhbHVlID0gKCkgPT4gdGhpcy5nZXRWYWx1ZSh0cnVlKTtcblxuICAgIHRoaXMuYXR0YWNoID0gKCkgPT4gZ2V0VmFsdWVzKHRoaXMucGF5bG9hZCkuZm9yRWFjaChzID0+IHMgaW5zdGFuY2VvZiBBbmltYXRlZCAmJiBzLmFkZENoaWxkKHRoaXMpKTtcblxuICAgIHRoaXMuZGV0YWNoID0gKCkgPT4gZ2V0VmFsdWVzKHRoaXMucGF5bG9hZCkuZm9yRWFjaChzID0+IHMgaW5zdGFuY2VvZiBBbmltYXRlZCAmJiBzLnJlbW92ZUNoaWxkKHRoaXMpKTtcbiAgfVxuXG4gIGdldFZhbHVlKGFuaW1hdGVkKSB7XG4gICAgaWYgKGFuaW1hdGVkID09PSB2b2lkIDApIHtcbiAgICAgIGFuaW1hdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wYXlsb2FkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucGF5bG9hZFtrZXldO1xuICAgICAgaWYgKGFuaW1hdGVkICYmICEodmFsdWUgaW5zdGFuY2VvZiBBbmltYXRlZCkpIGNvbnRpbnVlO1xuICAgICAgcGF5bG9hZFtrZXldID0gdmFsdWUgaW5zdGFuY2VvZiBBbmltYXRlZCA/IHZhbHVlW2FuaW1hdGVkID8gJ2dldEFuaW1hdGVkVmFsdWUnIDogJ2dldFZhbHVlJ10oKSA6IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbn1cblxuY2xhc3MgQW5pbWF0ZWRTdHlsZSBleHRlbmRzIEFuaW1hdGVkT2JqZWN0V2l0aENoaWxkcmVuIHtcbiAgY29uc3RydWN0b3Ioc3R5bGUpIHtcbiAgICBzdXBlcigpO1xuICAgIHN0eWxlID0gc3R5bGUgfHwge307XG4gICAgaWYgKHN0eWxlLnRyYW5zZm9ybSAmJiAhKHN0eWxlLnRyYW5zZm9ybSBpbnN0YW5jZW9mIEFuaW1hdGVkKSkgc3R5bGUgPSBhcHBseUFuaW1hdGVkVmFsdWVzLnRyYW5zZm9ybShzdHlsZSk7XG4gICAgdGhpcy5wYXlsb2FkID0gc3R5bGU7XG4gIH1cblxufVxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3JcbmNvbnN0IGNvbG9ycyA9IHtcbiAgdHJhbnNwYXJlbnQ6IDB4MDAwMDAwMDAsXG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmZmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkN2ZmLFxuICBhcXVhOiAweDAwZmZmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNGZmLFxuICBhenVyZTogMHhmMGZmZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjZmYsXG4gIGJpc3F1ZTogMHhmZmU0YzRmZixcbiAgYmxhY2s6IDB4MDAwMDAwZmYsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZGZmLFxuICBibHVlOiAweDAwMDBmZmZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMmZmLFxuICBicm93bjogMHhhNTJhMmFmZixcbiAgYnVybHl3b29kOiAweGRlYjg4N2ZmLFxuICBidXJudHNpZW5uYTogMHhlYTdlNWRmZixcbiAgY2FkZXRibHVlOiAweDVmOWVhMGZmLFxuICBjaGFydHJldXNlOiAweDdmZmYwMGZmLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlZmYsXG4gIGNvcmFsOiAweGZmN2Y1MGZmLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWRmZixcbiAgY29ybnNpbGs6IDB4ZmZmOGRjZmYsXG4gIGNyaW1zb246IDB4ZGMxNDNjZmYsXG4gIGN5YW46IDB4MDBmZmZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YmZmLFxuICBkYXJrY3lhbjogMHgwMDhiOGJmZixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGJmZixcbiAgZGFya2dyYXk6IDB4YTlhOWE5ZmYsXG4gIGRhcmtncmVlbjogMHgwMDY0MDBmZixcbiAgZGFya2dyZXk6IDB4YTlhOWE5ZmYsXG4gIGRhcmtraGFraTogMHhiZGI3NmJmZixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiZmYsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZmZmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMGZmLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjY2ZmLFxuICBkYXJrcmVkOiAweDhiMDAwMGZmLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YWZmLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmZmYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiZmYsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmZmYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmZmYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxZmYsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzZmYsXG4gIGRlZXBwaW5rOiAweGZmMTQ5M2ZmLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjlmZixcbiAgZGltZ3JleTogMHg2OTY5NjlmZixcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmZmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMmZmLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjBmZixcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyZmYsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGNmZixcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmZmZixcbiAgZ29sZDogMHhmZmQ3MDBmZixcbiAgZ29sZGVucm9kOiAweGRhYTUyMGZmLFxuICBncmF5OiAweDgwODA4MGZmLFxuICBncmVlbjogMHgwMDgwMDBmZixcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmZmYsXG4gIGdyZXk6IDB4ODA4MDgwZmYsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMGZmLFxuICBob3RwaW5rOiAweGZmNjliNGZmLFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjZmYsXG4gIGluZGlnbzogMHg0YjAwODJmZixcbiAgaXZvcnk6IDB4ZmZmZmYwZmYsXG4gIGtoYWtpOiAweGYwZTY4Y2ZmLFxuICBsYXZlbmRlcjogMHhlNmU2ZmFmZixcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjVmZixcbiAgbGF3bmdyZWVuOiAweDdjZmMwMGZmLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkZmYsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTZmZixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODBmZixcbiAgbGlnaHRjeWFuOiAweGUwZmZmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDJmZixcbiAgbGlnaHRncmF5OiAweGQzZDNkM2ZmLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MGZmLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzZmYsXG4gIGxpZ2h0cGluazogMHhmZmI2YzFmZixcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhZmYsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhZmYsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmFmZixcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5ZmYsXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OWZmLFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGVmZixcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwZmYsXG4gIGxpbWU6IDB4MDBmZjAwZmYsXG4gIGxpbWVncmVlbjogMHgzMmNkMzJmZixcbiAgbGluZW46IDB4ZmFmMGU2ZmYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmZmYsXG4gIG1hcm9vbjogMHg4MDAwMDBmZixcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWFmZixcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2RmZixcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkM2ZmLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiZmYsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MWZmLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlZmYsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YWZmLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjZmYsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODVmZixcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MGZmLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhZmYsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTFmZixcbiAgbW9jY2FzaW46IDB4ZmZlNGI1ZmYsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZGZmLFxuICBuYXZ5OiAweDAwMDA4MGZmLFxuICBvbGRsYWNlOiAweGZkZjVlNmZmLFxuICBvbGl2ZTogMHg4MDgwMDBmZixcbiAgb2xpdmVkcmFiOiAweDZiOGUyM2ZmLFxuICBvcmFuZ2U6IDB4ZmZhNTAwZmYsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDBmZixcbiAgb3JjaGlkOiAweGRhNzBkNmZmLFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYWZmLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4ZmYsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlZmYsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzZmYsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1ZmYsXG4gIHBlYWNocHVmZjogMHhmZmRhYjlmZixcbiAgcGVydTogMHhjZDg1M2ZmZixcbiAgcGluazogMHhmZmMwY2JmZixcbiAgcGx1bTogMHhkZGEwZGRmZixcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTZmZixcbiAgcHVycGxlOiAweDgwMDA4MGZmLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OWZmLFxuICByZWQ6IDB4ZmYwMDAwZmYsXG4gIHJvc3licm93bjogMHhiYzhmOGZmZixcbiAgcm95YWxibHVlOiAweDQxNjllMWZmLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTNmZixcbiAgc2FsbW9uOiAweGZhODA3MmZmLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MGZmLFxuICBzZWFncmVlbjogMHgyZThiNTdmZixcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlZmYsXG4gIHNpZW5uYTogMHhhMDUyMmRmZixcbiAgc2lsdmVyOiAweGMwYzBjMGZmLFxuICBza3libHVlOiAweDg3Y2VlYmZmLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkZmYsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTBmZixcbiAgc2xhdGVncmV5OiAweDcwODA5MGZmLFxuICBzbm93OiAweGZmZmFmYWZmLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2ZmZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNGZmLFxuICB0YW46IDB4ZDJiNDhjZmYsXG4gIHRlYWw6IDB4MDA4MDgwZmYsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4ZmYsXG4gIHRvbWF0bzogMHhmZjYzNDdmZixcbiAgdHVycXVvaXNlOiAweDQwZTBkMGZmLFxuICB2aW9sZXQ6IDB4ZWU4MmVlZmYsXG4gIHdoZWF0OiAweGY1ZGViM2ZmLFxuICB3aGl0ZTogMHhmZmZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjVmZixcbiAgeWVsbG93OiAweGZmZmYwMGZmLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJmZlxufTtcblxuY2xhc3MgSW50ZXJwb2xhdGlvbiB7XG4gIC8vIERlZmF1bHQgY29uZmlnID0gY29uZmlnLCBhcmdzXG4gIC8vIFNob3J0IGNvbmZpZyAgID0gcmFuZ2UsIG91dHB1dCwgZXh0cmFwb2xhdGVcbiAgc3RhdGljIGNyZWF0ZShjb25maWcsIG91dHB1dCwgZXh0cmEpIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGNvbmZpZztlbHNlIGlmIChpbnRlcnBvbGF0aW9uICYmIGNvbmZpZy5vdXRwdXQgJiYgdHlwZW9mIGNvbmZpZy5vdXRwdXRbMF0gPT09ICdzdHJpbmcnKSByZXR1cm4gaW50ZXJwb2xhdGlvbihjb25maWcpO2Vsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnKSkgcmV0dXJuIEludGVycG9sYXRpb24uY3JlYXRlKHtcbiAgICAgIHJhbmdlOiBjb25maWcsXG4gICAgICBvdXRwdXQsXG4gICAgICBleHRyYXBvbGF0ZTogZXh0cmEgfHwgJ2V4dGVuZCdcbiAgICB9KTtcbiAgICBsZXQgb3V0cHV0UmFuZ2UgPSBjb25maWcub3V0cHV0O1xuICAgIGxldCBpbnB1dFJhbmdlID0gY29uZmlnLnJhbmdlIHx8IFswLCAxXTtcblxuICAgIGxldCBlYXNpbmcgPSBjb25maWcuZWFzaW5nIHx8ICh0ID0+IHQpO1xuXG4gICAgbGV0IGV4dHJhcG9sYXRlTGVmdCA9ICdleHRlbmQnO1xuICAgIGxldCBtYXAgPSBjb25maWcubWFwO1xuICAgIGlmIChjb25maWcuZXh0cmFwb2xhdGVMZWZ0ICE9PSB1bmRlZmluZWQpIGV4dHJhcG9sYXRlTGVmdCA9IGNvbmZpZy5leHRyYXBvbGF0ZUxlZnQ7ZWxzZSBpZiAoY29uZmlnLmV4dHJhcG9sYXRlICE9PSB1bmRlZmluZWQpIGV4dHJhcG9sYXRlTGVmdCA9IGNvbmZpZy5leHRyYXBvbGF0ZTtcbiAgICBsZXQgZXh0cmFwb2xhdGVSaWdodCA9ICdleHRlbmQnO1xuICAgIGlmIChjb25maWcuZXh0cmFwb2xhdGVSaWdodCAhPT0gdW5kZWZpbmVkKSBleHRyYXBvbGF0ZVJpZ2h0ID0gY29uZmlnLmV4dHJhcG9sYXRlUmlnaHQ7ZWxzZSBpZiAoY29uZmlnLmV4dHJhcG9sYXRlICE9PSB1bmRlZmluZWQpIGV4dHJhcG9sYXRlUmlnaHQgPSBjb25maWcuZXh0cmFwb2xhdGU7XG4gICAgcmV0dXJuIGlucHV0ID0+IHtcbiAgICAgIGxldCByYW5nZSA9IGZpbmRSYW5nZShpbnB1dCwgaW5wdXRSYW5nZSk7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoaW5wdXQsIGlucHV0UmFuZ2VbcmFuZ2VdLCBpbnB1dFJhbmdlW3JhbmdlICsgMV0sIG91dHB1dFJhbmdlW3JhbmdlXSwgb3V0cHV0UmFuZ2VbcmFuZ2UgKyAxXSwgZWFzaW5nLCBleHRyYXBvbGF0ZUxlZnQsIGV4dHJhcG9sYXRlUmlnaHQsIG1hcCk7XG4gICAgfTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlKGlucHV0LCBpbnB1dE1pbiwgaW5wdXRNYXgsIG91dHB1dE1pbiwgb3V0cHV0TWF4LCBlYXNpbmcsIGV4dHJhcG9sYXRlTGVmdCwgZXh0cmFwb2xhdGVSaWdodCwgbWFwKSB7XG4gIGxldCByZXN1bHQgPSBtYXAgPyBtYXAoaW5wdXQpIDogaW5wdXQ7IC8vIEV4dHJhcG9sYXRlXG5cbiAgaWYgKHJlc3VsdCA8IGlucHV0TWluKSB7XG4gICAgaWYgKGV4dHJhcG9sYXRlTGVmdCA9PT0gJ2lkZW50aXR5JykgcmV0dXJuIHJlc3VsdDtlbHNlIGlmIChleHRyYXBvbGF0ZUxlZnQgPT09ICdjbGFtcCcpIHJlc3VsdCA9IGlucHV0TWluO1xuICB9XG5cbiAgaWYgKHJlc3VsdCA+IGlucHV0TWF4KSB7XG4gICAgaWYgKGV4dHJhcG9sYXRlUmlnaHQgPT09ICdpZGVudGl0eScpIHJldHVybiByZXN1bHQ7ZWxzZSBpZiAoZXh0cmFwb2xhdGVSaWdodCA9PT0gJ2NsYW1wJykgcmVzdWx0ID0gaW5wdXRNYXg7XG4gIH1cblxuICBpZiAob3V0cHV0TWluID09PSBvdXRwdXRNYXgpIHJldHVybiBvdXRwdXRNaW47XG4gIGlmIChpbnB1dE1pbiA9PT0gaW5wdXRNYXgpIHJldHVybiBpbnB1dCA8PSBpbnB1dE1pbiA/IG91dHB1dE1pbiA6IG91dHB1dE1heDsgLy8gSW5wdXQgUmFuZ2VcblxuICBpZiAoaW5wdXRNaW4gPT09IC1JbmZpbml0eSkgcmVzdWx0ID0gLXJlc3VsdDtlbHNlIGlmIChpbnB1dE1heCA9PT0gSW5maW5pdHkpIHJlc3VsdCA9IHJlc3VsdCAtIGlucHV0TWluO2Vsc2UgcmVzdWx0ID0gKHJlc3VsdCAtIGlucHV0TWluKSAvIChpbnB1dE1heCAtIGlucHV0TWluKTsgLy8gRWFzaW5nXG5cbiAgcmVzdWx0ID0gZWFzaW5nKHJlc3VsdCk7IC8vIE91dHB1dCBSYW5nZVxuXG4gIGlmIChvdXRwdXRNaW4gPT09IC1JbmZpbml0eSkgcmVzdWx0ID0gLXJlc3VsdDtlbHNlIGlmIChvdXRwdXRNYXggPT09IEluZmluaXR5KSByZXN1bHQgPSByZXN1bHQgKyBvdXRwdXRNaW47ZWxzZSByZXN1bHQgPSByZXN1bHQgKiAob3V0cHV0TWF4IC0gb3V0cHV0TWluKSArIG91dHB1dE1pbjtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZmluZFJhbmdlKGlucHV0LCBpbnB1dFJhbmdlKSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgaW5wdXRSYW5nZS5sZW5ndGggLSAxOyArK2kpIGlmIChpbnB1dFJhbmdlW2ldID49IGlucHV0KSBicmVhaztcblxuICByZXR1cm4gaSAtIDE7XG59XG5cbi8vIGNvbnN0IElOVEVHRVIgPSAnWy0rXT9cXFxcZCsnO1xuY29uc3QgTlVNQkVSID0gJ1stK10/XFxcXGQqXFxcXC4/XFxcXGQrJztcbmNvbnN0IFBFUkNFTlRBR0UgPSBOVU1CRVIgKyAnJSc7XG5cbmZ1bmN0aW9uIGNhbGwoKSB7XG4gIHJldHVybiAnXFxcXChcXFxccyooJyArIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbignKVxcXFxzKixcXFxccyooJykgKyAnKVxcXFxzKlxcXFwpJztcbn1cblxuY29uc3QgcmdiID0gbmV3IFJlZ0V4cCgncmdiJyArIGNhbGwoTlVNQkVSLCBOVU1CRVIsIE5VTUJFUikpO1xuY29uc3QgcmdiYSA9IG5ldyBSZWdFeHAoJ3JnYmEnICsgY2FsbChOVU1CRVIsIE5VTUJFUiwgTlVNQkVSLCBOVU1CRVIpKTtcbmNvbnN0IGhzbCA9IG5ldyBSZWdFeHAoJ2hzbCcgKyBjYWxsKE5VTUJFUiwgUEVSQ0VOVEFHRSwgUEVSQ0VOVEFHRSkpO1xuY29uc3QgaHNsYSA9IG5ldyBSZWdFeHAoJ2hzbGEnICsgY2FsbChOVU1CRVIsIFBFUkNFTlRBR0UsIFBFUkNFTlRBR0UsIE5VTUJFUikpO1xuY29uc3QgaGV4MyA9IC9eIyhbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KSQvO1xuY29uc3QgaGV4NCA9IC9eIyhbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkkLztcbmNvbnN0IGhleDYgPSAvXiMoWzAtOWEtZkEtRl17Nn0pJC87XG5jb25zdCBoZXg4ID0gL14jKFswLTlhLWZBLUZdezh9KSQvO1xuXG4vKlxuaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbW11bml0eS9ub3JtYWxpemUtY3NzLWNvbG9yXG5cbkJTRCAzLUNsYXVzZSBMaWNlbnNlXG5cbkNvcHlyaWdodCAoYykgMjAxNiwgUmVhY3QgQ29tbXVuaXR5XG5BbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cblxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG5GT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcblNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG5DQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbk9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuZnVuY3Rpb24gbm9ybWFsaXplQ29sb3IoY29sb3IpIHtcbiAgbGV0IG1hdGNoO1xuXG4gIGlmICh0eXBlb2YgY29sb3IgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGNvbG9yID4+PiAwID09PSBjb2xvciAmJiBjb2xvciA+PSAwICYmIGNvbG9yIDw9IDB4ZmZmZmZmZmYgPyBjb2xvciA6IG51bGw7XG4gIH0gLy8gT3JkZXJlZCBiYXNlZCBvbiBvY2N1cnJlbmNlcyBvbiBGYWNlYm9vayBjb2RlYmFzZVxuXG5cbiAgaWYgKG1hdGNoID0gaGV4Ni5leGVjKGNvbG9yKSkgcmV0dXJuIHBhcnNlSW50KG1hdGNoWzFdICsgJ2ZmJywgMTYpID4+PiAwO1xuICBpZiAoY29sb3JzLmhhc093blByb3BlcnR5KGNvbG9yKSkgcmV0dXJuIGNvbG9yc1tjb2xvcl07XG5cbiAgaWYgKG1hdGNoID0gcmdiLmV4ZWMoY29sb3IpKSB7XG4gICAgcmV0dXJuIChwYXJzZTI1NShtYXRjaFsxXSkgPDwgMjQgfCAvLyByXG4gICAgcGFyc2UyNTUobWF0Y2hbMl0pIDw8IDE2IHwgLy8gZ1xuICAgIHBhcnNlMjU1KG1hdGNoWzNdKSA8PCA4IHwgLy8gYlxuICAgIDB4MDAwMDAwZmYpID4+PiAvLyBhXG4gICAgMDtcbiAgfVxuXG4gIGlmIChtYXRjaCA9IHJnYmEuZXhlYyhjb2xvcikpIHtcbiAgICByZXR1cm4gKHBhcnNlMjU1KG1hdGNoWzFdKSA8PCAyNCB8IC8vIHJcbiAgICBwYXJzZTI1NShtYXRjaFsyXSkgPDwgMTYgfCAvLyBnXG4gICAgcGFyc2UyNTUobWF0Y2hbM10pIDw8IDggfCAvLyBiXG4gICAgcGFyc2UxKG1hdGNoWzRdKSkgPj4+IC8vIGFcbiAgICAwO1xuICB9XG5cbiAgaWYgKG1hdGNoID0gaGV4My5leGVjKGNvbG9yKSkge1xuICAgIHJldHVybiBwYXJzZUludChtYXRjaFsxXSArIG1hdGNoWzFdICsgLy8gclxuICAgIG1hdGNoWzJdICsgbWF0Y2hbMl0gKyAvLyBnXG4gICAgbWF0Y2hbM10gKyBtYXRjaFszXSArIC8vIGJcbiAgICAnZmYnLCAvLyBhXG4gICAgMTYpID4+PiAwO1xuICB9IC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtY29sb3ItNC8jaGV4LW5vdGF0aW9uXG5cblxuICBpZiAobWF0Y2ggPSBoZXg4LmV4ZWMoY29sb3IpKSByZXR1cm4gcGFyc2VJbnQobWF0Y2hbMV0sIDE2KSA+Pj4gMDtcblxuICBpZiAobWF0Y2ggPSBoZXg0LmV4ZWMoY29sb3IpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoWzFdICsgbWF0Y2hbMV0gKyAvLyByXG4gICAgbWF0Y2hbMl0gKyBtYXRjaFsyXSArIC8vIGdcbiAgICBtYXRjaFszXSArIG1hdGNoWzNdICsgLy8gYlxuICAgIG1hdGNoWzRdICsgbWF0Y2hbNF0sIC8vIGFcbiAgICAxNikgPj4+IDA7XG4gIH1cblxuICBpZiAobWF0Y2ggPSBoc2wuZXhlYyhjb2xvcikpIHtcbiAgICByZXR1cm4gKGhzbFRvUmdiKHBhcnNlMzYwKG1hdGNoWzFdKSwgLy8gaFxuICAgIHBhcnNlUGVyY2VudGFnZShtYXRjaFsyXSksIC8vIHNcbiAgICBwYXJzZVBlcmNlbnRhZ2UobWF0Y2hbM10pIC8vIGxcbiAgICApIHwgMHgwMDAwMDBmZikgPj4+IC8vIGFcbiAgICAwO1xuICB9XG5cbiAgaWYgKG1hdGNoID0gaHNsYS5leGVjKGNvbG9yKSkge1xuICAgIHJldHVybiAoaHNsVG9SZ2IocGFyc2UzNjAobWF0Y2hbMV0pLCAvLyBoXG4gICAgcGFyc2VQZXJjZW50YWdlKG1hdGNoWzJdKSwgLy8gc1xuICAgIHBhcnNlUGVyY2VudGFnZShtYXRjaFszXSkgLy8gbFxuICAgICkgfCBwYXJzZTEobWF0Y2hbNF0pKSA+Pj4gLy8gYVxuICAgIDA7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaHVlMnJnYihwLCBxLCB0KSB7XG4gIGlmICh0IDwgMCkgdCArPSAxO1xuICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgaWYgKHQgPCAxIC8gNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7XG4gIGlmICh0IDwgMSAvIDIpIHJldHVybiBxO1xuICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiBoc2xUb1JnYihoLCBzLCBsKSB7XG4gIGNvbnN0IHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICBjb25zdCBwID0gMiAqIGwgLSBxO1xuICBjb25zdCByID0gaHVlMnJnYihwLCBxLCBoICsgMSAvIDMpO1xuICBjb25zdCBnID0gaHVlMnJnYihwLCBxLCBoKTtcbiAgY29uc3QgYiA9IGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKTtcbiAgcmV0dXJuIE1hdGgucm91bmQociAqIDI1NSkgPDwgMjQgfCBNYXRoLnJvdW5kKGcgKiAyNTUpIDw8IDE2IHwgTWF0aC5yb3VuZChiICogMjU1KSA8PCA4O1xufVxuXG5mdW5jdGlvbiBwYXJzZTI1NShzdHIpIHtcbiAgY29uc3QgaW50ID0gcGFyc2VJbnQoc3RyLCAxMCk7XG4gIGlmIChpbnQgPCAwKSByZXR1cm4gMDtcbiAgaWYgKGludCA+IDI1NSkgcmV0dXJuIDI1NTtcbiAgcmV0dXJuIGludDtcbn1cblxuZnVuY3Rpb24gcGFyc2UzNjAoc3RyKSB7XG4gIGNvbnN0IGludCA9IHBhcnNlRmxvYXQoc3RyKTtcbiAgcmV0dXJuIChpbnQgJSAzNjAgKyAzNjApICUgMzYwIC8gMzYwO1xufVxuXG5mdW5jdGlvbiBwYXJzZTEoc3RyKSB7XG4gIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQoc3RyKTtcbiAgaWYgKG51bSA8IDApIHJldHVybiAwO1xuICBpZiAobnVtID4gMSkgcmV0dXJuIDI1NTtcbiAgcmV0dXJuIE1hdGgucm91bmQobnVtICogMjU1KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQZXJjZW50YWdlKHN0cikge1xuICAvLyBwYXJzZUZsb2F0IGNvbnZlbmllbnRseSBpZ25vcmVzIHRoZSBmaW5hbCAlXG4gIGNvbnN0IGludCA9IHBhcnNlRmxvYXQoc3RyKTtcbiAgaWYgKGludCA8IDApIHJldHVybiAwO1xuICBpZiAoaW50ID4gMTAwKSByZXR1cm4gMTtcbiAgcmV0dXJuIGludCAvIDEwMDtcbn1cblxuZnVuY3Rpb24gY29sb3JUb1JnYmEoaW5wdXQpIHtcbiAgbGV0IGludDMyQ29sb3IgPSBub3JtYWxpemVDb2xvcihpbnB1dCk7XG4gIGlmIChpbnQzMkNvbG9yID09PSBudWxsKSByZXR1cm4gaW5wdXQ7XG4gIGludDMyQ29sb3IgPSBpbnQzMkNvbG9yIHx8IDA7XG4gIGxldCByID0gKGludDMyQ29sb3IgJiAweGZmMDAwMDAwKSA+Pj4gMjQ7XG4gIGxldCBnID0gKGludDMyQ29sb3IgJiAweDAwZmYwMDAwKSA+Pj4gMTY7XG4gIGxldCBiID0gKGludDMyQ29sb3IgJiAweDAwMDBmZjAwKSA+Pj4gODtcbiAgbGV0IGEgPSAoaW50MzJDb2xvciAmIDB4MDAwMDAwZmYpIC8gMjU1O1xuICByZXR1cm4gYHJnYmEoJHtyfSwgJHtnfSwgJHtifSwgJHthfSlgO1xufSAvLyBQcm9ibGVtOiBodHRwczovL2dpdGh1Yi5jb20vYW5pbWF0ZWRqcy9hbmltYXRlZC9wdWxsLzEwMlxuLy8gU29sdXRpb246IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYzODU2NS9wYXJzaW5nLXNjaWVudGlmaWMtbm90YXRpb24tc2Vuc2libHkvNjU4NjYyXG5cblxuY29uc3Qgc3RyaW5nU2hhcGVSZWdleCA9IC9bK1xcLV0/KD86MHxbMS05XVxcZCopKD86XFwuXFxkKik/KD86W2VFXVsrXFwtXT9cXGQrKT8vZzsgLy8gQ292ZXJzIHJnYiwgcmdiYSwgaHNsLCBoc2xhXG4vLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL29sbW9rcmFtZXIvODJjY2NlNjczZjg2ZGI3Y2RhNWVcblxuY29uc3QgY29sb3JSZWdleCA9IC8oIyg/OlswLTlhLWZdezJ9KXsyLDR9fCgjWzAtOWEtZl17M30pfChyZ2J8aHNsKWE/XFwoKC0/XFxkKyU/WyxcXHNdKyl7MiwzfVxccypbXFxkXFwuXSslP1xcKSkvZ2k7IC8vIENvdmVycyBjb2xvciBuYW1lcyAodHJhbnNwYXJlbnQsIGJsdWUsIGV0Yy4pXG5cbmNvbnN0IGNvbG9yTmFtZXNSZWdleCA9IG5ldyBSZWdFeHAoYCgke09iamVjdC5rZXlzKGNvbG9ycykuam9pbignfCcpfSlgLCAnZycpO1xuLyoqXG4gKiBTdXBwb3J0cyBzdHJpbmcgc2hhcGVzIGJ5IGV4dHJhY3RpbmcgbnVtYmVycyBzbyBuZXcgdmFsdWVzIGNhbiBiZSBjb21wdXRlZCxcbiAqIGFuZCByZWNvbWJpbmVzIHRob3NlIHZhbHVlcyBpbnRvIG5ldyBzdHJpbmdzIG9mIHRoZSBzYW1lIHNoYXBlLiAgU3VwcG9ydHNcbiAqIHRoaW5ncyBsaWtlOlxuICpcbiAqICAgcmdiYSgxMjMsIDQyLCA5OSwgMC4zNikgICAgICAgICAgIC8vIGNvbG9yc1xuICogICAtNDVkZWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHdpdGggdW5pdHNcbiAqICAgMCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpIC8vIGJveCBzaGFkb3dzXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlSW50ZXJwb2xhdGlvbihjb25maWcpIHtcbiAgLy8gUmVwbGFjZSBjb2xvcnMgd2l0aCByZ2JhXG4gIGNvbnN0IG91dHB1dFJhbmdlID0gY29uZmlnLm91dHB1dC5tYXAocmFuZ2VWYWx1ZSA9PiByYW5nZVZhbHVlLnJlcGxhY2UoY29sb3JSZWdleCwgY29sb3JUb1JnYmEpKS5tYXAocmFuZ2VWYWx1ZSA9PiByYW5nZVZhbHVlLnJlcGxhY2UoY29sb3JOYW1lc1JlZ2V4LCBjb2xvclRvUmdiYSkpOyAvLyAtPlxuICAvLyBbXG4gIC8vICAgWzAsIDUwXSxcbiAgLy8gICBbMTAwLCAxNTBdLFxuICAvLyAgIFsyMDAsIDI1MF0sXG4gIC8vICAgWzAsIDAuNV0sXG4gIC8vIF1cblxuICBjb25zdCBvdXRwdXRSYW5nZXMgPSBvdXRwdXRSYW5nZVswXS5tYXRjaChzdHJpbmdTaGFwZVJlZ2V4KS5tYXAoKCkgPT4gW10pO1xuICBvdXRwdXRSYW5nZS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICB2YWx1ZS5tYXRjaChzdHJpbmdTaGFwZVJlZ2V4KS5mb3JFYWNoKChudW1iZXIsIGkpID0+IG91dHB1dFJhbmdlc1tpXS5wdXNoKCtudW1iZXIpKTtcbiAgfSk7XG4gIGNvbnN0IGludGVycG9sYXRpb25zID0gb3V0cHV0UmFuZ2VbMF0ubWF0Y2goc3RyaW5nU2hhcGVSZWdleCkubWFwKCh2YWx1ZSwgaSkgPT4ge1xuICAgIHJldHVybiBJbnRlcnBvbGF0aW9uLmNyZWF0ZShfZXh0ZW5kcyh7fSwgY29uZmlnLCB7XG4gICAgICBvdXRwdXQ6IG91dHB1dFJhbmdlc1tpXVxuICAgIH0pKTtcbiAgfSk7XG4gIHJldHVybiBpbnB1dCA9PiB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHJldHVybiBvdXRwdXRSYW5nZVswXSAvLyAncmdiYSgwLCAxMDAsIDIwMCwgMCknXG4gICAgLy8gLT5cbiAgICAvLyAncmdiYSgke2ludGVycG9sYXRpb25zWzBdKGlucHV0KX0sICR7aW50ZXJwb2xhdGlvbnNbMV0oaW5wdXQpfSwgLi4uJ1xuICAgIC5yZXBsYWNlKHN0cmluZ1NoYXBlUmVnZXgsICgpID0+IGludGVycG9sYXRpb25zW2krK10oaW5wdXQpKSAvLyByZ2JhIHJlcXVpcmVzIHRoYXQgdGhlIHIsZyxiIGFyZSBpbnRlZ2Vycy4uLi4gc28gd2Ugd2FudCB0byByb3VuZCB0aGVtLCBidXQgd2UgKmRvbnQqIHdhbnQgdG9cbiAgICAvLyByb3VuZCB0aGUgb3BhY2l0eSAoNHRoIGNvbHVtbikuXG4gICAgLnJlcGxhY2UoL3JnYmFcXCgoWzAtOVxcLi1dKyksIChbMC05XFwuLV0rKSwgKFswLTlcXC4tXSspLCAoWzAtOVxcLi1dKylcXCkvZ2ksIChfLCBwMSwgcDIsIHAzLCBwNCkgPT4gYHJnYmEoJHtNYXRoLnJvdW5kKHAxKX0sICR7TWF0aC5yb3VuZChwMil9LCAke01hdGgucm91bmQocDMpfSwgJHtwNH0pYCk7XG4gIH07XG59XG5cbmNsYXNzIEFuaW1hdGVkSW50ZXJwb2xhdGlvbiBleHRlbmRzIEFuaW1hdGVkQXJyYXlXaXRoQ2hpbGRyZW4ge1xuICBjb25zdHJ1Y3RvcihwYXJlbnRzLCBfY29uZmlnLCBfYXJnKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZ2V0VmFsdWUgPSAoKSA9PiB0aGlzLmNhbGMoLi4udGhpcy5wYXlsb2FkLm1hcCh2YWx1ZSA9PiB2YWx1ZS5nZXRWYWx1ZSgpKSk7XG5cbiAgICB0aGlzLnVwZGF0ZUNvbmZpZyA9IChjb25maWcsIGFyZykgPT4gdGhpcy5jYWxjID0gSW50ZXJwb2xhdGlvbi5jcmVhdGUoY29uZmlnLCBhcmcpO1xuXG4gICAgdGhpcy5pbnRlcnBvbGF0ZSA9IChjb25maWcsIGFyZykgPT4gbmV3IEFuaW1hdGVkSW50ZXJwb2xhdGlvbih0aGlzLCBjb25maWcsIGFyZyk7XG5cbiAgICB0aGlzLnBheWxvYWQgPSAvLyBBbmltYXRlZEFycmF5cyBzaG91bGQgdW5mb2xkLCBleGNlcHQgQW5pbWF0ZWRJbnRlcnBvbGF0aW9uIHdoaWNoIGlzIHRha2VuIGFzIGlzXG4gICAgcGFyZW50cyBpbnN0YW5jZW9mIEFuaW1hdGVkQXJyYXlXaXRoQ2hpbGRyZW4gJiYgIXBhcmVudHMudXBkYXRlQ29uZmlnID8gcGFyZW50cy5wYXlsb2FkIDogQXJyYXkuaXNBcnJheShwYXJlbnRzKSA/IHBhcmVudHMgOiBbcGFyZW50c107XG4gICAgdGhpcy5jYWxjID0gSW50ZXJwb2xhdGlvbi5jcmVhdGUoX2NvbmZpZywgX2FyZyk7XG4gIH1cblxufVxuY29uc3QgaW50ZXJwb2xhdGUkMSA9IChwYXJlbnRzLCBjb25maWcsIGFyZykgPT4gcGFyZW50cyAmJiBuZXcgQW5pbWF0ZWRJbnRlcnBvbGF0aW9uKHBhcmVudHMsIGNvbmZpZywgYXJnKTtcblxuLyoqXG4gKiBBbmltYXRlZCB3b3JrcyBieSBidWlsZGluZyBhIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGggb2YgZGVwZW5kZW5jaWVzXG4gKiB0cmFuc3BhcmVudGx5IHdoZW4geW91IHJlbmRlciB5b3VyIEFuaW1hdGVkIGNvbXBvbmVudHMuXG4gKlxuICogICAgICAgICAgICAgICBuZXcgQW5pbWF0ZWQuVmFsdWUoMClcbiAqICAgICAuaW50ZXJwb2xhdGUoKSAgICAgICAgLmludGVycG9sYXRlKCkgICAgbmV3IEFuaW1hdGVkLlZhbHVlKDEpXG4gKiAgICAgICAgIG9wYWNpdHkgICAgICAgICAgICAgICB0cmFuc2xhdGVZICAgICAgc2NhbGVcbiAqICAgICAgICAgIHN0eWxlICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVxuICogICAgICAgICBWaWV3IzIzNCAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcjMTIzXG4gKlxuICogQSkgVG9wIERvd24gcGhhc2VcbiAqIFdoZW4gYW4gQW5pbWF0ZWQuVmFsdWUgaXMgdXBkYXRlZCwgd2UgcmVjdXJzaXZlbHkgZ28gZG93biB0aHJvdWdoIHRoaXNcbiAqIGdyYXBoIGluIG9yZGVyIHRvIGZpbmQgbGVhZiBub2RlczogdGhlIHZpZXdzIHRoYXQgd2UgZmxhZyBhcyBuZWVkaW5nXG4gKiBhbiB1cGRhdGUuXG4gKlxuICogQikgQm90dG9tIFVwIHBoYXNlXG4gKiBXaGVuIGEgdmlldyBpcyBmbGFnZ2VkIGFzIG5lZWRpbmcgYW4gdXBkYXRlLCB3ZSByZWN1cnNpdmVseSBnbyBiYWNrIHVwXG4gKiBpbiBvcmRlciB0byBidWlsZCB0aGUgbmV3IHZhbHVlIHRoYXQgaXQgbmVlZHMuIFRoZSByZWFzb24gd2h5IHdlIG5lZWRcbiAqIHRoaXMgdHdvLXBoYXNlcyBwcm9jZXNzIGlzIHRvIGRlYWwgd2l0aCBjb21wb3NpdGUgcHJvcHMgc3VjaCBhc1xuICogdHJhbnNmb3JtIHdoaWNoIGNhbiByZWNlaXZlIHZhbHVlcyBmcm9tIG11bHRpcGxlIHBhcmVudHMuXG4gKi9cblxuZnVuY3Rpb24gZmluZEFuaW1hdGVkU3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICBpZiAodHlwZW9mIG5vZGUudXBkYXRlID09PSAnZnVuY3Rpb24nKSBzdHlsZXMuYWRkKG5vZGUpO2Vsc2Ugbm9kZS5nZXRDaGlsZHJlbigpLmZvckVhY2goY2hpbGQgPT4gZmluZEFuaW1hdGVkU3R5bGVzKGNoaWxkLCBzdHlsZXMpKTtcbn1cbi8qKlxuICogU3RhbmRhcmQgdmFsdWUgZm9yIGRyaXZpbmcgYW5pbWF0aW9ucy4gIE9uZSBgQW5pbWF0ZWQuVmFsdWVgIGNhbiBkcml2ZVxuICogbXVsdGlwbGUgcHJvcGVydGllcyBpbiBhIHN5bmNocm9uaXplZCBmYXNoaW9uLCBidXQgY2FuIG9ubHkgYmUgZHJpdmVuIGJ5IG9uZVxuICogbWVjaGFuaXNtIGF0IGEgdGltZS4gIFVzaW5nIGEgbmV3IG1lY2hhbmlzbSAoZS5nLiBzdGFydGluZyBhIG5ldyBhbmltYXRpb24sXG4gKiBvciBjYWxsaW5nIGBzZXRWYWx1ZWApIHdpbGwgc3RvcCBhbnkgcHJldmlvdXMgb25lcy5cbiAqL1xuXG5cbmNsYXNzIEFuaW1hdGVkVmFsdWUgZXh0ZW5kcyBBbmltYXRlZFdpdGhDaGlsZHJlbiB7XG4gIGNvbnN0cnVjdG9yKF92YWx1ZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHN1cGVyKCk7XG4gICAgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZmx1c2gpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGZsdXNoID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmIChmbHVzaCkgX3RoaXMuZmx1c2goKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRWYWx1ZSA9ICgpID0+IHRoaXMudmFsdWU7XG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlcyA9ICgpID0+IGZpbmRBbmltYXRlZFN0eWxlcyh0aGlzLCB0aGlzLmFuaW1hdGVkU3R5bGVzKTtcblxuICAgIHRoaXMudXBkYXRlVmFsdWUgPSB2YWx1ZSA9PiB0aGlzLmZsdXNoKHRoaXMudmFsdWUgPSB2YWx1ZSk7XG5cbiAgICB0aGlzLmludGVycG9sYXRlID0gKGNvbmZpZywgYXJnKSA9PiBuZXcgQW5pbWF0ZWRJbnRlcnBvbGF0aW9uKHRoaXMsIGNvbmZpZywgYXJnKTtcblxuICAgIHRoaXMudmFsdWUgPSBfdmFsdWU7XG4gICAgdGhpcy5hbmltYXRlZFN0eWxlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSBfdmFsdWU7XG4gICAgdGhpcy5sYXN0UG9zaXRpb24gPSBfdmFsdWU7XG4gICAgdGhpcy5sYXN0VmVsb2NpdHkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sYXN0VGltZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmbHVzaCgpIHtcbiAgICBpZiAodGhpcy5hbmltYXRlZFN0eWxlcy5zaXplID09PSAwKSB0aGlzLnVwZGF0ZVN0eWxlcygpO1xuICAgIHRoaXMuYW5pbWF0ZWRTdHlsZXMuZm9yRWFjaChhbmltYXRlZFN0eWxlID0+IGFuaW1hdGVkU3R5bGUudXBkYXRlKCkpO1xuICB9XG5cbiAgcHJlcGFyZShjb250cm9sbGVyKSB7XG4gICAgLy8gVmFsdWVzIHN0YXkgbG95YWwgdG8gdGhlaXIgb3JpZ2luYWwgY29udHJvbGxlciwgdGhpcyBpcyBhbHNvIGEgd2F5IHRvXG4gICAgLy8gZGV0ZWN0IHRyYWlsaW5nIHZhbHVlcyBvcmlnaW5hdGluZyBmcm9tIGEgZm9yZWlnbiBjb250cm9sbGVyXG4gICAgaWYgKHRoaXMuY29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuXG4gICAgaWYgKHRoaXMuY29udHJvbGxlciA9PT0gY29udHJvbGxlcikge1xuICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMubGFzdFBvc2l0aW9uID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gY29udHJvbGxlci5pc0FjdGl2ZSA/IHRoaXMubGFzdFZlbG9jaXR5IDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5sYXN0VGltZSA9IGNvbnRyb2xsZXIuaXNBY3RpdmUgPyB0aGlzLmxhc3RUaW1lIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmFuaW1hdGVkU3R5bGVzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbn1cblxuY2xhc3MgQW5pbWF0ZWRBcnJheSBleHRlbmRzIEFuaW1hdGVkQXJyYXlXaXRoQ2hpbGRyZW4ge1xuICBjb25zdHJ1Y3RvcihhcnJheSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHN1cGVyKCk7XG4gICAgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZmx1c2gpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGZsdXNoID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IF90aGlzLnBheWxvYWQubGVuZ3RoKSB2YWx1ZS5mb3JFYWNoKCh2LCBpKSA9PiBfdGhpcy5wYXlsb2FkW2ldLnNldFZhbHVlKHYsIGZsdXNoKSk7XG4gICAgICB9IGVsc2UgX3RoaXMucGF5bG9hZC5mb3JFYWNoKCh2LCBpKSA9PiBfdGhpcy5wYXlsb2FkW2ldLnNldFZhbHVlKHZhbHVlLCBmbHVzaCkpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFZhbHVlID0gKCkgPT4gdGhpcy5wYXlsb2FkLm1hcCh2ID0+IHYuZ2V0VmFsdWUoKSk7XG5cbiAgICB0aGlzLmludGVycG9sYXRlID0gKGNvbmZpZywgYXJnKSA9PiBuZXcgQW5pbWF0ZWRJbnRlcnBvbGF0aW9uKHRoaXMsIGNvbmZpZywgYXJnKTtcblxuICAgIHRoaXMucGF5bG9hZCA9IGFycmF5Lm1hcChuID0+IG5ldyBBbmltYXRlZFZhbHVlKG4pKTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0KHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRvQXJyYXkoYSkge1xuICByZXR1cm4gYSAhPT0gdm9pZCAwID8gQXJyYXkuaXNBcnJheShhKSA/IGEgOiBbYV0gOiBbXTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChhLCBiKSB7XG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYSA9PT0gJ251bWJlcicpIHJldHVybiBhID09PSBiO1xuICBsZXQgaTtcblxuICBmb3IgKGkgaW4gYSkgaWYgKCEoaSBpbiBiKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoaSBpbiBiKSBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBpID09PSB2b2lkIDAgPyBhID09PSBiIDogdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNhbGxQcm9wKG9iaikge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJyA/IG9iaiguLi5hcmdzKSA6IG9iajtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlcyQxKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5tYXAoayA9PiBvYmplY3Rba10pO1xufVxuZnVuY3Rpb24gZ2V0Rm9yd2FyZFByb3BzKHByb3BzKSB7XG4gIGNvbnN0IHRvID0gcHJvcHMudG8sXG4gICAgICAgIGZyb20gPSBwcm9wcy5mcm9tLFxuICAgICAgICBjb25maWcgPSBwcm9wcy5jb25maWcsXG4gICAgICAgIG5hdGl2ZSA9IHByb3BzLm5hdGl2ZSxcbiAgICAgICAgb25TdGFydCA9IHByb3BzLm9uU3RhcnQsXG4gICAgICAgIG9uUmVzdCA9IHByb3BzLm9uUmVzdCxcbiAgICAgICAgb25GcmFtZSA9IHByb3BzLm9uRnJhbWUsXG4gICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHJlc2V0ID0gcHJvcHMucmVzZXQsXG4gICAgICAgIHJldmVyc2UgPSBwcm9wcy5yZXZlcnNlLFxuICAgICAgICBmb3JjZSA9IHByb3BzLmZvcmNlLFxuICAgICAgICBpbW1lZGlhdGUgPSBwcm9wcy5pbW1lZGlhdGUsXG4gICAgICAgIGltcGwgPSBwcm9wcy5pbXBsLFxuICAgICAgICBpbmplY3QgPSBwcm9wcy5pbmplY3QsXG4gICAgICAgIGRlbGF5ID0gcHJvcHMuZGVsYXksXG4gICAgICAgIGF0dGFjaCA9IHByb3BzLmF0dGFjaCxcbiAgICAgICAgZGVzdHJveWVkID0gcHJvcHMuZGVzdHJveWVkLFxuICAgICAgICBpbnRlcnBvbGF0ZVRvID0gcHJvcHMuaW50ZXJwb2xhdGVUbyxcbiAgICAgICAgYXV0b1N0YXJ0ID0gcHJvcHMuYXV0b1N0YXJ0LFxuICAgICAgICByZWYgPSBwcm9wcy5yZWYsXG4gICAgICAgIGZvcndhcmQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgW1widG9cIiwgXCJmcm9tXCIsIFwiY29uZmlnXCIsIFwibmF0aXZlXCIsIFwib25TdGFydFwiLCBcIm9uUmVzdFwiLCBcIm9uRnJhbWVcIiwgXCJjaGlsZHJlblwiLCBcInJlc2V0XCIsIFwicmV2ZXJzZVwiLCBcImZvcmNlXCIsIFwiaW1tZWRpYXRlXCIsIFwiaW1wbFwiLCBcImluamVjdFwiLCBcImRlbGF5XCIsIFwiYXR0YWNoXCIsIFwiZGVzdHJveWVkXCIsIFwiaW50ZXJwb2xhdGVUb1wiLCBcImF1dG9TdGFydFwiLCBcInJlZlwiXSk7XG5cbiAgcmV0dXJuIGZvcndhcmQ7XG59XG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVRvKHByb3BzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBnZXRGb3J3YXJkUHJvcHMocHJvcHMpO1xuICBjb25zdCByZXN0ID0gT2JqZWN0LmtleXMocHJvcHMpLnJlZHVjZSgoYSwgaykgPT4gZm9yd2FyZFtrXSAhPT0gdm9pZCAwID8gYSA6IF9leHRlbmRzKHt9LCBhLCB7XG4gICAgW2tdOiBwcm9wc1trXVxuICB9KSwge30pO1xuICByZXR1cm4gX2V4dGVuZHMoe1xuICAgIHRvOiBmb3J3YXJkXG4gIH0sIHJlc3QpO1xufVxuZnVuY3Rpb24gY29udmVydFRvQW5pbWF0ZWRWYWx1ZShhY2MsIF9yZWYpIHtcbiAgbGV0IG5hbWUgPSBfcmVmWzBdLFxuICAgICAgdmFsdWUgPSBfcmVmWzFdO1xuICByZXR1cm4gX2V4dGVuZHMoe30sIGFjYywge1xuICAgIFtuYW1lXTogbmV3IChBcnJheS5pc0FycmF5KHZhbHVlKSA/IEFuaW1hdGVkQXJyYXkgOiBBbmltYXRlZFZhbHVlKSh2YWx1ZSlcbiAgfSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VmFsdWVzKHByb3BzKSB7XG4gIGNvbnN0IGZyb20gPSBwcm9wcy5mcm9tLFxuICAgICAgICB0byA9IHByb3BzLnRvLFxuICAgICAgICBuYXRpdmUgPSBwcm9wcy5uYXRpdmU7XG4gIGNvbnN0IGFsbFByb3BzID0gT2JqZWN0LmVudHJpZXMoX2V4dGVuZHMoe30sIGZyb20sIHRvKSk7XG4gIHJldHVybiBuYXRpdmUgPyBhbGxQcm9wcy5yZWR1Y2UoY29udmVydFRvQW5pbWF0ZWRWYWx1ZSwge30pIDogX2V4dGVuZHMoe30sIGZyb20sIHRvKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVJlZihyZWYsIGZvcndhcmQpIHtcbiAgaWYgKGZvcndhcmQpIHtcbiAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdCdzIGEgcmVmIGNhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBmb3J3YXJkID09PSAnZnVuY3Rpb24nKSBmb3J3YXJkKHJlZik7ZWxzZSBpZiAodHlwZW9mIGZvcndhcmQgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBJZiBpdCdzIGFuIG9iamVjdCBhbmQgaGFzIGEgJ2N1cnJlbnQnIHByb3BlcnR5LCBhc3N1bWUgaXQncyBhIHJlZiBvYmplY3RcbiAgICAgIGZvcndhcmQuY3VycmVudCA9IHJlZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVmO1xufVxuXG5jb25zdCBjaGVjayA9IHZhbHVlID0+IHZhbHVlID09PSAnYXV0byc7XG5cbmNvbnN0IG92ZXJ3cml0ZSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiAoYWNjLCBfcmVmKSA9PiB7XG4gIGxldCBuYW1lID0gX3JlZlswXSxcbiAgICAgIHZhbHVlID0gX3JlZlsxXTtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBhY2MsIHtcbiAgICBbbmFtZV06IHZhbHVlID09PSAnYXV0bycgPyB+bmFtZS5pbmRleE9mKCdoZWlnaHQnKSA/IGhlaWdodCA6IHdpZHRoIDogdmFsdWVcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBmaXhBdXRvKHByb3BzLCBjYWxsYmFjaykge1xuICBjb25zdCBmcm9tID0gcHJvcHMuZnJvbSxcbiAgICAgICAgdG8gPSBwcm9wcy50byxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjsgLy8gRHJ5LXJvdXRlIHByb3BzIGJhY2sgaWYgbm90aGluZydzIHVzaW5nICdhdXRvJyBpbiB0aGVyZVxuICAvLyBUT0RPOiBkZWFsIHdpdGggXCJudWxsXCJcblxuICBpZiAoIShnZXRWYWx1ZXMkMSh0bykuc29tZShjaGVjaykgfHwgZ2V0VmFsdWVzJDEoZnJvbSkuc29tZShjaGVjaykpKSByZXR1cm47IC8vIEZldGNoIHJlbmRlciB2LWRvbVxuXG4gIGxldCBlbGVtZW50ID0gY2hpbGRyZW4oY29udmVydFZhbHVlcyhwcm9wcykpOyAvLyBBIHNwcmluZyBjYW4gcmV0dXJuIHVuZGVmaW5lZC9udWxsLCBjaGVjayBhZ2FpbnN0IHRoYXQgKCMxNTMpXG5cbiAgaWYgKCFlbGVtZW50KSByZXR1cm47IC8vIE9yIGl0IGNvdWxkIGJlIGFuIGFycmF5ICgjMzQ2KSAuLi5cblxuICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50KSkgZWxlbWVudCA9IHtcbiAgICB0eXBlOiAnZGl2JyxcbiAgICBwcm9wczoge1xuICAgICAgY2hpbGRyZW46IGVsZW1lbnRcbiAgICB9IC8vIEV4dHJhY3Qgc3R5bGVzXG5cbiAgfTtcbiAgY29uc3QgZWxlbWVudFN0eWxlcyA9IGVsZW1lbnQucHJvcHMuc3R5bGU7IC8vIFJldHVybiB2LmRvbSB3aXRoIGluamVjdGVkIHJlZlxuXG4gIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQudHlwZSwgX2V4dGVuZHMoe1xuICAgIGtleTogZWxlbWVudC5rZXkgPyBlbGVtZW50LmtleSA6IHVuZGVmaW5lZFxuICB9LCBlbGVtZW50LnByb3BzLCB7XG4gICAgc3R5bGU6IF9leHRlbmRzKHt9LCBlbGVtZW50U3R5bGVzLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgfSksXG4gICAgcmVmOiBfcmVmMiA9PiB7XG4gICAgICBpZiAoX3JlZjIpIHtcbiAgICAgICAgLy8gT25jZSBpdCdzIHJlbmRlcmVkIG91dCwgZmV0Y2ggYm91bmRzIChtaW51cyBwYWRkaW5nL21hcmdpbi9ib3JkZXJzKVxuICAgICAgICBsZXQgbm9kZSA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKF9yZWYyKTtcbiAgICAgICAgbGV0IHdpZHRoLCBoZWlnaHQ7XG4gICAgICAgIGxldCBjcyA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG5cbiAgICAgICAgaWYgKGNzLmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgICAgICAgd2lkdGggPSBub2RlLm9mZnNldFdpZHRoO1xuICAgICAgICAgIGhlaWdodCA9IG5vZGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhZGRpbmdYID0gcGFyc2VGbG9hdChjcy5wYWRkaW5nTGVmdCB8fCAwKSArIHBhcnNlRmxvYXQoY3MucGFkZGluZ1JpZ2h0IHx8IDApO1xuICAgICAgICAgIGNvbnN0IHBhZGRpbmdZID0gcGFyc2VGbG9hdChjcy5wYWRkaW5nVG9wIHx8IDApICsgcGFyc2VGbG9hdChjcy5wYWRkaW5nQm90dG9tIHx8IDApO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclggPSBwYXJzZUZsb2F0KGNzLmJvcmRlckxlZnRXaWR0aCB8fCAwKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyUmlnaHRXaWR0aCB8fCAwKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJZID0gcGFyc2VGbG9hdChjcy5ib3JkZXJUb3BXaWR0aCB8fCAwKSArIHBhcnNlRmxvYXQoY3MuYm9yZGVyQm90dG9tV2lkdGggfHwgMCk7XG4gICAgICAgICAgd2lkdGggPSBub2RlLm9mZnNldFdpZHRoIC0gcGFkZGluZ1ggLSBib3JkZXJYO1xuICAgICAgICAgIGhlaWdodCA9IG5vZGUub2Zmc2V0SGVpZ2h0IC0gcGFkZGluZ1kgLSBib3JkZXJZO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udmVydCA9IG92ZXJ3cml0ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY2FsbGJhY2soX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgICAgZnJvbTogT2JqZWN0LmVudHJpZXMoZnJvbSkucmVkdWNlKGNvbnZlcnQsIGZyb20pLFxuICAgICAgICAgIHRvOiBPYmplY3QuZW50cmllcyh0bykucmVkdWNlKGNvbnZlcnQsIHRvKVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9KSk7XG59XG5cbmxldCBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgY29sdW1uczogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuXG5jb25zdCBwcmVmaXhLZXkgPSAocHJlZml4LCBrZXkpID0+IHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG5cbmNvbnN0IHByZWZpeGVzID0gWydXZWJraXQnLCAnTXMnLCAnTW96JywgJ08nXTtcbmlzVW5pdGxlc3NOdW1iZXIgPSBPYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5yZWR1Y2UoKGFjYywgcHJvcCkgPT4ge1xuICBwcmVmaXhlcy5mb3JFYWNoKHByZWZpeCA9PiBhY2NbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gYWNjW3Byb3BdKTtcbiAgcmV0dXJuIGFjYztcbn0sIGlzVW5pdGxlc3NOdW1iZXIpO1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJykgcmV0dXJuICcnO1xuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHJldHVybiB2YWx1ZSArICdweCc7IC8vIFByZXN1bWVzIGltcGxpY2l0ICdweCcgc3VmZml4IGZvciB1bml0bGVzcyBudW1iZXJzXG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbmNvbnN0IGF0dHJpYnV0ZUNhY2hlID0ge307XG5pbmplY3RDcmVhdGVBbmltYXRlZFN0eWxlKHN0eWxlID0+IG5ldyBBbmltYXRlZFN0eWxlKHN0eWxlKSk7XG5pbmplY3REZWZhdWx0RWxlbWVudCgnZGl2Jyk7XG5pbmplY3RJbnRlcnBvbGF0aW9uKGNyZWF0ZUludGVycG9sYXRpb24pO1xuaW5qZWN0Q29sb3JOYW1lcyhjb2xvcnMpO1xuaW5qZWN0QnVnZml4ZXMoZml4QXV0byk7XG5pbmplY3RBcHBseUFuaW1hdGVkVmFsdWVzKChpbnN0YW5jZSwgcHJvcHMpID0+IHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICYmIGluc3RhbmNlLnNldEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIHNjcm9sbFRvcCA9IHByb3BzLnNjcm9sbFRvcCxcbiAgICAgICAgICBzY3JvbGxMZWZ0ID0gcHJvcHMuc2Nyb2xsTGVmdCxcbiAgICAgICAgICBhdHRyaWJ1dGVzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UocHJvcHMsIFtcInN0eWxlXCIsIFwiY2hpbGRyZW5cIiwgXCJzY3JvbGxUb3BcIiwgXCJzY3JvbGxMZWZ0XCJdKTtcblxuICAgIGlmIChzY3JvbGxUb3AgIT09IHZvaWQgMCkgaW5zdGFuY2Uuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgIGlmIChzY3JvbGxMZWZ0ICE9PSB2b2lkIDApIGluc3RhbmNlLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0OyAvLyBTZXQgdGV4dENvbnRlbnQsIGlmIGNoaWxkcmVuIGlzIGFuIGFuaW1hdGFibGUgdmFsdWVcblxuICAgIGlmIChjaGlsZHJlbiAhPT0gdm9pZCAwKSBpbnN0YW5jZS50ZXh0Q29udGVudCA9IGNoaWxkcmVuOyAvLyBTZXQgc3R5bGVzIC4uLlxuXG4gICAgZm9yIChsZXQgc3R5bGVOYW1lIGluIHN0eWxlKSB7XG4gICAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIGNvbnRpbnVlO1xuICAgICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcbiAgICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlW3N0eWxlTmFtZV0sIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0Jykgc3R5bGVOYW1lID0gJ2Nzc0Zsb2F0JztcbiAgICAgIGlmIChpc0N1c3RvbVByb3BlcnR5KSBpbnN0YW5jZS5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO2Vsc2UgaW5zdGFuY2Uuc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgfSAvLyBTZXQgYXR0cmlidXRlcyAuLi5cblxuXG4gICAgZm9yIChsZXQgbmFtZSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAvLyBBdHRyaWJ1dGVzIGFyZSB3cml0dGVuIGluIGRhc2ggY2FzZVxuICAgICAgY29uc3QgZGFzaENhc2UgPSBhdHRyaWJ1dGVDYWNoZVtuYW1lXSB8fCAoYXR0cmlidXRlQ2FjaGVbbmFtZV0gPSBuYW1lLnJlcGxhY2UoLyhbQS1aXSkvZywgbiA9PiAnLScgKyBuLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0QXR0cmlidXRlKGRhc2hDYXNlKSAhPT0gJ3VuZGVmaW5lZCcpIGluc3RhbmNlLnNldEF0dHJpYnV0ZShkYXNoQ2FzZSwgYXR0cmlidXRlc1tuYW1lXSk7XG4gICAgfVxuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufSwgc3R5bGUgPT4gc3R5bGUpO1xuXG5sZXQgYWN0aXZlID0gZmFsc2U7XG5jb25zdCBjb250cm9sbGVycyA9IG5ldyBTZXQoKTtcblxuY29uc3QgZnJhbWVMb29wID0gKCkgPT4ge1xuICBsZXQgdGltZSA9IG5vdygpO1xuXG4gIGZvciAobGV0IGNvbnRyb2xsZXIgb2YgY29udHJvbGxlcnMpIHtcbiAgICBsZXQgaXNEb25lID0gdHJ1ZTtcbiAgICBsZXQgbm9DaGFuZ2UgPSB0cnVlO1xuXG4gICAgZm9yIChsZXQgY29uZmlnSWR4ID0gMDsgY29uZmlnSWR4IDwgY29udHJvbGxlci5jb25maWdzLmxlbmd0aDsgY29uZmlnSWR4KyspIHtcbiAgICAgIGxldCBjb25maWcgPSBjb250cm9sbGVyLmNvbmZpZ3NbY29uZmlnSWR4XTtcbiAgICAgIGxldCBlbmRPZkFuaW1hdGlvbiwgbGFzdFRpbWU7XG5cbiAgICAgIGZvciAobGV0IHZhbElkeCA9IDA7IHZhbElkeCA8IGNvbmZpZy5hbmltYXRlZFZhbHVlcy5sZW5ndGg7IHZhbElkeCsrKSB7XG4gICAgICAgIGxldCBhbmltYXRpb24gPSBjb25maWcuYW5pbWF0ZWRWYWx1ZXNbdmFsSWR4XTsgLy8gSWYgYW4gYW5pbWF0aW9uIGlzIGRvbmUsIHNraXAsIHVudGlsIGFsbCBvZiB0aGVtIGNvbmNsdWRlXG5cbiAgICAgICAgaWYgKGFuaW1hdGlvbi5kb25lKSBjb250aW51ZTtcbiAgICAgICAgbGV0IGZyb20gPSBjb25maWcuZnJvbVZhbHVlc1t2YWxJZHhdO1xuICAgICAgICBsZXQgdG8gPSBjb25maWcudG9WYWx1ZXNbdmFsSWR4XTtcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gYW5pbWF0aW9uLmxhc3RQb3NpdGlvbjtcbiAgICAgICAgbGV0IGlzQW5pbWF0ZWQgPSB0byBpbnN0YW5jZW9mIEFuaW1hdGVkO1xuICAgICAgICBsZXQgdmVsb2NpdHkgPSBBcnJheS5pc0FycmF5KGNvbmZpZy5pbml0aWFsVmVsb2NpdHkpID8gY29uZmlnLmluaXRpYWxWZWxvY2l0eVt2YWxJZHhdIDogY29uZmlnLmluaXRpYWxWZWxvY2l0eTtcbiAgICAgICAgaWYgKGlzQW5pbWF0ZWQpIHRvID0gdG8uZ2V0VmFsdWUoKTsgLy8gQ29uY2x1ZGUgYW5pbWF0aW9uIGlmIGl0J3MgZWl0aGVyIGltbWVkaWF0ZSwgb3IgZnJvbS12YWx1ZXMgbWF0Y2ggZW5kLXN0YXRlXG5cbiAgICAgICAgaWYgKGNvbmZpZy5pbW1lZGlhdGUgfHwgIWlzQW5pbWF0ZWQgJiYgIWNvbmZpZy5kZWNheSAmJiBmcm9tID09PSB0bykge1xuICAgICAgICAgIGFuaW1hdGlvbi51cGRhdGVWYWx1ZSh0byk7XG4gICAgICAgICAgYW5pbWF0aW9uLmRvbmUgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IC8vIERvaW5nIGRlbGF5IGhlcmUgaW5zdGVhZCBvZiBzZXRUaW1lb3V0IGlzIG9uZSBhc3luYyB3b3JyeSBsZXNzXG5cblxuICAgICAgICBpZiAoY29uZmlnLmRlbGF5ICYmIHRpbWUgLSBjb250cm9sbGVyLnN0YXJ0VGltZSA8IGNvbmZpZy5kZWxheSkge1xuICAgICAgICAgIGlzRG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IC8vIEZsYWcgY2hhbmdlXG5cblxuICAgICAgICBub0NoYW5nZSA9IGZhbHNlOyAvLyBCcmVhayBhbmltYXRpb24gd2hlbiBzdHJpbmcgdmFsdWVzIGFyZSBpbnZvbHZlZFxuXG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHRvID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGFuaW1hdGlvbi51cGRhdGVWYWx1ZSh0byk7XG4gICAgICAgICAgYW5pbWF0aW9uLmRvbmUgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5kdXJhdGlvbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgLyoqIER1cmF0aW9uIGVhc2luZyAqL1xuICAgICAgICAgIHBvc2l0aW9uID0gZnJvbSArIGNvbmZpZy5lYXNpbmcoKHRpbWUgLSBjb250cm9sbGVyLnN0YXJ0VGltZSAtIGNvbmZpZy5kZWxheSkgLyBjb25maWcuZHVyYXRpb24pICogKHRvIC0gZnJvbSk7XG4gICAgICAgICAgZW5kT2ZBbmltYXRpb24gPSB0aW1lID49IGNvbnRyb2xsZXIuc3RhcnRUaW1lICsgY29uZmlnLmRlbGF5ICsgY29uZmlnLmR1cmF0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZWNheSkge1xuICAgICAgICAgIC8qKiBEZWNheSBlYXNpbmcgKi9cbiAgICAgICAgICBwb3NpdGlvbiA9IGZyb20gKyB2ZWxvY2l0eSAvICgxIC0gMC45OTgpICogKDEgLSBNYXRoLmV4cCgtKDEgLSAwLjk5OCkgKiAodGltZSAtIGNvbnRyb2xsZXIuc3RhcnRUaW1lKSkpO1xuICAgICAgICAgIGVuZE9mQW5pbWF0aW9uID0gTWF0aC5hYnMoYW5pbWF0aW9uLmxhc3RQb3NpdGlvbiAtIHBvc2l0aW9uKSA8IDAuMTtcbiAgICAgICAgICBpZiAoZW5kT2ZBbmltYXRpb24pIHRvID0gcG9zaXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIFNwcmluZyBlYXNpbmcgKi9cbiAgICAgICAgICBsYXN0VGltZSA9IGFuaW1hdGlvbi5sYXN0VGltZSAhPT0gdm9pZCAwID8gYW5pbWF0aW9uLmxhc3RUaW1lIDogdGltZTtcbiAgICAgICAgICB2ZWxvY2l0eSA9IGFuaW1hdGlvbi5sYXN0VmVsb2NpdHkgIT09IHZvaWQgMCA/IGFuaW1hdGlvbi5sYXN0VmVsb2NpdHkgOiBjb25maWcuaW5pdGlhbFZlbG9jaXR5OyAvLyBJZiB3ZSBsb3N0IGEgbG90IG9mIGZyYW1lcyBqdXN0IGp1bXAgdG8gdGhlIGVuZC5cblxuICAgICAgICAgIGlmICh0aW1lID4gbGFzdFRpbWUgKyA2NCkgbGFzdFRpbWUgPSB0aW1lOyAvLyBodHRwOi8vZ2FmZmVyb25nYW1lcy5jb20vZ2FtZS1waHlzaWNzL2ZpeC15b3VyLXRpbWVzdGVwL1xuXG4gICAgICAgICAgbGV0IG51bVN0ZXBzID0gTWF0aC5mbG9vcih0aW1lIC0gbGFzdFRpbWUpO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1TdGVwczsgKytpKSB7XG4gICAgICAgICAgICBsZXQgZm9yY2UgPSAtY29uZmlnLnRlbnNpb24gKiAocG9zaXRpb24gLSB0byk7XG4gICAgICAgICAgICBsZXQgZGFtcGluZyA9IC1jb25maWcuZnJpY3Rpb24gKiB2ZWxvY2l0eTtcbiAgICAgICAgICAgIGxldCBhY2NlbGVyYXRpb24gPSAoZm9yY2UgKyBkYW1waW5nKSAvIGNvbmZpZy5tYXNzO1xuICAgICAgICAgICAgdmVsb2NpdHkgPSB2ZWxvY2l0eSArIGFjY2VsZXJhdGlvbiAqIDEgLyAxMDAwO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIHZlbG9jaXR5ICogMSAvIDEwMDA7XG4gICAgICAgICAgfSAvLyBDb25kaXRpb25zIGZvciBzdG9wcGluZyB0aGUgc3ByaW5nIGFuaW1hdGlvblxuXG5cbiAgICAgICAgICBsZXQgaXNPdmVyc2hvb3RpbmcgPSBjb25maWcuY2xhbXAgJiYgY29uZmlnLnRlbnNpb24gIT09IDAgPyBmcm9tIDwgdG8gPyBwb3NpdGlvbiA+IHRvIDogcG9zaXRpb24gPCB0byA6IGZhbHNlO1xuICAgICAgICAgIGxldCBpc1ZlbG9jaXR5ID0gTWF0aC5hYnModmVsb2NpdHkpIDw9IGNvbmZpZy5wcmVjaXNpb247XG4gICAgICAgICAgbGV0IGlzRGlzcGxhY2VtZW50ID0gY29uZmlnLnRlbnNpb24gIT09IDAgPyBNYXRoLmFicyh0byAtIHBvc2l0aW9uKSA8PSBjb25maWcucHJlY2lzaW9uIDogdHJ1ZTtcbiAgICAgICAgICBlbmRPZkFuaW1hdGlvbiA9IGlzT3ZlcnNob290aW5nIHx8IGlzVmVsb2NpdHkgJiYgaXNEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgYW5pbWF0aW9uLmxhc3RWZWxvY2l0eSA9IHZlbG9jaXR5O1xuICAgICAgICAgIGFuaW1hdGlvbi5sYXN0VGltZSA9IHRpbWU7XG4gICAgICAgIH0gLy8gVHJhaWxzIGFyZW4ndCBkb25lIHVudGlsIHRoZWlyIHBhcmVudHMgY29uY2x1ZGVcblxuXG4gICAgICAgIGlmIChpc0FuaW1hdGVkICYmICFjb25maWcudG9WYWx1ZXNbdmFsSWR4XS5kb25lKSBlbmRPZkFuaW1hdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChlbmRPZkFuaW1hdGlvbikge1xuICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGVuZCB1cCB3aXRoIGEgcm91bmQgdmFsdWVcbiAgICAgICAgICBpZiAoYW5pbWF0aW9uLnZhbHVlICE9PSB0bykgcG9zaXRpb24gPSB0bztcbiAgICAgICAgICBhbmltYXRpb24uZG9uZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpc0RvbmUgPSBmYWxzZTtcblxuICAgICAgICBhbmltYXRpb24udXBkYXRlVmFsdWUocG9zaXRpb24pO1xuICAgICAgICBhbmltYXRpb24ubGFzdFBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICB9IC8vIEtlZXAgdHJhY2sgb2YgdXBkYXRlZCB2YWx1ZXMgb25seSB3aGVuIG5lY2Vzc2FyeVxuXG5cbiAgICAgIGlmIChjb250cm9sbGVyLnByb3BzLm9uRnJhbWUgfHwgIWNvbnRyb2xsZXIucHJvcHMubmF0aXZlKSBjb250cm9sbGVyLmFuaW1hdGVkUHJvcHNbY29uZmlnLm5hbWVdID0gY29uZmlnLmludGVycG9sYXRpb24uZ2V0VmFsdWUoKTtcbiAgICB9IC8vIFVwZGF0ZSBjYWxsYmFja3MgaW4gdGhlIGVuZCBvZiB0aGUgZnJhbWVcblxuXG4gICAgaWYgKGNvbnRyb2xsZXIucHJvcHMub25GcmFtZSB8fCAhY29udHJvbGxlci5wcm9wcy5uYXRpdmUpIHtcbiAgICAgIGlmICghY29udHJvbGxlci5wcm9wcy5uYXRpdmUgJiYgY29udHJvbGxlci5vblVwZGF0ZSkgY29udHJvbGxlci5vblVwZGF0ZSgpO1xuICAgICAgaWYgKGNvbnRyb2xsZXIucHJvcHMub25GcmFtZSkgY29udHJvbGxlci5wcm9wcy5vbkZyYW1lKGNvbnRyb2xsZXIuYW5pbWF0ZWRQcm9wcyk7XG4gICAgfSAvLyBFaXRoZXIgY2FsbCBvbkVuZCBvciBuZXh0IGZyYW1lXG5cblxuICAgIGlmIChpc0RvbmUpIHtcbiAgICAgIGNvbnRyb2xsZXJzLmRlbGV0ZShjb250cm9sbGVyKTtcbiAgICAgIGNvbnRyb2xsZXIuZGVib3VuY2VkT25FbmQoe1xuICAgICAgICBmaW5pc2hlZDogdHJ1ZSxcbiAgICAgICAgbm9DaGFuZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBMb29wIG92ZXIgYXMgbG9uZyBhcyB0aGVyZSBhcmUgY29udHJvbGxlcnMgLi4uXG5cblxuICBpZiAoY29udHJvbGxlcnMuc2l6ZSkgcmVxdWVzdEZyYW1lKGZyYW1lTG9vcCk7ZWxzZSBhY3RpdmUgPSBmYWxzZTtcbn07XG5cbmNvbnN0IGFkZENvbnRyb2xsZXIgPSBjb250cm9sbGVyID0+IHtcbiAgaWYgKCFjb250cm9sbGVycy5oYXMoY29udHJvbGxlcikpIHtcbiAgICBjb250cm9sbGVycy5hZGQoY29udHJvbGxlcik7XG4gICAgaWYgKCFhY3RpdmUpIHJlcXVlc3RGcmFtZShmcmFtZUxvb3ApO1xuICAgIGFjdGl2ZSA9IHRydWU7XG4gIH1cbn07XG5cbmNvbnN0IHJlbW92ZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyID0+IHtcbiAgaWYgKGNvbnRyb2xsZXJzLmhhcyhjb250cm9sbGVyKSkge1xuICAgIGNvbnRyb2xsZXJzLmRlbGV0ZShjb250cm9sbGVyKTtcbiAgfVxufTtcblxuY2xhc3MgQ29udHJvbGxlciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzLCBjb25maWcpIHtcbiAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHtcbiAgICAgIGNvbmZpZyA9IHtcbiAgICAgICAgbmF0aXZlOiB0cnVlLFxuICAgICAgICBpbnRlcnBvbGF0ZVRvOiB0cnVlLFxuICAgICAgICBhdXRvU3RhcnQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5nZXRWYWx1ZXMgPSAoKSA9PiB0aGlzLnByb3BzLm5hdGl2ZSA/IHRoaXMuaW50ZXJwb2xhdGlvbnMgOiB0aGlzLmFuaW1hdGVkUHJvcHM7XG5cbiAgICB0aGlzLmRlcGVuZGVudHMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHRoaXMucHJvcHMgPSB7fTtcbiAgICB0aGlzLm1lcmdlZCA9IHt9O1xuICAgIHRoaXMuYW5pbWF0aW9ucyA9IHt9O1xuICAgIHRoaXMuaW50ZXJwb2xhdGlvbnMgPSB7fTtcbiAgICB0aGlzLmFuaW1hdGVkUHJvcHMgPSB7fTtcbiAgICB0aGlzLmNvbmZpZ3MgPSBbXTtcbiAgICB0aGlzLmZyYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGFzdFRpbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy51cGRhdGUoX2V4dGVuZHMoe30sIHByb3BzLCBjb25maWcpKTtcbiAgfVxuXG4gIHVwZGF0ZShwcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywgcHJvcHMpO1xuXG4gICAgbGV0IF9yZWYgPSB0aGlzLnByb3BzLmludGVycG9sYXRlVG8gPyBpbnRlcnBvbGF0ZVRvKHRoaXMucHJvcHMpIDogdGhpcy5wcm9wcyxcbiAgICAgICAgX3JlZiRmcm9tID0gX3JlZi5mcm9tLFxuICAgICAgICBmcm9tID0gX3JlZiRmcm9tID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkZnJvbSxcbiAgICAgICAgX3JlZiR0byA9IF9yZWYudG8sXG4gICAgICAgIHRvID0gX3JlZiR0byA9PT0gdm9pZCAwID8ge30gOiBfcmVmJHRvLFxuICAgICAgICBfcmVmJGNvbmZpZyA9IF9yZWYuY29uZmlnLFxuICAgICAgICBjb25maWcgPSBfcmVmJGNvbmZpZyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJGNvbmZpZyxcbiAgICAgICAgX3JlZiRkZWxheSA9IF9yZWYuZGVsYXksXG4gICAgICAgIGRlbGF5ID0gX3JlZiRkZWxheSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkZGVsYXksXG4gICAgICAgIHJldmVyc2UgPSBfcmVmLnJldmVyc2UsXG4gICAgICAgIGF0dGFjaCA9IF9yZWYuYXR0YWNoLFxuICAgICAgICByZXNldCA9IF9yZWYucmVzZXQsXG4gICAgICAgIGltbWVkaWF0ZSA9IF9yZWYuaW1tZWRpYXRlLFxuICAgICAgICBhdXRvU3RhcnQgPSBfcmVmLmF1dG9TdGFydCxcbiAgICAgICAgcmVmID0gX3JlZi5yZWY7IC8vIFJldmVyc2UgdmFsdWVzIHdoZW4gcmVxdWVzdGVkXG5cblxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICB2YXIgX3JlZjIgPSBbdG8sIGZyb21dO1xuICAgICAgZnJvbSA9IF9yZWYyWzBdO1xuICAgICAgdG8gPSBfcmVmMlsxXTtcbiAgICB9XG5cbiAgICB0aGlzLmhhc0NoYW5nZWQgPSBmYWxzZTsgLy8gQXR0YWNobWVudCBoYW5kbGluZywgdHJhaWxlZCBzcHJpbmdzIGNhbiBcImF0dGFjaFwiIHRoZW1zZWx2ZXMgdG8gYSBwcmV2aW91cyBzcHJpbmdcblxuICAgIGxldCB0YXJnZXQgPSBhdHRhY2ggJiYgYXR0YWNoKHRoaXMpOyAvLyBSZXNldCBtZXJnZWQgcHJvcHMgd2hlbiBuZWNlc3NhcnlcblxuICAgIGxldCBleHRyYSA9IHJlc2V0ID8ge30gOiB0aGlzLm1lcmdlZDsgLy8gVGhpcyB3aWxsIGNvbGxlY3QgYWxsIHByb3BzIHRoYXQgd2VyZSBldmVyIHNldFxuXG4gICAgdGhpcy5tZXJnZWQgPSBfZXh0ZW5kcyh7fSwgZnJvbSwgZXh0cmEsIHRvKTsgLy8gUmVkdWNlcyBpbnB1dCB7IG5hbWU6IHZhbHVlIH0gcGFpcnMgaW50byBhbmltYXRlZCB2YWx1ZXNcblxuICAgIHRoaXMuYW5pbWF0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHRoaXMubWVyZ2VkKS5yZWR1Y2UoKGFjYywgX3JlZjMsIGkpID0+IHtcbiAgICAgIGxldCBuYW1lID0gX3JlZjNbMF0sXG4gICAgICAgICAgdmFsdWUgPSBfcmVmM1sxXTtcbiAgICAgIC8vIElzc3VlIGNhY2hlZCBlbnRyaWVzLCBleGNlcHQgb24gcmVzZXRcbiAgICAgIGxldCBlbnRyeSA9ICFyZXNldCAmJiBhY2NbbmFtZV0gfHwge307IC8vIEZpZ3VyZSBvdXQgd2hhdCB0aGUgdmFsdWUgaXMgc3VwcG9zZWQgdG8gYmVcblxuICAgICAgY29uc3QgaXNOdW1iZXIgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuICAgICAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZS5zdGFydHNXaXRoKCcjJykgJiYgIS9cXGQvLnRlc3QodmFsdWUpICYmICFjb2xvck5hbWVzW3ZhbHVlXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSAhaXNOdW1iZXIgJiYgIWlzU3RyaW5nICYmIEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICAgICAgbGV0IGZyb21WYWx1ZSA9IGZyb21bbmFtZV0gIT09IHVuZGVmaW5lZCA/IGZyb21bbmFtZV0gOiB2YWx1ZTtcbiAgICAgIGxldCB0b1ZhbHVlID0gaXNOdW1iZXIgfHwgaXNBcnJheSA/IHZhbHVlIDogaXNTdHJpbmcgPyB2YWx1ZSA6IDE7XG4gICAgICBsZXQgdG9Db25maWcgPSBjYWxsUHJvcChjb25maWcsIG5hbWUpO1xuICAgICAgaWYgKHRhcmdldCkgdG9WYWx1ZSA9IHRhcmdldC5hbmltYXRpb25zW25hbWVdLnBhcmVudDsgLy8gRGV0ZWN0IGNoYW5nZXMsIGFuaW1hdGVkIHZhbHVlcyB3aWxsIGJlIGNoZWNrZWQgaW4gdGhlIHJhZi1sb29wXG5cbiAgICAgIGlmICh0b0NvbmZpZy5kZWNheSAhPT0gdm9pZCAwIHx8ICFzaGFsbG93RXF1YWwoZW50cnkuY2hhbmdlcywgdmFsdWUpKSB7XG4gICAgICAgIHRoaXMuaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGxldCBwYXJlbnQsIGludGVycG9sYXRpb24kJDE7XG4gICAgICAgIGlmIChpc051bWJlciB8fCBpc1N0cmluZykgcGFyZW50ID0gaW50ZXJwb2xhdGlvbiQkMSA9IGVudHJ5LnBhcmVudCB8fCBuZXcgQW5pbWF0ZWRWYWx1ZShmcm9tVmFsdWUpO2Vsc2UgaWYgKGlzQXJyYXkpIHBhcmVudCA9IGludGVycG9sYXRpb24kJDEgPSBlbnRyeS5wYXJlbnQgfHwgbmV3IEFuaW1hdGVkQXJyYXkoZnJvbVZhbHVlKTtlbHNlIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0gZW50cnkuaW50ZXJwb2xhdGlvbiAmJiBlbnRyeS5pbnRlcnBvbGF0aW9uLmNhbGMoZW50cnkucGFyZW50LnZhbHVlKTtcblxuICAgICAgICAgIGlmIChlbnRyeS5wYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IGVudHJ5LnBhcmVudDtcbiAgICAgICAgICAgIHBhcmVudC5zZXRWYWx1ZSgwLCBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIHBhcmVudCA9IG5ldyBBbmltYXRlZFZhbHVlKDApO1xuXG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgICAgICBvdXRwdXQ6IFtwcmV2ICE9PSB2b2lkIDAgPyBwcmV2IDogZnJvbVZhbHVlLCB2YWx1ZV1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGVudHJ5LmludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24kJDEgPSBlbnRyeS5pbnRlcnBvbGF0aW9uO1xuICAgICAgICAgICAgZW50cnkuaW50ZXJwb2xhdGlvbi51cGRhdGVDb25maWcocmFuZ2UpO1xuICAgICAgICAgIH0gZWxzZSBpbnRlcnBvbGF0aW9uJCQxID0gcGFyZW50LmludGVycG9sYXRlKHJhbmdlKTtcbiAgICAgICAgfSAvLyBTZXQgaW1tZWRpYXRlIHZhbHVlc1xuXG4gICAgICAgIGlmIChjYWxsUHJvcChpbW1lZGlhdGUsIG5hbWUpKSBwYXJlbnQuc2V0VmFsdWUodmFsdWUsIGZhbHNlKTsgLy8gUmVzZXQgYW5pbWF0ZWQgdmFsdWVzXG5cbiAgICAgICAgY29uc3QgYW5pbWF0ZWRWYWx1ZXMgPSB0b0FycmF5KHBhcmVudC5nZXRQYXlsb2FkKCkpO1xuICAgICAgICBhbmltYXRlZFZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHZhbHVlLnByZXBhcmUodGhpcykpO1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGFjYywge1xuICAgICAgICAgIFtuYW1lXTogX2V4dGVuZHMoe30sIGVudHJ5LCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbjogaW50ZXJwb2xhdGlvbiQkMSxcbiAgICAgICAgICAgIGFuaW1hdGVkVmFsdWVzLFxuICAgICAgICAgICAgY2hhbmdlczogdmFsdWUsXG4gICAgICAgICAgICBmcm9tVmFsdWVzOiB0b0FycmF5KHBhcmVudC5nZXRWYWx1ZSgpKSxcbiAgICAgICAgICAgIHRvVmFsdWVzOiB0b0FycmF5KHRhcmdldCA/IHRvVmFsdWUuZ2V0UGF5bG9hZCgpIDogdG9WYWx1ZSksXG4gICAgICAgICAgICBpbW1lZGlhdGU6IGNhbGxQcm9wKGltbWVkaWF0ZSwgbmFtZSksXG4gICAgICAgICAgICBkZWxheTogd2l0aERlZmF1bHQodG9Db25maWcuZGVsYXksIGRlbGF5IHx8IDApLFxuICAgICAgICAgICAgaW5pdGlhbFZlbG9jaXR5OiB3aXRoRGVmYXVsdCh0b0NvbmZpZy52ZWxvY2l0eSwgMCksXG4gICAgICAgICAgICBjbGFtcDogd2l0aERlZmF1bHQodG9Db25maWcuY2xhbXAsIGZhbHNlKSxcbiAgICAgICAgICAgIHByZWNpc2lvbjogd2l0aERlZmF1bHQodG9Db25maWcucHJlY2lzaW9uLCAwLjAxKSxcbiAgICAgICAgICAgIHRlbnNpb246IHdpdGhEZWZhdWx0KHRvQ29uZmlnLnRlbnNpb24sIDE3MCksXG4gICAgICAgICAgICBmcmljdGlvbjogd2l0aERlZmF1bHQodG9Db25maWcuZnJpY3Rpb24sIDI2KSxcbiAgICAgICAgICAgIG1hc3M6IHdpdGhEZWZhdWx0KHRvQ29uZmlnLm1hc3MsIDEpLFxuICAgICAgICAgICAgZHVyYXRpb246IHRvQ29uZmlnLmR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiB3aXRoRGVmYXVsdCh0b0NvbmZpZy5lYXNpbmcsIHQgPT4gdCksXG4gICAgICAgICAgICBkZWNheTogdG9Db25maWcuZGVjYXlcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSByZXR1cm4gYWNjO1xuICAgIH0sIHRoaXMuYW5pbWF0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5oYXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmNvbmZpZ3MgPSBnZXRWYWx1ZXMkMSh0aGlzLmFuaW1hdGlvbnMpO1xuICAgICAgdGhpcy5hbmltYXRlZFByb3BzID0ge307XG4gICAgICB0aGlzLmludGVycG9sYXRpb25zID0ge307XG5cbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmFuaW1hdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uc1trZXldID0gdGhpcy5hbmltYXRpb25zW2tleV0uaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgdGhpcy5hbmltYXRlZFByb3BzW2tleV0gPSB0aGlzLmFuaW1hdGlvbnNba2V5XS5pbnRlcnBvbGF0aW9uLmdldFZhbHVlKCk7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPOiBjbGVhbiB1cCByZWYgaW4gY29udHJvbGxlclxuXG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3RhcnQgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgc3RhcnRbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGlmICghcmVmICYmIChhdXRvU3RhcnQgfHwgc3RhcnQubGVuZ3RoKSkgdGhpcy5zdGFydCguLi5zdGFydCk7XG4gICAgY29uc3Qgb25FbmQgPSBzdGFydFswXSxcbiAgICAgICAgICBvblVwZGF0ZSA9IHN0YXJ0WzFdO1xuICAgIHRoaXMub25FbmQgPSB0eXBlb2Ygb25FbmQgPT09ICdmdW5jdGlvbicgJiYgb25FbmQ7XG4gICAgdGhpcy5vblVwZGF0ZSA9IG9uVXBkYXRlO1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlcygpO1xuICB9XG5cbiAgc3RhcnQob25FbmQsIG9uVXBkYXRlKSB7XG4gICAgdGhpcy5zdGFydFRpbWUgPSBub3coKTtcbiAgICBpZiAodGhpcy5pc0FjdGl2ZSkgdGhpcy5zdG9wKCk7XG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5vbkVuZCA9IHR5cGVvZiBvbkVuZCA9PT0gJ2Z1bmN0aW9uJyAmJiBvbkVuZDtcbiAgICB0aGlzLm9uVXBkYXRlID0gb25VcGRhdGU7XG4gICAgaWYgKHRoaXMucHJvcHMub25TdGFydCkgdGhpcy5wcm9wcy5vblN0YXJ0KCk7XG4gICAgYWRkQ29udHJvbGxlcih0aGlzKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzID0+IHRoaXMucmVzb2x2ZSA9IHJlcyk7XG4gIH1cblxuICBzdG9wKGZpbmlzaGVkKSB7XG4gICAgaWYgKGZpbmlzaGVkID09PSB2b2lkIDApIHtcbiAgICAgIGZpbmlzaGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgY29sbGVjdGVkIGNoYW5nZXMgc2luY2UgdGhlIGFuaW1hdGlvbiBoYXMgYmVlbiBzdG9wcGVkIGNvbGQgdHVya2V5XG4gICAgaWYgKGZpbmlzaGVkKSBnZXRWYWx1ZXMkMSh0aGlzLmFuaW1hdGlvbnMpLmZvckVhY2goYSA9PiBhLmNoYW5nZXMgPSB1bmRlZmluZWQpO1xuICAgIHRoaXMuZGVib3VuY2VkT25FbmQoe1xuICAgICAgZmluaXNoZWRcbiAgICB9KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgcmVtb3ZlQ29udHJvbGxlcih0aGlzKTtcbiAgICB0aGlzLnByb3BzID0ge307XG4gICAgdGhpcy5tZXJnZWQgPSB7fTtcbiAgICB0aGlzLmFuaW1hdGlvbnMgPSB7fTtcbiAgICB0aGlzLmludGVycG9sYXRpb25zID0ge307XG4gICAgdGhpcy5hbmltYXRlZFByb3BzID0ge307XG4gICAgdGhpcy5jb25maWdzID0gW107XG4gIH1cblxuICBkZWJvdW5jZWRPbkVuZChyZXN1bHQpIHtcbiAgICByZW1vdmVDb250cm9sbGVyKHRoaXMpO1xuICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICBjb25zdCBvbkVuZCA9IHRoaXMub25FbmQ7XG4gICAgdGhpcy5vbkVuZCA9IG51bGw7XG4gICAgaWYgKG9uRW5kKSBvbkVuZChyZXN1bHQpO1xuICAgIGlmICh0aGlzLnJlc29sdmUpIHRoaXMucmVzb2x2ZSgpO1xuICAgIHRoaXMucmVzb2x2ZSA9IG51bGw7XG4gIH1cblxufVxuXG5jbGFzcyBBbmltYXRlZFByb3BzIGV4dGVuZHMgQW5pbWF0ZWRPYmplY3RXaXRoQ2hpbGRyZW4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcywgY2FsbGJhY2spIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChwcm9wcy5zdHlsZSkgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIHN0eWxlOiBjcmVhdGVBbmltYXRlZFN0eWxlKHByb3BzLnN0eWxlKVxuICAgIH0pO1xuICAgIHRoaXMucGF5bG9hZCA9IHByb3BzO1xuICAgIHRoaXMudXBkYXRlID0gY2FsbGJhY2s7XG4gICAgdGhpcy5hdHRhY2goKTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFuaW1hdGVkQ29tcG9uZW50KENvbXBvbmVudCkge1xuICBjbGFzcyBBbmltYXRlZENvbXBvbmVudCBleHRlbmRzIFJlYWN0X19kZWZhdWx0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgIHN1cGVyKCk7XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm5vZGUpIHtcbiAgICAgICAgICBjb25zdCBkaWRVcGRhdGUgPSBhcHBseUFuaW1hdGVkVmFsdWVzLmZuKHRoaXMubm9kZSwgdGhpcy5wcm9wc0FuaW1hdGVkLmdldEFuaW1hdGVkVmFsdWUoKSwgdGhpcyk7XG4gICAgICAgICAgaWYgKGRpZFVwZGF0ZSA9PT0gZmFsc2UpIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5hdHRhY2hQcm9wcyhwcm9wcyk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzQW5pbWF0ZWQgJiYgdGhpcy5wcm9wc0FuaW1hdGVkLmRldGFjaCgpO1xuICAgIH1cblxuICAgIHNldE5hdGl2ZVByb3BzKHByb3BzKSB7XG4gICAgICBjb25zdCBkaWRVcGRhdGUgPSBhcHBseUFuaW1hdGVkVmFsdWVzLmZuKHRoaXMubm9kZSwgcHJvcHMsIHRoaXMpO1xuICAgICAgaWYgKGRpZFVwZGF0ZSA9PT0gZmFsc2UpIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICB9IC8vIFRoZSBzeXN0ZW0gaXMgYmVzdCBkZXNpZ25lZCB3aGVuIHNldE5hdGl2ZVByb3BzIGlzIGltcGxlbWVudGVkLiBJdCBpc1xuICAgIC8vIGFibGUgdG8gYXZvaWQgcmUtcmVuZGVyaW5nIGFuZCBkaXJlY3RseSBzZXQgdGhlIGF0dHJpYnV0ZXMgdGhhdFxuICAgIC8vIGNoYW5nZWQuIEhvd2V2ZXIsIHNldE5hdGl2ZVByb3BzIGNhbiBvbmx5IGJlIGltcGxlbWVudGVkIG9uIGxlYWZcbiAgICAvLyBuYXRpdmUgY29tcG9uZW50cy4gSWYgeW91IHdhbnQgdG8gYW5pbWF0ZSBhIGNvbXBvc2l0ZSBjb21wb25lbnQsIHlvdVxuICAgIC8vIG5lZWQgdG8gcmUtcmVuZGVyIGl0LiBJbiB0aGlzIGNhc2UsIHdlIGhhdmUgYSBmYWxsYmFjayB0aGF0IHVzZXNcbiAgICAvLyBmb3JjZVVwZGF0ZS5cblxuXG4gICAgYXR0YWNoUHJvcHMoX3JlZikge1xuICAgICAgbGV0IGZvcndhcmRSZWYgPSBfcmVmLmZvcndhcmRSZWYsXG4gICAgICAgICAgbmV4dFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgW1wiZm9yd2FyZFJlZlwiXSk7XG5cbiAgICAgIGNvbnN0IG9sZFByb3BzQW5pbWF0ZWQgPSB0aGlzLnByb3BzQW5pbWF0ZWQ7XG4gICAgICB0aGlzLnByb3BzQW5pbWF0ZWQgPSBuZXcgQW5pbWF0ZWRQcm9wcyhuZXh0UHJvcHMsIHRoaXMuY2FsbGJhY2spOyAvLyBXaGVuIHlvdSBjYWxsIGRldGFjaCwgaXQgcmVtb3ZlcyB0aGUgZWxlbWVudCBmcm9tIHRoZSBwYXJlbnQgbGlzdFxuICAgICAgLy8gb2YgY2hpbGRyZW4uIElmIGl0IGdvZXMgdG8gMCwgdGhlbiB0aGUgcGFyZW50IGFsc28gZGV0YWNoZXMgaXRzZWxmXG4gICAgICAvLyBhbmQgc28gb24uXG4gICAgICAvLyBBbiBvcHRpbWl6YXRpb24gaXMgdG8gYXR0YWNoIHRoZSBuZXcgZWxlbWVudHMgYW5kIFRIRU4gZGV0YWNoIHRoZSBvbGRcbiAgICAgIC8vIG9uZXMgaW5zdGVhZCBvZiBkZXRhY2hpbmcgYW5kIFRIRU4gYXR0YWNoaW5nLlxuICAgICAgLy8gVGhpcyB3YXkgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSBpc24ndCB0byBnbyB0byAwIGFuZCB0cmlnZ2VyXG4gICAgICAvLyB0aGlzIGV4cGVuc2l2ZSByZWN1cnNpdmUgZGV0YWNoaW5nIHRvIHRoZW4gcmUtYXR0YWNoIGV2ZXJ5dGhpbmcgb25cbiAgICAgIC8vIHRoZSB2ZXJ5IG5leHQgb3BlcmF0aW9uLlxuXG4gICAgICBvbGRQcm9wc0FuaW1hdGVkICYmIG9sZFByb3BzQW5pbWF0ZWQuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKHByb3BzKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgICAgICAgbmV4dFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UocHJvcHMsIFtcInN0eWxlXCJdKTtcblxuICAgICAgY29uc3QgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgY3VycmVudFN0eWxlID0gX3RoaXMkcHJvcHMuc3R5bGUsXG4gICAgICAgICAgICBjdXJyZW50UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wcywgW1wic3R5bGVcIl0pO1xuXG4gICAgICBpZiAoIXNoYWxsb3dFcXVhbChjdXJyZW50UHJvcHMsIG5leHRQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChjdXJyZW50U3R5bGUsIHN0eWxlKSkge1xuICAgICAgICB0aGlzLmF0dGFjaFByb3BzKHByb3BzKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCBfdGhpcyRwcm9wc0FuaW1hdGVkJGcgPSB0aGlzLnByb3BzQW5pbWF0ZWQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIHNjcm9sbFRvcCA9IF90aGlzJHByb3BzQW5pbWF0ZWQkZy5zY3JvbGxUb3AsXG4gICAgICAgICAgICBzY3JvbGxMZWZ0ID0gX3RoaXMkcHJvcHNBbmltYXRlZCRnLnNjcm9sbExlZnQsXG4gICAgICAgICAgICBhbmltYXRlZFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3RoaXMkcHJvcHNBbmltYXRlZCRnLCBbXCJzY3JvbGxUb3BcIiwgXCJzY3JvbGxMZWZ0XCJdKTtcblxuICAgICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgYW5pbWF0ZWRQcm9wcywge1xuICAgICAgICByZWY6IG5vZGUgPT4gdGhpcy5ub2RlID0gaGFuZGxlUmVmKG5vZGUsIHRoaXMucHJvcHMuZm9yd2FyZFJlZilcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgfVxuXG4gIHJldHVybiBSZWFjdF9fZGVmYXVsdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KEFuaW1hdGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBmb3J3YXJkUmVmOiByZWZcbiAgfSkpKTtcbn1cblxuY29uc3QgY29uZmlnID0ge1xuICBkZWZhdWx0OiB7XG4gICAgdGVuc2lvbjogMTcwLFxuICAgIGZyaWN0aW9uOiAyNlxuICB9LFxuICBnZW50bGU6IHtcbiAgICB0ZW5zaW9uOiAxMjAsXG4gICAgZnJpY3Rpb246IDE0XG4gIH0sXG4gIHdvYmJseToge1xuICAgIHRlbnNpb246IDE4MCxcbiAgICBmcmljdGlvbjogMTJcbiAgfSxcbiAgc3RpZmY6IHtcbiAgICB0ZW5zaW9uOiAyMTAsXG4gICAgZnJpY3Rpb246IDIwXG4gIH0sXG4gIHNsb3c6IHtcbiAgICB0ZW5zaW9uOiAyODAsXG4gICAgZnJpY3Rpb246IDYwXG4gIH0sXG4gIG1vbGFzc2VzOiB7XG4gICAgdGVuc2lvbjogMjgwLFxuICAgIGZyaWN0aW9uOiAxMjBcbiAgfVxufTtcblxuY2xhc3MgU3ByaW5nIGV4dGVuZHMgUmVhY3RfX2RlZmF1bHQuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbGFzdFByb3BzOiB7XG4gICAgICAgIGZyb206IHt9LFxuICAgICAgICB0bzoge31cbiAgICAgIH0sXG4gICAgICBwcm9wc0NoYW5nZWQ6IGZhbHNlLFxuICAgICAgaW50ZXJuYWw6IGZhbHNlXG4gICAgfTtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihudWxsLCBudWxsKTtcbiAgICB0aGlzLmRpZFVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGlkSW5qZWN0ID0gZmFsc2U7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG5cbiAgICB0aGlzLnN0YXJ0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgbGV0IHdhc01vdW50ZWQgPSB0aGlzLm1vdW50ZWQ7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIuc3RhcnQocHJvcHMgPT4gdGhpcy5maW5pc2goX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgIHdhc01vdW50ZWRcbiAgICAgIH0pKSwgdGhpcy51cGRhdGUpO1xuICAgIH07XG5cbiAgICB0aGlzLnN0b3AgPSAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuc3RvcCh0cnVlKTtcblxuICAgIHRoaXMudXBkYXRlID0gKCkgPT4gdGhpcy5tb3VudGVkICYmIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICB9KTtcblxuICAgIHRoaXMuZmluaXNoID0gKF9yZWYpID0+IHtcbiAgICAgIGxldCBmaW5pc2hlZCA9IF9yZWYuZmluaXNoZWQsXG4gICAgICAgICAgbm9DaGFuZ2UgPSBfcmVmLm5vQ2hhbmdlLFxuICAgICAgICAgIHdhc01vdW50ZWQgPSBfcmVmLndhc01vdW50ZWQ7XG4gICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMubW91bnRlZCAmJiBmaW5pc2hlZCkge1xuICAgICAgICAvLyBPbmx5IGNhbGwgb25SZXN0IGlmIGVpdGhlciB3ZSAqd2VyZSogbW91bnRlZCwgb3Igd2hlbiB0aGVyZSB3ZXJlIGNoYW5nZXNcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXN0ICYmICh3YXNNb3VudGVkIHx8ICFub0NoYW5nZSkpIHRoaXMucHJvcHMub25SZXN0KHRoaXMuY29udHJvbGxlci5tZXJnZWQpOyAvLyBSZXN0b3JlIGVuZC1zdGF0ZVxuXG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQgJiYgdGhpcy5kaWRJbmplY3QpIHtcbiAgICAgICAgICB0aGlzLmFmdGVySW5qZWN0ID0gY29udmVydFZhbHVlcyh0aGlzLnByb3BzKTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gLy8gSWYgd2UgaGF2ZSBhbiBpbmplY3Qgb3IgdmFsdWVzIHRvIGFwcGx5IGFmdGVyIHRoZSBhbmltYXRpb24gd2UgcGluZyBoZXJlXG5cblxuICAgICAgICBpZiAodGhpcy5tb3VudGVkICYmICh0aGlzLmRpZEluamVjdCB8fCB0aGlzLnByb3BzLmFmdGVyKSkgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlkSW5qZWN0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIGNvbXBvbmVudERpZFVwZGF0ZSBpc24ndCBjYWxsZWQgb24gbW91bnQsIHdlIGNhbGwgaXQgaGVyZSB0byBzdGFydCBhbmltYXRpbmdcbiAgICB0aGlzLmNvbXBvbmVudERpZFVwZGF0ZSgpO1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAvLyBTdG9wIGFsbCBvbmdvaW5nIGFuaW10aW9uc1xuICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RvcCgpO1xuICB9XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICBsZXQgaW50ZXJuYWwgPSBfcmVmMi5pbnRlcm5hbCxcbiAgICAgICAgbGFzdFByb3BzID0gX3JlZjIubGFzdFByb3BzO1xuICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYSB0ZXN0IGFnYWluc3QgcHJvcHMgdGhhdCBjb3VsZCBhbHRlciB0aGUgYW5pbWF0aW9uXG4gICAgY29uc3QgZnJvbSA9IHByb3BzLmZyb20sXG4gICAgICAgICAgdG8gPSBwcm9wcy50byxcbiAgICAgICAgICByZXNldCA9IHByb3BzLnJlc2V0LFxuICAgICAgICAgIGZvcmNlID0gcHJvcHMuZm9yY2U7XG4gICAgY29uc3QgcHJvcHNDaGFuZ2VkID0gIXNoYWxsb3dFcXVhbCh0bywgbGFzdFByb3BzLnRvKSB8fCAhc2hhbGxvd0VxdWFsKGZyb20sIGxhc3RQcm9wcy5mcm9tKSB8fCByZXNldCAmJiAhaW50ZXJuYWwgfHwgZm9yY2UgJiYgIWludGVybmFsO1xuICAgIHJldHVybiB7XG4gICAgICBwcm9wc0NoYW5nZWQsXG4gICAgICBsYXN0UHJvcHM6IHByb3BzLFxuICAgICAgaW50ZXJuYWw6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgY29uc3QgcHJvcHNDaGFuZ2VkID0gdGhpcy5zdGF0ZS5wcm9wc0NoYW5nZWQ7IC8vIEluamVjdCBwaGFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEhhbmRsZSBpbmplY3RlZCBmcmFtZXMsIGZvciBpbnN0YW5jZSB0YXJnZXRzL3dlYi9maXgtYXV0b1xuICAgIC8vIEFuIGluamVjdCB3aWxsIHJldHVybiBhbiBpbnRlcm1lZGlhcnkgUmVhY3Qgbm9kZSB3aGljaCBtZWFzdXJlcyBpdHNlbGYgb3V0XG4gICAgLy8gLi4gYW5kIHJldHVybnMgYSBjYWxsYmFjayB3aGVuIHRoZSB2YWx1ZXMgc291Z2h0IGFmdGVyIGFyZSByZWFkeSwgdXN1YWxseSBcImF1dG9cIi5cblxuICAgIGlmICh0aGlzLnByb3BzLmluamVjdCAmJiBwcm9wc0NoYW5nZWQgJiYgIXRoaXMuaW5qZWN0UHJvcHMpIHtcbiAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5wcm9wcy5pbmplY3QodGhpcy5wcm9wcywgaW5qZWN0UHJvcHMgPT4ge1xuICAgICAgICAvLyBUaGUgaW5qZWN0IGZyYW1lIGhhcyByZW5kZXJlZCwgbm93IGxldCdzIHVwZGF0ZSBhbmltYXRpb25zLi4uXG4gICAgICAgIHRoaXMuaW5qZWN0UHJvcHMgPSBpbmplY3RQcm9wcztcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTsgLy8gUmVuZGVyIG91dCBpbmplY3RlZCBmcmFtZVxuXG4gICAgICBpZiAoZnJhbWUpIHJldHVybiBmcmFtZTtcbiAgICB9IC8vIFVwZGF0ZSBwaGFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICBpZiAodGhpcy5pbmplY3RQcm9wcyB8fCBwcm9wc0NoYW5nZWQpIHtcbiAgICAgIC8vIFdlIGNhbiBwb3RlbnRpYWxseSBjYXVzZSBzZXRTdGF0ZSwgYnV0IHdlJ3JlIGluc2lkZSByZW5kZXIsIHRoZSBmbGFnIHByZXZlbnRzIHRoYXRcbiAgICAgIHRoaXMuZGlkSW5qZWN0ID0gZmFsc2U7IC8vIFVwZGF0ZSBhbmltYXRpb25zLCB0aGlzIHR1cm5zIGZyb20vdG8gcHJvcHMgaW50byBBbmltYXRlZFZhbHVlc1xuICAgICAgLy8gQW4gdXBkYXRlIGNhbiBvY2N1ciBvbiBpbmplY3RlZCBwcm9wcywgb3Igd2hlbiBvd24tcHJvcHMgaGF2ZSBjaGFuZ2VkLlxuXG4gICAgICBpZiAodGhpcy5pbmplY3RQcm9wcykge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIudXBkYXRlKHRoaXMuaW5qZWN0UHJvcHMpOyAvLyBkaWRJbmplY3QgaXMgbmVlZGVkLCBiZWNhdXNlIHRoZXJlIHdpbGwgYmUgYSAzcmQgc3RhZ2UsIHdoZXJlIHRoZSBvcmlnaW5hbCB2YWx1ZXNcbiAgICAgICAgLy8gLi4gd2lsbCBiZSByZXN0b3JlZCBhZnRlciB0aGUgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLiBXaGVuIHNvbWVvbmUgYW5pbWF0ZXMgdG93YXJkc1xuICAgICAgICAvLyAuLiBcImF1dG9cIiwgdGhlIGVuZC1yZXN1bHQgc2hvdWxkIGJlIFwiYXV0b1wiLCBub3QgXCIxOTk5cHhcIiwgd2hpY2ggd291bGQgYmxvY2sgbmVzdGVkXG4gICAgICAgIC8vIC4uIGhlaWdodC93aWR0aCBjaGFuZ2VzLlxuXG4gICAgICAgIHRoaXMuZGlkSW5qZWN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHNDaGFuZ2VkKSB0aGlzLmNvbnRyb2xsZXIudXBkYXRlKHRoaXMucHJvcHMpOyAvLyBGbGFnIGFuIHVwZGF0ZSB0aGF0IG9jY3VyZWQsIGNvbXBvbmVudERpZFVwZGF0ZSB3aWxsIHN0YXJ0IHRoZSBhbmltYXRpb24gbGF0ZXIgb25cblxuXG4gICAgICB0aGlzLmRpZFVwZGF0ZSA9IHRydWU7XG4gICAgICB0aGlzLmFmdGVySW5qZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5pbmplY3RQcm9wcyA9IHVuZGVmaW5lZDtcbiAgICB9IC8vIFJlbmRlciBwaGFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFJlbmRlciBvdXQgcmF3IHZhbHVlcyBvciBBbmltYXRlZFZhbHVlcyBkZXBlbmRpbmcgb24gXCJuYXRpdmVcIlxuXG5cbiAgICBsZXQgdmFsdWVzID0gX2V4dGVuZHMoe30sIHRoaXMuY29udHJvbGxlci5nZXRWYWx1ZXMoKSwgdGhpcy5hZnRlckluamVjdCk7XG5cbiAgICBpZiAodGhpcy5maW5pc2hlZCkgdmFsdWVzID0gX2V4dGVuZHMoe30sIHZhbHVlcywgdGhpcy5wcm9wcy5hZnRlcik7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlcykubGVuZ3RoID8gY2hpbGRyZW4odmFsdWVzKSA6IG51bGw7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgLy8gVGhlIGFuaW1hdGlvbiBoYXMgdG8gc3RhcnQgKmFmdGVyKiByZW5kZXIsIHNpbmNlIGF0IHRoYXQgcG9pbnQgdGhlIHNjZW5lXG4gICAgLy8gLi4gZ3JhcGggc2hvdWxkIGJlIGVzdGFibGlzaGVkLCBzbyB3ZSBkbyBpdCBoZXJlLiBVbmZvcnR1bmF0ZWxseSwgbm9uLW5hdGl2ZVxuICAgIC8vIC4uIGFuaW1hdGlvbnMgYXMgd2VsbCBhcyBcImF1dG9cIi1pbmplY3RzIGNhbGwgZm9yY2VVcGRhdGUsIHNvIGl0J3MgY2F1c2luZyBhIGxvb3AuXG4gICAgLy8gLi4gZGlkVXBkYXRlIHByZXZlbnRzIHRoYXQgYXMgaXQgZ2V0cyBzZXQgb25seSBvbiBwcm9wIGNoYW5nZXMuXG4gICAgaWYgKHRoaXMuZGlkVXBkYXRlKSB0aGlzLnN0YXJ0KCk7XG4gICAgdGhpcy5kaWRVcGRhdGUgPSBmYWxzZTtcbiAgfVxuXG59XG5TcHJpbmcuZGVmYXVsdFByb3BzID0ge1xuICBmcm9tOiB7fSxcbiAgdG86IHt9LFxuICBjb25maWc6IGNvbmZpZy5kZWZhdWx0LFxuICBuYXRpdmU6IGZhbHNlLFxuICBpbW1lZGlhdGU6IGZhbHNlLFxuICByZXNldDogZmFsc2UsXG4gIGZvcmNlOiBmYWxzZSxcbiAgaW5qZWN0OiBidWdmaXhlc1xufTtcblxuY2xhc3MgVHJhaWwgZXh0ZW5kcyBSZWFjdF9fZGVmYXVsdC5QdXJlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLmZpcnN0ID0gdHJ1ZTtcbiAgICB0aGlzLmluc3RhbmNlcyA9IG5ldyBTZXQoKTtcblxuICAgIHRoaXMuaG9vayA9IChpbnN0YW5jZSwgaW5kZXgsIGxlbmd0aCwgcmV2ZXJzZSkgPT4ge1xuICAgICAgLy8gQWRkIGluc3RhbmNlIHRvIHNldFxuICAgICAgdGhpcy5pbnN0YW5jZXMuYWRkKGluc3RhbmNlKTsgLy8gUmV0dXJuIHVuZGVmaW5lZCBvbiB0aGUgZmlyc3QgaW5kZXggYW5kIGZyb20gdGhlbiBvbiB0aGUgcHJldmlvdXMgaW5zdGFuY2VcblxuICAgICAgaWYgKHJldmVyc2UgPyBpbmRleCA9PT0gbGVuZ3RoIC0gMSA6IGluZGV4ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO2Vsc2UgcmV0dXJuIEFycmF5LmZyb20odGhpcy5pbnN0YW5jZXMpW3JldmVyc2UgPyBpbmRleCArIDEgOiBpbmRleCAtIDFdO1xuICAgIH07XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGl0ZW1zID0gX3RoaXMkcHJvcHMuaXRlbXMsXG4gICAgICAgICAgX2NoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgX3RoaXMkcHJvcHMkZnJvbSA9IF90aGlzJHByb3BzLmZyb20sXG4gICAgICAgICAgZnJvbSA9IF90aGlzJHByb3BzJGZyb20gPT09IHZvaWQgMCA/IHt9IDogX3RoaXMkcHJvcHMkZnJvbSxcbiAgICAgICAgICBpbml0aWFsID0gX3RoaXMkcHJvcHMuaW5pdGlhbCxcbiAgICAgICAgICByZXZlcnNlID0gX3RoaXMkcHJvcHMucmV2ZXJzZSxcbiAgICAgICAgICBrZXlzID0gX3RoaXMkcHJvcHMua2V5cyxcbiAgICAgICAgICBkZWxheSA9IF90aGlzJHByb3BzLmRlbGF5LFxuICAgICAgICAgIG9uUmVzdCA9IF90aGlzJHByb3BzLm9uUmVzdCxcbiAgICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzLCBbXCJpdGVtc1wiLCBcImNoaWxkcmVuXCIsIFwiZnJvbVwiLCBcImluaXRpYWxcIiwgXCJyZXZlcnNlXCIsIFwia2V5c1wiLCBcImRlbGF5XCIsIFwib25SZXN0XCJdKTtcblxuICAgIGNvbnN0IGFycmF5ID0gdG9BcnJheShpdGVtcyk7XG4gICAgcmV0dXJuIHRvQXJyYXkoYXJyYXkpLm1hcCgoaXRlbSwgaSkgPT4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChTcHJpbmcsIF9leHRlbmRzKHtcbiAgICAgIG9uUmVzdDogaSA9PT0gMCA/IG9uUmVzdCA6IG51bGwsXG4gICAgICBrZXk6IHR5cGVvZiBrZXlzID09PSAnZnVuY3Rpb24nID8ga2V5cyhpdGVtKSA6IHRvQXJyYXkoa2V5cylbaV0sXG4gICAgICBmcm9tOiB0aGlzLmZpcnN0ICYmIGluaXRpYWwgIT09IHZvaWQgMCA/IGluaXRpYWwgfHwge30gOiBmcm9tXG4gICAgfSwgcHJvcHMsIHtcbiAgICAgIGRlbGF5OiBpID09PSAwICYmIGRlbGF5IHx8IHVuZGVmaW5lZCxcbiAgICAgIGF0dGFjaDogaW5zdGFuY2UgPT4gdGhpcy5ob29rKGluc3RhbmNlLCBpLCBhcnJheS5sZW5ndGgsIHJldmVyc2UpLFxuICAgICAgY2hpbGRyZW46IHByb3BzID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBfY2hpbGRyZW4oaXRlbSwgaSk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkID8gY2hpbGQocHJvcHMpIDogbnVsbDtcbiAgICAgIH1cbiAgICB9KSkpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHRoaXMuZmlyc3QgPSBmYWxzZTtcbiAgICBpZiAocHJldlByb3BzLml0ZW1zICE9PSB0aGlzLnByb3BzLml0ZW1zKSB0aGlzLmluc3RhbmNlcy5jbGVhcigpO1xuICB9XG5cbn1cblRyYWlsLmRlZmF1bHRQcm9wcyA9IHtcbiAga2V5czogaXRlbSA9PiBpdGVtXG59O1xuXG5jb25zdCBERUZBVUxUID0gJ19fZGVmYXVsdCc7XG5cbmNsYXNzIEtleWZyYW1lc0ltcGwgZXh0ZW5kcyBSZWFjdF9fZGVmYXVsdC5QdXJlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICBfdGhpcyA9IHRoaXM7XG4gICAgdGhpcy5ndWlkID0gMDtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgcHJvcHM6IHt9LFxuICAgICAgcmVzb2x2ZTogKCkgPT4gbnVsbCxcbiAgICAgIGxhc3Q6IHRydWUsXG4gICAgICBpbmRleDogMFxuICAgIH07XG5cbiAgICB0aGlzLm5leHQgPSBmdW5jdGlvbiAocHJvcHMsIGxhc3QsIGluZGV4KSB7XG4gICAgICBpZiAobGFzdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGxhc3QgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBfdGhpcy5tb3VudGVkICYmIF90aGlzLnNldFN0YXRlKHN0YXRlID0+ICh7XG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICBsYXN0LFxuICAgICAgICAgIGluZGV4XG4gICAgICAgIH0pLCAoKSA9PiBfdGhpcy5ydW5uaW5nID0gZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgdGhpcy5jb21wb25lbnREaWRVcGRhdGUoe30pO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldmlvdXMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGNvbnN0IF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBzdGF0ZXMgPSBfdGhpcyRwcm9wcy5zdGF0ZXMsXG4gICAgICAgICAgZiA9IF90aGlzJHByb3BzLmZpbHRlcixcbiAgICAgICAgICBzdGF0ZSA9IF90aGlzJHByb3BzLnN0YXRlO1xuXG4gICAgaWYgKHByZXZpb3VzLnN0YXRlICE9PSB0aGlzLnByb3BzLnN0YXRlIHx8IHRoaXMucHJvcHMucmVzZXQgJiYgIXRoaXMucnVubmluZyB8fCAhc2hhbGxvd0VxdWFsKHN0YXRlc1tzdGF0ZV0sIHByZXZpb3VzLnN0YXRlc1twcmV2aW91cy5zdGF0ZV0pKSB7XG4gICAgICBpZiAoc3RhdGVzICYmIHN0YXRlICYmIHN0YXRlc1tzdGF0ZV0pIHtcbiAgICAgICAgY29uc3QgbG9jYWxJZCA9ICsrdGhpcy5ndWlkO1xuICAgICAgICBjb25zdCBzbG90cyA9IHN0YXRlc1tzdGF0ZV07XG5cbiAgICAgICAgaWYgKHNsb3RzKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2xvdHMpKSB7XG4gICAgICAgICAgICBsZXQgcSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGxldCBpbmRleCA9IGk7XG4gICAgICAgICAgICAgIGxldCBzbG90ID0gc2xvdHNbaW5kZXhdO1xuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGluZGV4ID09PSBzbG90cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICBxID0gcS50aGVuKCgpID0+IGxvY2FsSWQgPT09IHRoaXMuZ3VpZCAmJiB0aGlzLm5leHQoZihzbG90KSwgbGFzdCwgaW5kZXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzbG90cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICAgIHNsb3RzKCAvLyBuZXh0XG4gICAgICAgICAgICBmdW5jdGlvbiAocHJvcHMsIGxhc3QpIHtcbiAgICAgICAgICAgICAgaWYgKGxhc3QgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIGxhc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBsb2NhbElkID09PSBfdGhpczIuZ3VpZCAmJiBfdGhpczIubmV4dChmKHByb3BzKSwgbGFzdCwgaW5kZXgrKyk7XG4gICAgICAgICAgICB9LCAvLyBjYW5jZWxcbiAgICAgICAgICAgICgpID0+IHJlcXVlc3RGcmFtZSgoKSA9PiB0aGlzLmluc3RhbmNlICYmIHRoaXMuaW5zdGFuY2Uuc3RvcCgpKSwgLy8gb3ducHJvcHNcbiAgICAgICAgICAgIHRoaXMucHJvcHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHQoZihzdGF0ZXNbc3RhdGVdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBwcm9wcyA9IF90aGlzJHN0YXRlLnByb3BzLFxuICAgICAgICAgIHJlc29sdmUgPSBfdGhpcyRzdGF0ZS5yZXNvbHZlLFxuICAgICAgICAgIGxhc3QgPSBfdGhpcyRzdGF0ZS5sYXN0LFxuICAgICAgICAgIGluZGV4ID0gX3RoaXMkc3RhdGUuaW5kZXg7XG4gICAgaWYgKCFwcm9wcyB8fCBPYmplY3Qua2V5cyhwcm9wcykubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBzdGF0ZSA9IF90aGlzJHByb3BzMi5zdGF0ZSxcbiAgICAgICAgZmlsdGVyID0gX3RoaXMkcHJvcHMyLmZpbHRlcixcbiAgICAgICAgc3RhdGVzID0gX3RoaXMkcHJvcHMyLnN0YXRlcyxcbiAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHMyLmNvbmZpZyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3RoaXMkcHJvcHMyLnByaW1pdGl2ZSxcbiAgICAgICAgX29uUmVzdCA9IF90aGlzJHByb3BzMi5vblJlc3QsXG4gICAgICAgIGZvcndhcmRSZWYgPSBfdGhpcyRwcm9wczIuZm9yd2FyZFJlZixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzMiwgW1wic3RhdGVcIiwgXCJmaWx0ZXJcIiwgXCJzdGF0ZXNcIiwgXCJjb25maWdcIiwgXCJwcmltaXRpdmVcIiwgXCJvblJlc3RcIiwgXCJmb3J3YXJkUmVmXCJdKTsgLy8gQXJyYXllZCBjb25maWdzIG5lZWQgYW4gaW5kZXggdG8gcHJvY2Vzc1xuXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcpKSBjb25maWcgPSBjb25maWdbaW5kZXhdO1xuICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgICAgcmVmOiBfcmVmID0+IHRoaXMuaW5zdGFuY2UgPSBoYW5kbGVSZWYoX3JlZiwgZm9yd2FyZFJlZiksXG4gICAgICBjb25maWc6IGNvbmZpZ1xuICAgIH0sIHJlc3QsIHByb3BzLCB7XG4gICAgICBvblJlc3Q6IGFyZ3MgPT4ge1xuICAgICAgICByZXNvbHZlKGFyZ3MpO1xuICAgICAgICBpZiAoX29uUmVzdCAmJiBsYXN0KSBfb25SZXN0KGFyZ3MpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG59XG5cbktleWZyYW1lc0ltcGwuZGVmYXVsdFByb3BzID0ge1xuICBzdGF0ZTogREVGQVVMVFxufTtcbmNvbnN0IEtleWZyYW1lcyA9IFJlYWN0X19kZWZhdWx0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoS2V5ZnJhbWVzSW1wbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gIGZvcndhcmRSZWY6IHJlZlxufSkpKTtcblxuS2V5ZnJhbWVzLmNyZWF0ZSA9IHByaW1pdGl2ZSA9PiBmdW5jdGlvbiAoc3RhdGVzLCBmaWx0ZXIpIHtcbiAgaWYgKGZpbHRlciA9PT0gdm9pZCAwKSB7XG4gICAgZmlsdGVyID0gc3RhdGVzID0+IHN0YXRlcztcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdGVzID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkoc3RhdGVzKSkgc3RhdGVzID0ge1xuICAgIFtERUZBVUxUXTogc3RhdGVzXG4gIH07XG4gIHJldHVybiBwcm9wcyA9PiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KEtleWZyYW1lc0ltcGwsIF9leHRlbmRzKHtcbiAgICBwcmltaXRpdmU6IHByaW1pdGl2ZSxcbiAgICBzdGF0ZXM6IHN0YXRlcyxcbiAgICBmaWx0ZXI6IGZpbHRlclxuICB9LCBwcm9wcykpO1xufTtcblxuS2V5ZnJhbWVzLlNwcmluZyA9IHN0YXRlcyA9PiBLZXlmcmFtZXMuY3JlYXRlKFNwcmluZykoc3RhdGVzLCBpbnRlcnBvbGF0ZVRvKTtcblxuS2V5ZnJhbWVzLlRyYWlsID0gc3RhdGVzID0+IEtleWZyYW1lcy5jcmVhdGUoVHJhaWwpKHN0YXRlcywgaW50ZXJwb2xhdGVUbyk7XG5cbmxldCBndWlkID0gMDtcblxubGV0IGdldCA9IHByb3BzID0+IHtcbiAgbGV0IGl0ZW1zID0gcHJvcHMuaXRlbXMsXG4gICAgICBrZXlzID0gcHJvcHMua2V5cyxcbiAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgW1wiaXRlbXNcIiwgXCJrZXlzXCJdKTtcblxuICBpdGVtcyA9IHRvQXJyYXkoaXRlbXMgIT09IHZvaWQgMCA/IGl0ZW1zIDogbnVsbCk7XG4gIGtleXMgPSB0eXBlb2Yga2V5cyA9PT0gJ2Z1bmN0aW9uJyA/IGl0ZW1zLm1hcChrZXlzKSA6IHRvQXJyYXkoa2V5cyk7IC8vIE1ha2Ugc3VyZSBudW1lcmljIGtleXMgYXJlIGludGVycHJldGVkIGFzIFN0cmluZ3MgKDUgIT09IFwiNVwiKVxuXG4gIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgaXRlbXMsXG4gICAga2V5czoga2V5cy5tYXAoa2V5ID0+IFN0cmluZyhrZXkpKVxuICB9LCByZXN0KTtcbn07XG5cbmNsYXNzIFRyYW5zaXRpb24gZXh0ZW5kcyBSZWFjdF9fZGVmYXVsdC5QdXJlQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJldlByb3BzKSB7XG4gICAgc3VwZXIocHJldlByb3BzKTtcblxuICAgIHRoaXMuZGVzdHJveUl0ZW0gPSAoaXRlbSwga2V5LCBzdGF0ZSkgPT4gdmFsdWVzID0+IHtcbiAgICAgIGNvbnN0IF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIG9uUmVzdCA9IF90aGlzJHByb3BzLm9uUmVzdCxcbiAgICAgICAgICAgIG9uRGVzdHJveWVkID0gX3RoaXMkcHJvcHMub25EZXN0cm95ZWQ7XG5cbiAgICAgIGlmICh0aGlzLm1vdW50ZWQpIHtcbiAgICAgICAgb25EZXN0cm95ZWQgJiYgb25EZXN0cm95ZWQoaXRlbSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKF9yZWYpID0+IHtcbiAgICAgICAgICBsZXQgZGVsZXRlZCA9IF9yZWYuZGVsZXRlZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVsZXRlZDogZGVsZXRlZC5maWx0ZXIodCA9PiB0LmtleSAhPT0ga2V5KVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBvblJlc3QgJiYgb25SZXN0KGl0ZW0sIHN0YXRlLCB2YWx1ZXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZmlyc3Q6IHRydWUsXG4gICAgICB0cmFuc2l0aW9uczogW10sXG4gICAgICBjdXJyZW50OiB7fSxcbiAgICAgIGRlbGV0ZWQ6IFtdLFxuICAgICAgcHJldlByb3BzXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgbGV0IGZpcnN0ID0gX3JlZjIuZmlyc3QsXG4gICAgICAgIHByZXZQcm9wcyA9IF9yZWYyLnByZXZQcm9wcyxcbiAgICAgICAgc3RhdGUgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmMiwgW1wiZmlyc3RcIiwgXCJwcmV2UHJvcHNcIl0pO1xuXG4gICAgbGV0IF9nZXQgPSBnZXQocHJvcHMpLFxuICAgICAgICBpdGVtcyA9IF9nZXQuaXRlbXMsXG4gICAgICAgIGtleXMgPSBfZ2V0LmtleXMsXG4gICAgICAgIGluaXRpYWwgPSBfZ2V0LmluaXRpYWwsXG4gICAgICAgIGZyb20gPSBfZ2V0LmZyb20sXG4gICAgICAgIGVudGVyID0gX2dldC5lbnRlcixcbiAgICAgICAgbGVhdmUgPSBfZ2V0LmxlYXZlLFxuICAgICAgICB1cGRhdGUgPSBfZ2V0LnVwZGF0ZSxcbiAgICAgICAgX2dldCR0cmFpbCA9IF9nZXQudHJhaWwsXG4gICAgICAgIHRyYWlsID0gX2dldCR0cmFpbCA9PT0gdm9pZCAwID8gMCA6IF9nZXQkdHJhaWwsXG4gICAgICAgIHVuaXF1ZSA9IF9nZXQudW5pcXVlLFxuICAgICAgICBjb25maWcgPSBfZ2V0LmNvbmZpZztcblxuICAgIGxldCBfZ2V0MiA9IGdldChwcmV2UHJvcHMpLFxuICAgICAgICBfa2V5cyA9IF9nZXQyLmtleXMsXG4gICAgICAgIF9pdGVtcyA9IF9nZXQyLml0ZW1zO1xuXG4gICAgbGV0IGN1cnJlbnQgPSBfZXh0ZW5kcyh7fSwgc3RhdGUuY3VycmVudCk7XG5cbiAgICBsZXQgZGVsZXRlZCA9IFsuLi5zdGF0ZS5kZWxldGVkXTsgLy8gQ29tcGFyZSBuZXh0IGtleXMgd2l0aCBjdXJyZW50IGtleXNcblxuICAgIGxldCBjdXJyZW50S2V5cyA9IE9iamVjdC5rZXlzKGN1cnJlbnQpO1xuICAgIGxldCBjdXJyZW50U2V0ID0gbmV3IFNldChjdXJyZW50S2V5cyk7XG4gICAgbGV0IG5leHRTZXQgPSBuZXcgU2V0KGtleXMpO1xuICAgIGxldCBhZGRlZCA9IGtleXMuZmlsdGVyKGl0ZW0gPT4gIWN1cnJlbnRTZXQuaGFzKGl0ZW0pKTtcbiAgICBsZXQgcmVtb3ZlZCA9IHN0YXRlLnRyYW5zaXRpb25zLmZpbHRlcihpdGVtID0+ICFpdGVtLmRlc3Ryb3llZCAmJiAhbmV4dFNldC5oYXMoaXRlbS5vcmlnaW5hbEtleSkpLm1hcChpID0+IGkub3JpZ2luYWxLZXkpO1xuICAgIGxldCB1cGRhdGVkID0ga2V5cy5maWx0ZXIoaXRlbSA9PiBjdXJyZW50U2V0LmhhcyhpdGVtKSk7XG4gICAgbGV0IGRlbGF5ID0gMDtcbiAgICBhZGRlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAvLyBJbiB1bmlxdWUgbW9kZSwgcmVtb3ZlIGZhZGluZyBvdXQgdHJhbnNpdGlvbnMgaWYgdGhlaXIga2V5IGNvbWVzIGluIGFnYWluXG4gICAgICBpZiAodW5pcXVlICYmIGRlbGV0ZWQuZmluZChkID0+IGQub3JpZ2luYWxLZXkgPT09IGtleSkpIGRlbGV0ZWQgPSBkZWxldGVkLmZpbHRlcih0ID0+IHQub3JpZ2luYWxLZXkgIT09IGtleSk7XG4gICAgICBjb25zdCBrZXlJbmRleCA9IGtleXMuaW5kZXhPZihrZXkpO1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2tleUluZGV4XTtcbiAgICAgIGNvbnN0IHN0YXRlID0gJ2VudGVyJztcbiAgICAgIGN1cnJlbnRba2V5XSA9IHtcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIG9yaWdpbmFsS2V5OiBrZXksXG4gICAgICAgIGtleTogdW5pcXVlID8gU3RyaW5nKGtleSkgOiBndWlkKyssXG4gICAgICAgIGl0ZW0sXG4gICAgICAgIHRyYWlsOiBkZWxheSA9IGRlbGF5ICsgdHJhaWwsXG4gICAgICAgIGNvbmZpZzogY2FsbFByb3AoY29uZmlnLCBpdGVtLCBzdGF0ZSksXG4gICAgICAgIGZyb206IGNhbGxQcm9wKGZpcnN0ID8gaW5pdGlhbCAhPT0gdm9pZCAwID8gaW5pdGlhbCB8fCB7fSA6IGZyb20gOiBmcm9tLCBpdGVtKSxcbiAgICAgICAgdG86IGNhbGxQcm9wKGVudGVyLCBpdGVtKVxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZW1vdmVkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGtleUluZGV4ID0gX2tleXMuaW5kZXhPZihrZXkpO1xuXG4gICAgICBjb25zdCBpdGVtID0gX2l0ZW1zW2tleUluZGV4XTtcbiAgICAgIGNvbnN0IHN0YXRlID0gJ2xlYXZlJztcbiAgICAgIGRlbGV0ZWQucHVzaChfZXh0ZW5kcyh7fSwgY3VycmVudFtrZXldLCB7XG4gICAgICAgIHN0YXRlLFxuICAgICAgICBkZXN0cm95ZWQ6IHRydWUsXG4gICAgICAgIGxlZnQ6IF9rZXlzW01hdGgubWF4KDAsIGtleUluZGV4IC0gMSldLFxuICAgICAgICByaWdodDogX2tleXNbTWF0aC5taW4oX2tleXMubGVuZ3RoLCBrZXlJbmRleCArIDEpXSxcbiAgICAgICAgdHJhaWw6IGRlbGF5ID0gZGVsYXkgKyB0cmFpbCxcbiAgICAgICAgY29uZmlnOiBjYWxsUHJvcChjb25maWcsIGl0ZW0sIHN0YXRlKSxcbiAgICAgICAgdG86IGNhbGxQcm9wKGxlYXZlLCBpdGVtKVxuICAgICAgfSkpO1xuICAgICAgZGVsZXRlIGN1cnJlbnRba2V5XTtcbiAgICB9KTtcbiAgICB1cGRhdGVkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGtleUluZGV4ID0ga2V5cy5pbmRleE9mKGtleSk7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNba2V5SW5kZXhdO1xuICAgICAgY29uc3Qgc3RhdGUgPSAndXBkYXRlJztcbiAgICAgIGN1cnJlbnRba2V5XSA9IF9leHRlbmRzKHt9LCBjdXJyZW50W2tleV0sIHtcbiAgICAgICAgaXRlbSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHRyYWlsOiBkZWxheSA9IGRlbGF5ICsgdHJhaWwsXG4gICAgICAgIGNvbmZpZzogY2FsbFByb3AoY29uZmlnLCBpdGVtLCBzdGF0ZSksXG4gICAgICAgIHRvOiBjYWxsUHJvcCh1cGRhdGUsIGl0ZW0pXG4gICAgICB9KTtcbiAgICB9KTsgLy8gVGhpcyB0cmllcyB0byByZXN0b3JlIG9yZGVyIGZvciBkZWxldGVkIGl0ZW1zIGJ5IGZpbmRpbmcgdGhlaXIgbGFzdCBrbm93biBzaWJsaW5nc1xuXG4gICAgbGV0IG91dCA9IGtleXMubWFwKGtleSA9PiBjdXJyZW50W2tleV0pO1xuICAgIGRlbGV0ZWQuZm9yRWFjaCgoX3JlZjMpID0+IHtcbiAgICAgIGxldCBsZWZ0ID0gX3JlZjMubGVmdCxcbiAgICAgICAgICByaWdodCA9IF9yZWYzLnJpZ2h0LFxuICAgICAgICAgIHRyYW5zaXRpb24gPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmMywgW1wibGVmdFwiLCBcInJpZ2h0XCJdKTtcblxuICAgICAgbGV0IHBvczsgLy8gV2FzIGl0IHRoZSBlbGVtZW50IG9uIHRoZSBsZWZ0LCBpZiB5ZXMsIG1vdmUgdGhlcmUgLi4uXG5cbiAgICAgIGlmICgocG9zID0gb3V0LmZpbmRJbmRleCh0ID0+IHQub3JpZ2luYWxLZXkgPT09IGxlZnQpKSAhPT0gLTEpIHBvcyArPSAxOyAvLyBPciBob3cgYWJvdXQgdGhlIGVsZW1lbnQgb24gdGhlIHJpZ2h0IC4uLlxuXG4gICAgICBpZiAocG9zID09PSAtMSkgcG9zID0gb3V0LmZpbmRJbmRleCh0ID0+IHQub3JpZ2luYWxLZXkgPT09IHJpZ2h0KTsgLy8gTWF5YmUgd2UnbGwgZmluZCBpdCBpbiB0aGUgbGlzdCBvZiBkZWxldGVkIGl0ZW1zXG5cbiAgICAgIGlmIChwb3MgPT09IC0xKSBwb3MgPSBkZWxldGVkLmZpbmRJbmRleCh0ID0+IHQub3JpZ2luYWxLZXkgPT09IGxlZnQpOyAvLyBDaGVja2luZyByaWdodCBzaWRlIGFzIHdlbGxcblxuICAgICAgaWYgKHBvcyA9PT0gLTEpIHBvcyA9IGRlbGV0ZWQuZmluZEluZGV4KHQgPT4gdC5vcmlnaW5hbEtleSA9PT0gcmlnaHQpOyAvLyBBbmQgaWYgbm90aGluZyBlbHNlIGhlbHBzLCBtb3ZlIGl0IHRvIHRoZSBzdGFydCDCr1xcXyjjg4QpXy/Cr1xuXG4gICAgICBwb3MgPSBNYXRoLm1heCgwLCBwb3MpO1xuICAgICAgb3V0ID0gWy4uLm91dC5zbGljZSgwLCBwb3MpLCB0cmFuc2l0aW9uLCAuLi5vdXQuc2xpY2UocG9zKV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0OiBmaXJzdCAmJiBhZGRlZC5sZW5ndGggPT09IDAsXG4gICAgICB0cmFuc2l0aW9uczogb3V0LFxuICAgICAgY3VycmVudCxcbiAgICAgIGRlbGV0ZWQsXG4gICAgICBwcmV2UHJvcHM6IHByb3BzXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGluaXRpYWwgPSBfdGhpcyRwcm9wczIuaW5pdGlhbCxcbiAgICAgICAgICBfdGhpcyRwcm9wczIkZnJvbSA9IF90aGlzJHByb3BzMi5mcm9tLFxuICAgICAgICAgIF90aGlzJHByb3BzMiRlbnRlciA9IF90aGlzJHByb3BzMi5lbnRlcixcbiAgICAgICAgICBfdGhpcyRwcm9wczIkbGVhdmUgPSBfdGhpcyRwcm9wczIubGVhdmUsXG4gICAgICAgICAgX3RoaXMkcHJvcHMyJHVwZGF0ZSA9IF90aGlzJHByb3BzMi51cGRhdGUsXG4gICAgICAgICAgb25EZXN0cm95ZWQgPSBfdGhpcyRwcm9wczIub25EZXN0cm95ZWQsXG4gICAgICAgICAga2V5cyA9IF90aGlzJHByb3BzMi5rZXlzLFxuICAgICAgICAgIGl0ZW1zID0gX3RoaXMkcHJvcHMyLml0ZW1zLFxuICAgICAgICAgIG9uRnJhbWUgPSBfdGhpcyRwcm9wczIub25GcmFtZSxcbiAgICAgICAgICBvblJlc3QgPSBfdGhpcyRwcm9wczIub25SZXN0LFxuICAgICAgICAgIG9uU3RhcnQgPSBfdGhpcyRwcm9wczIub25TdGFydCxcbiAgICAgICAgICB0cmFpbCA9IF90aGlzJHByb3BzMi50cmFpbCxcbiAgICAgICAgICBjb25maWcgPSBfdGhpcyRwcm9wczIuY29uZmlnLFxuICAgICAgICAgIF9jaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbixcbiAgICAgICAgICB1bmlxdWUgPSBfdGhpcyRwcm9wczIudW5pcXVlLFxuICAgICAgICAgIHJlc2V0ID0gX3RoaXMkcHJvcHMyLnJlc2V0LFxuICAgICAgICAgIGV4dHJhID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3RoaXMkcHJvcHMyLCBbXCJpbml0aWFsXCIsIFwiZnJvbVwiLCBcImVudGVyXCIsIFwibGVhdmVcIiwgXCJ1cGRhdGVcIiwgXCJvbkRlc3Ryb3llZFwiLCBcImtleXNcIiwgXCJpdGVtc1wiLCBcIm9uRnJhbWVcIiwgXCJvblJlc3RcIiwgXCJvblN0YXJ0XCIsIFwidHJhaWxcIiwgXCJjb25maWdcIiwgXCJjaGlsZHJlblwiLCBcInVuaXF1ZVwiLCBcInJlc2V0XCJdKTtcblxuICAgIHJldHVybiB0aGlzLnN0YXRlLnRyYW5zaXRpb25zLm1hcCgoX3JlZjQsIGkpID0+IHtcbiAgICAgIGxldCBzdGF0ZSA9IF9yZWY0LnN0YXRlLFxuICAgICAgICAgIGtleSA9IF9yZWY0LmtleSxcbiAgICAgICAgICBpdGVtID0gX3JlZjQuaXRlbSxcbiAgICAgICAgICBmcm9tID0gX3JlZjQuZnJvbSxcbiAgICAgICAgICB0byA9IF9yZWY0LnRvLFxuICAgICAgICAgIHRyYWlsID0gX3JlZjQudHJhaWwsXG4gICAgICAgICAgY29uZmlnID0gX3JlZjQuY29uZmlnLFxuICAgICAgICAgIGRlc3Ryb3llZCA9IF9yZWY0LmRlc3Ryb3llZDtcbiAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KEtleWZyYW1lcywgX2V4dGVuZHMoe1xuICAgICAgICByZXNldDogcmVzZXQgJiYgc3RhdGUgPT09ICdlbnRlcicsXG4gICAgICAgIHByaW1pdGl2ZTogU3ByaW5nLFxuICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgIGZpbHRlcjogaW50ZXJwb2xhdGVUbyxcbiAgICAgICAgc3RhdGVzOiB7XG4gICAgICAgICAgW3N0YXRlXTogdG9cbiAgICAgICAgfSxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIG9uUmVzdDogZGVzdHJveWVkID8gdGhpcy5kZXN0cm95SXRlbShpdGVtLCBrZXksIHN0YXRlKSA6IG9uUmVzdCAmJiAodmFsdWVzID0+IG9uUmVzdChpdGVtLCBzdGF0ZSwgdmFsdWVzKSksXG4gICAgICAgIG9uU3RhcnQ6IG9uU3RhcnQgJiYgKCgpID0+IG9uU3RhcnQoaXRlbSwgc3RhdGUpKSxcbiAgICAgICAgb25GcmFtZTogb25GcmFtZSAmJiAodmFsdWVzID0+IG9uRnJhbWUoaXRlbSwgc3RhdGUsIHZhbHVlcykpLFxuICAgICAgICBkZWxheTogdHJhaWwsXG4gICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICB9LCBleHRyYSwge1xuICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICBjaGlsZHJlbjogcHJvcHMgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gX2NoaWxkcmVuKGl0ZW0sIHN0YXRlLCBpKTtcblxuICAgICAgICAgIHJldHVybiBjaGlsZCA/IGNoaWxkKHByb3BzKSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG59XG5UcmFuc2l0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAga2V5czogaXRlbSA9PiBpdGVtLFxuICB1bmlxdWU6IGZhbHNlLFxuICByZXNldDogZmFsc2Vcbn07XG5cbmNvbnN0IGRvbUVsZW1lbnRzID0gWydhJywgJ2FiYnInLCAnYWRkcmVzcycsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYXVkaW8nLCAnYicsICdiYXNlJywgJ2JkaScsICdiZG8nLCAnYmlnJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FudmFzJywgJ2NhcHRpb24nLCAnY2l0ZScsICdjb2RlJywgJ2NvbCcsICdjb2xncm91cCcsICdkYXRhJywgJ2RhdGFsaXN0JywgJ2RkJywgJ2RlbCcsICdkZXRhaWxzJywgJ2RmbicsICdkaWFsb2cnLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtJywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2knLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpbnMnLCAna2JkJywgJ2tleWdlbicsICdsYWJlbCcsICdsZWdlbmQnLCAnbGknLCAnbGluaycsICdtYWluJywgJ21hcCcsICdtYXJrJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ21ldGVyJywgJ25hdicsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAnb3B0Z3JvdXAnLCAnb3B0aW9uJywgJ291dHB1dCcsICdwJywgJ3BhcmFtJywgJ3BpY3R1cmUnLCAncHJlJywgJ3Byb2dyZXNzJywgJ3EnLCAncnAnLCAncnQnLCAncnVieScsICdzJywgJ3NhbXAnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NtYWxsJywgJ3NvdXJjZScsICdzcGFuJywgJ3N0cm9uZycsICdzdHlsZScsICdzdWInLCAnc3VtbWFyeScsICdzdXAnLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGltZScsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1JywgJ3VsJywgJ3ZhcicsICd2aWRlbycsICd3YnInLCAvLyBTVkdcbidjaXJjbGUnLCAnY2xpcFBhdGgnLCAnZGVmcycsICdlbGxpcHNlJywgJ2ZvcmVpZ25PYmplY3QnLCAnZycsICdpbWFnZScsICdsaW5lJywgJ2xpbmVhckdyYWRpZW50JywgJ21hc2snLCAncGF0aCcsICdwYXR0ZXJuJywgJ3BvbHlnb24nLCAncG9seWxpbmUnLCAncmFkaWFsR3JhZGllbnQnLCAncmVjdCcsICdzdG9wJywgJ3N2ZycsICd0ZXh0JywgJ3RzcGFuJ107XG5jb25zdCBleHRlbmRlZEFuaW1hdGVkID0gZG9tRWxlbWVudHMucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgYWNjW2VsZW1lbnRdID0gY3JlYXRlQW5pbWF0ZWRDb21wb25lbnQoZWxlbWVudCk7XG4gIHJldHVybiBhY2M7XG59LCBjcmVhdGVBbmltYXRlZENvbXBvbmVudCk7XG5cbmV4cG9ydHMuU3ByaW5nID0gU3ByaW5nO1xuZXhwb3J0cy5LZXlmcmFtZXMgPSBLZXlmcmFtZXM7XG5leHBvcnRzLlRyYW5zaXRpb24gPSBUcmFuc2l0aW9uO1xuZXhwb3J0cy5UcmFpbCA9IFRyYWlsO1xuZXhwb3J0cy5Db250cm9sbGVyID0gQ29udHJvbGxlcjtcbmV4cG9ydHMuY29uZmlnID0gY29uZmlnO1xuZXhwb3J0cy5hbmltYXRlZCA9IGV4dGVuZGVkQW5pbWF0ZWQ7XG5leHBvcnRzLmludGVycG9sYXRlID0gaW50ZXJwb2xhdGUkMTtcbmV4cG9ydHMuR2xvYmFscyA9IEdsb2JhbHM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4823\n")},3697:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar functionsHaveConfigurableNames = (__webpack_require__(5972).functionsHaveConfigurableNames)();\n\nvar $Object = Object;\nvar $TypeError = TypeError;\n\nmodule.exports = function flags() {\n\tif (this != null && this !== $Object(this)) {\n\t\tthrow new $TypeError('RegExp.prototype.flags getter called on non-object');\n\t}\n\tvar result = '';\n\tif (this.hasIndices) {\n\t\tresult += 'd';\n\t}\n\tif (this.global) {\n\t\tresult += 'g';\n\t}\n\tif (this.ignoreCase) {\n\t\tresult += 'i';\n\t}\n\tif (this.multiline) {\n\t\tresult += 'm';\n\t}\n\tif (this.dotAll) {\n\t\tresult += 's';\n\t}\n\tif (this.unicode) {\n\t\tresult += 'u';\n\t}\n\tif (this.sticky) {\n\t\tresult += 'y';\n\t}\n\treturn result;\n};\n\nif (functionsHaveConfigurableNames && Object.defineProperty) {\n\tObject.defineProperty(module.exports, \"name\", ({ value: 'get flags' }));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY5Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9yZWdleHAucHJvdG90eXBlLmZsYWdzL2ltcGxlbWVudGF0aW9uLmpzPzU3MDgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZnVuY3Rpb25zSGF2ZUNvbmZpZ3VyYWJsZU5hbWVzID0gcmVxdWlyZSgnZnVuY3Rpb25zLWhhdmUtbmFtZXMnKS5mdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMoKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmbGFncygpIHtcblx0aWYgKHRoaXMgIT0gbnVsbCAmJiB0aGlzICE9PSAkT2JqZWN0KHRoaXMpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1JlZ0V4cC5wcm90b3R5cGUuZmxhZ3MgZ2V0dGVyIGNhbGxlZCBvbiBub24tb2JqZWN0Jyk7XG5cdH1cblx0dmFyIHJlc3VsdCA9ICcnO1xuXHRpZiAodGhpcy5oYXNJbmRpY2VzKSB7XG5cdFx0cmVzdWx0ICs9ICdkJztcblx0fVxuXHRpZiAodGhpcy5nbG9iYWwpIHtcblx0XHRyZXN1bHQgKz0gJ2cnO1xuXHR9XG5cdGlmICh0aGlzLmlnbm9yZUNhc2UpIHtcblx0XHRyZXN1bHQgKz0gJ2knO1xuXHR9XG5cdGlmICh0aGlzLm11bHRpbGluZSkge1xuXHRcdHJlc3VsdCArPSAnbSc7XG5cdH1cblx0aWYgKHRoaXMuZG90QWxsKSB7XG5cdFx0cmVzdWx0ICs9ICdzJztcblx0fVxuXHRpZiAodGhpcy51bmljb2RlKSB7XG5cdFx0cmVzdWx0ICs9ICd1Jztcblx0fVxuXHRpZiAodGhpcy5zdGlja3kpIHtcblx0XHRyZXN1bHQgKz0gJ3knO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG5pZiAoZnVuY3Rpb25zSGF2ZUNvbmZpZ3VyYWJsZU5hbWVzICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICduYW1lJywgeyB2YWx1ZTogJ2dldCBmbGFncycgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3697\n")},2847:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar define = __webpack_require__(4289);\nvar callBind = __webpack_require__(5559);\n\nvar implementation = __webpack_require__(3697);\nvar getPolyfill = __webpack_require__(1721);\nvar shim = __webpack_require__(2753);\n\nvar flagsBound = callBind(getPolyfill());\n\ndefine(flagsBound, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = flagsBound;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg0Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9yZWdleHAucHJvdG90eXBlLmZsYWdzL2luZGV4LmpzP2U3MTAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJy4vc2hpbScpO1xuXG52YXIgZmxhZ3NCb3VuZCA9IGNhbGxCaW5kKGdldFBvbHlmaWxsKCkpO1xuXG5kZWZpbmUoZmxhZ3NCb3VuZCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhZ3NCb3VuZDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2847\n")},1721:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar implementation = __webpack_require__(3697);\n\nvar supportsDescriptors = (__webpack_require__(4289).supportsDescriptors);\nvar $gOPD = Object.getOwnPropertyDescriptor;\n\nmodule.exports = function getPolyfill() {\n\tif (supportsDescriptors && (/a/mig).flags === 'gim') {\n\t\tvar descriptor = $gOPD(RegExp.prototype, 'flags');\n\t\tif (\n\t\t\tdescriptor\n\t\t\t&& typeof descriptor.get === 'function'\n\t\t\t&& typeof RegExp.prototype.dotAll === 'boolean'\n\t\t\t&& typeof RegExp.prototype.hasIndices === 'boolean'\n\t\t) {\n\t\t\t/* eslint getter-return: 0 */\n\t\t\tvar calls = '';\n\t\t\tvar o = {};\n\t\t\tObject.defineProperty(o, 'hasIndices', {\n\t\t\t\tget: function () {\n\t\t\t\t\tcalls += 'd';\n\t\t\t\t}\n\t\t\t});\n\t\t\tObject.defineProperty(o, 'sticky', {\n\t\t\t\tget: function () {\n\t\t\t\t\tcalls += 'y';\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (calls === 'dy') {\n\t\t\t\treturn descriptor.get;\n\t\t\t}\n\t\t}\n\t}\n\treturn implementation;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcyMS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9yZWdleHAucHJvdG90eXBlLmZsYWdzL3BvbHlmaWxsLmpzPzU3ZWMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyICRnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0aWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMgJiYgKC9hL21pZykuZmxhZ3MgPT09ICdnaW0nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSAkZ09QRChSZWdFeHAucHJvdG90eXBlLCAnZmxhZ3MnKTtcblx0XHRpZiAoXG5cdFx0XHRkZXNjcmlwdG9yXG5cdFx0XHQmJiB0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbidcblx0XHRcdCYmIHR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmRvdEFsbCA9PT0gJ2Jvb2xlYW4nXG5cdFx0XHQmJiB0eXBlb2YgUmVnRXhwLnByb3RvdHlwZS5oYXNJbmRpY2VzID09PSAnYm9vbGVhbidcblx0XHQpIHtcblx0XHRcdC8qIGVzbGludCBnZXR0ZXItcmV0dXJuOiAwICovXG5cdFx0XHR2YXIgY2FsbHMgPSAnJztcblx0XHRcdHZhciBvID0ge307XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobywgJ2hhc0luZGljZXMnLCB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGNhbGxzICs9ICdkJztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobywgJ3N0aWNreScsIHtcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Y2FsbHMgKz0gJ3knO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChjYWxscyA9PT0gJ2R5Jykge1xuXHRcdFx0XHRyZXR1cm4gZGVzY3JpcHRvci5nZXQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbXBsZW1lbnRhdGlvbjtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1721\n")},2753:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar supportsDescriptors = (__webpack_require__(4289).supportsDescriptors);\nvar getPolyfill = __webpack_require__(1721);\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar defineProperty = Object.defineProperty;\nvar TypeErr = TypeError;\nvar getProto = Object.getPrototypeOf;\nvar regex = /a/;\n\nmodule.exports = function shimFlags() {\n\tif (!supportsDescriptors || !getProto) {\n\t\tthrow new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');\n\t}\n\tvar polyfill = getPolyfill();\n\tvar proto = getProto(regex);\n\tvar descriptor = gOPD(proto, 'flags');\n\tif (!descriptor || descriptor.get !== polyfill) {\n\t\tdefineProperty(proto, 'flags', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tget: polyfill\n\t\t});\n\t}\n\treturn polyfill;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc1My5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvcmVnZXhwLnByb3RvdHlwZS5mbGFncy9zaGltLmpzPzFjN2UiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3VwcG9ydHNEZXNjcmlwdG9ycyA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJykuc3VwcG9ydHNEZXNjcmlwdG9ycztcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBUeXBlRXJyID0gVHlwZUVycm9yO1xudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIHJlZ2V4ID0gL2EvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1GbGFncygpIHtcblx0aWYgKCFzdXBwb3J0c0Rlc2NyaXB0b3JzIHx8ICFnZXRQcm90bykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXJ0eSBkZXNjcmlwdG9ycycpO1xuXHR9XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdHZhciBwcm90byA9IGdldFByb3RvKHJlZ2V4KTtcblx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKHByb3RvLCAnZmxhZ3MnKTtcblx0aWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuZ2V0ICE9PSBwb2x5ZmlsbCkge1xuXHRcdGRlZmluZVByb3BlcnR5KHByb3RvLCAnZmxhZ3MnLCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogcG9seWZpbGxcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2753\n")},6399:module=>{eval("/**\n * Bare-bones equivalent for the functionality of d3.scale.linear\n * @param {Array} domain\n * @param {Array} range\n * @returns {Function} scale function\n * @example\n * var linearScale = require('simple-linear-scale');\n *\n * var scaleFunction = linearScale([0, 1], [0, 100]);\n * scaleFunction(0.5); // 50\n *\n * // clamp option ensures that output is within range\n * var scaleFunction = linearScale([0, 1], [0, 10], true);\n * scaleFunction(100); // 10\n */\nfunction linearScale(domain, range, clamp) {\n return function(value) {\n if (domain[0] === domain[1] || range[0] === range[1]) {\n return range[0];\n }\n var ratio = (range[1] - range[0]) / (domain[1] - domain[0]),\n result = range[0] + ratio * (value - domain[0]);\n return clamp ? Math.min(range[1], Math.max(range[0], result)) : result;\n };\n}\n\nmodule.exports = linearScale;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM5OS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9zaW1wbGUtbGluZWFyLXNjYWxlL2luZGV4LmpzPzg1ZjEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXJlLWJvbmVzIGVxdWl2YWxlbnQgZm9yIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGQzLnNjYWxlLmxpbmVhclxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBkb21haW5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gcmFuZ2VcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gc2NhbGUgZnVuY3Rpb25cbiAqIEBleGFtcGxlXG4gKiB2YXIgbGluZWFyU2NhbGUgPSByZXF1aXJlKCdzaW1wbGUtbGluZWFyLXNjYWxlJyk7XG4gKlxuICogdmFyIHNjYWxlRnVuY3Rpb24gPSBsaW5lYXJTY2FsZShbMCwgMV0sIFswLCAxMDBdKTtcbiAqIHNjYWxlRnVuY3Rpb24oMC41KTsgLy8gNTBcbiAqXG4gKiAvLyBjbGFtcCBvcHRpb24gZW5zdXJlcyB0aGF0IG91dHB1dCBpcyB3aXRoaW4gcmFuZ2VcbiAqIHZhciBzY2FsZUZ1bmN0aW9uID0gbGluZWFyU2NhbGUoWzAsIDFdLCBbMCwgMTBdLCB0cnVlKTtcbiAqIHNjYWxlRnVuY3Rpb24oMTAwKTsgLy8gMTBcbiAqL1xuZnVuY3Rpb24gbGluZWFyU2NhbGUoZG9tYWluLCByYW5nZSwgY2xhbXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGRvbWFpblswXSA9PT0gZG9tYWluWzFdIHx8IHJhbmdlWzBdID09PSByYW5nZVsxXSkge1xuICAgICAgcmV0dXJuIHJhbmdlWzBdO1xuICAgIH1cbiAgICB2YXIgcmF0aW8gPSAocmFuZ2VbMV0gLSByYW5nZVswXSkgLyAoZG9tYWluWzFdIC0gZG9tYWluWzBdKSxcbiAgICAgIHJlc3VsdCA9IHJhbmdlWzBdICsgcmF0aW8gKiAodmFsdWUgLSBkb21haW5bMF0pO1xuICAgIHJldHVybiBjbGFtcCA/IE1hdGgubWluKHJhbmdlWzFdLCBNYXRoLm1heChyYW5nZVswXSwgcmVzdWx0KSkgOiByZXN1bHQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGluZWFyU2NhbGU7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6399\n")},4760:module=>{eval("var candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\nvar candidateSelector = candidateSelectors.join(',');\n\nvar matches = typeof Element === 'undefined'\n ? function () {}\n : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\nfunction tabbable(el, options) {\n options = options || {};\n\n var elementDocument = el.ownerDocument || el;\n var regularTabbables = [];\n var orderedTabbables = [];\n\n var untouchabilityChecker = new UntouchabilityChecker(elementDocument);\n var candidates = el.querySelectorAll(candidateSelector);\n\n if (options.includeContainer) {\n if (matches.call(el, candidateSelector)) {\n candidates = Array.prototype.slice.apply(candidates);\n candidates.unshift(el);\n }\n }\n\n var i, candidate, candidateTabindex;\n for (i = 0; i < candidates.length; i++) {\n candidate = candidates[i];\n\n if (!isNodeMatchingSelectorTabbable(candidate, untouchabilityChecker)) continue;\n\n candidateTabindex = getTabindex(candidate);\n if (candidateTabindex === 0) {\n regularTabbables.push(candidate);\n } else {\n orderedTabbables.push({\n documentOrder: i,\n tabIndex: candidateTabindex,\n node: candidate,\n });\n }\n }\n\n var tabbableNodes = orderedTabbables\n .sort(sortOrderedTabbables)\n .map(function(a) { return a.node })\n .concat(regularTabbables);\n\n return tabbableNodes;\n}\n\ntabbable.isTabbable = isTabbable;\ntabbable.isFocusable = isFocusable;\n\nfunction isNodeMatchingSelectorTabbable(node, untouchabilityChecker) {\n if (\n !isNodeMatchingSelectorFocusable(node, untouchabilityChecker)\n || isNonTabbableRadio(node)\n || getTabindex(node) < 0\n ) {\n return false;\n }\n return true;\n}\n\nfunction isTabbable(node, untouchabilityChecker) {\n if (!node) throw new Error('No node provided');\n if (matches.call(node, candidateSelector) === false) return false;\n return isNodeMatchingSelectorTabbable(node, untouchabilityChecker);\n}\n\nfunction isNodeMatchingSelectorFocusable(node, untouchabilityChecker) {\n untouchabilityChecker = untouchabilityChecker || new UntouchabilityChecker(node.ownerDocument || node);\n if (\n node.disabled\n || isHiddenInput(node)\n || untouchabilityChecker.isUntouchable(node)\n ) {\n return false;\n }\n return true;\n}\n\nvar focusableCandidateSelector = candidateSelectors.concat('iframe').join(',');\nfunction isFocusable(node, untouchabilityChecker) {\n if (!node) throw new Error('No node provided');\n if (matches.call(node, focusableCandidateSelector) === false) return false;\n return isNodeMatchingSelectorFocusable(node, untouchabilityChecker);\n}\n\nfunction getTabindex(node) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return `tabIndex` correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction sortOrderedTabbables(a, b) {\n return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex;\n}\n\n// Array.prototype.find not available in IE.\nfunction find(list, predicate) {\n for (var i = 0, length = list.length; i < length; i++) {\n if (predicate(list[i])) return list[i];\n }\n}\n\nfunction isContentEditable(node) {\n return node.contentEditable === 'true';\n}\n\nfunction isInput(node) {\n return node.tagName === 'INPUT';\n}\n\nfunction isHiddenInput(node) {\n return isInput(node) && node.type === 'hidden';\n}\n\nfunction isRadio(node) {\n return isInput(node) && node.type === 'radio';\n}\n\nfunction isNonTabbableRadio(node) {\n return isRadio(node) && !isTabbableRadio(node);\n}\n\nfunction getCheckedRadio(nodes) {\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].checked) {\n return nodes[i];\n }\n }\n}\n\nfunction isTabbableRadio(node) {\n if (!node.name) return true;\n // This won't account for the edge case where you have radio groups with the same\n // in separate forms on the same page.\n var radioSet = node.ownerDocument.querySelectorAll('input[type=\"radio\"][name=\"' + node.name + '\"]');\n var checked = getCheckedRadio(radioSet);\n return !checked || checked === node;\n}\n\n// An element is \"untouchable\" if *it or one of its ancestors* has\n// `visibility: hidden` or `display: none`.\nfunction UntouchabilityChecker(elementDocument) {\n this.doc = elementDocument;\n // Node cache must be refreshed on every check, in case\n // the content of the element has changed. The cache contains tuples\n // mapping nodes to their boolean result.\n this.cache = [];\n}\n\n// getComputedStyle accurately reflects `visibility: hidden` of ancestors\n// but not `display: none`, so we need to recursively check parents.\nUntouchabilityChecker.prototype.hasDisplayNone = function hasDisplayNone(node, nodeComputedStyle) {\n if (node.nodeType !== Node.ELEMENT_NODE) return false;\n\n // Search for a cached result.\n var cached = find(this.cache, function(item) {\n return item === node;\n });\n if (cached) return cached[1];\n\n nodeComputedStyle = nodeComputedStyle || this.doc.defaultView.getComputedStyle(node);\n\n var result = false;\n\n if (nodeComputedStyle.display === 'none') {\n result = true;\n } else if (node.parentNode) {\n result = this.hasDisplayNone(node.parentNode);\n }\n\n this.cache.push([node, result]);\n\n return result;\n}\n\nUntouchabilityChecker.prototype.isUntouchable = function isUntouchable(node) {\n if (node === this.doc.documentElement) return false;\n var computedStyle = this.doc.defaultView.getComputedStyle(node);\n if (this.hasDisplayNone(node, computedStyle)) return true;\n return computedStyle.visibility === 'hidden';\n}\n\nmodule.exports = tabbable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc2MC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvdGFiYmFibGUvaW5kZXguanM/MDU4MCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2FuZGlkYXRlU2VsZWN0b3JzID0gW1xuICAnaW5wdXQnLFxuICAnc2VsZWN0JyxcbiAgJ3RleHRhcmVhJyxcbiAgJ2FbaHJlZl0nLFxuICAnYnV0dG9uJyxcbiAgJ1t0YWJpbmRleF0nLFxuICAnYXVkaW9bY29udHJvbHNdJyxcbiAgJ3ZpZGVvW2NvbnRyb2xzXScsXG4gICdbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdKScsXG5dO1xudmFyIGNhbmRpZGF0ZVNlbGVjdG9yID0gY2FuZGlkYXRlU2VsZWN0b3JzLmpvaW4oJywnKTtcblxudmFyIG1hdGNoZXMgPSB0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCdcbiAgPyBmdW5jdGlvbiAoKSB7fVxuICA6IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgfHwgRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xuXG5mdW5jdGlvbiB0YWJiYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICB2YXIgZWxlbWVudERvY3VtZW50ID0gZWwub3duZXJEb2N1bWVudCB8fCBlbDtcbiAgdmFyIHJlZ3VsYXJUYWJiYWJsZXMgPSBbXTtcbiAgdmFyIG9yZGVyZWRUYWJiYWJsZXMgPSBbXTtcblxuICB2YXIgdW50b3VjaGFiaWxpdHlDaGVja2VyID0gbmV3IFVudG91Y2hhYmlsaXR5Q2hlY2tlcihlbGVtZW50RG9jdW1lbnQpO1xuICB2YXIgY2FuZGlkYXRlcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoY2FuZGlkYXRlU2VsZWN0b3IpO1xuXG4gIGlmIChvcHRpb25zLmluY2x1ZGVDb250YWluZXIpIHtcbiAgICBpZiAobWF0Y2hlcy5jYWxsKGVsLCBjYW5kaWRhdGVTZWxlY3RvcikpIHtcbiAgICAgIGNhbmRpZGF0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoY2FuZGlkYXRlcyk7XG4gICAgICBjYW5kaWRhdGVzLnVuc2hpZnQoZWwpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpLCBjYW5kaWRhdGUsIGNhbmRpZGF0ZVRhYmluZGV4O1xuICBmb3IgKGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKykge1xuICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXNbaV07XG5cbiAgICBpZiAoIWlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShjYW5kaWRhdGUsIHVudG91Y2hhYmlsaXR5Q2hlY2tlcikpIGNvbnRpbnVlO1xuXG4gICAgY2FuZGlkYXRlVGFiaW5kZXggPSBnZXRUYWJpbmRleChjYW5kaWRhdGUpO1xuICAgIGlmIChjYW5kaWRhdGVUYWJpbmRleCA9PT0gMCkge1xuICAgICAgcmVndWxhclRhYmJhYmxlcy5wdXNoKGNhbmRpZGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yZGVyZWRUYWJiYWJsZXMucHVzaCh7XG4gICAgICAgIGRvY3VtZW50T3JkZXI6IGksXG4gICAgICAgIHRhYkluZGV4OiBjYW5kaWRhdGVUYWJpbmRleCxcbiAgICAgICAgbm9kZTogY2FuZGlkYXRlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHRhYmJhYmxlTm9kZXMgPSBvcmRlcmVkVGFiYmFibGVzXG4gICAgLnNvcnQoc29ydE9yZGVyZWRUYWJiYWJsZXMpXG4gICAgLm1hcChmdW5jdGlvbihhKSB7IHJldHVybiBhLm5vZGUgfSlcbiAgICAuY29uY2F0KHJlZ3VsYXJUYWJiYWJsZXMpO1xuXG4gIHJldHVybiB0YWJiYWJsZU5vZGVzO1xufVxuXG50YWJiYWJsZS5pc1RhYmJhYmxlID0gaXNUYWJiYWJsZTtcbnRhYmJhYmxlLmlzRm9jdXNhYmxlID0gaXNGb2N1c2FibGU7XG5cbmZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShub2RlLCB1bnRvdWNoYWJpbGl0eUNoZWNrZXIpIHtcbiAgaWYgKFxuICAgICFpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG5vZGUsIHVudG91Y2hhYmlsaXR5Q2hlY2tlcilcbiAgICB8fCBpc05vblRhYmJhYmxlUmFkaW8obm9kZSlcbiAgICB8fCBnZXRUYWJpbmRleChub2RlKSA8IDBcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1RhYmJhYmxlKG5vZGUsIHVudG91Y2hhYmlsaXR5Q2hlY2tlcikge1xuICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcignTm8gbm9kZSBwcm92aWRlZCcpO1xuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGUsIGNhbmRpZGF0ZVNlbGVjdG9yKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShub2RlLCB1bnRvdWNoYWJpbGl0eUNoZWNrZXIpO1xufVxuXG5mdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG5vZGUsIHVudG91Y2hhYmlsaXR5Q2hlY2tlcikge1xuICB1bnRvdWNoYWJpbGl0eUNoZWNrZXIgPSB1bnRvdWNoYWJpbGl0eUNoZWNrZXIgfHwgbmV3IFVudG91Y2hhYmlsaXR5Q2hlY2tlcihub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSk7XG4gIGlmIChcbiAgICBub2RlLmRpc2FibGVkXG4gICAgfHwgaXNIaWRkZW5JbnB1dChub2RlKVxuICAgIHx8IHVudG91Y2hhYmlsaXR5Q2hlY2tlci5pc1VudG91Y2hhYmxlKG5vZGUpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yID0gY2FuZGlkYXRlU2VsZWN0b3JzLmNvbmNhdCgnaWZyYW1lJykuam9pbignLCcpO1xuZnVuY3Rpb24gaXNGb2N1c2FibGUobm9kZSwgdW50b3VjaGFiaWxpdHlDaGVja2VyKSB7XG4gIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZSwgZm9jdXNhYmxlQ2FuZGlkYXRlU2VsZWN0b3IpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShub2RlLCB1bnRvdWNoYWJpbGl0eUNoZWNrZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRUYWJpbmRleChub2RlKSB7XG4gIHZhciB0YWJpbmRleEF0dHIgPSBwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgMTApO1xuICBpZiAoIWlzTmFOKHRhYmluZGV4QXR0cikpIHJldHVybiB0YWJpbmRleEF0dHI7XG4gIC8vIEJyb3dzZXJzIGRvIG5vdCByZXR1cm4gYHRhYkluZGV4YCBjb3JyZWN0bHkgZm9yIGNvbnRlbnRFZGl0YWJsZSBub2RlcztcbiAgLy8gc28gaWYgdGhleSBkb24ndCBoYXZlIGEgdGFiaW5kZXggYXR0cmlidXRlIHNwZWNpZmljYWxseSBzZXQsIGFzc3VtZSBpdCdzIDAuXG4gIGlmIChpc0NvbnRlbnRFZGl0YWJsZShub2RlKSkgcmV0dXJuIDA7XG4gIHJldHVybiBub2RlLnRhYkluZGV4O1xufVxuXG5mdW5jdGlvbiBzb3J0T3JkZXJlZFRhYmJhYmxlcyhhLCBiKSB7XG4gIHJldHVybiBhLnRhYkluZGV4ID09PSBiLnRhYkluZGV4ID8gYS5kb2N1bWVudE9yZGVyIC0gYi5kb2N1bWVudE9yZGVyIDogYS50YWJJbmRleCAtIGIudGFiSW5kZXg7XG59XG5cbi8vIEFycmF5LnByb3RvdHlwZS5maW5kIG5vdCBhdmFpbGFibGUgaW4gSUUuXG5mdW5jdGlvbiBmaW5kKGxpc3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gbGlzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChwcmVkaWNhdGUobGlzdFtpXSkpIHJldHVybiBsaXN0W2ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGVudEVkaXRhYmxlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZSc7XG59XG5cbmZ1bmN0aW9uIGlzSW5wdXQobm9kZSkge1xuICByZXR1cm4gbm9kZS50YWdOYW1lID09PSAnSU5QVVQnO1xufVxuXG5mdW5jdGlvbiBpc0hpZGRlbklucHV0KG5vZGUpIHtcbiAgcmV0dXJuIGlzSW5wdXQobm9kZSkgJiYgbm9kZS50eXBlID09PSAnaGlkZGVuJztcbn1cblxuZnVuY3Rpb24gaXNSYWRpbyhub2RlKSB7XG4gIHJldHVybiBpc0lucHV0KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ3JhZGlvJztcbn1cblxuZnVuY3Rpb24gaXNOb25UYWJiYWJsZVJhZGlvKG5vZGUpIHtcbiAgcmV0dXJuIGlzUmFkaW8obm9kZSkgJiYgIWlzVGFiYmFibGVSYWRpbyhub2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tlZFJhZGlvKG5vZGVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobm9kZXNbaV0uY2hlY2tlZCkge1xuICAgICAgcmV0dXJuIG5vZGVzW2ldO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RhYmJhYmxlUmFkaW8obm9kZSkge1xuICBpZiAoIW5vZGUubmFtZSkgcmV0dXJuIHRydWU7XG4gIC8vIFRoaXMgd29uJ3QgYWNjb3VudCBmb3IgdGhlIGVkZ2UgY2FzZSB3aGVyZSB5b3UgaGF2ZSByYWRpbyBncm91cHMgd2l0aCB0aGUgc2FtZVxuICAvLyBpbiBzZXBhcmF0ZSBmb3JtcyBvbiB0aGUgc2FtZSBwYWdlLlxuICB2YXIgcmFkaW9TZXQgPSBub2RlLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCInICsgbm9kZS5uYW1lICsgJ1wiXScpO1xuICB2YXIgY2hlY2tlZCA9IGdldENoZWNrZWRSYWRpbyhyYWRpb1NldCk7XG4gIHJldHVybiAhY2hlY2tlZCB8fCBjaGVja2VkID09PSBub2RlO1xufVxuXG4vLyBBbiBlbGVtZW50IGlzIFwidW50b3VjaGFibGVcIiBpZiAqaXQgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMqIGhhc1xuLy8gYHZpc2liaWxpdHk6IGhpZGRlbmAgb3IgYGRpc3BsYXk6IG5vbmVgLlxuZnVuY3Rpb24gVW50b3VjaGFiaWxpdHlDaGVja2VyKGVsZW1lbnREb2N1bWVudCkge1xuICB0aGlzLmRvYyA9IGVsZW1lbnREb2N1bWVudDtcbiAgLy8gTm9kZSBjYWNoZSBtdXN0IGJlIHJlZnJlc2hlZCBvbiBldmVyeSBjaGVjaywgaW4gY2FzZVxuICAvLyB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBoYXMgY2hhbmdlZC4gVGhlIGNhY2hlIGNvbnRhaW5zIHR1cGxlc1xuICAvLyBtYXBwaW5nIG5vZGVzIHRvIHRoZWlyIGJvb2xlYW4gcmVzdWx0LlxuICB0aGlzLmNhY2hlID0gW107XG59XG5cbi8vIGdldENvbXB1dGVkU3R5bGUgYWNjdXJhdGVseSByZWZsZWN0cyBgdmlzaWJpbGl0eTogaGlkZGVuYCBvZiBhbmNlc3RvcnNcbi8vIGJ1dCBub3QgYGRpc3BsYXk6IG5vbmVgLCBzbyB3ZSBuZWVkIHRvIHJlY3Vyc2l2ZWx5IGNoZWNrIHBhcmVudHMuXG5VbnRvdWNoYWJpbGl0eUNoZWNrZXIucHJvdG90eXBlLmhhc0Rpc3BsYXlOb25lID0gZnVuY3Rpb24gaGFzRGlzcGxheU5vbmUobm9kZSwgbm9kZUNvbXB1dGVkU3R5bGUpIHtcbiAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBTZWFyY2ggZm9yIGEgY2FjaGVkIHJlc3VsdC5cbiAgICB2YXIgY2FjaGVkID0gZmluZCh0aGlzLmNhY2hlLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbSA9PT0gbm9kZTtcbiAgICB9KTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkWzFdO1xuXG4gICAgbm9kZUNvbXB1dGVkU3R5bGUgPSBub2RlQ29tcHV0ZWRTdHlsZSB8fCB0aGlzLmRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuXG4gICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgaWYgKG5vZGVDb21wdXRlZFN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5oYXNEaXNwbGF5Tm9uZShub2RlLnBhcmVudE5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMuY2FjaGUucHVzaChbbm9kZSwgcmVzdWx0XSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5VbnRvdWNoYWJpbGl0eUNoZWNrZXIucHJvdG90eXBlLmlzVW50b3VjaGFibGUgPSBmdW5jdGlvbiBpc1VudG91Y2hhYmxlKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IHRoaXMuZG9jLmRvY3VtZW50RWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgY29tcHV0ZWRTdHlsZSA9IHRoaXMuZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIGlmICh0aGlzLmhhc0Rpc3BsYXlOb25lKG5vZGUsIGNvbXB1dGVkU3R5bGUpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGNvbXB1dGVkU3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbic7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGFiYmFibGU7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4760\n")},5933:(module,exports,__webpack_require__)=>{eval('var __WEBPACK_AMD_DEFINE_RESULT__;/* Web Font Loader v1.6.28 - (c) Adobe Systems, Google. License: Apache 2.0 */(function(){function aa(a,b,c){return a.call.apply(a.bind,arguments)}function ba(a,b,c){if(!a)throw Error();if(2=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?d():setTimeout(f,25)},function(){e()})}f()}),e=null,f=new Promise(function(a,d){e=setTimeout(d,b.f)});Promise.race([f,d]).then(function(){e&&(clearTimeout(e),e=null);b.g(b.a)},function(){b.j(b.a)})};function Q(a,b,c,d,e,f,g){this.v=a;this.B=b;this.c=c;this.a=d;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.m=this.j=this.h=this.g=null;this.g=new M(this.c,this.s);this.h=new M(this.c,this.s);this.j=new M(this.c,this.s);this.m=new M(this.c,this.s);a=new G(this.a.c+",serif",J(this.a));a=O(a);this.g.a.style.cssText=a;a=new G(this.a.c+",sans-serif",J(this.a));a=O(a);this.h.a.style.cssText=a;a=new G("serif",J(this.a));a=O(a);this.j.a.style.cssText=a;a=new G("sans-serif",J(this.a));a=\nO(a);this.m.a.style.cssText=a;N(this.g);N(this.h);N(this.j);N(this.m)}var R={D:"serif",C:"sans-serif"},S=null;function T(){if(null===S){var a=/AppleWebKit\\/([0-9]+)(?:\\.([0-9]+))/.exec(window.navigator.userAgent);S=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return S}Q.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.m.a.offsetWidth;this.A=q();U(this)};\nfunction la(a,b,c){for(var d in R)if(R.hasOwnProperty(d)&&b===a.f[R[d]]&&c===a.f[R[d]])return!0;return!1}function U(a){var b=a.g.a.offsetWidth,c=a.h.a.offsetWidth,d;(d=b===a.f.serif&&c===a.f["sans-serif"])||(d=T()&&la(a,b,c));d?q()-a.A>=a.w?T()&&la(a,b,c)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):ma(a):V(a,a.v)}function ma(a){setTimeout(p(function(){U(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.m.a);b(this.a)},a),0)};function W(a,b,c){this.c=a;this.a=b;this.f=0;this.m=this.j=!1;this.s=c}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,J(a).toString(),"active")],[b.a.c("wf",a.c,J(a).toString(),"loading"),b.a.c("wf",a.c,J(a).toString(),"inactive")]);K(b,"fontactive",a);this.m=!0;na(this)};\nW.prototype.h=function(a){var b=this.a;if(b.g){var c=y(b.f,b.a.c("wf",a.c,J(a).toString(),"active")),d=[],e=[b.a.c("wf",a.c,J(a).toString(),"loading")];c||d.push(b.a.c("wf",a.c,J(a).toString(),"inactive"));w(b.f,d,e)}K(b,"fontinactive",a);na(this)};function na(a){0==--a.f&&a.j&&(a.m?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),K(a,"active")):L(a.a))};function oa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}oa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;pa(this,new ha(this.c,a),a)};\nfunction qa(a,b,c,d,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,m=d||null||{};if(0===c.length&&f)L(b.a);else{b.f+=c.length;f&&(b.j=f);var h,l=[];for(h=0;h{eval("module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUyOS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcz81M2E4Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgICB2YXIgdGFyZ2V0ID0ge31cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7529\n")},1764:(e,n,t)=>{var g={"./ct-addable-box.js":9285,"./ct-background.js":8601,"./ct-border.js":9218,"./ct-box-shadow.js":9795,"./ct-button.js":9838,"./ct-checkboxes.js":3413,"./ct-color-palettes-picker.js":2757,"./ct-color-picker.js":2495,"./ct-customizer-reset-options.js":9158,"./ct-divider.js":8163,"./ct-footer-builder.js":5821,"./ct-header-builder.js":5565,"./ct-image-picker.js":6962,"./ct-image-uploader.js":3048,"./ct-layers-mirror.js":379,"./ct-layers.js":6780,"./ct-multi-image-uploader.js":546,"./ct-notification.js":9875,"./ct-number.js":4949,"./ct-panel.js":3731,"./ct-radio.js":7636,"./ct-ratio.js":9735,"./ct-select.js":1404,"./ct-slider.js":8252,"./ct-spacer.js":1282,"./ct-spacing.js":5286,"./ct-switch.js":9497,"./ct-title.js":7896,"./ct-typography.js":5183,"./ct-visibility.js":5138,"./ct-woocommerce-columns-and-rows.js":6223,"./ct-woocommerce-ratio.js":6761,"./date-time-picker.js":7946,"./hidden.js":6897,"./html.js":6904,"./jsx.js":5491,"./react-outside-click-handler.js":8204,"./text.js":977,"./textarea.js":1323,"./wp-editor.js":9313};function I(e){var n=l(e);return t(n)}function l(e){if(!t.o(g,e)){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return g[e]}I.keys=function(){return Object.keys(g)},I.resolve=l,e.exports=I,I.id=1764},7363:e=>{"use strict";e.exports=React},1533:e=>{"use strict";e.exports=ReactDOM},2243:e=>{"use strict";e.exports=ctEvents},5311:e=>{"use strict";e.exports=jQuery},6715:e=>{"use strict";e.exports=window._},8441:e=>{"use strict";e.exports=window.wp.components},3356:e=>{"use strict";e.exports=window.wp.compose},1381:e=>{"use strict";e.exports=window.wp.element},5652:e=>{"use strict";e.exports=window.wp.i18n},7228:e=>{"use strict";e.exports=window.wp.keycodes},4737:e=>{"use strict";e.exports=window.wp.primitives},7326:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": () => (/* binding */ _assertThisInitialized)\n/* harmony export */ });\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return self;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMyNi5qcyIsIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcz9mMDk4Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7326\n')},7462:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ _extends)\n/* harmony export */ });\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQ2Mi5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzPzRiMDkiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7462\n')},4578:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": () => (/* binding */ _inheritsLoose)\n/* harmony export */ });\n/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9611);\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .Z)(subClass, superClass);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU3OC5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZS5qcz80MWRmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4578\n')},3366:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ _objectWithoutPropertiesLoose)\n/* harmony export */ });\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM2Ni5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanM/Njk2MSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3366\n')},9611:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": () => (/* binding */ _setPrototypeOf)\n/* harmony export */ });\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYxMS5qcyIsIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzPzVkMjQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9611\n')},6765:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Vi": () => (/* binding */ w),\n/* harmony export */ "l7": () => (/* binding */ k)\n/* harmony export */ });\n/* unused harmony exports Colord, getFormat, random */\nvar r={grad:.9,turn:360,rad:360/(2*Math.PI)},t=function(r){return"string"==typeof r?r.length>0:"number"==typeof r},n=function(r,t,n){return void 0===t&&(t=0),void 0===n&&(n=Math.pow(10,t)),Math.round(n*r)/n+0},e=function(r,t,n){return void 0===t&&(t=0),void 0===n&&(n=1),r>n?n:r>t?r:t},u=function(r){return(r=isFinite(r)?r%360:0)>0?r:r+360},a=function(r){return{r:e(r.r,0,255),g:e(r.g,0,255),b:e(r.b,0,255),a:e(r.a)}},o=function(r){return{r:n(r.r),g:n(r.g),b:n(r.b),a:n(r.a,3)}},i=/^#([0-9a-f]{3,8})$/i,s=function(r){var t=r.toString(16);return t.length<2?"0"+t:t},h=function(r){var t=r.r,n=r.g,e=r.b,u=r.a,a=Math.max(t,n,e),o=a-Math.min(t,n,e),i=o?a===t?(n-e)/o:a===n?2+(e-t)/o:4+(t-n)/o:0;return{h:60*(i<0?i+6:i),s:a?o/a*100:0,v:a/255*100,a:u}},b=function(r){var t=r.h,n=r.s,e=r.v,u=r.a;t=t/360*6,n/=100,e/=100;var a=Math.floor(t),o=e*(1-n),i=e*(1-(t-a)*n),s=e*(1-(1-t+a)*n),h=a%6;return{r:255*[e,i,o,o,s,e][h],g:255*[s,e,e,i,o,o][h],b:255*[o,o,s,e,e,i][h],a:u}},g=function(r){return{h:u(r.h),s:e(r.s,0,100),l:e(r.l,0,100),a:e(r.a)}},d=function(r){return{h:n(r.h),s:n(r.s),l:n(r.l),a:n(r.a,3)}},f=function(r){return b((n=(t=r).s,{h:t.h,s:(n*=((e=t.l)<50?e:100-e)/100)>0?2*n/(e+n)*100:0,v:e+n,a:t.a}));var t,n,e},c=function(r){return{h:(t=h(r)).h,s:(u=(200-(n=t.s))*(e=t.v)/100)>0&&u<200?n*e/100/(u<=100?u:200-u)*100:0,l:u/2,a:t.a};var t,n,e,u},l=/^hsla?\\(\\s*([+-]?\\d*\\.?\\d+)(deg|rad|grad|turn)?\\s*,\\s*([+-]?\\d*\\.?\\d+)%\\s*,\\s*([+-]?\\d*\\.?\\d+)%\\s*(?:,\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*)?\\)$/i,p=/^hsla?\\(\\s*([+-]?\\d*\\.?\\d+)(deg|rad|grad|turn)?\\s+([+-]?\\d*\\.?\\d+)%\\s+([+-]?\\d*\\.?\\d+)%\\s*(?:\\/\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*)?\\)$/i,v=/^rgba?\\(\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*,\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*,\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*(?:,\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*)?\\)$/i,m=/^rgba?\\(\\s*([+-]?\\d*\\.?\\d+)(%)?\\s+([+-]?\\d*\\.?\\d+)(%)?\\s+([+-]?\\d*\\.?\\d+)(%)?\\s*(?:\\/\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*)?\\)$/i,y={string:[[function(r){var t=i.exec(r);return t?(r=t[1]).length<=4?{r:parseInt(r[0]+r[0],16),g:parseInt(r[1]+r[1],16),b:parseInt(r[2]+r[2],16),a:4===r.length?n(parseInt(r[3]+r[3],16)/255,2):1}:6===r.length||8===r.length?{r:parseInt(r.substr(0,2),16),g:parseInt(r.substr(2,2),16),b:parseInt(r.substr(4,2),16),a:8===r.length?n(parseInt(r.substr(6,2),16)/255,2):1}:null:null},"hex"],[function(r){var t=v.exec(r)||m.exec(r);return t?t[2]!==t[4]||t[4]!==t[6]?null:a({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:void 0===t[7]?1:Number(t[7])/(t[8]?100:1)}):null},"rgb"],[function(t){var n=l.exec(t)||p.exec(t);if(!n)return null;var e,u,a=g({h:(e=n[1],u=n[2],void 0===u&&(u="deg"),Number(e)*(r[u]||1)),s:Number(n[3]),l:Number(n[4]),a:void 0===n[5]?1:Number(n[5])/(n[6]?100:1)});return f(a)},"hsl"]],object:[[function(r){var n=r.r,e=r.g,u=r.b,o=r.a,i=void 0===o?1:o;return t(n)&&t(e)&&t(u)?a({r:Number(n),g:Number(e),b:Number(u),a:Number(i)}):null},"rgb"],[function(r){var n=r.h,e=r.s,u=r.l,a=r.a,o=void 0===a?1:a;if(!t(n)||!t(e)||!t(u))return null;var i=g({h:Number(n),s:Number(e),l:Number(u),a:Number(o)});return f(i)},"hsl"],[function(r){var n=r.h,a=r.s,o=r.v,i=r.a,s=void 0===i?1:i;if(!t(n)||!t(a)||!t(o))return null;var h=function(r){return{h:u(r.h),s:e(r.s,0,100),v:e(r.v,0,100),a:e(r.a)}}({h:Number(n),s:Number(a),v:Number(o),a:Number(s)});return b(h)},"hsv"]]},N=function(r,t){for(var n=0;n=.5},r.prototype.toHex=function(){return r=o(this.rgba),t=r.r,e=r.g,u=r.b,i=(a=r.a)<1?s(n(255*a)):"","#"+s(t)+s(e)+s(u)+i;var r,t,e,u,a,i},r.prototype.toRgb=function(){return o(this.rgba)},r.prototype.toRgbString=function(){return r=o(this.rgba),t=r.r,n=r.g,e=r.b,(u=r.a)<1?"rgba("+t+", "+n+", "+e+", "+u+")":"rgb("+t+", "+n+", "+e+")";var r,t,n,e,u},r.prototype.toHsl=function(){return d(c(this.rgba))},r.prototype.toHslString=function(){return r=d(c(this.rgba)),t=r.h,n=r.s,e=r.l,(u=r.a)<1?"hsla("+t+", "+n+"%, "+e+"%, "+u+")":"hsl("+t+", "+n+"%, "+e+"%)";var r,t,n,e,u},r.prototype.toHsv=function(){return r=h(this.rgba),{h:n(r.h),s:n(r.s),v:n(r.v),a:n(r.a,3)};var r},r.prototype.invert=function(){return w({r:255-(r=this.rgba).r,g:255-r.g,b:255-r.b,a:r.a});var r},r.prototype.saturate=function(r){return void 0===r&&(r=.1),w(M(this.rgba,r))},r.prototype.desaturate=function(r){return void 0===r&&(r=.1),w(M(this.rgba,-r))},r.prototype.grayscale=function(){return w(M(this.rgba,-1))},r.prototype.lighten=function(r){return void 0===r&&(r=.1),w($(this.rgba,r))},r.prototype.darken=function(r){return void 0===r&&(r=.1),w($(this.rgba,-r))},r.prototype.rotate=function(r){return void 0===r&&(r=15),this.hue(this.hue()+r)},r.prototype.alpha=function(r){return"number"==typeof r?w({r:(t=this.rgba).r,g:t.g,b:t.b,a:r}):n(this.rgba.a,3);var t},r.prototype.hue=function(r){var t=c(this.rgba);return"number"==typeof r?w({h:r,s:t.s,l:t.l,a:t.a}):n(t.h)},r.prototype.isEqual=function(r){return this.toHex()===w(r).toHex()},r}(),w=function(r){return r instanceof j?r:new j(r)},S=[],k=function(r){r.forEach(function(r){S.indexOf(r)<0&&(r(j,y),S.push(r))})},E=function(){return new j({r:255*Math.random(),g:255*Math.random(),b:255*Math.random()})};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc2NS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9ub2RlX21vZHVsZXMvY29sb3JkL2luZGV4Lm1qcz9mMDMzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByPXtncmFkOi45LHR1cm46MzYwLHJhZDozNjAvKDIqTWF0aC5QSSl9LHQ9ZnVuY3Rpb24ocil7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHI/ci5sZW5ndGg+MDpcIm51bWJlclwiPT10eXBlb2Ygcn0sbj1mdW5jdGlvbihyLHQsbil7cmV0dXJuIHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPU1hdGgucG93KDEwLHQpKSxNYXRoLnJvdW5kKG4qcikvbiswfSxlPWZ1bmN0aW9uKHIsdCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49MSkscj5uP246cj50P3I6dH0sdT1mdW5jdGlvbihyKXtyZXR1cm4ocj1pc0Zpbml0ZShyKT9yJTM2MDowKT4wP3I6ciszNjB9LGE9ZnVuY3Rpb24ocil7cmV0dXJue3I6ZShyLnIsMCwyNTUpLGc6ZShyLmcsMCwyNTUpLGI6ZShyLmIsMCwyNTUpLGE6ZShyLmEpfX0sbz1mdW5jdGlvbihyKXtyZXR1cm57cjpuKHIuciksZzpuKHIuZyksYjpuKHIuYiksYTpuKHIuYSwzKX19LGk9L14jKFswLTlhLWZdezMsOH0pJC9pLHM9ZnVuY3Rpb24ocil7dmFyIHQ9ci50b1N0cmluZygxNik7cmV0dXJuIHQubGVuZ3RoPDI/XCIwXCIrdDp0fSxoPWZ1bmN0aW9uKHIpe3ZhciB0PXIucixuPXIuZyxlPXIuYix1PXIuYSxhPU1hdGgubWF4KHQsbixlKSxvPWEtTWF0aC5taW4odCxuLGUpLGk9bz9hPT09dD8obi1lKS9vOmE9PT1uPzIrKGUtdCkvbzo0Kyh0LW4pL286MDtyZXR1cm57aDo2MCooaTwwP2krNjppKSxzOmE/by9hKjEwMDowLHY6YS8yNTUqMTAwLGE6dX19LGI9ZnVuY3Rpb24ocil7dmFyIHQ9ci5oLG49ci5zLGU9ci52LHU9ci5hO3Q9dC8zNjAqNixuLz0xMDAsZS89MTAwO3ZhciBhPU1hdGguZmxvb3IodCksbz1lKigxLW4pLGk9ZSooMS0odC1hKSpuKSxzPWUqKDEtKDEtdCthKSpuKSxoPWElNjtyZXR1cm57cjoyNTUqW2UsaSxvLG8scyxlXVtoXSxnOjI1NSpbcyxlLGUsaSxvLG9dW2hdLGI6MjU1KltvLG8scyxlLGUsaV1baF0sYTp1fX0sZz1mdW5jdGlvbihyKXtyZXR1cm57aDp1KHIuaCksczplKHIucywwLDEwMCksbDplKHIubCwwLDEwMCksYTplKHIuYSl9fSxkPWZ1bmN0aW9uKHIpe3JldHVybntoOm4oci5oKSxzOm4oci5zKSxsOm4oci5sKSxhOm4oci5hLDMpfX0sZj1mdW5jdGlvbihyKXtyZXR1cm4gYigobj0odD1yKS5zLHtoOnQuaCxzOihuKj0oKGU9dC5sKTw1MD9lOjEwMC1lKS8xMDApPjA/MipuLyhlK24pKjEwMDowLHY6ZStuLGE6dC5hfSkpO3ZhciB0LG4sZX0sYz1mdW5jdGlvbihyKXtyZXR1cm57aDoodD1oKHIpKS5oLHM6KHU9KDIwMC0obj10LnMpKSooZT10LnYpLzEwMCk+MCYmdTwyMDA/biplLzEwMC8odTw9MTAwP3U6MjAwLXUpKjEwMDowLGw6dS8yLGE6dC5hfTt2YXIgdCxuLGUsdX0sbD0vXmhzbGE/XFwoXFxzKihbKy1dP1xcZCpcXC4/XFxkKykoZGVnfHJhZHxncmFkfHR1cm4pP1xccyosXFxzKihbKy1dP1xcZCpcXC4/XFxkKyklXFxzKixcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKSVcXHMqKD86LFxccyooWystXT9cXGQqXFwuP1xcZCspKCUpP1xccyopP1xcKSQvaSxwPS9eaHNsYT9cXChcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKShkZWd8cmFkfGdyYWR8dHVybik/XFxzKyhbKy1dP1xcZCpcXC4/XFxkKyklXFxzKyhbKy1dP1xcZCpcXC4/XFxkKyklXFxzKig/OlxcL1xccyooWystXT9cXGQqXFwuP1xcZCspKCUpP1xccyopP1xcKSQvaSx2PS9ecmdiYT9cXChcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKSglKT9cXHMqLFxccyooWystXT9cXGQqXFwuP1xcZCspKCUpP1xccyosXFxzKihbKy1dP1xcZCpcXC4/XFxkKykoJSk/XFxzKig/OixcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKSglKT9cXHMqKT9cXCkkL2ksbT0vXnJnYmE/XFwoXFxzKihbKy1dP1xcZCpcXC4/XFxkKykoJSk/XFxzKyhbKy1dP1xcZCpcXC4/XFxkKykoJSk/XFxzKyhbKy1dP1xcZCpcXC4/XFxkKykoJSk/XFxzKig/OlxcL1xccyooWystXT9cXGQqXFwuP1xcZCspKCUpP1xccyopP1xcKSQvaSx5PXtzdHJpbmc6W1tmdW5jdGlvbihyKXt2YXIgdD1pLmV4ZWMocik7cmV0dXJuIHQ/KHI9dFsxXSkubGVuZ3RoPD00P3tyOnBhcnNlSW50KHJbMF0rclswXSwxNiksZzpwYXJzZUludChyWzFdK3JbMV0sMTYpLGI6cGFyc2VJbnQoclsyXStyWzJdLDE2KSxhOjQ9PT1yLmxlbmd0aD9uKHBhcnNlSW50KHJbM10rclszXSwxNikvMjU1LDIpOjF9OjY9PT1yLmxlbmd0aHx8OD09PXIubGVuZ3RoP3tyOnBhcnNlSW50KHIuc3Vic3RyKDAsMiksMTYpLGc6cGFyc2VJbnQoci5zdWJzdHIoMiwyKSwxNiksYjpwYXJzZUludChyLnN1YnN0cig0LDIpLDE2KSxhOjg9PT1yLmxlbmd0aD9uKHBhcnNlSW50KHIuc3Vic3RyKDYsMiksMTYpLzI1NSwyKToxfTpudWxsOm51bGx9LFwiaGV4XCJdLFtmdW5jdGlvbihyKXt2YXIgdD12LmV4ZWMocil8fG0uZXhlYyhyKTtyZXR1cm4gdD90WzJdIT09dFs0XXx8dFs0XSE9PXRbNl0/bnVsbDphKHtyOk51bWJlcih0WzFdKS8odFsyXT8xMDAvMjU1OjEpLGc6TnVtYmVyKHRbM10pLyh0WzRdPzEwMC8yNTU6MSksYjpOdW1iZXIodFs1XSkvKHRbNl0/MTAwLzI1NToxKSxhOnZvaWQgMD09PXRbN10/MTpOdW1iZXIodFs3XSkvKHRbOF0/MTAwOjEpfSk6bnVsbH0sXCJyZ2JcIl0sW2Z1bmN0aW9uKHQpe3ZhciBuPWwuZXhlYyh0KXx8cC5leGVjKHQpO2lmKCFuKXJldHVybiBudWxsO3ZhciBlLHUsYT1nKHtoOihlPW5bMV0sdT1uWzJdLHZvaWQgMD09PXUmJih1PVwiZGVnXCIpLE51bWJlcihlKSooclt1XXx8MSkpLHM6TnVtYmVyKG5bM10pLGw6TnVtYmVyKG5bNF0pLGE6dm9pZCAwPT09bls1XT8xOk51bWJlcihuWzVdKS8obls2XT8xMDA6MSl9KTtyZXR1cm4gZihhKX0sXCJoc2xcIl1dLG9iamVjdDpbW2Z1bmN0aW9uKHIpe3ZhciBuPXIucixlPXIuZyx1PXIuYixvPXIuYSxpPXZvaWQgMD09PW8/MTpvO3JldHVybiB0KG4pJiZ0KGUpJiZ0KHUpP2Eoe3I6TnVtYmVyKG4pLGc6TnVtYmVyKGUpLGI6TnVtYmVyKHUpLGE6TnVtYmVyKGkpfSk6bnVsbH0sXCJyZ2JcIl0sW2Z1bmN0aW9uKHIpe3ZhciBuPXIuaCxlPXIucyx1PXIubCxhPXIuYSxvPXZvaWQgMD09PWE/MTphO2lmKCF0KG4pfHwhdChlKXx8IXQodSkpcmV0dXJuIG51bGw7dmFyIGk9Zyh7aDpOdW1iZXIobiksczpOdW1iZXIoZSksbDpOdW1iZXIodSksYTpOdW1iZXIobyl9KTtyZXR1cm4gZihpKX0sXCJoc2xcIl0sW2Z1bmN0aW9uKHIpe3ZhciBuPXIuaCxhPXIucyxvPXIudixpPXIuYSxzPXZvaWQgMD09PWk/MTppO2lmKCF0KG4pfHwhdChhKXx8IXQobykpcmV0dXJuIG51bGw7dmFyIGg9ZnVuY3Rpb24ocil7cmV0dXJue2g6dShyLmgpLHM6ZShyLnMsMCwxMDApLHY6ZShyLnYsMCwxMDApLGE6ZShyLmEpfX0oe2g6TnVtYmVyKG4pLHM6TnVtYmVyKGEpLHY6TnVtYmVyKG8pLGE6TnVtYmVyKHMpfSk7cmV0dXJuIGIoaCl9LFwiaHN2XCJdXX0sTj1mdW5jdGlvbihyLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgZT10W25dWzBdKHIpO2lmKGUpcmV0dXJuW2UsdFtuXVsxXV19cmV0dXJuW251bGwsdm9pZCAwXX0seD1mdW5jdGlvbihyKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2Ygcj9OKHIudHJpbSgpLHkuc3RyaW5nKTpcIm9iamVjdFwiPT10eXBlb2YgciYmbnVsbCE9PXI/TihyLHkub2JqZWN0KTpbbnVsbCx2b2lkIDBdfSxJPWZ1bmN0aW9uKHIpe3JldHVybiB4KHIpWzFdfSxNPWZ1bmN0aW9uKHIsdCl7dmFyIG49YyhyKTtyZXR1cm57aDpuLmgsczplKG4ucysxMDAqdCwwLDEwMCksbDpuLmwsYTpuLmF9fSxIPWZ1bmN0aW9uKHIpe3JldHVybigyOTkqci5yKzU4NypyLmcrMTE0KnIuYikvMWUzLzI1NX0sJD1mdW5jdGlvbihyLHQpe3ZhciBuPWMocik7cmV0dXJue2g6bi5oLHM6bi5zLGw6ZShuLmwrMTAwKnQsMCwxMDApLGE6bi5hfX0saj1mdW5jdGlvbigpe2Z1bmN0aW9uIHIocil7dGhpcy5wYXJzZWQ9eChyKVswXSx0aGlzLnJnYmE9dGhpcy5wYXJzZWR8fHtyOjAsZzowLGI6MCxhOjF9fXJldHVybiByLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLnBhcnNlZH0sci5wcm90b3R5cGUuYnJpZ2h0bmVzcz1mdW5jdGlvbigpe3JldHVybiBuKEgodGhpcy5yZ2JhKSwyKX0sci5wcm90b3R5cGUuaXNEYXJrPWZ1bmN0aW9uKCl7cmV0dXJuIEgodGhpcy5yZ2JhKTwuNX0sci5wcm90b3R5cGUuaXNMaWdodD1mdW5jdGlvbigpe3JldHVybiBIKHRoaXMucmdiYSk+PS41fSxyLnByb3RvdHlwZS50b0hleD1mdW5jdGlvbigpe3JldHVybiByPW8odGhpcy5yZ2JhKSx0PXIucixlPXIuZyx1PXIuYixpPShhPXIuYSk8MT9zKG4oMjU1KmEpKTpcIlwiLFwiI1wiK3ModCkrcyhlKStzKHUpK2k7dmFyIHIsdCxlLHUsYSxpfSxyLnByb3RvdHlwZS50b1JnYj1mdW5jdGlvbigpe3JldHVybiBvKHRoaXMucmdiYSl9LHIucHJvdG90eXBlLnRvUmdiU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHI9byh0aGlzLnJnYmEpLHQ9ci5yLG49ci5nLGU9ci5iLCh1PXIuYSk8MT9cInJnYmEoXCIrdCtcIiwgXCIrbitcIiwgXCIrZStcIiwgXCIrdStcIilcIjpcInJnYihcIit0K1wiLCBcIituK1wiLCBcIitlK1wiKVwiO3ZhciByLHQsbixlLHV9LHIucHJvdG90eXBlLnRvSHNsPWZ1bmN0aW9uKCl7cmV0dXJuIGQoYyh0aGlzLnJnYmEpKX0sci5wcm90b3R5cGUudG9Ic2xTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcj1kKGModGhpcy5yZ2JhKSksdD1yLmgsbj1yLnMsZT1yLmwsKHU9ci5hKTwxP1wiaHNsYShcIit0K1wiLCBcIituK1wiJSwgXCIrZStcIiUsIFwiK3UrXCIpXCI6XCJoc2woXCIrdCtcIiwgXCIrbitcIiUsIFwiK2UrXCIlKVwiO3ZhciByLHQsbixlLHV9LHIucHJvdG90eXBlLnRvSHN2PWZ1bmN0aW9uKCl7cmV0dXJuIHI9aCh0aGlzLnJnYmEpLHtoOm4oci5oKSxzOm4oci5zKSx2Om4oci52KSxhOm4oci5hLDMpfTt2YXIgcn0sci5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHcoe3I6MjU1LShyPXRoaXMucmdiYSkucixnOjI1NS1yLmcsYjoyNTUtci5iLGE6ci5hfSk7dmFyIHJ9LHIucHJvdG90eXBlLnNhdHVyYXRlPWZ1bmN0aW9uKHIpe3JldHVybiB2b2lkIDA9PT1yJiYocj0uMSksdyhNKHRoaXMucmdiYSxyKSl9LHIucHJvdG90eXBlLmRlc2F0dXJhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIHZvaWQgMD09PXImJihyPS4xKSx3KE0odGhpcy5yZ2JhLC1yKSl9LHIucHJvdG90eXBlLmdyYXlzY2FsZT1mdW5jdGlvbigpe3JldHVybiB3KE0odGhpcy5yZ2JhLC0xKSl9LHIucHJvdG90eXBlLmxpZ2h0ZW49ZnVuY3Rpb24ocil7cmV0dXJuIHZvaWQgMD09PXImJihyPS4xKSx3KCQodGhpcy5yZ2JhLHIpKX0sci5wcm90b3R5cGUuZGFya2VuPWZ1bmN0aW9uKHIpe3JldHVybiB2b2lkIDA9PT1yJiYocj0uMSksdygkKHRoaXMucmdiYSwtcikpfSxyLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIHZvaWQgMD09PXImJihyPTE1KSx0aGlzLmh1ZSh0aGlzLmh1ZSgpK3IpfSxyLnByb3RvdHlwZS5hbHBoYT1mdW5jdGlvbihyKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2Ygcj93KHtyOih0PXRoaXMucmdiYSkucixnOnQuZyxiOnQuYixhOnJ9KTpuKHRoaXMucmdiYS5hLDMpO3ZhciB0fSxyLnByb3RvdHlwZS5odWU9ZnVuY3Rpb24ocil7dmFyIHQ9Yyh0aGlzLnJnYmEpO3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiByP3coe2g6cixzOnQucyxsOnQubCxhOnQuYX0pOm4odC5oKX0sci5wcm90b3R5cGUuaXNFcXVhbD1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy50b0hleCgpPT09dyhyKS50b0hleCgpfSxyfSgpLHc9ZnVuY3Rpb24ocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBqP3I6bmV3IGoocil9LFM9W10saz1mdW5jdGlvbihyKXtyLmZvckVhY2goZnVuY3Rpb24ocil7Uy5pbmRleE9mKHIpPDAmJihyKGoseSksUy5wdXNoKHIpKX0pfSxFPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBqKHtyOjI1NSpNYXRoLnJhbmRvbSgpLGc6MjU1Kk1hdGgucmFuZG9tKCksYjoyNTUqTWF0aC5yYW5kb20oKX0pfTtleHBvcnR7aiBhcyBDb2xvcmQsdyBhcyBjb2xvcmQsayBhcyBleHRlbmQsSSBhcyBnZXRGb3JtYXQsRSBhcyByYW5kb219O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6765\n')}},__webpack_module_cache__={},inProgress,dataWebpackPrefix;function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(t.exports,t,t.exports,__webpack_require__),t.loaded=!0,t.exports}__webpack_require__.m=__webpack_modules__,__webpack_require__.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(n,{a:n}),n},__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.f={},__webpack_require__.e=e=>Promise.all(Object.keys(__webpack_require__.f).reduce(((n,t)=>(__webpack_require__.f[t](e,n),n)),[])),__webpack_require__.u=e=>e+"."+{149:"14b20ad0a8288ce671e8",188:"e336139f8a253ffc7c1c",904:"ef3d94e7d7f89419586d"}[e]+".js",__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),inProgress={},dataWebpackPrefix="blocksyOptions:",__webpack_require__.l=(e,n,t,g)=>{if(inProgress[e])inProgress[e].push(n);else{var I,l;if(void 0!==t)for(var c=document.getElementsByTagName("script"),B=0;B{I.onerror=I.onload=null,clearTimeout(d);var g=inProgress[e];if(delete inProgress[e],I.parentNode&&I.parentNode.removeChild(I),g&&g.forEach((e=>e(t))),n)return n(t)},d=setTimeout(b.bind(null,void 0,{type:"timeout",target:I}),12e4);I.onerror=b.bind(null,I.onerror),I.onload=b.bind(null,I.onload),l&&document.head.appendChild(I)}},__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;__webpack_require__.g.importScripts&&(e=__webpack_require__.g.location+"");var n=__webpack_require__.g.document;if(!e&&n&&(n.currentScript&&(e=n.currentScript.src),!e)){var t=n.getElementsByTagName("script");t.length&&(e=t[t.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),__webpack_require__.p=e})(),(()=>{var e={179:0};__webpack_require__.f.j=(n,t)=>{var g=__webpack_require__.o(e,n)?e[n]:void 0;if(0!==g)if(g)t.push(g[2]);else{var I=new Promise(((t,I)=>g=e[n]=[t,I]));t.push(g[2]=I);var l=__webpack_require__.p+__webpack_require__.u(n),c=new Error;__webpack_require__.l(l,(t=>{if(__webpack_require__.o(e,n)&&(0!==(g=e[n])&&(e[n]=void 0),g)){var I=t&&("load"===t.type?"missing":t.type),l=t&&t.target&&t.target.src;c.message="Loading chunk "+n+" failed.\n("+I+": "+l+")",c.name="ChunkLoadError",c.type=I,c.request=l,g[1](c)}}),"chunk-"+n,n)}};var n=(n,t)=>{var g,I,[l,c,B]=t,i=0;if(l.some((n=>0!==e[n]))){for(g in c)__webpack_require__.o(c,g)&&(__webpack_require__.m[g]=c[g]);B&&B(__webpack_require__)}for(n&&n(t);i