diff --git a/dist/imask.js b/dist/imask.js index dc57588e..abd2d169 100644 --- a/dist/imask.js +++ b/dist/imask.js @@ -309,14 +309,17 @@ var BaseMask = function () { if (this.el.value !== value) this.el.value = value; if (this.cursorPos != cursorPos && cursorPos != null) { - // also queue change cursor for some browsers - if (this._cursorChanging) clearTimeout(this._cursorChanging); - this._changingCursorPos = cursorPos; - this._cursorChanging = setTimeout(function () { - _this.cursorPos = _this._changingCursorPos; - delete _this._cursorChanging; - }, 10); this.cursorPos = cursorPos; + + // also queue change cursor for mobile browsers + if (this._cursorChanging) clearTimeout(this._cursorChanging); + if (this.cursorPos != cursorPos) { + this._changingCursorPos = cursorPos; + this._cursorChanging = setTimeout(function () { + _this.cursorPos = _this._changingCursorPos; + delete _this._cursorChanging; + }, 10); + } } this.saveSelection(); @@ -330,10 +333,6 @@ var BaseMask = function () { }, { key: "_onInput", value: function _onInput(ev) { - if (this._cursorChanging) { - ev.preventDefault(); - return; - } this.processInput(this.el.value); } }, { @@ -363,6 +362,7 @@ var BaseMask = function () { set: function set(str) { this.processInput(str, { cursorPos: str.length, + oldValue: this.rawValue, oldSelection: { start: 0, end: this.rawValue.length @@ -380,7 +380,7 @@ var BaseMask = function () { }, { key: "selectionStart", get: function get() { - return this.el.selectionStart; + return this._cursorChanging ? this._changingCursorPos : this.el.selectionStart; } }, { key: "cursorPos", @@ -872,6 +872,81 @@ PatternMask.DEFAULT_PLACEHOLDER = { char: '_' }; +var PipeMask = function (_BaseMask) { + inherits(PipeMask, _BaseMask); + + function PipeMask(el, opts) { + classCallCheck(this, PipeMask); + + var _this = possibleConstructorReturn(this, (PipeMask.__proto__ || Object.getPrototypeOf(PipeMask)).call(this, el, opts)); + + _this.multipass = opts.multipass; + + _this._compiledMasks = _this.mask.map(function (m) { + return IMask.MaskFactory(el, m); + }); + return _this; + } + + createClass(PipeMask, [{ + key: 'resolve', + value: function resolve(str, details) { + var res = this._pipe(str, details); + if (!this.multipass) return res; + + var cursorPos = details.cursorPos; + + var stepRes; + var tempRes = res; + + while (stepRes !== tempRes) { + stepRes = tempRes; + tempRes = this._pipe(stepRes, { + cursorPos: stepRes.length, + oldValue: stepRes, + oldSelection: { + start: 0, + end: stepRes.length + } + }); + } + + details.cursorPos = cursorPos - (res.length - stepRes.length); + + return stepRes; + } + }, { + key: '_pipe', + value: function _pipe(str, details) { + return this._compiledMasks.reduce(function (s, m) { + var d = extendDetailsAdjustments(s, details); + var res = m.resolve(s, d); + details.cursorPos = d.cursorPos; + return res; + }, str); + } + }, { + key: 'bindEvents', + value: function bindEvents() { + get$1(PipeMask.prototype.__proto__ || Object.getPrototypeOf(PipeMask.prototype), 'bindEvents', this).call(this); + this._compiledMasks.forEach(function (m) { + m.bindEvents(); + // disable basemask events for child masks + BaseMask.prototype.unbindEvents.apply(m); + }); + } + }, { + key: 'unbindEvents', + value: function unbindEvents() { + get$1(PipeMask.prototype.__proto__ || Object.getPrototypeOf(PipeMask.prototype), 'unbindEvents', this).call(this); + this._compiledMasks.forEach(function (m) { + return m.unbindEvents(); + }); + } + }]); + return PipeMask; +}(BaseMask); + function IMask$1(el) { var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; @@ -887,6 +962,7 @@ IMask$1.MaskFactory = function (el, opts) { if (mask instanceof BaseMask) return mask; if (mask instanceof RegExp) return new RegExpMask(el, opts); if (mask instanceof Function) return new FuncMask(el, opts); + if (mask instanceof Array) return new PipeMask(el, opts); if (isString(mask)) return new PatternMask(el, opts); return new BaseMask(el, opts); }; @@ -899,4 +975,4 @@ window.IMask = IMask$1; return IMask$1; }))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL3V0aWxzLmpzIiwiQzovUHJvamVjdHMvaW1hc2tqcy9zcmMvbWFza3MvYmFzZS5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL21hc2tzL3JlZ2V4cC5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL21hc2tzL2Z1bmMuanMiLCJDOi9Qcm9qZWN0cy9pbWFza2pzL3NyYy9tYXNrcy9wYXR0ZXJuLmpzIiwiQzovUHJvamVjdHMvaW1hc2tqcy9zcmMvaW1hc2suanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0XHJcbmZ1bmN0aW9uIGlzU3RyaW5nIChzdHIpIHtcclxuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgc3RyIGluc3RhbmNlb2YgU3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnRcclxuZnVuY3Rpb24gY29uZm9ybSAocmVzLCBzdHIsIGZhbGxiYWNrPScnKSB7XHJcbiAgcmV0dXJuIGlzU3RyaW5nKHJlcykgP1xyXG4gICAgcmVzIDpcclxuICAgIHJlcyA/XHJcbiAgICAgIHN0ciA6XHJcbiAgICAgIGZhbGxiYWNrO1xyXG59XHJcblxyXG5leHBvcnRcclxuZnVuY3Rpb24gZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzKHN0ciwgZGV0YWlscykge1xyXG4gIHZhciBjdXJzb3JQb3MgPSBkZXRhaWxzLmN1cnNvclBvcztcclxuICB2YXIgb2xkU2VsZWN0aW9uID0gZGV0YWlscy5vbGRTZWxlY3Rpb247XHJcbiAgdmFyIG9sZFZhbHVlID0gZGV0YWlscy5vbGRWYWx1ZTtcclxuXHJcbiAgdmFyIHN0YXJ0Q2hhbmdlUG9zID0gTWF0aC5taW4oY3Vyc29yUG9zLCBvbGRTZWxlY3Rpb24uc3RhcnQpO1xyXG4gIHZhciBpbnNlcnRlZENvdW50ID0gY3Vyc29yUG9zIC0gc3RhcnRDaGFuZ2VQb3M7XHJcbiAgLy8gTWF0aC5tYXggZm9yIG9wcG9zaXRlIG9wZXJhdGlvblxyXG4gIHZhciByZW1vdmVkQ291bnQgPSBNYXRoLm1heCgob2xkU2VsZWN0aW9uLmVuZCAtIHN0YXJ0Q2hhbmdlUG9zKSB8fFxyXG4gICAgLy8gZm9yIERlbGV0ZVxyXG4gICAgb2xkVmFsdWUubGVuZ3RoIC0gc3RyLmxlbmd0aCwgMCk7XHJcbiAgdmFyIGhlYWQgPSBzdHIuc3Vic3RyaW5nKDAsIHN0YXJ0Q2hhbmdlUG9zKTtcclxuICB2YXIgdGFpbCA9IHN0ci5zdWJzdHJpbmcoc3RhcnRDaGFuZ2VQb3MgKyBpbnNlcnRlZENvdW50KTtcclxuICB2YXIgaW5zZXJ0ZWQgPSBzdHIuc3Vic3RyKHN0YXJ0Q2hhbmdlUG9zLCBpbnNlcnRlZENvdW50KTtcclxuICB2YXIgcmVtb3ZlZCA9IHN0ci5zdWJzdHIoc3RhcnRDaGFuZ2VQb3MsIHJlbW92ZWRDb3VudCk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzdGFydENoYW5nZVBvcyxcclxuICAgIGhlYWQsXHJcbiAgICB0YWlsLFxyXG4gICAgaW5zZXJ0ZWQsXHJcbiAgICByZW1vdmVkLFxyXG4gICAgLi4uZGV0YWlsc1xyXG4gIH07XHJcbn1cclxuIiwiaW1wb3J0IHtjb25mb3JtLCBleHRlbmREZXRhaWxzQWRqdXN0bWVudHN9IGZyb20gJy4uL3V0aWxzJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdFxyXG5jbGFzcyBCYXNlTWFzayB7XHJcbiAgY29uc3RydWN0b3IgKGVsLCBvcHRzKSB7XHJcbiAgICB0aGlzLmVsID0gZWw7XHJcbiAgICB0aGlzLm1hc2sgPSBvcHRzLm1hc2s7XHJcblxyXG4gICAgdGhpcy5fbGlzdGVuZXJzID0ge307XHJcbiAgICB0aGlzLl9yZWZyZXNoaW5nQ291bnQgPSAwO1xyXG4gICAgdGhpcy5fcmF3VmFsdWUgPSBcIlwiO1xyXG4gICAgdGhpcy5fdW5tYXNrZWRWYWx1ZSA9IFwiXCI7XHJcblxyXG4gICAgdGhpcy5zYXZlU2VsZWN0aW9uID0gdGhpcy5zYXZlU2VsZWN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLl9vbklucHV0ID0gdGhpcy5fb25JbnB1dC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5fb25Ecm9wID0gdGhpcy5fb25Ecm9wLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBvbiAoZXYsIGhhbmRsZXIpIHtcclxuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW2V2XSkgdGhpcy5fbGlzdGVuZXJzW2V2XSA9IFtdO1xyXG4gICAgdGhpcy5fbGlzdGVuZXJzW2V2XS5wdXNoKGhhbmRsZXIpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBvZmYgKGV2LCBoYW5kbGVyKSB7XHJcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1tldl0pIHJldHVybjtcclxuICAgIGlmICghaGFuZGxlcikge1xyXG4gICAgICBkZWxldGUgdGhpcy5fbGlzdGVuZXJzW2V2XTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIGhJbmRleCA9IHRoaXMuX2xpc3RlbmVyc1tldl0uaW5kZXhPZihoYW5kbGVyKTtcclxuICAgIGlmIChoSW5kZXggPj0gMCkgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShoSW5kZXgsIDEpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBnZXQgcmF3VmFsdWUgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jhd1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJhd1ZhbHVlIChzdHIpIHtcclxuICAgIHRoaXMucHJvY2Vzc0lucHV0KHN0ciwge1xyXG4gICAgICBjdXJzb3JQb3M6IHN0ci5sZW5ndGgsXHJcbiAgICAgIG9sZFNlbGVjdGlvbjoge1xyXG4gICAgICAgIHN0YXJ0OiAwLFxyXG4gICAgICAgIGVuZDogdGhpcy5yYXdWYWx1ZS5sZW5ndGhcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVubWFza2VkVmFsdWUgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VubWFza2VkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdW5tYXNrZWRWYWx1ZSAodmFsdWUpIHtcclxuICAgIHRoaXMucmF3VmFsdWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG5cclxuICBiaW5kRXZlbnRzICgpIHtcclxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuc2F2ZVNlbGVjdGlvbik7XHJcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fb25JbnB1dCk7XHJcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLl9vbkRyb3ApO1xyXG4gIH1cclxuXHJcbiAgdW5iaW5kRXZlbnRzICgpIHtcclxuICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuc2F2ZVNlbGVjdGlvbik7XHJcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fb25JbnB1dCk7XHJcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLl9vbkRyb3ApO1xyXG4gIH1cclxuXHJcbiAgZmlyZUV2ZW50IChldikge1xyXG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldl0gfHwgW107XHJcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaChsID0+IGwoKSk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzSW5wdXQgKGlucHV0VmFsdWUsIGRldGFpbHMpIHtcclxuICAgIGRldGFpbHMgPSB7XHJcbiAgICAgIGN1cnNvclBvczogdGhpcy5jdXJzb3JQb3MsXHJcbiAgICAgIG9sZFNlbGVjdGlvbjogdGhpcy5fc2VsZWN0aW9uLFxyXG4gICAgICBvbGRWYWx1ZTogdGhpcy5yYXdWYWx1ZSxcclxuICAgICAgb2xkVW5tYXNrZWRWYWx1ZTogdGhpcy51bm1hc2tlZFZhbHVlLFxyXG4gICAgICAuLi5kZXRhaWxzXHJcbiAgICB9O1xyXG5cclxuICAgIGRldGFpbHMgPSBleHRlbmREZXRhaWxzQWRqdXN0bWVudHMoaW5wdXRWYWx1ZSwgZGV0YWlscyk7XHJcblxyXG4gICAgdmFyIHJlcyA9IGNvbmZvcm0odGhpcy5yZXNvbHZlKGlucHV0VmFsdWUsIGRldGFpbHMpLFxyXG4gICAgICBpbnB1dFZhbHVlLFxyXG4gICAgICB0aGlzLnJhd1ZhbHVlKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQocmVzLCBkZXRhaWxzLmN1cnNvclBvcyk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldCBzZWxlY3Rpb25TdGFydCAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbC5zZWxlY3Rpb25TdGFydDtcclxuICB9XHJcblxyXG4gIGdldCBjdXJzb3JQb3MgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvckNoYW5naW5nID9cclxuICAgICAgdGhpcy5fY2hhbmdpbmdDdXJzb3JQb3MgOlxyXG4gICAgICB0aGlzLmVsLnNlbGVjdGlvbkVuZDtcclxuICB9XHJcblxyXG4gIHNldCBjdXJzb3JQb3MgKHBvcykge1xyXG4gICAgdGhpcy5lbC5zZXRTZWxlY3Rpb25SYW5nZShwb3MsIHBvcyk7XHJcbiAgfVxyXG5cclxuICBzYXZlU2VsZWN0aW9uIChldikge1xyXG4gICAgaWYgKHRoaXMucmF3VmFsdWUgIT09IHRoaXMuZWwudmFsdWUpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiVW5jb250cm9sbGVkIGlucHV0IGNoYW5nZSwgcmVmcmVzaCBtYXNrIG1hbnVhbGx5IVwiKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NlbGVjdGlvbiA9IHtcclxuICAgICAgc3RhcnQ6IHRoaXMuc2VsZWN0aW9uU3RhcnQsXHJcbiAgICAgIGVuZDogdGhpcy5jdXJzb3JQb3NcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBkZXN0cm95ICgpIHtcclxuICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XHJcbiAgICB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUVsZW1lbnQgKHZhbHVlLCBjdXJzb3JQb3MpIHtcclxuICAgIHZhciB1bm1hc2tlZFZhbHVlID0gdGhpcy5fY2FsY1VubWFza2VkKHZhbHVlKTtcclxuICAgIHZhciBpc0NoYW5nZWQgPSAodGhpcy51bm1hc2tlZFZhbHVlICE9PSB1bm1hc2tlZFZhbHVlIHx8XHJcbiAgICAgIHRoaXMucmF3VmFsdWUgIT09IHZhbHVlKTtcclxuXHJcbiAgICB0aGlzLl91bm1hc2tlZFZhbHVlID0gdW5tYXNrZWRWYWx1ZTtcclxuICAgIHRoaXMuX3Jhd1ZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuZWwudmFsdWUgIT09IHZhbHVlKSB0aGlzLmVsLnZhbHVlID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5jdXJzb3JQb3MgIT0gY3Vyc29yUG9zICYmIGN1cnNvclBvcyAhPSBudWxsKSB7XHJcbiAgICAgIC8vIGFsc28gcXVldWUgY2hhbmdlIGN1cnNvciBmb3Igc29tZSBicm93c2Vyc1xyXG4gICAgICBpZiAodGhpcy5fY3Vyc29yQ2hhbmdpbmcpIGNsZWFyVGltZW91dCh0aGlzLl9jdXJzb3JDaGFuZ2luZyk7XHJcbiAgICAgIHRoaXMuX2NoYW5naW5nQ3Vyc29yUG9zID0gY3Vyc29yUG9zO1xyXG4gICAgICB0aGlzLl9jdXJzb3JDaGFuZ2luZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3Vyc29yUG9zID0gdGhpcy5fY2hhbmdpbmdDdXJzb3JQb3M7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2N1cnNvckNoYW5naW5nO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICAgIHRoaXMuY3Vyc29yUG9zID0gY3Vyc29yUG9zO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgaWYgKGlzQ2hhbmdlZCkgdGhpcy5fZmlyZUNoYW5nZUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgX2ZpcmVDaGFuZ2VFdmVudHMgKCkge1xyXG4gICAgdGhpcy5maXJlRXZlbnQoXCJhY2NlcHRcIik7XHJcbiAgfVxyXG5cclxuICBfb25JbnB1dCAoZXYpIHtcclxuICAgIGlmICh0aGlzLl9jdXJzb3JDaGFuZ2luZykge1xyXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb2Nlc3NJbnB1dCh0aGlzLmVsLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIF9vbkRyb3AgKGV2KSB7XHJcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLyBvdmVycmlkZVxyXG4gIHJlc29sdmUgKHN0ciwgZGV0YWlscykgeyByZXR1cm4gc3RyOyB9XHJcblxyXG4gIF9jYWxjVW5tYXNrZWQgKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfVxyXG59XHJcbiIsImltcG9ydCBCYXNlTWFzayBmcm9tICcuL2Jhc2UnO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0XHJcbmNsYXNzIFJlZ0V4cE1hc2sgZXh0ZW5kcyBCYXNlTWFzayB7XHJcbiAgcmVzb2x2ZSAoc3RyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXNrLnRlc3Qoc3RyKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IEJhc2VNYXNrIGZyb20gJy4vYmFzZSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuY2xhc3MgRnVuY01hc2sgZXh0ZW5kcyBCYXNlTWFzayB7XHJcbiAgcmVzb2x2ZSAoLi4uYXJncykge1xyXG4gICAgcmV0dXJuIHRoaXMubWFzayguLi5hcmdzKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtjb25mb3JtfSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCBCYXNlTWFzayBmcm9tICcuL2Jhc2UnO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0XHJcbmNsYXNzIFBhdHRlcm5NYXNrIGV4dGVuZHMgQmFzZU1hc2sge1xyXG4gIGNvbnN0cnVjdG9yIChlbCwgb3B0cykge1xyXG4gICAgc3VwZXIoZWwsIG9wdHMpO1xyXG5cclxuICAgIHRoaXMuX2hvbGxvd3MgPSBbXTtcclxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSBvcHRzLnBsYWNlaG9sZGVyO1xyXG4gICAgdGhpcy5kZWZpbml0aW9ucyA9IHtcclxuICAgICAgLi4uUGF0dGVybk1hc2suREVGSU5JVElPTlMsXHJcbiAgICAgIC4uLm9wdHMuZGVmaW5pdGlvbnNcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5fYWxpZ25DdXJzb3IgPSB0aGlzLl9hbGlnbkN1cnNvci5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5fYWxpZ25DdXJzb3JGcmllbmRseSA9IHRoaXMuX2FsaWduQ3Vyc29yRnJpZW5kbHkuYmluZCh0aGlzKTtcclxuXHJcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBfYWxpZ25DdXJzb3JGcmllbmRseSAoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCAhPT0gdGhpcy5jdXJzb3JQb3MpIHJldHVybjtcclxuICAgIHRoaXMuX2FsaWduQ3Vyc29yKCk7XHJcbiAgfVxyXG5cclxuICBiaW5kRXZlbnRzICgpIHtcclxuICAgIHN1cGVyLmJpbmRFdmVudHMoKTtcclxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9hbGlnbkN1cnNvckZyaWVuZGx5KTtcclxuICB9XHJcblxyXG4gIHVuYmluZEV2ZW50cyAoKSB7XHJcbiAgICBzdXBlci51bmJpbmRFdmVudHMoKTtcclxuICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9hbGlnbkN1cnNvckZyaWVuZGx5KTtcclxuICB9XHJcblxyXG4gIF9pbnN0YWxsRGVmaW5pdGlvbnMgKGRlZmluaXRpb25zKSB7XHJcbiAgICB0aGlzLl9kZWZpbml0aW9ucyA9IGRlZmluaXRpb25zO1xyXG4gICAgdGhpcy5fY2hhckRlZnMgPSBbXTtcclxuICAgIHZhciBwYXR0ZXJuID0gdGhpcy5tYXNrO1xyXG5cclxuICAgIGlmICghcGF0dGVybiB8fCAhZGVmaW5pdGlvbnMpIHJldHVybjtcclxuXHJcbiAgICB2YXIgdW5tYXNraW5nQmxvY2sgPSBmYWxzZTtcclxuICAgIHZhciBvcHRpb25hbEJsb2NrID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpPTA7IGk8cGF0dGVybi5sZW5ndGg7ICsraSkge1xyXG4gICAgICB2YXIgY2ggPSBwYXR0ZXJuW2ldO1xyXG4gICAgICB2YXIgdHlwZSA9ICF1bm1hc2tpbmdCbG9jayAmJiBjaCBpbiBkZWZpbml0aW9ucyA/XHJcbiAgICAgICAgUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUIDpcclxuICAgICAgICBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuRklYRUQ7XHJcbiAgICAgIHZhciB1bm1hc2tpbmcgPSB0eXBlID09PSBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuSU5QVVQgfHwgdW5tYXNraW5nQmxvY2s7XHJcbiAgICAgIHZhciBvcHRpb25hbCA9IHR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiBvcHRpb25hbEJsb2NrO1xyXG5cclxuICAgICAgaWYgKGNoID09PSAneycgfHwgY2ggPT09ICd9Jykge1xyXG4gICAgICAgIHVubWFza2luZ0Jsb2NrID0gIXVubWFza2luZ0Jsb2NrO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2ggPT09ICdbJyB8fCBjaCA9PT0gJ10nKSB7XHJcbiAgICAgICAgb3B0aW9uYWxCbG9jayA9ICFvcHRpb25hbEJsb2NrO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2ggPT09ICdcXFxcJykge1xyXG4gICAgICAgICsraTtcclxuICAgICAgICBjaCA9IHBhdHRlcm5baV07XHJcbiAgICAgICAgLy8gVE9ETyB2YWxpZGF0aW9uXHJcbiAgICAgICAgaWYgKCFjaCkgYnJlYWs7XHJcbiAgICAgICAgdHlwZSA9IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5GSVhFRDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fY2hhckRlZnMucHVzaCh7XHJcbiAgICAgICAgY2hhcjogY2gsXHJcbiAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICBvcHRpb25hbDogb3B0aW9uYWwsXHJcbiAgICAgICAgdW5tYXNraW5nOiB1bm1hc2tpbmdcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fYnVpbGRSZXNvbHZlcnMoKTtcclxuICB9XHJcblxyXG4gIF9idWlsZFJlc29sdmVycyAoKSB7XHJcbiAgICB0aGlzLl9yZXNvbHZlcnMgPSB7fTtcclxuICAgIGZvciAodmFyIGRlZktleSBpbiB0aGlzLmRlZmluaXRpb25zKSB7XHJcbiAgICAgIHRoaXMuX3Jlc29sdmVyc1tkZWZLZXldID0gSU1hc2suTWFza0ZhY3RvcnkodGhpcy5lbCwge1xyXG4gICAgICAgIG1hc2s6IHRoaXMuZGVmaW5pdGlvbnNbZGVmS2V5XVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9hcHBlbmRUYWlsIChzdHIsIHRhaWwpIHtcclxuICAgIHZhciBwbGFjZWhvbGRlckJ1ZmZlciA9ICcnO1xyXG4gICAgdmFyIGhvbGxvd3MgPSB0aGlzLl9ob2xsb3dzLnNsaWNlKCk7XHJcbiAgICB2YXIgb3ZlcmZsb3cgPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKHZhciBjaT0wLCBkaT10aGlzLl9tYXBQb3NUb0RlZkluZGV4KHN0ci5sZW5ndGgpOyBjaSA8IHRhaWwubGVuZ3RoOyArK2RpKSB7XHJcbiAgICAgIHZhciBjaCA9IHRhaWxbY2ldO1xyXG4gICAgICB2YXIgZGVmID0gdGhpcy5fY2hhckRlZnNbZGldO1xyXG5cclxuICAgICAgLy8gZmFpbGVkXHJcbiAgICAgIGlmICghZGVmKSB7XHJcbiAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCkge1xyXG4gICAgICAgIHZhciByZXNvbHZlciA9IHRoaXMuX3Jlc29sdmVyc1tkZWYuY2hhcl07XHJcbiAgICAgICAgdmFyIGNocmVzID0gcmVzb2x2ZXIucmVzb2x2ZShjaCwgZGksIHN0cikgfHwgJyc7XHJcbiAgICAgICAgaWYgKGNocmVzKSB7XHJcbiAgICAgICAgICBjaHJlcyA9IGNvbmZvcm0oY2hyZXMsIGNoKTtcclxuICAgICAgICAgICsrY2k7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICghZGVmLm9wdGlvbmFsKSBjaHJlcyA9IHRoaXMuX3BsYWNlaG9sZGVyLmNoYXI7XHJcbiAgICAgICAgICBob2xsb3dzLnB1c2goZGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdHIgKz0gcGxhY2Vob2xkZXJCdWZmZXIgKyBjaHJlcztcclxuICAgICAgICBwbGFjZWhvbGRlckJ1ZmZlciA9ICcnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBsYWNlaG9sZGVyQnVmZmVyICs9IGRlZi5jaGFyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtzdHIsIGhvbGxvd3MsIG92ZXJmbG93XTtcclxuICB9XHJcblxyXG4gIF9leHRyYWN0SW5wdXQgKHN0ciwgZnJvbVBvcz0wKSB7XHJcbiAgICB2YXIgaW5wdXQgPSAnJztcclxuXHJcbiAgICBmb3IgKHZhciBjaT0wLCBkaT10aGlzLl9tYXBQb3NUb0RlZkluZGV4KGZyb21Qb3MpOyBjaTxzdHIubGVuZ3RoICYmIGRpPHRoaXMuX2NoYXJEZWZzLmxlbmd0aDsgKytkaSkge1xyXG4gICAgICB2YXIgY2ggPSBzdHJbY2ldO1xyXG4gICAgICB2YXIgZGVmID0gdGhpcy5fY2hhckRlZnNbZGldO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2lzSGlkZGVuSG9sbG93KGRpKSkgY29udGludWU7XHJcblxyXG4gICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiAhdGhpcy5faXNIb2xsb3coZGkpKSBpbnB1dCArPSBjaDtcclxuICAgICAgKytjaTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbnB1dDtcclxuICB9XHJcblxyXG4gIF9pc0hvbGxvdyAoZGVmSW5kZXgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob2xsb3dzLmluZGV4T2YoZGVmSW5kZXgpID49IDA7XHJcbiAgfVxyXG5cclxuICBfaXNIaWRkZW5Ib2xsb3cgKGRlZkluZGV4KSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNIb2xsb3coZGVmSW5kZXgpICYmXHJcbiAgICAgIHRoaXMuX2NoYXJEZWZzW2RlZkluZGV4XSAmJiB0aGlzLl9jaGFyRGVmc1tkZWZJbmRleF0ub3B0aW9uYWw7XHJcbiAgfVxyXG5cclxuICBfaG9sbG93c0JlZm9yZSAoZGVmSW5kZXgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob2xsb3dzLmZpbHRlcihoID0+IGggPCBkZWZJbmRleCAmJiB0aGlzLl9pc0hpZGRlbkhvbGxvdyhoKSk7XHJcbiAgfVxyXG5cclxuICBfbWFwRGVmSW5kZXhUb1BvcyAoZGVmSW5kZXgpIHtcclxuICAgIHJldHVybiBkZWZJbmRleCAtIHRoaXMuX2hvbGxvd3NCZWZvcmUoZGVmSW5kZXgpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIF9tYXBQb3NUb0RlZkluZGV4IChwb3MpIHtcclxuICAgIHZhciBsYXN0SG9sbG93SW5kZXggPSBwb3M7XHJcbiAgICAvLyBleHRlbmQgY29udGlndW91c1xyXG4gICAgd2hpbGUgKHRoaXMuX2lzSGlkZGVuSG9sbG93KGxhc3RIb2xsb3dJbmRleC0xKSkgKytsYXN0SG9sbG93SW5kZXg7XHJcblxyXG4gICAgcmV0dXJuIHBvcyArIHRoaXMuX2hvbGxvd3NCZWZvcmUobGFzdEhvbGxvd0luZGV4KS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBfZ2VuZXJhdGVJbnNlcnRTdGVwcyAoaGVhZCwgaW5zZXJ0ZWQpIHtcclxuICAgIHZhciByZXMgPSBoZWFkO1xyXG4gICAgdmFyIGhvbGxvd3MgPSB0aGlzLl9ob2xsb3dzLnNsaWNlKCk7XHJcbiAgICB2YXIgcGxhY2Vob2xkZXJCdWZmZXIgPSAnJztcclxuICAgIHZhciBpbnNlcnRTdGVwcyA9IFtbcmVzLCBob2xsb3dzLnNsaWNlKCldXTtcclxuXHJcbiAgICBmb3IgKHZhciBjaT0wLCBkaT10aGlzLl9tYXBQb3NUb0RlZkluZGV4KGhlYWQubGVuZ3RoKTsgY2k8aW5zZXJ0ZWQubGVuZ3RoOykge1xyXG4gICAgICB2YXIgZGVmID0gdGhpcy5fY2hhckRlZnNbZGldO1xyXG4gICAgICBpZiAoIWRlZikgYnJlYWs7XHJcblxyXG4gICAgICB2YXIgY2ggPSBpbnNlcnRlZFtjaV07XHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSB7XHJcbiAgICAgICAgdmFyIHJlc29sdmVyID0gdGhpcy5fcmVzb2x2ZXJzW2RlZi5jaGFyXTtcclxuICAgICAgICB2YXIgY2hyZXMgPSByZXNvbHZlci5yZXNvbHZlKGNoLCBjaSwgcmVzKSB8fCAnJztcclxuICAgICAgICAvLyBpZiBvayAtIG5leHQgZGlcclxuICAgICAgICBpZiAoY2hyZXMpIHtcclxuICAgICAgICAgIHJlcyArPSBwbGFjZWhvbGRlckJ1ZmZlciArIGNvbmZvcm0oY2hyZXMsIGNoKTsgcGxhY2Vob2xkZXJCdWZmZXIgPSAnJztcclxuICAgICAgICAgIGluc2VydFN0ZXBzLnB1c2goW3JlcywgaG9sbG93cy5zbGljZSgpXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkZWYub3B0aW9uYWwpIHtcclxuICAgICAgICAgIGlmIChob2xsb3dzLmluZGV4T2YoZGkpIDwgMCkgaG9sbG93cy5wdXNoKGRpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNocmVzIHx8IGRlZi5vcHRpb25hbCkgKytkaTtcclxuICAgICAgICBpZiAoY2hyZXMgfHwgIWRlZi5vcHRpb25hbCkgKytjaTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwbGFjZWhvbGRlckJ1ZmZlciArPSBkZWYuY2hhcjtcclxuXHJcbiAgICAgICAgaWYgKGNoID09PSBkZWYuY2hhcikgKytjaTtcclxuICAgICAgICArK2RpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGluc2VydFN0ZXBzO1xyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZSAoc3RyLCBkZXRhaWxzKSB7XHJcbiAgICB2YXIgY3Vyc29yUG9zID0gZGV0YWlscy5jdXJzb3JQb3M7XHJcbiAgICB2YXIgc3RhcnRDaGFuZ2VQb3MgPSBkZXRhaWxzLnN0YXJ0Q2hhbmdlUG9zO1xyXG4gICAgdmFyIGluc2VydGVkID0gZGV0YWlscy5pbnNlcnRlZDtcclxuICAgIHZhciByZW1vdmVkQ291bnQgPSBkZXRhaWxzLnJlbW92ZWQubGVuZ3RoO1xyXG4gICAgdmFyIHRhaWxJbnB1dCA9IHRoaXMuX2V4dHJhY3RJbnB1dChkZXRhaWxzLnRhaWwsIHN0YXJ0Q2hhbmdlUG9zICsgcmVtb3ZlZENvdW50KTtcclxuXHJcbiAgICAvLyByZW1vdmUgaG9sbG93cyBhZnRlciBjdXJzb3JcclxuICAgIHZhciBsYXN0SG9sbG93SW5kZXggPSB0aGlzLl9tYXBQb3NUb0RlZkluZGV4KHN0YXJ0Q2hhbmdlUG9zKTtcclxuICAgIHRoaXMuX2hvbGxvd3MgPSB0aGlzLl9ob2xsb3dzLmZpbHRlcihoID0+IGggPCBsYXN0SG9sbG93SW5kZXgpO1xyXG5cclxuICAgIHZhciByZXMgPSBkZXRhaWxzLmhlYWQ7XHJcblxyXG4gICAgLy8gaW5zZXJ0IGF2YWlsYWJsZVxyXG4gICAgdmFyIGluc2VydFN0ZXBzID0gdGhpcy5fZ2VuZXJhdGVJbnNlcnRTdGVwcyhyZXMsIGluc2VydGVkKTtcclxuICAgIGZvciAodmFyIGlzdGVwPWluc2VydFN0ZXBzLmxlbmd0aC0xOyBpc3RlcCA+PSAwOyAtLWlzdGVwKSB7XHJcbiAgICAgIHZhciBzdGVwO1xyXG4gICAgICBbc3RlcCwgdGhpcy5faG9sbG93c10gPSBpbnNlcnRTdGVwc1tpc3RlcF07XHJcbiAgICAgIHZhciBbdHJlcywgdGhvbGxvd3MsIG92ZXJmbG93XSA9IHRoaXMuX2FwcGVuZFRhaWwoc3RlcCwgdGFpbElucHV0KTtcclxuICAgICAgaWYgKCFvdmVyZmxvdykge1xyXG4gICAgICAgIFtyZXMsIHRoaXMuX2hvbGxvd3NdID0gW3RyZXMsIHRob2xsb3dzXTtcclxuICAgICAgICBjdXJzb3JQb3MgPSBzdGVwLmxlbmd0aDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGlucHV0IGF0IHRoZSBlbmQgLSBhcHBlbmQgZml4ZWRcclxuICAgIGlmIChpbnNlcnRlZCAmJiBjdXJzb3JQb3MgPT09IHJlcy5sZW5ndGgpIHtcclxuICAgICAgLy8gYXBwZW5kIGZpeGVkIGF0IGVuZFxyXG4gICAgICB2YXIgYXBwZW5kZWQgPSB0aGlzLl9hcHBlbmRGaXhlZEVuZChyZXMpO1xyXG4gICAgICBjdXJzb3JQb3MgKz0gYXBwZW5kZWQubGVuZ3RoIC0gcmVzLmxlbmd0aDtcclxuICAgICAgcmVzID0gYXBwZW5kZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpbnNlcnRlZCAmJiByZW1vdmVkQ291bnQpIHtcclxuICAgICAgLy8gaWYgZGVsZXRlIGF0IHJpZ2h0XHJcbiAgICAgIGlmIChkZXRhaWxzLm9sZFNlbGVjdGlvbi5lbmQgPT09IGN1cnNvclBvcykge1xyXG4gICAgICAgIGZvciAoOzsrK2N1cnNvclBvcykge1xyXG4gICAgICAgICAgdmFyIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgoY3Vyc29yUG9zKTtcclxuICAgICAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgICAgICBpZiAoIWRlZiB8fCBkZWYudHlwZSAhPT0gUGF0dGVybk1hc2suREVGX1RZUEVTLkZJWEVEKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSBoZWFkIGZpeGVkIGFuZCBob2xsb3dzIGlmIHJlbW92ZWQgYXQgZW5kXHJcbiAgICAgIGlmIChjdXJzb3JQb3MgPT09IHJlcy5sZW5ndGgpIHtcclxuICAgICAgICB2YXIgZGkgPSB0aGlzLl9tYXBQb3NUb0RlZkluZGV4KGN1cnNvclBvcy0xKTtcclxuICAgICAgICB2YXIgaGFzSG9sbG93cyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAoOyBkaSA+IDA7IC0tZGkpIHtcclxuICAgICAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNIb2xsb3coZGkpKSBoYXNIb2xsb3dzID0gdHJ1ZTtcclxuICAgICAgICAgICAgZWxzZSBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhhc0hvbGxvd3MpIHJlcyA9IHJlcy5zbGljZSgwLCBkaSArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXBwZW5kIHBsYWNlaG9sZGVyXHJcbiAgICByZXMgPSB0aGlzLl9hcHBlbmRQbGFjZWhvbGRlckVuZChyZXMpO1xyXG4gICAgZGV0YWlscy5jdXJzb3JQb3MgPSBjdXJzb3JQb3M7XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIF9maXJlQ2hhbmdlRXZlbnRzICgpIHtcclxuICAgIC8vIGZpcmUgJ2NvbXBsZXRlJyBhZnRlciAnYWNjZXB0JyBldmVudFxyXG4gICAgc3VwZXIuX2ZpcmVDaGFuZ2VFdmVudHMoKTtcclxuICAgIGlmICh0aGlzLmlzQ29tcGxldGUpIHRoaXMuZmlyZUV2ZW50KFwiY29tcGxldGVcIik7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDb21wbGV0ZSAoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuX2NoYXJEZWZzLmZpbHRlcigoZGVmLCBkaSkgPT5cclxuICAgICAgZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiAhZGVmLm9wdGlvbmFsICYmXHJcbiAgICAgIHRoaXMuX2lzSG9sbG93KGRpKSkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgX2FwcGVuZEZpeGVkRW5kIChyZXMpIHtcclxuICAgIGZvciAodmFyIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgocmVzLmxlbmd0aCk7OyArK2RpKSB7XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgIGlmICghZGVmKSBicmVhaztcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pc0hpZGRlbkhvbGxvdyhkaSkpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCkgYnJlYWs7XHJcbiAgICAgIGlmIChkaSA+PSByZXMubGVuZ3RoKSByZXMgKz0gZGVmLmNoYXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgX2FwcGVuZFBsYWNlaG9sZGVyRW5kIChyZXMpIHtcclxuICAgIGZvciAodmFyIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgocmVzLmxlbmd0aCk7IGRpPHRoaXMuX2NoYXJEZWZzLmxlbmd0aDsgKytkaSkge1xyXG4gICAgICB2YXIgZGVmID0gdGhpcy5fY2hhckRlZnNbZGldO1xyXG4gICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiAhdGhpcy5faXNIb2xsb3coZGkpKSB7XHJcbiAgICAgICAgdGhpcy5faG9sbG93cy5wdXNoKGRpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fcGxhY2Vob2xkZXIuc2hvdyA9PT0gJ2Fsd2F5cycpIHtcclxuICAgICAgICByZXMgKz0gZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5GSVhFRCA/XHJcbiAgICAgICAgICBkZWYuY2hhciA6XHJcbiAgICAgICAgICAhZGVmLm9wdGlvbmFsID9cclxuICAgICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIuY2hhciA6XHJcbiAgICAgICAgICAgICcnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgX2NhbGNVbm1hc2tlZCAoc3RyKSB7XHJcbiAgICB2YXIgdW5tYXNrZWQgPSAnJztcclxuICAgIGZvciAodmFyIGNpPTAsIGRpPTA7IGNpPHN0ci5sZW5ndGggJiYgZGk8dGhpcy5fY2hhckRlZnMubGVuZ3RoOyArK2RpKSB7XHJcbiAgICAgIHZhciBjaCA9IHN0cltjaV07XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcblxyXG4gICAgICBpZiAodGhpcy5faXNIaWRkZW5Ib2xsb3coZGkpKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGlmIChkZWYudW5tYXNraW5nICYmICF0aGlzLl9pc0hvbGxvdyhkaSkgJiZcclxuICAgICAgICAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiB0aGlzLl9yZXNvbHZlcnNbZGVmLmNoYXJdLnJlc29sdmUoY2gsIGNpLCBzdHIpIHx8XHJcbiAgICAgICAgICBkZWYuY2hhciA9PT0gY2gpKSB7XHJcbiAgICAgICAgdW5tYXNrZWQgKz0gY2g7XHJcbiAgICAgIH1cclxuICAgICAgKytjaTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bm1hc2tlZDtcclxuICB9XHJcblxyXG4gIGdldCB1bm1hc2tlZFZhbHVlICgpIHtcclxuICAgIHJldHVybiB0aGlzLl91bm1hc2tlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHVubWFza2VkVmFsdWUgKHN0cikge1xyXG4gICAgdGhpcy5faG9sbG93cy5sZW5ndGggPSAwO1xyXG4gICAgdmFyIHJlcztcclxuICAgIFtyZXMsIHRoaXMuX2hvbGxvd3NdID0gdGhpcy5fYXBwZW5kVGFpbCgnJywgc3RyKTtcclxuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLl9hcHBlbmRQbGFjZWhvbGRlckVuZChyZXMpKTtcclxuICB9XHJcblxyXG4gIGdldCBwbGFjZWhvbGRlciAoKSB7IHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjsgfVxyXG5cclxuICBzZXQgcGxhY2Vob2xkZXIgKHBoKSB7XHJcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHtcclxuICAgICAgLi4uUGF0dGVybk1hc2suREVGQVVMVF9QTEFDRUhPTERFUixcclxuICAgICAgLi4ucGhcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHRoaXMudW5tYXNrZWRWYWx1ZSA9IHRoaXMudW5tYXNrZWRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBwbGFjZWhvbGRlckxhYmVsICgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFyRGVmcy5tYXAoZGVmID0+XHJcbiAgICAgIGRlZi50eXBlID09PSBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuRklYRUQgP1xyXG4gICAgICAgIGRlZi5jaGFyIDpcclxuICAgICAgICAhZGVmLm9wdGlvbmFsID9cclxuICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyLmNoYXIgOlxyXG4gICAgICAgICAgJycpLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRlZmluaXRpb25zICgpIHsgcmV0dXJuIHRoaXMuX2RlZmluaXRpb25zOyB9XHJcblxyXG4gIHNldCBkZWZpbml0aW9ucyAoZGVmcykge1xyXG4gICAgdGhpcy5faW5zdGFsbERlZmluaXRpb25zKGRlZnMpO1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB0aGlzLnVubWFza2VkVmFsdWUgPSB0aGlzLnVubWFza2VkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbWFzayAoKSB7IHJldHVybiB0aGlzLl9tYXNrOyB9XHJcblxyXG4gIHNldCBtYXNrIChtYXNrKSB7XHJcbiAgICB0aGlzLl9tYXNrID0gbWFzaztcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgdGhpcy5kZWZpbml0aW9ucyA9IHRoaXMuZGVmaW5pdGlvbnM7XHJcbiAgfVxyXG5cclxuICBfYWxpZ25DdXJzb3IgKCkge1xyXG4gICAgdmFyIGN1cnNvckRlZkluZGV4ID0gdGhpcy5fbWFwUG9zVG9EZWZJbmRleCh0aGlzLmN1cnNvclBvcyk7XHJcbiAgICBmb3IgKHZhciByUG9zID0gY3Vyc29yRGVmSW5kZXg7IHJQb3MgPj0gMDsgLS1yUG9zKSB7XHJcbiAgICAgIHZhciByRGVmID0gdGhpcy5fY2hhckRlZnNbclBvc107XHJcbiAgICAgIHZhciBsUG9zID0gclBvcy0xO1xyXG4gICAgICB2YXIgbERlZiA9IHRoaXMuX2NoYXJEZWZzW2xQb3NdO1xyXG4gICAgICBpZiAodGhpcy5faXNIaWRkZW5Ib2xsb3cobFBvcykpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCghckRlZiB8fCByRGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiB0aGlzLl9pc0hvbGxvdyhyUG9zKSAmJiAhdGhpcy5faXNIaWRkZW5Ib2xsb3coclBvcykpICYmXHJcbiAgICAgICAgIXRoaXMuX2lzSG9sbG93KGxQb3MpKSB7XHJcbiAgICAgICAgY3Vyc29yRGVmSW5kZXggPSByUG9zO1xyXG4gICAgICAgIGlmICghbERlZiB8fCBsRGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCkgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY3Vyc29yUG9zID0gdGhpcy5fbWFwRGVmSW5kZXhUb1BvcyhjdXJzb3JEZWZJbmRleCk7XHJcbiAgfVxyXG59XHJcblBhdHRlcm5NYXNrLkRFRklOSVRJT05TID0ge1xyXG4gICcwJzogL1xcZC8sXHJcbiAgJ2EnOiAvW1xcdTAwNDEtXFx1MDA1QVxcdTAwNjEtXFx1MDA3QVxcdTAwQUFcXHUwMEI1XFx1MDBCQVxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0OEEtXFx1MDUyN1xcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjIwLVxcdTA2NEFcXHUwNjZFXFx1MDY2RlxcdTA2NzEtXFx1MDZEM1xcdTA2RDVcXHUwNkU1XFx1MDZFNlxcdTA2RUVcXHUwNkVGXFx1MDZGQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTBcXHUwNzEyLVxcdTA3MkZcXHUwNzRELVxcdTA3QTVcXHUwN0IxXFx1MDdDQS1cXHUwN0VBXFx1MDdGNFxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODE1XFx1MDgxQVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhBMFxcdTA4QTItXFx1MDhBQ1xcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTc3XFx1MDk3OS1cXHUwOTdGXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzNcXHUwQzM1LVxcdTBDMzlcXHUwQzNEXFx1MEM1OFxcdTBDNTlcXHUwQzYwXFx1MEM2MVxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ2MFxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y0XFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFDXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlDMS1cXHUxOUM3XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE4M1xcdTIxODRcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRUVcXHUyQ0YyXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEODAtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJFMkZcXHUzMDA1XFx1MzAwNlxcdTMwMzEtXFx1MzAzNVxcdTMwM0JcXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkNDXFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OTdcXHVBNkEwLVxcdUE2RTVcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3OEVcXHVBNzkwLVxcdUE3OTNcXHVBN0EwLVxcdUE3QUFcXHVBN0Y4LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QTkwQS1cXHVBOTI1XFx1QTkzMC1cXHVBOTQ2XFx1QTk2MC1cXHVBOTdDXFx1QTk4NC1cXHVBOUIyXFx1QTlDRlxcdUFBMDAtXFx1QUEyOFxcdUFBNDAtXFx1QUE0MlxcdUFBNDQtXFx1QUE0QlxcdUFBNjAtXFx1QUE3NlxcdUFBN0FcXHVBQTgwLVxcdUFBQUZcXHVBQUIxXFx1QUFCNVxcdUFBQjZcXHVBQUI5LVxcdUFBQkRcXHVBQUMwXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFQVxcdUFBRjItXFx1QUFGNFxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCQzAtXFx1QUJFMlxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMURcXHVGQjFGLVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMjEtXFx1RkYzQVxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ10vLCAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjIwNzUwNzBcclxuICAnKic6IC8uL1xyXG59O1xyXG5QYXR0ZXJuTWFzay5ERUZfVFlQRVMgPSB7XHJcbiAgSU5QVVQ6ICdpbnB1dCcsXHJcbiAgRklYRUQ6ICdmaXhlZCdcclxufVxyXG5QYXR0ZXJuTWFzay5ERUZBVUxUX1BMQUNFSE9MREVSID0ge1xyXG4gIHNob3c6ICdsYXp5JyxcclxuICBjaGFyOiAnXydcclxufTtcclxuIiwiaW1wb3J0IHtpc1N0cmluZ30gZnJvbSAnLi91dGlscyc7XHJcblxyXG5pbXBvcnQgQmFzZU1hc2sgZnJvbSAnLi9tYXNrcy9iYXNlJztcclxuaW1wb3J0IFJlZ0V4cE1hc2sgZnJvbSAnLi9tYXNrcy9yZWdleHAnO1xyXG5pbXBvcnQgRnVuY01hc2sgZnJvbSAnLi9tYXNrcy9mdW5jJztcclxuaW1wb3J0IFBhdHRlcm5NYXNrIGZyb20gJy4vbWFza3MvcGF0dGVybic7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuZnVuY3Rpb24gSU1hc2sgKGVsLCBvcHRzPXt9KSB7XHJcbiAgdmFyIG1hc2sgPSBJTWFzay5NYXNrRmFjdG9yeShlbCwgb3B0cyk7XHJcbiAgbWFzay5iaW5kRXZlbnRzKCk7XHJcbiAgLy8gcmVmcmVzaFxyXG4gIG1hc2sucmF3VmFsdWUgPSBlbC52YWx1ZTtcclxuICByZXR1cm4gbWFzaztcclxufVxyXG5cclxuSU1hc2suTWFza0ZhY3RvcnkgPSBmdW5jdGlvbiAoZWwsIG9wdHMpIHtcclxuICB2YXIgbWFzayA9IG9wdHMubWFzaztcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEJhc2VNYXNrKSByZXR1cm4gbWFzaztcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIG5ldyBSZWdFeHBNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gbmV3IEZ1bmNNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAoaXNTdHJpbmcobWFzaykpIHJldHVybiBuZXcgUGF0dGVybk1hc2soZWwsIG9wdHMpO1xyXG4gIHJldHVybiBuZXcgQmFzZU1hc2soZWwsIG9wdHMpO1xyXG59XHJcbklNYXNrLkJhc2VNYXNrID0gQmFzZU1hc2s7XHJcbklNYXNrLkZ1bmNNYXNrID0gRnVuY01hc2s7XHJcbklNYXNrLlJlZ0V4cE1hc2sgPSBSZWdFeHBNYXNrO1xyXG5JTWFzay5QYXR0ZXJuTWFzayA9IFBhdHRlcm5NYXNrO1xyXG53aW5kb3cuSU1hc2sgPSBJTWFzaztcclxuIl0sIm5hbWVzIjpbImlzU3RyaW5nIiwic3RyIiwiU3RyaW5nIiwiY29uZm9ybSIsInJlcyIsImZhbGxiYWNrIiwiZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzIiwiZGV0YWlscyIsImN1cnNvclBvcyIsIm9sZFNlbGVjdGlvbiIsIm9sZFZhbHVlIiwic3RhcnRDaGFuZ2VQb3MiLCJNYXRoIiwibWluIiwic3RhcnQiLCJpbnNlcnRlZENvdW50IiwicmVtb3ZlZENvdW50IiwibWF4IiwiZW5kIiwibGVuZ3RoIiwiaGVhZCIsInN1YnN0cmluZyIsInRhaWwiLCJpbnNlcnRlZCIsInN1YnN0ciIsInJlbW92ZWQiLCJCYXNlTWFzayIsImVsIiwib3B0cyIsIm1hc2siLCJfbGlzdGVuZXJzIiwiX3JlZnJlc2hpbmdDb3VudCIsIl9yYXdWYWx1ZSIsIl91bm1hc2tlZFZhbHVlIiwic2F2ZVNlbGVjdGlvbiIsImJpbmQiLCJfb25JbnB1dCIsIl9vbkRyb3AiLCJldiIsImhhbmRsZXIiLCJwdXNoIiwiaEluZGV4IiwiaW5kZXhPZiIsInNwbGljZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibGlzdGVuZXJzIiwiZm9yRWFjaCIsImwiLCJpbnB1dFZhbHVlIiwiX3NlbGVjdGlvbiIsInJhd1ZhbHVlIiwidW5tYXNrZWRWYWx1ZSIsInJlc29sdmUiLCJ1cGRhdGVFbGVtZW50IiwidmFsdWUiLCJ3YXJuIiwic2VsZWN0aW9uU3RhcnQiLCJ1bmJpbmRFdmVudHMiLCJfY2FsY1VubWFza2VkIiwiaXNDaGFuZ2VkIiwiX2N1cnNvckNoYW5naW5nIiwiY2xlYXJUaW1lb3V0IiwiX2NoYW5naW5nQ3Vyc29yUG9zIiwic2V0VGltZW91dCIsIl9maXJlQ2hhbmdlRXZlbnRzIiwiZmlyZUV2ZW50IiwicHJldmVudERlZmF1bHQiLCJwcm9jZXNzSW5wdXQiLCJzdG9wUHJvcGFnYXRpb24iLCJzZWxlY3Rpb25FbmQiLCJwb3MiLCJzZXRTZWxlY3Rpb25SYW5nZSIsIlJlZ0V4cE1hc2siLCJ0ZXN0IiwiRnVuY01hc2siLCJQYXR0ZXJuTWFzayIsIl9ob2xsb3dzIiwicGxhY2Vob2xkZXIiLCJkZWZpbml0aW9ucyIsIkRFRklOSVRJT05TIiwiX2FsaWduQ3Vyc29yIiwiX2FsaWduQ3Vyc29yRnJpZW5kbHkiLCJfaW5pdGlhbGl6ZWQiLCJfZGVmaW5pdGlvbnMiLCJfY2hhckRlZnMiLCJwYXR0ZXJuIiwidW5tYXNraW5nQmxvY2siLCJvcHRpb25hbEJsb2NrIiwiaSIsImNoIiwidHlwZSIsIkRFRl9UWVBFUyIsIklOUFVUIiwiRklYRUQiLCJ1bm1hc2tpbmciLCJvcHRpb25hbCIsIl9idWlsZFJlc29sdmVycyIsIl9yZXNvbHZlcnMiLCJkZWZLZXkiLCJJTWFzayIsIk1hc2tGYWN0b3J5IiwicGxhY2Vob2xkZXJCdWZmZXIiLCJob2xsb3dzIiwic2xpY2UiLCJvdmVyZmxvdyIsImNpIiwiZGkiLCJfbWFwUG9zVG9EZWZJbmRleCIsImRlZiIsInJlc29sdmVyIiwiY2hhciIsImNocmVzIiwiX3BsYWNlaG9sZGVyIiwiZnJvbVBvcyIsImlucHV0IiwiX2lzSGlkZGVuSG9sbG93IiwiX2lzSG9sbG93IiwiZGVmSW5kZXgiLCJmaWx0ZXIiLCJoIiwiX2hvbGxvd3NCZWZvcmUiLCJsYXN0SG9sbG93SW5kZXgiLCJpbnNlcnRTdGVwcyIsInRhaWxJbnB1dCIsIl9leHRyYWN0SW5wdXQiLCJfZ2VuZXJhdGVJbnNlcnRTdGVwcyIsImlzdGVwIiwic3RlcCIsIl9hcHBlbmRUYWlsIiwidHJlcyIsInRob2xsb3dzIiwiYXBwZW5kZWQiLCJfYXBwZW5kRml4ZWRFbmQiLCJoYXNIb2xsb3dzIiwiX2FwcGVuZFBsYWNlaG9sZGVyRW5kIiwiaXNDb21wbGV0ZSIsInNob3ciLCJ1bm1hc2tlZCIsImN1cnNvckRlZkluZGV4IiwiclBvcyIsInJEZWYiLCJsUG9zIiwibERlZiIsIl9tYXBEZWZJbmRleFRvUG9zIiwicGgiLCJERUZBVUxUX1BMQUNFSE9MREVSIiwibWFwIiwiam9pbiIsImRlZnMiLCJfaW5zdGFsbERlZmluaXRpb25zIiwiX21hc2siLCJiaW5kRXZlbnRzIiwiUmVnRXhwIiwiRnVuY3Rpb24iLCJ3aW5kb3ciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLFNBQVNBLFFBQVQsQ0FBbUJDLEdBQW5CLEVBQXdCO1NBQ2YsT0FBT0EsR0FBUCxLQUFlLFFBQWYsSUFBMkJB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 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL3V0aWxzLmpzIiwiQzovUHJvamVjdHMvaW1hc2tqcy9zcmMvbWFza3MvYmFzZS5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL21hc2tzL3JlZ2V4cC5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL21hc2tzL2Z1bmMuanMiLCJDOi9Qcm9qZWN0cy9pbWFza2pzL3NyYy9tYXNrcy9wYXR0ZXJuLmpzIiwiQzovUHJvamVjdHMvaW1hc2tqcy9zcmMvbWFza3MvcGlwZS5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL2ltYXNrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydFxyXG5mdW5jdGlvbiBpc1N0cmluZyAoc3RyKSB7XHJcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnIHx8IHN0ciBpbnN0YW5jZW9mIFN0cmluZztcclxufVxyXG5cclxuZXhwb3J0XHJcbmZ1bmN0aW9uIGNvbmZvcm0gKHJlcywgc3RyLCBmYWxsYmFjaz0nJykge1xyXG4gIHJldHVybiBpc1N0cmluZyhyZXMpID9cclxuICAgIHJlcyA6XHJcbiAgICByZXMgP1xyXG4gICAgICBzdHIgOlxyXG4gICAgICBmYWxsYmFjaztcclxufVxyXG5cclxuZXhwb3J0XHJcbmZ1bmN0aW9uIGV4dGVuZERldGFpbHNBZGp1c3RtZW50cyhzdHIsIGRldGFpbHMpIHtcclxuICB2YXIgY3Vyc29yUG9zID0gZGV0YWlscy5jdXJzb3JQb3M7XHJcbiAgdmFyIG9sZFNlbGVjdGlvbiA9IGRldGFpbHMub2xkU2VsZWN0aW9uO1xyXG4gIHZhciBvbGRWYWx1ZSA9IGRldGFpbHMub2xkVmFsdWU7XHJcblxyXG4gIHZhciBzdGFydENoYW5nZVBvcyA9IE1hdGgubWluKGN1cnNvclBvcywgb2xkU2VsZWN0aW9uLnN0YXJ0KTtcclxuICB2YXIgaW5zZXJ0ZWRDb3VudCA9IGN1cnNvclBvcyAtIHN0YXJ0Q2hhbmdlUG9zO1xyXG4gIC8vIE1hdGgubWF4IGZvciBvcHBvc2l0ZSBvcGVyYXRpb25cclxuICB2YXIgcmVtb3ZlZENvdW50ID0gTWF0aC5tYXgoKG9sZFNlbGVjdGlvbi5lbmQgLSBzdGFydENoYW5nZVBvcykgfHxcclxuICAgIC8vIGZvciBEZWxldGVcclxuICAgIG9sZFZhbHVlLmxlbmd0aCAtIHN0ci5sZW5ndGgsIDApO1xyXG4gIHZhciBoZWFkID0gc3RyLnN1YnN0cmluZygwLCBzdGFydENoYW5nZVBvcyk7XHJcbiAgdmFyIHRhaWwgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0Q2hhbmdlUG9zICsgaW5zZXJ0ZWRDb3VudCk7XHJcbiAgdmFyIGluc2VydGVkID0gc3RyLnN1YnN0cihzdGFydENoYW5nZVBvcywgaW5zZXJ0ZWRDb3VudCk7XHJcbiAgdmFyIHJlbW92ZWQgPSBzdHIuc3Vic3RyKHN0YXJ0Q2hhbmdlUG9zLCByZW1vdmVkQ291bnQpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc3RhcnRDaGFuZ2VQb3MsXHJcbiAgICBoZWFkLFxyXG4gICAgdGFpbCxcclxuICAgIGluc2VydGVkLFxyXG4gICAgcmVtb3ZlZCxcclxuICAgIC4uLmRldGFpbHNcclxuICB9O1xyXG59XHJcbiIsImltcG9ydCB7Y29uZm9ybSwgZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzfSBmcm9tICcuLi91dGlscyc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuY2xhc3MgQmFzZU1hc2sge1xyXG4gIGNvbnN0cnVjdG9yIChlbCwgb3B0cykge1xyXG4gICAgdGhpcy5lbCA9IGVsO1xyXG4gICAgdGhpcy5tYXNrID0gb3B0cy5tYXNrO1xyXG5cclxuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xyXG4gICAgdGhpcy5fcmVmcmVzaGluZ0NvdW50ID0gMDtcclxuICAgIHRoaXMuX3Jhd1ZhbHVlID0gXCJcIjtcclxuICAgIHRoaXMuX3VubWFza2VkVmFsdWUgPSBcIlwiO1xyXG5cclxuICAgIHRoaXMuc2F2ZVNlbGVjdGlvbiA9IHRoaXMuc2F2ZVNlbGVjdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5fb25JbnB1dCA9IHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKTtcclxuICAgIHRoaXMuX29uRHJvcCA9IHRoaXMuX29uRHJvcC5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgb24gKGV2LCBoYW5kbGVyKSB7XHJcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1tldl0pIHRoaXMuX2xpc3RlbmVyc1tldl0gPSBbXTtcclxuICAgIHRoaXMuX2xpc3RlbmVyc1tldl0ucHVzaChoYW5kbGVyKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgb2ZmIChldiwgaGFuZGxlcikge1xyXG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbZXZdKSByZXR1cm47XHJcbiAgICBpZiAoIWhhbmRsZXIpIHtcclxuICAgICAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tldl07XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHZhciBoSW5kZXggPSB0aGlzLl9saXN0ZW5lcnNbZXZdLmluZGV4T2YoaGFuZGxlcik7XHJcbiAgICBpZiAoaEluZGV4ID49IDApIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaEluZGV4LCAxKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJhd1ZhbHVlICgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yYXdWYWx1ZTtcclxuICB9XHJcblxyXG4gIHNldCByYXdWYWx1ZSAoc3RyKSB7XHJcbiAgICB0aGlzLnByb2Nlc3NJbnB1dChzdHIsIHtcclxuICAgICAgY3Vyc29yUG9zOiBzdHIubGVuZ3RoLFxyXG4gICAgICBvbGRWYWx1ZTogdGhpcy5yYXdWYWx1ZSxcclxuICAgICAgb2xkU2VsZWN0aW9uOiB7XHJcbiAgICAgICAgc3RhcnQ6IDAsXHJcbiAgICAgICAgZW5kOiB0aGlzLnJhd1ZhbHVlLmxlbmd0aFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCB1bm1hc2tlZFZhbHVlICgpIHtcclxuICAgIHJldHVybiB0aGlzLl91bm1hc2tlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHVubWFza2VkVmFsdWUgKHZhbHVlKSB7XHJcbiAgICB0aGlzLnJhd1ZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgYmluZEV2ZW50cyAoKSB7XHJcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnNhdmVTZWxlY3Rpb24pO1xyXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX29uSW5wdXQpO1xyXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5fb25Ecm9wKTtcclxuICB9XHJcblxyXG4gIHVuYmluZEV2ZW50cyAoKSB7XHJcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnNhdmVTZWxlY3Rpb24pO1xyXG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX29uSW5wdXQpO1xyXG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5fb25Ecm9wKTtcclxuICB9XHJcblxyXG4gIGZpcmVFdmVudCAoZXYpIHtcclxuICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZdIHx8IFtdO1xyXG4gICAgbGlzdGVuZXJzLmZvckVhY2gobCA9PiBsKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc0lucHV0IChpbnB1dFZhbHVlLCBkZXRhaWxzKSB7XHJcbiAgICBkZXRhaWxzID0ge1xyXG4gICAgICBjdXJzb3JQb3M6IHRoaXMuY3Vyc29yUG9zLFxyXG4gICAgICBvbGRTZWxlY3Rpb246IHRoaXMuX3NlbGVjdGlvbixcclxuICAgICAgb2xkVmFsdWU6IHRoaXMucmF3VmFsdWUsXHJcbiAgICAgIG9sZFVubWFza2VkVmFsdWU6IHRoaXMudW5tYXNrZWRWYWx1ZSxcclxuICAgICAgLi4uZGV0YWlsc1xyXG4gICAgfTtcclxuXHJcbiAgICBkZXRhaWxzID0gZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzKGlucHV0VmFsdWUsIGRldGFpbHMpO1xyXG5cclxuICAgIHZhciByZXMgPSBjb25mb3JtKHRoaXMucmVzb2x2ZShpbnB1dFZhbHVlLCBkZXRhaWxzKSxcclxuICAgICAgaW5wdXRWYWx1ZSxcclxuICAgICAgdGhpcy5yYXdWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVFbGVtZW50KHJlcywgZGV0YWlscy5jdXJzb3JQb3MpO1xyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG5cclxuICBnZXQgc2VsZWN0aW9uU3RhcnQgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvckNoYW5naW5nID9cclxuICAgICAgdGhpcy5fY2hhbmdpbmdDdXJzb3JQb3MgOlxyXG5cclxuICAgICAgdGhpcy5lbC5zZWxlY3Rpb25TdGFydDtcclxuICB9XHJcblxyXG4gIGdldCBjdXJzb3JQb3MgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvckNoYW5naW5nID9cclxuICAgICAgdGhpcy5fY2hhbmdpbmdDdXJzb3JQb3MgOlxyXG5cclxuICAgICAgdGhpcy5lbC5zZWxlY3Rpb25FbmQ7XHJcbiAgfVxyXG5cclxuICBzZXQgY3Vyc29yUG9zIChwb3MpIHtcclxuICAgIHRoaXMuZWwuc2V0U2VsZWN0aW9uUmFuZ2UocG9zLCBwb3MpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlbGVjdGlvbiAoZXYpIHtcclxuICAgIGlmICh0aGlzLnJhd1ZhbHVlICE9PSB0aGlzLmVsLnZhbHVlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIlVuY29udHJvbGxlZCBpbnB1dCBjaGFuZ2UsIHJlZnJlc2ggbWFzayBtYW51YWxseSFcIik7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zZWxlY3Rpb24gPSB7XHJcbiAgICAgIHN0YXJ0OiB0aGlzLnNlbGVjdGlvblN0YXJ0LFxyXG4gICAgICBlbmQ6IHRoaXMuY3Vyc29yUG9zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSAoKSB7XHJcbiAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xyXG4gICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbGVtZW50ICh2YWx1ZSwgY3Vyc29yUG9zKSB7XHJcbiAgICB2YXIgdW5tYXNrZWRWYWx1ZSA9IHRoaXMuX2NhbGNVbm1hc2tlZCh2YWx1ZSk7XHJcbiAgICB2YXIgaXNDaGFuZ2VkID0gKHRoaXMudW5tYXNrZWRWYWx1ZSAhPT0gdW5tYXNrZWRWYWx1ZSB8fFxyXG4gICAgICB0aGlzLnJhd1ZhbHVlICE9PSB2YWx1ZSk7XHJcblxyXG4gICAgdGhpcy5fdW5tYXNrZWRWYWx1ZSA9IHVubWFza2VkVmFsdWU7XHJcbiAgICB0aGlzLl9yYXdWYWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLmVsLnZhbHVlICE9PSB2YWx1ZSkgdGhpcy5lbC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuY3Vyc29yUG9zICE9IGN1cnNvclBvcyAmJiBjdXJzb3JQb3MgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmN1cnNvclBvcyA9IGN1cnNvclBvcztcclxuXHJcbiAgICAgIC8vIGFsc28gcXVldWUgY2hhbmdlIGN1cnNvciBmb3IgbW9iaWxlIGJyb3dzZXJzXHJcbiAgICAgIGlmICh0aGlzLl9jdXJzb3JDaGFuZ2luZykgY2xlYXJUaW1lb3V0KHRoaXMuX2N1cnNvckNoYW5naW5nKTtcclxuICAgICAgaWYgKHRoaXMuY3Vyc29yUG9zICE9IGN1cnNvclBvcykge1xyXG4gICAgICAgIHRoaXMuX2NoYW5naW5nQ3Vyc29yUG9zID0gY3Vyc29yUG9zO1xyXG4gICAgICAgIHRoaXMuX2N1cnNvckNoYW5naW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN1cnNvclBvcyA9IHRoaXMuX2NoYW5naW5nQ3Vyc29yUG9zO1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXMuX2N1cnNvckNoYW5naW5nO1xyXG4gICAgICAgIH0sIDEwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgaWYgKGlzQ2hhbmdlZCkgdGhpcy5fZmlyZUNoYW5nZUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgX2ZpcmVDaGFuZ2VFdmVudHMgKCkge1xyXG4gICAgdGhpcy5maXJlRXZlbnQoXCJhY2NlcHRcIik7XHJcbiAgfVxyXG5cclxuICBfb25JbnB1dCAoZXYpIHtcclxuICAgIHRoaXMucHJvY2Vzc0lucHV0KHRoaXMuZWwudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgX29uRHJvcCAoZXYpIHtcclxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vIG92ZXJyaWRlXHJcbiAgcmVzb2x2ZSAoc3RyLCBkZXRhaWxzKSB7IHJldHVybiBzdHI7IH1cclxuXHJcbiAgX2NhbGNVbm1hc2tlZCAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9XHJcbn1cclxuIiwiaW1wb3J0IEJhc2VNYXNrIGZyb20gJy4vYmFzZSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuY2xhc3MgUmVnRXhwTWFzayBleHRlbmRzIEJhc2VNYXNrIHtcclxuICByZXNvbHZlIChzdHIpIHtcclxuICAgIHJldHVybiB0aGlzLm1hc2sudGVzdChzdHIpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgQmFzZU1hc2sgZnJvbSAnLi9iYXNlJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdFxyXG5jbGFzcyBGdW5jTWFzayBleHRlbmRzIEJhc2VNYXNrIHtcclxuICByZXNvbHZlICguLi5hcmdzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXNrKC4uLmFyZ3MpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge2NvbmZvcm19IGZyb20gJy4uL3V0aWxzJztcclxuaW1wb3J0IEJhc2VNYXNrIGZyb20gJy4vYmFzZSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuY2xhc3MgUGF0dGVybk1hc2sgZXh0ZW5kcyBCYXNlTWFzayB7XHJcbiAgY29uc3RydWN0b3IgKGVsLCBvcHRzKSB7XHJcbiAgICBzdXBlcihlbCwgb3B0cyk7XHJcblxyXG4gICAgdGhpcy5faG9sbG93cyA9IFtdO1xyXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IG9wdHMucGxhY2Vob2xkZXI7XHJcbiAgICB0aGlzLmRlZmluaXRpb25zID0ge1xyXG4gICAgICAuLi5QYXR0ZXJuTWFzay5ERUZJTklUSU9OUyxcclxuICAgICAgLi4ub3B0cy5kZWZpbml0aW9uc1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9hbGlnbkN1cnNvciA9IHRoaXMuX2FsaWduQ3Vyc29yLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLl9hbGlnbkN1cnNvckZyaWVuZGx5ID0gdGhpcy5fYWxpZ25DdXJzb3JGcmllbmRseS5iaW5kKHRoaXMpO1xyXG5cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIF9hbGlnbkN1cnNvckZyaWVuZGx5ICgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0ICE9PSB0aGlzLmN1cnNvclBvcykgcmV0dXJuO1xyXG4gICAgdGhpcy5fYWxpZ25DdXJzb3IoKTtcclxuICB9XHJcblxyXG4gIGJpbmRFdmVudHMgKCkge1xyXG4gICAgc3VwZXIuYmluZEV2ZW50cygpO1xyXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2FsaWduQ3Vyc29yRnJpZW5kbHkpO1xyXG4gIH1cclxuXHJcbiAgdW5iaW5kRXZlbnRzICgpIHtcclxuICAgIHN1cGVyLnVuYmluZEV2ZW50cygpO1xyXG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2FsaWduQ3Vyc29yRnJpZW5kbHkpO1xyXG4gIH1cclxuXHJcbiAgX2luc3RhbGxEZWZpbml0aW9ucyAoZGVmaW5pdGlvbnMpIHtcclxuICAgIHRoaXMuX2RlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XHJcbiAgICB0aGlzLl9jaGFyRGVmcyA9IFtdO1xyXG4gICAgdmFyIHBhdHRlcm4gPSB0aGlzLm1hc2s7XHJcblxyXG4gICAgaWYgKCFwYXR0ZXJuIHx8ICFkZWZpbml0aW9ucykgcmV0dXJuO1xyXG5cclxuICAgIHZhciB1bm1hc2tpbmdCbG9jayA9IGZhbHNlO1xyXG4gICAgdmFyIG9wdGlvbmFsQmxvY2sgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGk9MDsgaTxwYXR0ZXJuLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHZhciBjaCA9IHBhdHRlcm5baV07XHJcbiAgICAgIHZhciB0eXBlID0gIXVubWFza2luZ0Jsb2NrICYmIGNoIGluIGRlZmluaXRpb25zID9cclxuICAgICAgICBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuSU5QVVQgOlxyXG4gICAgICAgIFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5GSVhFRDtcclxuICAgICAgdmFyIHVubWFza2luZyA9IHR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCB8fCB1bm1hc2tpbmdCbG9jaztcclxuICAgICAgdmFyIG9wdGlvbmFsID0gdHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmIG9wdGlvbmFsQmxvY2s7XHJcblxyXG4gICAgICBpZiAoY2ggPT09ICd7JyB8fCBjaCA9PT0gJ30nKSB7XHJcbiAgICAgICAgdW5tYXNraW5nQmxvY2sgPSAhdW5tYXNraW5nQmxvY2s7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaCA9PT0gJ1snIHx8IGNoID09PSAnXScpIHtcclxuICAgICAgICBvcHRpb25hbEJsb2NrID0gIW9wdGlvbmFsQmxvY2s7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaCA9PT0gJ1xcXFwnKSB7XHJcbiAgICAgICAgKytpO1xyXG4gICAgICAgIGNoID0gcGF0dGVybltpXTtcclxuICAgICAgICAvLyBUT0RPIHZhbGlkYXRpb25cclxuICAgICAgICBpZiAoIWNoKSBicmVhaztcclxuICAgICAgICB0eXBlID0gUGF0dGVybk1hc2suREVGX1RZUEVTLkZJWEVEO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9jaGFyRGVmcy5wdXNoKHtcclxuICAgICAgICBjaGFyOiBjaCxcclxuICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgIG9wdGlvbmFsOiBvcHRpb25hbCxcclxuICAgICAgICB1bm1hc2tpbmc6IHVubWFza2luZ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9idWlsZFJlc29sdmVycygpO1xyXG4gIH1cclxuXHJcbiAgX2J1aWxkUmVzb2x2ZXJzICgpIHtcclxuICAgIHRoaXMuX3Jlc29sdmVycyA9IHt9O1xyXG4gICAgZm9yICh2YXIgZGVmS2V5IGluIHRoaXMuZGVmaW5pdGlvbnMpIHtcclxuICAgICAgdGhpcy5fcmVzb2x2ZXJzW2RlZktleV0gPSBJTWFzay5NYXNrRmFjdG9yeSh0aGlzLmVsLCB7XHJcbiAgICAgICAgbWFzazogdGhpcy5kZWZpbml0aW9uc1tkZWZLZXldXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX2FwcGVuZFRhaWwgKHN0ciwgdGFpbCkge1xyXG4gICAgdmFyIHBsYWNlaG9sZGVyQnVmZmVyID0gJyc7XHJcbiAgICB2YXIgaG9sbG93cyA9IHRoaXMuX2hvbGxvd3Muc2xpY2UoKTtcclxuICAgIHZhciBvdmVyZmxvdyA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAodmFyIGNpPTAsIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgoc3RyLmxlbmd0aCk7IGNpIDwgdGFpbC5sZW5ndGg7ICsrZGkpIHtcclxuICAgICAgdmFyIGNoID0gdGFpbFtjaV07XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcblxyXG4gICAgICAvLyBmYWlsZWRcclxuICAgICAgaWYgKCFkZWYpIHtcclxuICAgICAgICBvdmVyZmxvdyA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSB7XHJcbiAgICAgICAgdmFyIHJlc29sdmVyID0gdGhpcy5fcmVzb2x2ZXJzW2RlZi5jaGFyXTtcclxuICAgICAgICB2YXIgY2hyZXMgPSByZXNvbHZlci5yZXNvbHZlKGNoLCBkaSwgc3RyKSB8fCAnJztcclxuICAgICAgICBpZiAoY2hyZXMpIHtcclxuICAgICAgICAgIGNocmVzID0gY29uZm9ybShjaHJlcywgY2gpO1xyXG4gICAgICAgICAgKytjaTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCFkZWYub3B0aW9uYWwpIGNocmVzID0gdGhpcy5fcGxhY2Vob2xkZXIuY2hhcjtcclxuICAgICAgICAgIGhvbGxvd3MucHVzaChkaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0ciArPSBwbGFjZWhvbGRlckJ1ZmZlciArIGNocmVzO1xyXG4gICAgICAgIHBsYWNlaG9sZGVyQnVmZmVyID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGxhY2Vob2xkZXJCdWZmZXIgKz0gZGVmLmNoYXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3N0ciwgaG9sbG93cywgb3ZlcmZsb3ddO1xyXG4gIH1cclxuXHJcbiAgX2V4dHJhY3RJbnB1dCAoc3RyLCBmcm9tUG9zPTApIHtcclxuICAgIHZhciBpbnB1dCA9ICcnO1xyXG5cclxuICAgIGZvciAodmFyIGNpPTAsIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgoZnJvbVBvcyk7IGNpPHN0ci5sZW5ndGggJiYgZGk8dGhpcy5fY2hhckRlZnMubGVuZ3RoOyArK2RpKSB7XHJcbiAgICAgIHZhciBjaCA9IHN0cltjaV07XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcblxyXG4gICAgICBpZiAodGhpcy5faXNIaWRkZW5Ib2xsb3coZGkpKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmICF0aGlzLl9pc0hvbGxvdyhkaSkpIGlucHV0ICs9IGNoO1xyXG4gICAgICArK2NpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgX2lzSG9sbG93IChkZWZJbmRleCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvbGxvd3MuaW5kZXhPZihkZWZJbmRleCkgPj0gMDtcclxuICB9XHJcblxyXG4gIF9pc0hpZGRlbkhvbGxvdyAoZGVmSW5kZXgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0hvbGxvdyhkZWZJbmRleCkgJiZcclxuICAgICAgdGhpcy5fY2hhckRlZnNbZGVmSW5kZXhdICYmIHRoaXMuX2NoYXJEZWZzW2RlZkluZGV4XS5vcHRpb25hbDtcclxuICB9XHJcblxyXG4gIF9ob2xsb3dzQmVmb3JlIChkZWZJbmRleCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvbGxvd3MuZmlsdGVyKGggPT4gaCA8IGRlZkluZGV4ICYmIHRoaXMuX2lzSGlkZGVuSG9sbG93KGgpKTtcclxuICB9XHJcblxyXG4gIF9tYXBEZWZJbmRleFRvUG9zIChkZWZJbmRleCkge1xyXG4gICAgcmV0dXJuIGRlZkluZGV4IC0gdGhpcy5faG9sbG93c0JlZm9yZShkZWZJbmRleCkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgX21hcFBvc1RvRGVmSW5kZXggKHBvcykge1xyXG4gICAgdmFyIGxhc3RIb2xsb3dJbmRleCA9IHBvcztcclxuICAgIC8vIGV4dGVuZCBjb250aWd1b3VzXHJcbiAgICB3aGlsZSAodGhpcy5faXNIaWRkZW5Ib2xsb3cobGFzdEhvbGxvd0luZGV4LTEpKSArK2xhc3RIb2xsb3dJbmRleDtcclxuXHJcbiAgICByZXR1cm4gcG9zICsgdGhpcy5faG9sbG93c0JlZm9yZShsYXN0SG9sbG93SW5kZXgpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIF9nZW5lcmF0ZUluc2VydFN0ZXBzIChoZWFkLCBpbnNlcnRlZCkge1xyXG4gICAgdmFyIHJlcyA9IGhlYWQ7XHJcbiAgICB2YXIgaG9sbG93cyA9IHRoaXMuX2hvbGxvd3Muc2xpY2UoKTtcclxuICAgIHZhciBwbGFjZWhvbGRlckJ1ZmZlciA9ICcnO1xyXG4gICAgdmFyIGluc2VydFN0ZXBzID0gW1tyZXMsIGhvbGxvd3Muc2xpY2UoKV1dO1xyXG5cclxuICAgIGZvciAodmFyIGNpPTAsIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgoaGVhZC5sZW5ndGgpOyBjaTxpbnNlcnRlZC5sZW5ndGg7KSB7XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgIGlmICghZGVmKSBicmVhaztcclxuXHJcbiAgICAgIHZhciBjaCA9IGluc2VydGVkW2NpXTtcclxuICAgICAgaWYgKGRlZi50eXBlID09PSBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuSU5QVVQpIHtcclxuICAgICAgICB2YXIgcmVzb2x2ZXIgPSB0aGlzLl9yZXNvbHZlcnNbZGVmLmNoYXJdO1xyXG4gICAgICAgIHZhciBjaHJlcyA9IHJlc29sdmVyLnJlc29sdmUoY2gsIGNpLCByZXMpIHx8ICcnO1xyXG4gICAgICAgIC8vIGlmIG9rIC0gbmV4dCBkaVxyXG4gICAgICAgIGlmIChjaHJlcykge1xyXG4gICAgICAgICAgcmVzICs9IHBsYWNlaG9sZGVyQnVmZmVyICsgY29uZm9ybShjaHJlcywgY2gpOyBwbGFjZWhvbGRlckJ1ZmZlciA9ICcnO1xyXG4gICAgICAgICAgaW5zZXJ0U3RlcHMucHVzaChbcmVzLCBob2xsb3dzLnNsaWNlKCldKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRlZi5vcHRpb25hbCkge1xyXG4gICAgICAgICAgaWYgKGhvbGxvd3MuaW5kZXhPZihkaSkgPCAwKSBob2xsb3dzLnB1c2goZGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hyZXMgfHwgZGVmLm9wdGlvbmFsKSArK2RpO1xyXG4gICAgICAgIGlmIChjaHJlcyB8fCAhZGVmLm9wdGlvbmFsKSArK2NpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBsYWNlaG9sZGVyQnVmZmVyICs9IGRlZi5jaGFyO1xyXG5cclxuICAgICAgICBpZiAoY2ggPT09IGRlZi5jaGFyKSArK2NpO1xyXG4gICAgICAgICsrZGk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zZXJ0U3RlcHM7XHJcbiAgfVxyXG5cclxuICByZXNvbHZlIChzdHIsIGRldGFpbHMpIHtcclxuICAgIHZhciBjdXJzb3JQb3MgPSBkZXRhaWxzLmN1cnNvclBvcztcclxuICAgIHZhciBzdGFydENoYW5nZVBvcyA9IGRldGFpbHMuc3RhcnRDaGFuZ2VQb3M7XHJcbiAgICB2YXIgaW5zZXJ0ZWQgPSBkZXRhaWxzLmluc2VydGVkO1xyXG4gICAgdmFyIHJlbW92ZWRDb3VudCA9IGRldGFpbHMucmVtb3ZlZC5sZW5ndGg7XHJcbiAgICB2YXIgdGFpbElucHV0ID0gdGhpcy5fZXh0cmFjdElucHV0KGRldGFpbHMudGFpbCwgc3RhcnRDaGFuZ2VQb3MgKyByZW1vdmVkQ291bnQpO1xyXG5cclxuICAgIC8vIHJlbW92ZSBob2xsb3dzIGFmdGVyIGN1cnNvclxyXG4gICAgdmFyIGxhc3RIb2xsb3dJbmRleCA9IHRoaXMuX21hcFBvc1RvRGVmSW5kZXgoc3RhcnRDaGFuZ2VQb3MpO1xyXG4gICAgdGhpcy5faG9sbG93cyA9IHRoaXMuX2hvbGxvd3MuZmlsdGVyKGggPT4gaCA8IGxhc3RIb2xsb3dJbmRleCk7XHJcblxyXG4gICAgdmFyIHJlcyA9IGRldGFpbHMuaGVhZDtcclxuXHJcbiAgICAvLyBpbnNlcnQgYXZhaWxhYmxlXHJcbiAgICB2YXIgaW5zZXJ0U3RlcHMgPSB0aGlzLl9nZW5lcmF0ZUluc2VydFN0ZXBzKHJlcywgaW5zZXJ0ZWQpO1xyXG4gICAgZm9yICh2YXIgaXN0ZXA9aW5zZXJ0U3RlcHMubGVuZ3RoLTE7IGlzdGVwID49IDA7IC0taXN0ZXApIHtcclxuICAgICAgdmFyIHN0ZXA7XHJcbiAgICAgIFtzdGVwLCB0aGlzLl9ob2xsb3dzXSA9IGluc2VydFN0ZXBzW2lzdGVwXTtcclxuICAgICAgdmFyIFt0cmVzLCB0aG9sbG93cywgb3ZlcmZsb3ddID0gdGhpcy5fYXBwZW5kVGFpbChzdGVwLCB0YWlsSW5wdXQpO1xyXG4gICAgICBpZiAoIW92ZXJmbG93KSB7XHJcbiAgICAgICAgW3JlcywgdGhpcy5faG9sbG93c10gPSBbdHJlcywgdGhvbGxvd3NdO1xyXG4gICAgICAgIGN1cnNvclBvcyA9IHN0ZXAubGVuZ3RoO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgaW5wdXQgYXQgdGhlIGVuZCAtIGFwcGVuZCBmaXhlZFxyXG4gICAgaWYgKGluc2VydGVkICYmIGN1cnNvclBvcyA9PT0gcmVzLmxlbmd0aCkge1xyXG4gICAgICAvLyBhcHBlbmQgZml4ZWQgYXQgZW5kXHJcbiAgICAgIHZhciBhcHBlbmRlZCA9IHRoaXMuX2FwcGVuZEZpeGVkRW5kKHJlcyk7XHJcbiAgICAgIGN1cnNvclBvcyArPSBhcHBlbmRlZC5sZW5ndGggLSByZXMubGVuZ3RoO1xyXG4gICAgICByZXMgPSBhcHBlbmRlZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWluc2VydGVkICYmIHJlbW92ZWRDb3VudCkge1xyXG4gICAgICAvLyBpZiBkZWxldGUgYXQgcmlnaHRcclxuICAgICAgaWYgKGRldGFpbHMub2xkU2VsZWN0aW9uLmVuZCA9PT0gY3Vyc29yUG9zKSB7XHJcbiAgICAgICAgZm9yICg7OysrY3Vyc29yUG9zKSB7XHJcbiAgICAgICAgICB2YXIgZGk9dGhpcy5fbWFwUG9zVG9EZWZJbmRleChjdXJzb3JQb3MpO1xyXG4gICAgICAgICAgdmFyIGRlZiA9IHRoaXMuX2NoYXJEZWZzW2RpXTtcclxuICAgICAgICAgIGlmICghZGVmIHx8IGRlZi50eXBlICE9PSBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuRklYRUQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVtb3ZlIGhlYWQgZml4ZWQgYW5kIGhvbGxvd3MgaWYgcmVtb3ZlZCBhdCBlbmRcclxuICAgICAgaWYgKGN1cnNvclBvcyA9PT0gcmVzLmxlbmd0aCkge1xyXG4gICAgICAgIHZhciBkaSA9IHRoaXMuX21hcFBvc1RvRGVmSW5kZXgoY3Vyc29yUG9zLTEpO1xyXG4gICAgICAgIHZhciBoYXNIb2xsb3dzID0gZmFsc2U7XHJcbiAgICAgICAgZm9yICg7IGRpID4gMDsgLS1kaSkge1xyXG4gICAgICAgICAgdmFyIGRlZiA9IHRoaXMuX2NoYXJEZWZzW2RpXTtcclxuICAgICAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0hvbGxvdyhkaSkpIGhhc0hvbGxvd3MgPSB0cnVlO1xyXG4gICAgICAgICAgICBlbHNlIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaGFzSG9sbG93cykgcmVzID0gcmVzLnNsaWNlKDAsIGRpICsgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgcGxhY2Vob2xkZXJcclxuICAgIHJlcyA9IHRoaXMuX2FwcGVuZFBsYWNlaG9sZGVyRW5kKHJlcyk7XHJcbiAgICBkZXRhaWxzLmN1cnNvclBvcyA9IGN1cnNvclBvcztcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgX2ZpcmVDaGFuZ2VFdmVudHMgKCkge1xyXG4gICAgLy8gZmlyZSAnY29tcGxldGUnIGFmdGVyICdhY2NlcHQnIGV2ZW50XHJcbiAgICBzdXBlci5fZmlyZUNoYW5nZUV2ZW50cygpO1xyXG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZSkgdGhpcy5maXJlRXZlbnQoXCJjb21wbGV0ZVwiKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0NvbXBsZXRlICgpIHtcclxuICAgIHJldHVybiAhdGhpcy5fY2hhckRlZnMuZmlsdGVyKChkZWYsIGRpKSA9PlxyXG4gICAgICBkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmICFkZWYub3B0aW9uYWwgJiZcclxuICAgICAgdGhpcy5faXNIb2xsb3coZGkpKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBfYXBwZW5kRml4ZWRFbmQgKHJlcykge1xyXG4gICAgZm9yICh2YXIgZGk9dGhpcy5fbWFwUG9zVG9EZWZJbmRleChyZXMubGVuZ3RoKTs7ICsrZGkpIHtcclxuICAgICAgdmFyIGRlZiA9IHRoaXMuX2NoYXJEZWZzW2RpXTtcclxuICAgICAgaWYgKCFkZWYpIGJyZWFrO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2lzSGlkZGVuSG9sbG93KGRpKSkgY29udGludWU7XHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSBicmVhaztcclxuICAgICAgaWYgKGRpID49IHJlcy5sZW5ndGgpIHJlcyArPSBkZWYuY2hhcjtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBfYXBwZW5kUGxhY2Vob2xkZXJFbmQgKHJlcykge1xyXG4gICAgZm9yICh2YXIgZGk9dGhpcy5fbWFwUG9zVG9EZWZJbmRleChyZXMubGVuZ3RoKTsgZGk8dGhpcy5fY2hhckRlZnMubGVuZ3RoOyArK2RpKSB7XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmICF0aGlzLl9pc0hvbGxvdyhkaSkpIHtcclxuICAgICAgICB0aGlzLl9ob2xsb3dzLnB1c2goZGkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9wbGFjZWhvbGRlci5zaG93ID09PSAnYWx3YXlzJykge1xyXG4gICAgICAgIHJlcyArPSBkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLkZJWEVEID9cclxuICAgICAgICAgIGRlZi5jaGFyIDpcclxuICAgICAgICAgICFkZWYub3B0aW9uYWwgP1xyXG4gICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlci5jaGFyIDpcclxuICAgICAgICAgICAgJyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBfY2FsY1VubWFza2VkIChzdHIpIHtcclxuICAgIHZhciB1bm1hc2tlZCA9ICcnO1xyXG4gICAgZm9yICh2YXIgY2k9MCwgZGk9MDsgY2k8c3RyLmxlbmd0aCAmJiBkaTx0aGlzLl9jaGFyRGVmcy5sZW5ndGg7ICsrZGkpIHtcclxuICAgICAgdmFyIGNoID0gc3RyW2NpXTtcclxuICAgICAgdmFyIGRlZiA9IHRoaXMuX2NoYXJEZWZzW2RpXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pc0hpZGRlbkhvbGxvdyhkaSkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKGRlZi51bm1hc2tpbmcgJiYgIXRoaXMuX2lzSG9sbG93KGRpKSAmJlxyXG4gICAgICAgIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmIHRoaXMuX3Jlc29sdmVyc1tkZWYuY2hhcl0ucmVzb2x2ZShjaCwgY2ksIHN0cikgfHxcclxuICAgICAgICAgIGRlZi5jaGFyID09PSBjaCkpIHtcclxuICAgICAgICB1bm1hc2tlZCArPSBjaDtcclxuICAgICAgfVxyXG4gICAgICArK2NpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVubWFza2VkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVubWFza2VkVmFsdWUgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VubWFza2VkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdW5tYXNrZWRWYWx1ZSAoc3RyKSB7XHJcbiAgICB0aGlzLl9ob2xsb3dzLmxlbmd0aCA9IDA7XHJcbiAgICB2YXIgcmVzO1xyXG4gICAgW3JlcywgdGhpcy5faG9sbG93c10gPSB0aGlzLl9hcHBlbmRUYWlsKCcnLCBzdHIpO1xyXG4gICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuX2FwcGVuZFBsYWNlaG9sZGVyRW5kKHJlcykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYWNlaG9sZGVyICgpIHsgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyOyB9XHJcblxyXG4gIHNldCBwbGFjZWhvbGRlciAocGgpIHtcclxuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0ge1xyXG4gICAgICAuLi5QYXR0ZXJuTWFzay5ERUZBVUxUX1BMQUNFSE9MREVSLFxyXG4gICAgICAuLi5waFxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgdGhpcy51bm1hc2tlZFZhbHVlID0gdGhpcy51bm1hc2tlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYWNlaG9sZGVyTGFiZWwgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYXJEZWZzLm1hcChkZWYgPT5cclxuICAgICAgZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5GSVhFRCA/XHJcbiAgICAgICAgZGVmLmNoYXIgOlxyXG4gICAgICAgICFkZWYub3B0aW9uYWwgP1xyXG4gICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIuY2hhciA6XHJcbiAgICAgICAgICAnJykuam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGVmaW5pdGlvbnMgKCkgeyByZXR1cm4gdGhpcy5fZGVmaW5pdGlvbnM7IH1cclxuXHJcbiAgc2V0IGRlZmluaXRpb25zIChkZWZzKSB7XHJcbiAgICB0aGlzLl9pbnN0YWxsRGVmaW5pdGlvbnMoZGVmcyk7XHJcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHRoaXMudW5tYXNrZWRWYWx1ZSA9IHRoaXMudW5tYXNrZWRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBtYXNrICgpIHsgcmV0dXJuIHRoaXMuX21hc2s7IH1cclxuXHJcbiAgc2V0IG1hc2sgKG1hc2spIHtcclxuICAgIHRoaXMuX21hc2sgPSBtYXNrO1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB0aGlzLmRlZmluaXRpb25zID0gdGhpcy5kZWZpbml0aW9ucztcclxuICB9XHJcblxyXG4gIF9hbGlnbkN1cnNvciAoKSB7XHJcbiAgICB2YXIgY3Vyc29yRGVmSW5kZXggPSB0aGlzLl9tYXBQb3NUb0RlZkluZGV4KHRoaXMuY3Vyc29yUG9zKTtcclxuICAgIGZvciAodmFyIHJQb3MgPSBjdXJzb3JEZWZJbmRleDsgclBvcyA+PSAwOyAtLXJQb3MpIHtcclxuICAgICAgdmFyIHJEZWYgPSB0aGlzLl9jaGFyRGVmc1tyUG9zXTtcclxuICAgICAgdmFyIGxQb3MgPSByUG9zLTE7XHJcbiAgICAgIHZhciBsRGVmID0gdGhpcy5fY2hhckRlZnNbbFBvc107XHJcbiAgICAgIGlmICh0aGlzLl9pc0hpZGRlbkhvbGxvdyhsUG9zKSkgY29udGludWU7XHJcblxyXG4gICAgICBpZiAoKCFyRGVmIHx8IHJEZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmIHRoaXMuX2lzSG9sbG93KHJQb3MpICYmICF0aGlzLl9pc0hpZGRlbkhvbGxvdyhyUG9zKSkgJiZcclxuICAgICAgICAhdGhpcy5faXNIb2xsb3cobFBvcykpIHtcclxuICAgICAgICBjdXJzb3JEZWZJbmRleCA9IHJQb3M7XHJcbiAgICAgICAgaWYgKCFsRGVmIHx8IGxEZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jdXJzb3JQb3MgPSB0aGlzLl9tYXBEZWZJbmRleFRvUG9zKGN1cnNvckRlZkluZGV4KTtcclxuICB9XHJcbn1cclxuUGF0dGVybk1hc2suREVGSU5JVElPTlMgPSB7XHJcbiAgJzAnOiAvXFxkLyxcclxuICAnYSc6IC9bXFx1MDA0MS1cXHUwMDVBXFx1MDA2MS1cXHUwMDdBXFx1MDBBQVxcdTAwQjVcXHUwMEJBXFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTI3XFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOEEwXFx1MDhBMi1cXHUwOEFDXFx1MDkwNC1cXHUwOTM5XFx1MDkzRFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5NzdcXHUwOTc5LVxcdTA5N0ZcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJEXFx1MDlDRVxcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMFxcdTA5RjFcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTcyLVxcdTBBNzRcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkRcXHUwQUQwXFx1MEFFMFxcdTBBRTFcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzRFxcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYxXFx1MEI3MVxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJEMFxcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzM1xcdTBDMzUtXFx1MEMzOVxcdTBDM0RcXHUwQzU4XFx1MEM1OVxcdTBDNjBcXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDYwXFx1MEQ2MVxcdTBEN0EtXFx1MEQ3RlxcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRTAxLVxcdTBFMzBcXHUwRTMyXFx1MEUzM1xcdTBFNDAtXFx1MEU0NlxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUIwXFx1MEVCMlxcdTBFQjNcXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjQwLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjg4LVxcdTBGOENcXHUxMDAwLVxcdTEwMkFcXHUxMDNGXFx1MTA1MC1cXHUxMDU1XFx1MTA1QS1cXHUxMDVEXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2RS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4RVxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzgwLVxcdTE3QjNcXHUxN0Q3XFx1MTdEQ1xcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBOFxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUNcXHUxOTUwLVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUMxLVxcdTE5QzdcXHUxQTAwLVxcdTFBMTZcXHUxQTIwLVxcdTFBNTRcXHUxQUE3XFx1MUIwNS1cXHUxQjMzXFx1MUI0NS1cXHUxQjRCXFx1MUI4My1cXHUxQkEwXFx1MUJBRVxcdTFCQUZcXHUxQkJBLVxcdTFCRTVcXHUxQzAwLVxcdTFDMjNcXHUxQzRELVxcdTFDNEZcXHUxQzVBLVxcdTFDN0RcXHUxQ0U5LVxcdTFDRUNcXHUxQ0VFLVxcdTFDRjFcXHUxQ0Y1XFx1MUNGNlxcdTFEMDAtXFx1MURCRlxcdTFFMDAtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEyRFxcdTIxMkYtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTgzXFx1MjE4NFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkUyRlxcdTMwMDVcXHUzMDA2XFx1MzAzMS1cXHUzMDM1XFx1MzAzQlxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDlELVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGQ0NcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MUZcXHVBNjJBXFx1QTYyQlxcdUE2NDAtXFx1QTY2RVxcdUE2N0YtXFx1QTY5N1xcdUE2QTAtXFx1QTZFNVxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTc4RVxcdUE3OTAtXFx1QTc5M1xcdUE3QTAtXFx1QTdBQVxcdUE3RjgtXFx1QTgwMVxcdUE4MDMtXFx1QTgwNVxcdUE4MDctXFx1QTgwQVxcdUE4MEMtXFx1QTgyMlxcdUE4NDAtXFx1QTg3M1xcdUE4ODItXFx1QThCM1xcdUE4RjItXFx1QThGN1xcdUE4RkJcXHVBOTBBLVxcdUE5MjVcXHVBOTMwLVxcdUE5NDZcXHVBOTYwLVxcdUE5N0NcXHVBOTg0LVxcdUE5QjJcXHVBOUNGXFx1QUEwMC1cXHVBQTI4XFx1QUE0MC1cXHVBQTQyXFx1QUE0NC1cXHVBQTRCXFx1QUE2MC1cXHVBQTc2XFx1QUE3QVxcdUFBODAtXFx1QUFBRlxcdUFBQjFcXHVBQUI1XFx1QUFCNlxcdUFBQjktXFx1QUFCRFxcdUFBQzBcXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVBXFx1QUFGMi1cXHVBQUY0XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUJDMC1cXHVBQkUyXFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRFxcdUZCMUYtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYyMS1cXHVGRjNBXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXS8sICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjA3NTA3MFxyXG4gICcqJzogLy4vXHJcbn07XHJcblBhdHRlcm5NYXNrLkRFRl9UWVBFUyA9IHtcclxuICBJTlBVVDogJ2lucHV0JyxcclxuICBGSVhFRDogJ2ZpeGVkJ1xyXG59XHJcblBhdHRlcm5NYXNrLkRFRkFVTFRfUExBQ0VIT0xERVIgPSB7XHJcbiAgc2hvdzogJ2xhenknLFxyXG4gIGNoYXI6ICdfJ1xyXG59O1xyXG4iLCJpbXBvcnQgQmFzZU1hc2sgZnJvbSAnLi9iYXNlJztcclxuaW1wb3J0IHtleHRlbmREZXRhaWxzQWRqdXN0bWVudHN9IGZyb20gJy4uL3V0aWxzJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdFxyXG5jbGFzcyBQaXBlTWFzayBleHRlbmRzIEJhc2VNYXNrIHtcclxuICBjb25zdHJ1Y3RvciAoZWwsIG9wdHMpIHtcclxuICAgIHN1cGVyKGVsLCBvcHRzKTtcclxuXHJcbiAgICB0aGlzLm11bHRpcGFzcyA9IG9wdHMubXVsdGlwYXNzO1xyXG5cclxuICAgIHRoaXMuX2NvbXBpbGVkTWFza3MgPSB0aGlzLm1hc2subWFwKG0gPT4gSU1hc2suTWFza0ZhY3RvcnkoZWwsIG0pKTtcclxuICB9XHJcblxyXG4gIHJlc29sdmUgKHN0ciwgZGV0YWlscykge1xyXG4gICAgdmFyIHJlcyA9IHRoaXMuX3BpcGUoc3RyLCBkZXRhaWxzKTtcclxuICAgIGlmICghdGhpcy5tdWx0aXBhc3MpIHJldHVybiByZXM7XHJcblxyXG4gICAgdmFyIGN1cnNvclBvcyA9IGRldGFpbHMuY3Vyc29yUG9zO1xyXG5cclxuICAgIHZhciBzdGVwUmVzO1xyXG4gICAgdmFyIHRlbXBSZXMgPSByZXM7XHJcblxyXG4gICAgd2hpbGUgKHN0ZXBSZXMgIT09IHRlbXBSZXMpIHtcclxuICAgICAgc3RlcFJlcyA9IHRlbXBSZXM7XHJcbiAgICAgIHRlbXBSZXMgPSB0aGlzLl9waXBlKHN0ZXBSZXMsIHtcclxuICAgICAgICBjdXJzb3JQb3M6IHN0ZXBSZXMubGVuZ3RoLFxyXG4gICAgICAgIG9sZFZhbHVlOiBzdGVwUmVzLFxyXG4gICAgICAgIG9sZFNlbGVjdGlvbjoge1xyXG4gICAgICAgICAgc3RhcnQ6IDAsXHJcbiAgICAgICAgICBlbmQ6IHN0ZXBSZXMubGVuZ3RoXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRhaWxzLmN1cnNvclBvcyA9IGN1cnNvclBvcyAtIChyZXMubGVuZ3RoIC0gc3RlcFJlcy5sZW5ndGgpO1xyXG5cclxuICAgIHJldHVybiBzdGVwUmVzO1xyXG4gIH1cclxuXHJcbiAgX3BpcGUgKHN0ciwgZGV0YWlscykge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVkTWFza3MucmVkdWNlKChzLCBtKSA9PiB7XHJcbiAgICAgIHZhciBkID0gZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzKHMsIGRldGFpbHMpO1xyXG4gICAgICB2YXIgcmVzID0gbS5yZXNvbHZlKHMsIGQpO1xyXG4gICAgICBkZXRhaWxzLmN1cnNvclBvcyA9IGQuY3Vyc29yUG9zO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfSwgc3RyKTtcclxuICB9XHJcblxyXG4gIGJpbmRFdmVudHMgKCkge1xyXG4gICAgc3VwZXIuYmluZEV2ZW50cygpO1xyXG4gICAgdGhpcy5fY29tcGlsZWRNYXNrcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICBtLmJpbmRFdmVudHMoKTtcclxuICAgICAgLy8gZGlzYWJsZSBiYXNlbWFzayBldmVudHMgZm9yIGNoaWxkIG1hc2tzXHJcbiAgICAgIEJhc2VNYXNrLnByb3RvdHlwZS51bmJpbmRFdmVudHMuYXBwbHkobSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVuYmluZEV2ZW50cyAoKSB7XHJcbiAgICBzdXBlci51bmJpbmRFdmVudHMoKTtcclxuICAgIHRoaXMuX2NvbXBpbGVkTWFza3MuZm9yRWFjaChtID0+IG0udW5iaW5kRXZlbnRzKCkpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge2lzU3RyaW5nfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmltcG9ydCBCYXNlTWFzayBmcm9tICcuL21hc2tzL2Jhc2UnO1xyXG5pbXBvcnQgUmVnRXhwTWFzayBmcm9tICcuL21hc2tzL3JlZ2V4cCc7XHJcbmltcG9ydCBGdW5jTWFzayBmcm9tICcuL21hc2tzL2Z1bmMnO1xyXG5pbXBvcnQgUGF0dGVybk1hc2sgZnJvbSAnLi9tYXNrcy9wYXR0ZXJuJztcclxuaW1wb3J0IFBpcGVNYXNrIGZyb20gJy4vbWFza3MvcGlwZSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuZnVuY3Rpb24gSU1hc2sgKGVsLCBvcHRzPXt9KSB7XHJcbiAgdmFyIG1hc2sgPSBJTWFzay5NYXNrRmFjdG9yeShlbCwgb3B0cyk7XHJcbiAgbWFzay5iaW5kRXZlbnRzKCk7XHJcbiAgLy8gcmVmcmVzaFxyXG4gIG1hc2sucmF3VmFsdWUgPSBlbC52YWx1ZTtcclxuICByZXR1cm4gbWFzaztcclxufVxyXG5cclxuSU1hc2suTWFza0ZhY3RvcnkgPSBmdW5jdGlvbiAoZWwsIG9wdHMpIHtcclxuICB2YXIgbWFzayA9IG9wdHMubWFzaztcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEJhc2VNYXNrKSByZXR1cm4gbWFzaztcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIG5ldyBSZWdFeHBNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gbmV3IEZ1bmNNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gbmV3IFBpcGVNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAoaXNTdHJpbmcobWFzaykpIHJldHVybiBuZXcgUGF0dGVybk1hc2soZWwsIG9wdHMpO1xyXG4gIHJldHVybiBuZXcgQmFzZU1hc2soZWwsIG9wdHMpO1xyXG59XHJcbklNYXNrLkJhc2VNYXNrID0gQmFzZU1hc2s7XHJcbklNYXNrLkZ1bmNNYXNrID0gRnVuY01hc2s7XHJcbklNYXNrLlJlZ0V4cE1hc2sgPSBSZWdFeHBNYXNrO1xyXG5JTWFzay5QYXR0ZXJuTWFzayA9IFBhdHRlcm5NYXNrO1xyXG53aW5kb3cuSU1hc2sgPSBJTWFzaztcclxuIl0sIm5hbWVzIjpbImlzU3RyaW5nIiwic3RyIiwiU3RyaW5nIiwiY29uZm9ybSIsInJlcyIsImZhbGxiYWNrIiwiZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzIiwiZGV0YWlscyIsImN1cnNvclBvcyIsIm9sZFNlbGVjdGlvbiIsIm9sZFZhbHVlIiwic3RhcnRDaGFuZ2VQb3MiLCJNYXRoIiwibWluIiwic3RhcnQiLCJpbnNlcnRlZENvdW50IiwicmVtb3ZlZENvdW50IiwibWF4IiwiZW5kIiwibGVuZ3RoIiwiaGVhZCIsInN1YnN0cmluZyIsInRhaWwiLCJpbnNlcnRlZCIsInN1YnN0ciIsInJlbW92ZWQiLCJCYXNlTWFzayIsImVsIiwib3B0cyIsIm1hc2siLCJfbGlzdGVuZXJzIiwiX3JlZnJlc2hpbmdDb3VudCIsIl9yYXdWYWx1ZSIsIl91bm1hc2tlZFZhbHVlIiwic2F2ZVNlbGVjdGlvbiIsImJpbmQiLCJfb25JbnB1dCIsIl9vbkRyb3AiLCJldiIsImhhbmRsZXIiLCJwdXNoIiwiaEluZGV4IiwiaW5kZXhPZiIsInNwbGljZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibGlzdGVuZXJzIiwiZm9yRWFjaCIsImwiLCJpbnB1dFZhbHVlIiwiX3NlbGVjdGlvbiIsInJhd1ZhbHVlIiwidW5tYXNrZWRWYWx1ZSIsInJlc29sdmUiLCJ1cGRhdGVFbGVtZW50IiwidmFsdWUiLCJ3YXJuIiwic2VsZWN0aW9uU3RhcnQiLCJ1bmJpbmRFdmVudHMiLCJfY2FsY1VubWFza2VkIiwiaXNDaGFuZ2VkIiwiX2N1cnNvckNoYW5naW5nIiwiY2xlYXJUaW1lb3V0IiwiX2NoYW5naW5nQ3Vyc29yUG9zIiwic2V0VGltZW91dCIsIl9maXJlQ2hhbmdlRXZlbnRzIiwiZmlyZUV2ZW50IiwicHJvY2Vzc0lucHV0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJzZWxlY3Rpb25FbmQiLCJwb3MiLCJzZXRTZWxlY3Rpb25SYW5nZSIsIlJlZ0V4cE1hc2siLCJ0ZXN0IiwiRnVuY01hc2siLCJQYXR0ZXJuTWFzayIsIl9ob2xsb3dzIiwicGxhY2Vob2xkZXIiLCJkZWZpbml0aW9ucyIsIkRFRklOSVRJT05TIiwiX2FsaWduQ3Vyc29yIiwiX2FsaWduQ3Vyc29yRnJpZW5kbHkiLCJfaW5pdGlhbGl6ZWQiLCJfZGVmaW5pdGlvbnMiLCJfY2hhckRlZnMiLCJwYXR0ZXJuIiwidW5tYXNraW5nQmxvY2siLCJvcHRpb25hbEJsb2NrIiwiaSIsImNoIiwidHlwZSIsIkRFRl9UWVBFUyIsIklOUFVUIiwiRklYRUQiLCJ1bm1hc2tpbmciLCJvcHRpb25hbCIsIl9idWlsZFJlc29sdmVycyIsIl9yZXNvbHZlcnMiLCJkZWZLZXkiLCJJTWFzayIsIk1hc2tGYWN0b3J5IiwicGxhY2Vob2xkZXJCdWZmZXIiLCJob2xsb3dzIiwic2xpY2UiLCJvdmVyZmxvdyIsImNpIiwiZGkiLCJfbWFwUG9zVG9EZWZJbmRleCIsImRlZiIsInJlc29sdmVyIiwiY2hhciIsImNocmVzIiwiX3BsYWNlaG9sZGVyIiwiZnJvbVBvcyIsImlucHV0IiwiX2lzSGlkZGVuSG9sbG93IiwiX2lzSG9sbG93IiwiZGVmSW5kZXgiLCJmaWx0ZXIiLCJoIiwiX2hvbGxvd3NCZWZvcmUiLCJsYXN0SG9sbG93SW5kZXgiLCJpbnNlcnRTdGVwcyIsInRhaWxJbnB1dCIsIl9leHRyYWN0SW5wdXQiLCJfZ2VuZXJhdGVJbnNlcnRTdGVwcyIsImlzdGVwIiwic3RlcCIsIl9hcHBlbmRUYWlsIiwidHJlcyIsInRob2xsb3dzIiwiYXBwZW5kZWQiLCJfYXBwZW5kRml4ZWRFbmQiLCJoYXNIb2xsb3dzIiwiX2FwcGVuZFBsYWNlaG9sZGVyRW5kIiwiaXNDb21wbGV0ZSIsInNob3ciLCJ1bm1hc2tlZCIsImN1cnNvckRlZkluZGV4IiwiclBvcyIsInJEZWYiLCJsUG9zIiwibERlZiIsIl9tYXBEZWZJbmRleFRvUG9zIiwicGgiLCJERUZBVUxUX1BMQUNFSE9MREVSIiwibWFwIiwiam9pbiIsImRlZnMiLCJfaW5zdGFsbERlZmluaXRpb25zIiwiX21hc2siLCJQaXBlTWFzayIsIm11bHRpcGFzcyIsIl9jb21waWxlZE1hc2tzIiwibSIsIl9waXBlIiwic3RlcFJlcyIsInRlbXBSZXMiLCJyZWR1Y2UiLCJzIiwiZCIsImJpbmRFdmVudHMiLCJwcm90b3R5cGUiLCJhcHBseSIsIlJlZ0V4cCIsIkZ1bmN0aW9uIiwiQXJyYXkiLCJ3aW5kb3ciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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 \ No newline at end of file diff --git a/dist/imask.js.map b/dist/imask.js.map index 0daf9cdb..37dcbccf 100644 --- a/dist/imask.js.map +++ b/dist/imask.js.map @@ -1 +1 @@ -{"version":3,"file":"imask.js","sources":["utils.js","masks/base.js","masks/regexp.js","masks/func.js","masks/pattern.js","imask.js"],"sourcesContent":["export\r\nfunction isString (str) {\r\n return typeof str === 'string' || str instanceof String;\r\n}\r\n\r\nexport\r\nfunction conform (res, str, fallback='') {\r\n return isString(res) ?\r\n res :\r\n res ?\r\n str :\r\n fallback;\r\n}\r\n\r\nexport\r\nfunction extendDetailsAdjustments(str, details) {\r\n var cursorPos = details.cursorPos;\r\n var oldSelection = details.oldSelection;\r\n var oldValue = details.oldValue;\r\n\r\n var startChangePos = Math.min(cursorPos, oldSelection.start);\r\n var insertedCount = cursorPos - startChangePos;\r\n // Math.max for opposite operation\r\n var removedCount = Math.max((oldSelection.end - startChangePos) ||\r\n // for Delete\r\n oldValue.length - str.length, 0);\r\n var head = str.substring(0, startChangePos);\r\n var tail = str.substring(startChangePos + insertedCount);\r\n var inserted = str.substr(startChangePos, insertedCount);\r\n var removed = str.substr(startChangePos, removedCount);\r\n\r\n return {\r\n startChangePos,\r\n head,\r\n tail,\r\n inserted,\r\n removed,\r\n ...details\r\n };\r\n}\r\n","import {conform, extendDetailsAdjustments} from '../utils';\r\n\r\n\r\nexport default\r\nclass BaseMask {\r\n constructor (el, opts) {\r\n this.el = el;\r\n this.mask = opts.mask;\r\n\r\n this._listeners = {};\r\n this._refreshingCount = 0;\r\n this._rawValue = \"\";\r\n this._unmaskedValue = \"\";\r\n\r\n this.saveSelection = this.saveSelection.bind(this);\r\n this._onInput = this._onInput.bind(this);\r\n this._onDrop = this._onDrop.bind(this);\r\n }\r\n\r\n on (ev, handler) {\r\n if (!this._listeners[ev]) this._listeners[ev] = [];\r\n this._listeners[ev].push(handler);\r\n return this;\r\n }\r\n\r\n off (ev, handler) {\r\n if (!this._listeners[ev]) return;\r\n if (!handler) {\r\n delete this._listeners[ev];\r\n return;\r\n }\r\n var hIndex = this._listeners[ev].indexOf(handler);\r\n if (hIndex >= 0) this._listeners.splice(hIndex, 1);\r\n return this;\r\n }\r\n\r\n get rawValue () {\r\n return this._rawValue;\r\n }\r\n\r\n set rawValue (str) {\r\n this.processInput(str, {\r\n cursorPos: str.length,\r\n oldSelection: {\r\n start: 0,\r\n end: this.rawValue.length\r\n },\r\n });\r\n }\r\n\r\n get unmaskedValue () {\r\n return this._unmaskedValue;\r\n }\r\n\r\n set unmaskedValue (value) {\r\n this.rawValue = value;\r\n }\r\n\r\n\r\n bindEvents () {\r\n this.el.addEventListener('keydown', this.saveSelection);\r\n this.el.addEventListener('input', this._onInput);\r\n this.el.addEventListener('drop', this._onDrop);\r\n }\r\n\r\n unbindEvents () {\r\n this.el.removeEventListener('keydown', this.saveSelection);\r\n this.el.removeEventListener('input', this._onInput);\r\n this.el.removeEventListener('drop', this._onDrop);\r\n }\r\n\r\n fireEvent (ev) {\r\n var listeners = this._listeners[ev] || [];\r\n listeners.forEach(l => l());\r\n }\r\n\r\n processInput (inputValue, details) {\r\n details = {\r\n cursorPos: this.cursorPos,\r\n oldSelection: this._selection,\r\n oldValue: this.rawValue,\r\n oldUnmaskedValue: this.unmaskedValue,\r\n ...details\r\n };\r\n\r\n details = extendDetailsAdjustments(inputValue, details);\r\n\r\n var res = conform(this.resolve(inputValue, details),\r\n inputValue,\r\n this.rawValue);\r\n\r\n this.updateElement(res, details.cursorPos);\r\n return res;\r\n }\r\n\r\n\r\n get selectionStart () {\r\n return this.el.selectionStart;\r\n }\r\n\r\n get cursorPos () {\r\n return this._cursorChanging ?\r\n this._changingCursorPos :\r\n this.el.selectionEnd;\r\n }\r\n\r\n set cursorPos (pos) {\r\n this.el.setSelectionRange(pos, pos);\r\n }\r\n\r\n saveSelection (ev) {\r\n if (this.rawValue !== this.el.value) {\r\n console.warn(\"Uncontrolled input change, refresh mask manually!\");\r\n }\r\n this._selection = {\r\n start: this.selectionStart,\r\n end: this.cursorPos\r\n };\r\n }\r\n\r\n destroy () {\r\n this.unbindEvents();\r\n this._listeners.length = 0;\r\n }\r\n\r\n updateElement (value, cursorPos) {\r\n var unmaskedValue = this._calcUnmasked(value);\r\n var isChanged = (this.unmaskedValue !== unmaskedValue ||\r\n this.rawValue !== value);\r\n\r\n this._unmaskedValue = unmaskedValue;\r\n this._rawValue = value;\r\n\r\n if (this.el.value !== value) this.el.value = value;\r\n if (this.cursorPos != cursorPos && cursorPos != null) {\r\n // also queue change cursor for some browsers\r\n if (this._cursorChanging) clearTimeout(this._cursorChanging);\r\n this._changingCursorPos = cursorPos;\r\n this._cursorChanging = setTimeout(() => {\r\n this.cursorPos = this._changingCursorPos;\r\n delete this._cursorChanging;\r\n }, 10);\r\n this.cursorPos = cursorPos;\r\n }\r\n this.saveSelection();\r\n\r\n if (isChanged) this._fireChangeEvents();\r\n }\r\n\r\n _fireChangeEvents () {\r\n this.fireEvent(\"accept\");\r\n }\r\n\r\n _onInput (ev) {\r\n if (this._cursorChanging) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n this.processInput(this.el.value);\r\n }\r\n\r\n _onDrop (ev) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n\r\n // override\r\n resolve (str, details) { return str; }\r\n\r\n _calcUnmasked (value) { return value; }\r\n}\r\n","import BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass RegExpMask extends BaseMask {\r\n resolve (str) {\r\n return this.mask.test(str);\r\n }\r\n}\r\n","import BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass FuncMask extends BaseMask {\r\n resolve (...args) {\r\n return this.mask(...args);\r\n }\r\n}\r\n","import {conform} from '../utils';\r\nimport BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass PatternMask extends BaseMask {\r\n constructor (el, opts) {\r\n super(el, opts);\r\n\r\n this._hollows = [];\r\n this.placeholder = opts.placeholder;\r\n this.definitions = {\r\n ...PatternMask.DEFINITIONS,\r\n ...opts.definitions\r\n };\r\n\r\n this._alignCursor = this._alignCursor.bind(this);\r\n this._alignCursorFriendly = this._alignCursorFriendly.bind(this);\r\n\r\n this._initialized = true;\r\n }\r\n\r\n _alignCursorFriendly () {\r\n if (this.selectionStart !== this.cursorPos) return;\r\n this._alignCursor();\r\n }\r\n\r\n bindEvents () {\r\n super.bindEvents();\r\n this.el.addEventListener('click', this._alignCursorFriendly);\r\n }\r\n\r\n unbindEvents () {\r\n super.unbindEvents();\r\n this.el.removeEventListener('click', this._alignCursorFriendly);\r\n }\r\n\r\n _installDefinitions (definitions) {\r\n this._definitions = definitions;\r\n this._charDefs = [];\r\n var pattern = this.mask;\r\n\r\n if (!pattern || !definitions) return;\r\n\r\n var unmaskingBlock = false;\r\n var optionalBlock = false;\r\n for (var i=0; i= 0;\r\n }\r\n\r\n _isHiddenHollow (defIndex) {\r\n return this._isHollow(defIndex) &&\r\n this._charDefs[defIndex] && this._charDefs[defIndex].optional;\r\n }\r\n\r\n _hollowsBefore (defIndex) {\r\n return this._hollows.filter(h => h < defIndex && this._isHiddenHollow(h));\r\n }\r\n\r\n _mapDefIndexToPos (defIndex) {\r\n return defIndex - this._hollowsBefore(defIndex).length;\r\n }\r\n\r\n _mapPosToDefIndex (pos) {\r\n var lastHollowIndex = pos;\r\n // extend contiguous\r\n while (this._isHiddenHollow(lastHollowIndex-1)) ++lastHollowIndex;\r\n\r\n return pos + this._hollowsBefore(lastHollowIndex).length;\r\n }\r\n\r\n _generateInsertSteps (head, inserted) {\r\n var res = head;\r\n var hollows = this._hollows.slice();\r\n var placeholderBuffer = '';\r\n var insertSteps = [[res, hollows.slice()]];\r\n\r\n for (var ci=0, di=this._mapPosToDefIndex(head.length); ci h < lastHollowIndex);\r\n\r\n var res = details.head;\r\n\r\n // insert available\r\n var insertSteps = this._generateInsertSteps(res, inserted);\r\n for (var istep=insertSteps.length-1; istep >= 0; --istep) {\r\n var step;\r\n [step, this._hollows] = insertSteps[istep];\r\n var [tres, thollows, overflow] = this._appendTail(step, tailInput);\r\n if (!overflow) {\r\n [res, this._hollows] = [tres, thollows];\r\n cursorPos = step.length;\r\n break;\r\n }\r\n }\r\n\r\n // if input at the end - append fixed\r\n if (inserted && cursorPos === res.length) {\r\n // append fixed at end\r\n var appended = this._appendFixedEnd(res);\r\n cursorPos += appended.length - res.length;\r\n res = appended;\r\n }\r\n\r\n if (!inserted && removedCount) {\r\n // if delete at right\r\n if (details.oldSelection.end === cursorPos) {\r\n for (;;++cursorPos) {\r\n var di=this._mapPosToDefIndex(cursorPos);\r\n var def = this._charDefs[di];\r\n if (!def || def.type !== PatternMask.DEF_TYPES.FIXED) break;\r\n }\r\n }\r\n\r\n // remove head fixed and hollows if removed at end\r\n if (cursorPos === res.length) {\r\n var di = this._mapPosToDefIndex(cursorPos-1);\r\n var hasHollows = false;\r\n for (; di > 0; --di) {\r\n var def = this._charDefs[di];\r\n if (def.type === PatternMask.DEF_TYPES.INPUT) {\r\n if (this._isHollow(di)) hasHollows = true;\r\n else break;\r\n }\r\n }\r\n if (hasHollows) res = res.slice(0, di + 1);\r\n }\r\n }\r\n\r\n // append placeholder\r\n res = this._appendPlaceholderEnd(res);\r\n details.cursorPos = cursorPos;\r\n\r\n return res;\r\n }\r\n\r\n _fireChangeEvents () {\r\n // fire 'complete' after 'accept' event\r\n super._fireChangeEvents();\r\n if (this.isComplete) this.fireEvent(\"complete\");\r\n }\r\n\r\n get isComplete () {\r\n return !this._charDefs.filter((def, di) =>\r\n def.type === PatternMask.DEF_TYPES.INPUT && !def.optional &&\r\n this._isHollow(di)).length;\r\n }\r\n\r\n _appendFixedEnd (res) {\r\n for (var di=this._mapPosToDefIndex(res.length);; ++di) {\r\n var def = this._charDefs[di];\r\n if (!def) break;\r\n\r\n if (this._isHiddenHollow(di)) continue;\r\n if (def.type === PatternMask.DEF_TYPES.INPUT) break;\r\n if (di >= res.length) res += def.char;\r\n }\r\n return res;\r\n }\r\n\r\n _appendPlaceholderEnd (res) {\r\n for (var di=this._mapPosToDefIndex(res.length); di\r\n def.type === PatternMask.DEF_TYPES.FIXED ?\r\n def.char :\r\n !def.optional ?\r\n this._placeholder.char :\r\n '').join('');\r\n }\r\n\r\n get definitions () { return this._definitions; }\r\n\r\n set definitions (defs) {\r\n this._installDefinitions(defs);\r\n if (this._initialized) this.unmaskedValue = this.unmaskedValue;\r\n }\r\n\r\n get mask () { return this._mask; }\r\n\r\n set mask (mask) {\r\n this._mask = mask;\r\n if (this._initialized) this.definitions = this.definitions;\r\n }\r\n\r\n _alignCursor () {\r\n var cursorDefIndex = this._mapPosToDefIndex(this.cursorPos);\r\n for (var rPos = cursorDefIndex; rPos >= 0; --rPos) {\r\n var rDef = this._charDefs[rPos];\r\n var lPos = rPos-1;\r\n var lDef = this._charDefs[lPos];\r\n if (this._isHiddenHollow(lPos)) continue;\r\n\r\n if ((!rDef || rDef.type === PatternMask.DEF_TYPES.INPUT && this._isHollow(rPos) && !this._isHiddenHollow(rPos)) &&\r\n !this._isHollow(lPos)) {\r\n cursorDefIndex = rPos;\r\n if (!lDef || lDef.type === PatternMask.DEF_TYPES.INPUT) break;\r\n }\r\n }\r\n this.cursorPos = this._mapDefIndexToPos(cursorDefIndex);\r\n }\r\n}\r\nPatternMask.DEFINITIONS = {\r\n '0': /\\d/,\r\n 'a': /[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/, // http://stackoverflow.com/a/22075070\r\n '*': /./\r\n};\r\nPatternMask.DEF_TYPES = {\r\n INPUT: 'input',\r\n FIXED: 'fixed'\r\n}\r\nPatternMask.DEFAULT_PLACEHOLDER = {\r\n show: 'lazy',\r\n char: '_'\r\n};\r\n","import {isString} from './utils';\r\n\r\nimport BaseMask from './masks/base';\r\nimport RegExpMask from './masks/regexp';\r\nimport FuncMask from './masks/func';\r\nimport PatternMask from './masks/pattern';\r\n\r\n\r\nexport default\r\nfunction IMask (el, opts={}) {\r\n var mask = IMask.MaskFactory(el, opts);\r\n mask.bindEvents();\r\n // refresh\r\n mask.rawValue = el.value;\r\n return mask;\r\n}\r\n\r\nIMask.MaskFactory = function (el, opts) {\r\n var mask = opts.mask;\r\n if (mask instanceof BaseMask) return mask;\r\n if (mask instanceof RegExp) return new RegExpMask(el, opts);\r\n if (mask instanceof Function) return new FuncMask(el, opts);\r\n if (isString(mask)) return new PatternMask(el, opts);\r\n return new BaseMask(el, opts);\r\n}\r\nIMask.BaseMask = BaseMask;\r\nIMask.FuncMask = FuncMask;\r\nIMask.RegExpMask = RegExpMask;\r\nIMask.PatternMask = PatternMask;\r\nwindow.IMask = IMask;\r\n"],"names":["isString","str","String","conform","res","fallback","extendDetailsAdjustments","details","cursorPos","oldSelection","oldValue","startChangePos","Math","min","start","insertedCount","removedCount","max","end","length","head","substring","tail","inserted","substr","removed","BaseMask","el","opts","mask","_listeners","_refreshingCount","_rawValue","_unmaskedValue","saveSelection","bind","_onInput","_onDrop","ev","handler","push","hIndex","indexOf","splice","addEventListener","removeEventListener","listeners","forEach","l","inputValue","_selection","rawValue","unmaskedValue","resolve","updateElement","value","warn","selectionStart","unbindEvents","_calcUnmasked","isChanged","_cursorChanging","clearTimeout","_changingCursorPos","setTimeout","_fireChangeEvents","fireEvent","preventDefault","processInput","stopPropagation","selectionEnd","pos","setSelectionRange","RegExpMask","test","FuncMask","PatternMask","_hollows","placeholder","definitions","DEFINITIONS","_alignCursor","_alignCursorFriendly","_initialized","_definitions","_charDefs","pattern","unmaskingBlock","optionalBlock","i","ch","type","DEF_TYPES","INPUT","FIXED","unmasking","optional","_buildResolvers","_resolvers","defKey","IMask","MaskFactory","placeholderBuffer","hollows","slice","overflow","ci","di","_mapPosToDefIndex","def","resolver","char","chres","_placeholder","fromPos","input","_isHiddenHollow","_isHollow","defIndex","filter","h","_hollowsBefore","lastHollowIndex","insertSteps","tailInput","_extractInput","_generateInsertSteps","istep","step","_appendTail","tres","thollows","appended","_appendFixedEnd","hasHollows","_appendPlaceholderEnd","isComplete","show","unmasked","cursorDefIndex","rPos","rDef","lPos","lDef","_mapDefIndexToPos","ph","DEFAULT_PLACEHOLDER","map","join","defs","_installDefinitions","_mask","bindEvents","RegExp","Function","window"],"mappings":"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","preExisting":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL3V0aWxzLmpzIiwiQzovUHJvamVjdHMvaW1hc2tqcy9zcmMvbWFza3MvYmFzZS5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL21hc2tzL3JlZ2V4cC5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL21hc2tzL2Z1bmMuanMiLCJDOi9Qcm9qZWN0cy9pbWFza2pzL3NyYy9tYXNrcy9wYXR0ZXJuLmpzIiwiQzovUHJvamVjdHMvaW1hc2tqcy9zcmMvaW1hc2suanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0XHJcbmZ1bmN0aW9uIGlzU3RyaW5nIChzdHIpIHtcclxuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgc3RyIGluc3RhbmNlb2YgU3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnRcclxuZnVuY3Rpb24gY29uZm9ybSAocmVzLCBzdHIsIGZhbGxiYWNrPScnKSB7XHJcbiAgcmV0dXJuIGlzU3RyaW5nKHJlcykgP1xyXG4gICAgcmVzIDpcclxuICAgIHJlcyA/XHJcbiAgICAgIHN0ciA6XHJcbiAgICAgIGZhbGxiYWNrO1xyXG59XHJcblxyXG5leHBvcnRcclxuZnVuY3Rpb24gZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzKHN0ciwgZGV0YWlscykge1xyXG4gIHZhciBjdXJzb3JQb3MgPSBkZXRhaWxzLmN1cnNvclBvcztcclxuICB2YXIgb2xkU2VsZWN0aW9uID0gZGV0YWlscy5vbGRTZWxlY3Rpb247XHJcbiAgdmFyIG9sZFZhbHVlID0gZGV0YWlscy5vbGRWYWx1ZTtcclxuXHJcbiAgdmFyIHN0YXJ0Q2hhbmdlUG9zID0gTWF0aC5taW4oY3Vyc29yUG9zLCBvbGRTZWxlY3Rpb24uc3RhcnQpO1xyXG4gIHZhciBpbnNlcnRlZENvdW50ID0gY3Vyc29yUG9zIC0gc3RhcnRDaGFuZ2VQb3M7XHJcbiAgLy8gTWF0aC5tYXggZm9yIG9wcG9zaXRlIG9wZXJhdGlvblxyXG4gIHZhciByZW1vdmVkQ291bnQgPSBNYXRoLm1heCgob2xkU2VsZWN0aW9uLmVuZCAtIHN0YXJ0Q2hhbmdlUG9zKSB8fFxyXG4gICAgLy8gZm9yIERlbGV0ZVxyXG4gICAgb2xkVmFsdWUubGVuZ3RoIC0gc3RyLmxlbmd0aCwgMCk7XHJcbiAgdmFyIGhlYWQgPSBzdHIuc3Vic3RyaW5nKDAsIHN0YXJ0Q2hhbmdlUG9zKTtcclxuICB2YXIgdGFpbCA9IHN0ci5zdWJzdHJpbmcoc3RhcnRDaGFuZ2VQb3MgKyBpbnNlcnRlZENvdW50KTtcclxuICB2YXIgaW5zZXJ0ZWQgPSBzdHIuc3Vic3RyKHN0YXJ0Q2hhbmdlUG9zLCBpbnNlcnRlZENvdW50KTtcclxuICB2YXIgcmVtb3ZlZCA9IHN0ci5zdWJzdHIoc3RhcnRDaGFuZ2VQb3MsIHJlbW92ZWRDb3VudCk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzdGFydENoYW5nZVBvcyxcclxuICAgIGhlYWQsXHJcbiAgICB0YWlsLFxyXG4gICAgaW5zZXJ0ZWQsXHJcbiAgICByZW1vdmVkLFxyXG4gICAgLi4uZGV0YWlsc1xyXG4gIH07XHJcbn1cclxuIiwiaW1wb3J0IHtjb25mb3JtLCBleHRlbmREZXRhaWxzQWRqdXN0bWVudHN9IGZyb20gJy4uL3V0aWxzJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdFxyXG5jbGFzcyBCYXNlTWFzayB7XHJcbiAgY29uc3RydWN0b3IgKGVsLCBvcHRzKSB7XHJcbiAgICB0aGlzLmVsID0gZWw7XHJcbiAgICB0aGlzLm1hc2sgPSBvcHRzLm1hc2s7XHJcblxyXG4gICAgdGhpcy5fbGlzdGVuZXJzID0ge307XHJcbiAgICB0aGlzLl9yZWZyZXNoaW5nQ291bnQgPSAwO1xyXG4gICAgdGhpcy5fcmF3VmFsdWUgPSBcIlwiO1xyXG4gICAgdGhpcy5fdW5tYXNrZWRWYWx1ZSA9IFwiXCI7XHJcblxyXG4gICAgdGhpcy5zYXZlU2VsZWN0aW9uID0gdGhpcy5zYXZlU2VsZWN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLl9vbklucHV0ID0gdGhpcy5fb25JbnB1dC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5fb25Ecm9wID0gdGhpcy5fb25Ecm9wLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBvbiAoZXYsIGhhbmRsZXIpIHtcclxuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW2V2XSkgdGhpcy5fbGlzdGVuZXJzW2V2XSA9IFtdO1xyXG4gICAgdGhpcy5fbGlzdGVuZXJzW2V2XS5wdXNoKGhhbmRsZXIpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBvZmYgKGV2LCBoYW5kbGVyKSB7XHJcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1tldl0pIHJldHVybjtcclxuICAgIGlmICghaGFuZGxlcikge1xyXG4gICAgICBkZWxldGUgdGhpcy5fbGlzdGVuZXJzW2V2XTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIGhJbmRleCA9IHRoaXMuX2xpc3RlbmVyc1tldl0uaW5kZXhPZihoYW5kbGVyKTtcclxuICAgIGlmIChoSW5kZXggPj0gMCkgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShoSW5kZXgsIDEpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBnZXQgcmF3VmFsdWUgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jhd1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJhd1ZhbHVlIChzdHIpIHtcclxuICAgIHRoaXMucHJvY2Vzc0lucHV0KHN0ciwge1xyXG4gICAgICBjdXJzb3JQb3M6IHN0ci5sZW5ndGgsXHJcbiAgICAgIG9sZFNlbGVjdGlvbjoge1xyXG4gICAgICAgIHN0YXJ0OiAwLFxyXG4gICAgICAgIGVuZDogdGhpcy5yYXdWYWx1ZS5sZW5ndGhcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVubWFza2VkVmFsdWUgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VubWFza2VkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdW5tYXNrZWRWYWx1ZSAodmFsdWUpIHtcclxuICAgIHRoaXMucmF3VmFsdWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG5cclxuICBiaW5kRXZlbnRzICgpIHtcclxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuc2F2ZVNlbGVjdGlvbik7XHJcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fb25JbnB1dCk7XHJcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLl9vbkRyb3ApO1xyXG4gIH1cclxuXHJcbiAgdW5iaW5kRXZlbnRzICgpIHtcclxuICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuc2F2ZVNlbGVjdGlvbik7XHJcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fb25JbnB1dCk7XHJcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLl9vbkRyb3ApO1xyXG4gIH1cclxuXHJcbiAgZmlyZUV2ZW50IChldikge1xyXG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldl0gfHwgW107XHJcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaChsID0+IGwoKSk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzSW5wdXQgKGlucHV0VmFsdWUsIGRldGFpbHMpIHtcclxuICAgIGRldGFpbHMgPSB7XHJcbiAgICAgIGN1cnNvclBvczogdGhpcy5jdXJzb3JQb3MsXHJcbiAgICAgIG9sZFNlbGVjdGlvbjogdGhpcy5fc2VsZWN0aW9uLFxyXG4gICAgICBvbGRWYWx1ZTogdGhpcy5yYXdWYWx1ZSxcclxuICAgICAgb2xkVW5tYXNrZWRWYWx1ZTogdGhpcy51bm1hc2tlZFZhbHVlLFxyXG4gICAgICAuLi5kZXRhaWxzXHJcbiAgICB9O1xyXG5cclxuICAgIGRldGFpbHMgPSBleHRlbmREZXRhaWxzQWRqdXN0bWVudHMoaW5wdXRWYWx1ZSwgZGV0YWlscyk7XHJcblxyXG4gICAgdmFyIHJlcyA9IGNvbmZvcm0odGhpcy5yZXNvbHZlKGlucHV0VmFsdWUsIGRldGFpbHMpLFxyXG4gICAgICBpbnB1dFZhbHVlLFxyXG4gICAgICB0aGlzLnJhd1ZhbHVlKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQocmVzLCBkZXRhaWxzLmN1cnNvclBvcyk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldCBzZWxlY3Rpb25TdGFydCAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbC5zZWxlY3Rpb25TdGFydDtcclxuICB9XHJcblxyXG4gIGdldCBjdXJzb3JQb3MgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvckNoYW5naW5nID9cclxuICAgICAgdGhpcy5fY2hhbmdpbmdDdXJzb3JQb3MgOlxyXG4gICAgICB0aGlzLmVsLnNlbGVjdGlvbkVuZDtcclxuICB9XHJcblxyXG4gIHNldCBjdXJzb3JQb3MgKHBvcykge1xyXG4gICAgdGhpcy5lbC5zZXRTZWxlY3Rpb25SYW5nZShwb3MsIHBvcyk7XHJcbiAgfVxyXG5cclxuICBzYXZlU2VsZWN0aW9uIChldikge1xyXG4gICAgaWYgKHRoaXMucmF3VmFsdWUgIT09IHRoaXMuZWwudmFsdWUpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiVW5jb250cm9sbGVkIGlucHV0IGNoYW5nZSwgcmVmcmVzaCBtYXNrIG1hbnVhbGx5IVwiKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NlbGVjdGlvbiA9IHtcclxuICAgICAgc3RhcnQ6IHRoaXMuc2VsZWN0aW9uU3RhcnQsXHJcbiAgICAgIGVuZDogdGhpcy5jdXJzb3JQb3NcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBkZXN0cm95ICgpIHtcclxuICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XHJcbiAgICB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUVsZW1lbnQgKHZhbHVlLCBjdXJzb3JQb3MpIHtcclxuICAgIHZhciB1bm1hc2tlZFZhbHVlID0gdGhpcy5fY2FsY1VubWFza2VkKHZhbHVlKTtcclxuICAgIHZhciBpc0NoYW5nZWQgPSAodGhpcy51bm1hc2tlZFZhbHVlICE9PSB1bm1hc2tlZFZhbHVlIHx8XHJcbiAgICAgIHRoaXMucmF3VmFsdWUgIT09IHZhbHVlKTtcclxuXHJcbiAgICB0aGlzLl91bm1hc2tlZFZhbHVlID0gdW5tYXNrZWRWYWx1ZTtcclxuICAgIHRoaXMuX3Jhd1ZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuZWwudmFsdWUgIT09IHZhbHVlKSB0aGlzLmVsLnZhbHVlID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5jdXJzb3JQb3MgIT0gY3Vyc29yUG9zICYmIGN1cnNvclBvcyAhPSBudWxsKSB7XHJcbiAgICAgIC8vIGFsc28gcXVldWUgY2hhbmdlIGN1cnNvciBmb3Igc29tZSBicm93c2Vyc1xyXG4gICAgICBpZiAodGhpcy5fY3Vyc29yQ2hhbmdpbmcpIGNsZWFyVGltZW91dCh0aGlzLl9jdXJzb3JDaGFuZ2luZyk7XHJcbiAgICAgIHRoaXMuX2NoYW5naW5nQ3Vyc29yUG9zID0gY3Vyc29yUG9zO1xyXG4gICAgICB0aGlzLl9jdXJzb3JDaGFuZ2luZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3Vyc29yUG9zID0gdGhpcy5fY2hhbmdpbmdDdXJzb3JQb3M7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2N1cnNvckNoYW5naW5nO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICAgIHRoaXMuY3Vyc29yUG9zID0gY3Vyc29yUG9zO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgaWYgKGlzQ2hhbmdlZCkgdGhpcy5fZmlyZUNoYW5nZUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgX2ZpcmVDaGFuZ2VFdmVudHMgKCkge1xyXG4gICAgdGhpcy5maXJlRXZlbnQoXCJhY2NlcHRcIik7XHJcbiAgfVxyXG5cclxuICBfb25JbnB1dCAoZXYpIHtcclxuICAgIGlmICh0aGlzLl9jdXJzb3JDaGFuZ2luZykge1xyXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb2Nlc3NJbnB1dCh0aGlzLmVsLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIF9vbkRyb3AgKGV2KSB7XHJcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLyBvdmVycmlkZVxyXG4gIHJlc29sdmUgKHN0ciwgZGV0YWlscykgeyByZXR1cm4gc3RyOyB9XHJcblxyXG4gIF9jYWxjVW5tYXNrZWQgKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfVxyXG59XHJcbiIsImltcG9ydCBCYXNlTWFzayBmcm9tICcuL2Jhc2UnO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0XHJcbmNsYXNzIFJlZ0V4cE1hc2sgZXh0ZW5kcyBCYXNlTWFzayB7XHJcbiAgcmVzb2x2ZSAoc3RyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXNrLnRlc3Qoc3RyKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IEJhc2VNYXNrIGZyb20gJy4vYmFzZSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuY2xhc3MgRnVuY01hc2sgZXh0ZW5kcyBCYXNlTWFzayB7XHJcbiAgcmVzb2x2ZSAoLi4uYXJncykge1xyXG4gICAgcmV0dXJuIHRoaXMubWFzayguLi5hcmdzKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtjb25mb3JtfSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCBCYXNlTWFzayBmcm9tICcuL2Jhc2UnO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0XHJcbmNsYXNzIFBhdHRlcm5NYXNrIGV4dGVuZHMgQmFzZU1hc2sge1xyXG4gIGNvbnN0cnVjdG9yIChlbCwgb3B0cykge1xyXG4gICAgc3VwZXIoZWwsIG9wdHMpO1xyXG5cclxuICAgIHRoaXMuX2hvbGxvd3MgPSBbXTtcclxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSBvcHRzLnBsYWNlaG9sZGVyO1xyXG4gICAgdGhpcy5kZWZpbml0aW9ucyA9IHtcclxuICAgICAgLi4uUGF0dGVybk1hc2suREVGSU5JVElPTlMsXHJcbiAgICAgIC4uLm9wdHMuZGVmaW5pdGlvbnNcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5fYWxpZ25DdXJzb3IgPSB0aGlzLl9hbGlnbkN1cnNvci5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5fYWxpZ25DdXJzb3JGcmllbmRseSA9IHRoaXMuX2FsaWduQ3Vyc29yRnJpZW5kbHkuYmluZCh0aGlzKTtcclxuXHJcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBfYWxpZ25DdXJzb3JGcmllbmRseSAoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCAhPT0gdGhpcy5jdXJzb3JQb3MpIHJldHVybjtcclxuICAgIHRoaXMuX2FsaWduQ3Vyc29yKCk7XHJcbiAgfVxyXG5cclxuICBiaW5kRXZlbnRzICgpIHtcclxuICAgIHN1cGVyLmJpbmRFdmVudHMoKTtcclxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9hbGlnbkN1cnNvckZyaWVuZGx5KTtcclxuICB9XHJcblxyXG4gIHVuYmluZEV2ZW50cyAoKSB7XHJcbiAgICBzdXBlci51bmJpbmRFdmVudHMoKTtcclxuICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9hbGlnbkN1cnNvckZyaWVuZGx5KTtcclxuICB9XHJcblxyXG4gIF9pbnN0YWxsRGVmaW5pdGlvbnMgKGRlZmluaXRpb25zKSB7XHJcbiAgICB0aGlzLl9kZWZpbml0aW9ucyA9IGRlZmluaXRpb25zO1xyXG4gICAgdGhpcy5fY2hhckRlZnMgPSBbXTtcclxuICAgIHZhciBwYXR0ZXJuID0gdGhpcy5tYXNrO1xyXG5cclxuICAgIGlmICghcGF0dGVybiB8fCAhZGVmaW5pdGlvbnMpIHJldHVybjtcclxuXHJcbiAgICB2YXIgdW5tYXNraW5nQmxvY2sgPSBmYWxzZTtcclxuICAgIHZhciBvcHRpb25hbEJsb2NrID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpPTA7IGk8cGF0dGVybi5sZW5ndGg7ICsraSkge1xyXG4gICAgICB2YXIgY2ggPSBwYXR0ZXJuW2ldO1xyXG4gICAgICB2YXIgdHlwZSA9ICF1bm1hc2tpbmdCbG9jayAmJiBjaCBpbiBkZWZpbml0aW9ucyA/XHJcbiAgICAgICAgUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUIDpcclxuICAgICAgICBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuRklYRUQ7XHJcbiAgICAgIHZhciB1bm1hc2tpbmcgPSB0eXBlID09PSBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuSU5QVVQgfHwgdW5tYXNraW5nQmxvY2s7XHJcbiAgICAgIHZhciBvcHRpb25hbCA9IHR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiBvcHRpb25hbEJsb2NrO1xyXG5cclxuICAgICAgaWYgKGNoID09PSAneycgfHwgY2ggPT09ICd9Jykge1xyXG4gICAgICAgIHVubWFza2luZ0Jsb2NrID0gIXVubWFza2luZ0Jsb2NrO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2ggPT09ICdbJyB8fCBjaCA9PT0gJ10nKSB7XHJcbiAgICAgICAgb3B0aW9uYWxCbG9jayA9ICFvcHRpb25hbEJsb2NrO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2ggPT09ICdcXFxcJykge1xyXG4gICAgICAgICsraTtcclxuICAgICAgICBjaCA9IHBhdHRlcm5baV07XHJcbiAgICAgICAgLy8gVE9ETyB2YWxpZGF0aW9uXHJcbiAgICAgICAgaWYgKCFjaCkgYnJlYWs7XHJcbiAgICAgICAgdHlwZSA9IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5GSVhFRDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fY2hhckRlZnMucHVzaCh7XHJcbiAgICAgICAgY2hhcjogY2gsXHJcbiAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICBvcHRpb25hbDogb3B0aW9uYWwsXHJcbiAgICAgICAgdW5tYXNraW5nOiB1bm1hc2tpbmdcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fYnVpbGRSZXNvbHZlcnMoKTtcclxuICB9XHJcblxyXG4gIF9idWlsZFJlc29sdmVycyAoKSB7XHJcbiAgICB0aGlzLl9yZXNvbHZlcnMgPSB7fTtcclxuICAgIGZvciAodmFyIGRlZktleSBpbiB0aGlzLmRlZmluaXRpb25zKSB7XHJcbiAgICAgIHRoaXMuX3Jlc29sdmVyc1tkZWZLZXldID0gSU1hc2suTWFza0ZhY3RvcnkodGhpcy5lbCwge1xyXG4gICAgICAgIG1hc2s6IHRoaXMuZGVmaW5pdGlvbnNbZGVmS2V5XVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9hcHBlbmRUYWlsIChzdHIsIHRhaWwpIHtcclxuICAgIHZhciBwbGFjZWhvbGRlckJ1ZmZlciA9ICcnO1xyXG4gICAgdmFyIGhvbGxvd3MgPSB0aGlzLl9ob2xsb3dzLnNsaWNlKCk7XHJcbiAgICB2YXIgb3ZlcmZsb3cgPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKHZhciBjaT0wLCBkaT10aGlzLl9tYXBQb3NUb0RlZkluZGV4KHN0ci5sZW5ndGgpOyBjaSA8IHRhaWwubGVuZ3RoOyArK2RpKSB7XHJcbiAgICAgIHZhciBjaCA9IHRhaWxbY2ldO1xyXG4gICAgICB2YXIgZGVmID0gdGhpcy5fY2hhckRlZnNbZGldO1xyXG5cclxuICAgICAgLy8gZmFpbGVkXHJcbiAgICAgIGlmICghZGVmKSB7XHJcbiAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCkge1xyXG4gICAgICAgIHZhciByZXNvbHZlciA9IHRoaXMuX3Jlc29sdmVyc1tkZWYuY2hhcl07XHJcbiAgICAgICAgdmFyIGNocmVzID0gcmVzb2x2ZXIucmVzb2x2ZShjaCwgZGksIHN0cikgfHwgJyc7XHJcbiAgICAgICAgaWYgKGNocmVzKSB7XHJcbiAgICAgICAgICBjaHJlcyA9IGNvbmZvcm0oY2hyZXMsIGNoKTtcclxuICAgICAgICAgICsrY2k7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICghZGVmLm9wdGlvbmFsKSBjaHJlcyA9IHRoaXMuX3BsYWNlaG9sZGVyLmNoYXI7XHJcbiAgICAgICAgICBob2xsb3dzLnB1c2goZGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdHIgKz0gcGxhY2Vob2xkZXJCdWZmZXIgKyBjaHJlcztcclxuICAgICAgICBwbGFjZWhvbGRlckJ1ZmZlciA9ICcnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBsYWNlaG9sZGVyQnVmZmVyICs9IGRlZi5jaGFyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtzdHIsIGhvbGxvd3MsIG92ZXJmbG93XTtcclxuICB9XHJcblxyXG4gIF9leHRyYWN0SW5wdXQgKHN0ciwgZnJvbVBvcz0wKSB7XHJcbiAgICB2YXIgaW5wdXQgPSAnJztcclxuXHJcbiAgICBmb3IgKHZhciBjaT0wLCBkaT10aGlzLl9tYXBQb3NUb0RlZkluZGV4KGZyb21Qb3MpOyBjaTxzdHIubGVuZ3RoICYmIGRpPHRoaXMuX2NoYXJEZWZzLmxlbmd0aDsgKytkaSkge1xyXG4gICAgICB2YXIgY2ggPSBzdHJbY2ldO1xyXG4gICAgICB2YXIgZGVmID0gdGhpcy5fY2hhckRlZnNbZGldO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2lzSGlkZGVuSG9sbG93KGRpKSkgY29udGludWU7XHJcblxyXG4gICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiAhdGhpcy5faXNIb2xsb3coZGkpKSBpbnB1dCArPSBjaDtcclxuICAgICAgKytjaTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbnB1dDtcclxuICB9XHJcblxyXG4gIF9pc0hvbGxvdyAoZGVmSW5kZXgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob2xsb3dzLmluZGV4T2YoZGVmSW5kZXgpID49IDA7XHJcbiAgfVxyXG5cclxuICBfaXNIaWRkZW5Ib2xsb3cgKGRlZkluZGV4KSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNIb2xsb3coZGVmSW5kZXgpICYmXHJcbiAgICAgIHRoaXMuX2NoYXJEZWZzW2RlZkluZGV4XSAmJiB0aGlzLl9jaGFyRGVmc1tkZWZJbmRleF0ub3B0aW9uYWw7XHJcbiAgfVxyXG5cclxuICBfaG9sbG93c0JlZm9yZSAoZGVmSW5kZXgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob2xsb3dzLmZpbHRlcihoID0+IGggPCBkZWZJbmRleCAmJiB0aGlzLl9pc0hpZGRlbkhvbGxvdyhoKSk7XHJcbiAgfVxyXG5cclxuICBfbWFwRGVmSW5kZXhUb1BvcyAoZGVmSW5kZXgpIHtcclxuICAgIHJldHVybiBkZWZJbmRleCAtIHRoaXMuX2hvbGxvd3NCZWZvcmUoZGVmSW5kZXgpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIF9tYXBQb3NUb0RlZkluZGV4IChwb3MpIHtcclxuICAgIHZhciBsYXN0SG9sbG93SW5kZXggPSBwb3M7XHJcbiAgICAvLyBleHRlbmQgY29udGlndW91c1xyXG4gICAgd2hpbGUgKHRoaXMuX2lzSGlkZGVuSG9sbG93KGxhc3RIb2xsb3dJbmRleC0xKSkgKytsYXN0SG9sbG93SW5kZXg7XHJcblxyXG4gICAgcmV0dXJuIHBvcyArIHRoaXMuX2hvbGxvd3NCZWZvcmUobGFzdEhvbGxvd0luZGV4KS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBfZ2VuZXJhdGVJbnNlcnRTdGVwcyAoaGVhZCwgaW5zZXJ0ZWQpIHtcclxuICAgIHZhciByZXMgPSBoZWFkO1xyXG4gICAgdmFyIGhvbGxvd3MgPSB0aGlzLl9ob2xsb3dzLnNsaWNlKCk7XHJcbiAgICB2YXIgcGxhY2Vob2xkZXJCdWZmZXIgPSAnJztcclxuICAgIHZhciBpbnNlcnRTdGVwcyA9IFtbcmVzLCBob2xsb3dzLnNsaWNlKCldXTtcclxuXHJcbiAgICBmb3IgKHZhciBjaT0wLCBkaT10aGlzLl9tYXBQb3NUb0RlZkluZGV4KGhlYWQubGVuZ3RoKTsgY2k8aW5zZXJ0ZWQubGVuZ3RoOykge1xyXG4gICAgICB2YXIgZGVmID0gdGhpcy5fY2hhckRlZnNbZGldO1xyXG4gICAgICBpZiAoIWRlZikgYnJlYWs7XHJcblxyXG4gICAgICB2YXIgY2ggPSBpbnNlcnRlZFtjaV07XHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSB7XHJcbiAgICAgICAgdmFyIHJlc29sdmVyID0gdGhpcy5fcmVzb2x2ZXJzW2RlZi5jaGFyXTtcclxuICAgICAgICB2YXIgY2hyZXMgPSByZXNvbHZlci5yZXNvbHZlKGNoLCBjaSwgcmVzKSB8fCAnJztcclxuICAgICAgICAvLyBpZiBvayAtIG5leHQgZGlcclxuICAgICAgICBpZiAoY2hyZXMpIHtcclxuICAgICAgICAgIHJlcyArPSBwbGFjZWhvbGRlckJ1ZmZlciArIGNvbmZvcm0oY2hyZXMsIGNoKTsgcGxhY2Vob2xkZXJCdWZmZXIgPSAnJztcclxuICAgICAgICAgIGluc2VydFN0ZXBzLnB1c2goW3JlcywgaG9sbG93cy5zbGljZSgpXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkZWYub3B0aW9uYWwpIHtcclxuICAgICAgICAgIGlmIChob2xsb3dzLmluZGV4T2YoZGkpIDwgMCkgaG9sbG93cy5wdXNoKGRpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNocmVzIHx8IGRlZi5vcHRpb25hbCkgKytkaTtcclxuICAgICAgICBpZiAoY2hyZXMgfHwgIWRlZi5vcHRpb25hbCkgKytjaTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwbGFjZWhvbGRlckJ1ZmZlciArPSBkZWYuY2hhcjtcclxuXHJcbiAgICAgICAgaWYgKGNoID09PSBkZWYuY2hhcikgKytjaTtcclxuICAgICAgICArK2RpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGluc2VydFN0ZXBzO1xyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZSAoc3RyLCBkZXRhaWxzKSB7XHJcbiAgICB2YXIgY3Vyc29yUG9zID0gZGV0YWlscy5jdXJzb3JQb3M7XHJcbiAgICB2YXIgc3RhcnRDaGFuZ2VQb3MgPSBkZXRhaWxzLnN0YXJ0Q2hhbmdlUG9zO1xyXG4gICAgdmFyIGluc2VydGVkID0gZGV0YWlscy5pbnNlcnRlZDtcclxuICAgIHZhciByZW1vdmVkQ291bnQgPSBkZXRhaWxzLnJlbW92ZWQubGVuZ3RoO1xyXG4gICAgdmFyIHRhaWxJbnB1dCA9IHRoaXMuX2V4dHJhY3RJbnB1dChkZXRhaWxzLnRhaWwsIHN0YXJ0Q2hhbmdlUG9zICsgcmVtb3ZlZENvdW50KTtcclxuXHJcbiAgICAvLyByZW1vdmUgaG9sbG93cyBhZnRlciBjdXJzb3JcclxuICAgIHZhciBsYXN0SG9sbG93SW5kZXggPSB0aGlzLl9tYXBQb3NUb0RlZkluZGV4KHN0YXJ0Q2hhbmdlUG9zKTtcclxuICAgIHRoaXMuX2hvbGxvd3MgPSB0aGlzLl9ob2xsb3dzLmZpbHRlcihoID0+IGggPCBsYXN0SG9sbG93SW5kZXgpO1xyXG5cclxuICAgIHZhciByZXMgPSBkZXRhaWxzLmhlYWQ7XHJcblxyXG4gICAgLy8gaW5zZXJ0IGF2YWlsYWJsZVxyXG4gICAgdmFyIGluc2VydFN0ZXBzID0gdGhpcy5fZ2VuZXJhdGVJbnNlcnRTdGVwcyhyZXMsIGluc2VydGVkKTtcclxuICAgIGZvciAodmFyIGlzdGVwPWluc2VydFN0ZXBzLmxlbmd0aC0xOyBpc3RlcCA+PSAwOyAtLWlzdGVwKSB7XHJcbiAgICAgIHZhciBzdGVwO1xyXG4gICAgICBbc3RlcCwgdGhpcy5faG9sbG93c10gPSBpbnNlcnRTdGVwc1tpc3RlcF07XHJcbiAgICAgIHZhciBbdHJlcywgdGhvbGxvd3MsIG92ZXJmbG93XSA9IHRoaXMuX2FwcGVuZFRhaWwoc3RlcCwgdGFpbElucHV0KTtcclxuICAgICAgaWYgKCFvdmVyZmxvdykge1xyXG4gICAgICAgIFtyZXMsIHRoaXMuX2hvbGxvd3NdID0gW3RyZXMsIHRob2xsb3dzXTtcclxuICAgICAgICBjdXJzb3JQb3MgPSBzdGVwLmxlbmd0aDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGlucHV0IGF0IHRoZSBlbmQgLSBhcHBlbmQgZml4ZWRcclxuICAgIGlmIChpbnNlcnRlZCAmJiBjdXJzb3JQb3MgPT09IHJlcy5sZW5ndGgpIHtcclxuICAgICAgLy8gYXBwZW5kIGZpeGVkIGF0IGVuZFxyXG4gICAgICB2YXIgYXBwZW5kZWQgPSB0aGlzLl9hcHBlbmRGaXhlZEVuZChyZXMpO1xyXG4gICAgICBjdXJzb3JQb3MgKz0gYXBwZW5kZWQubGVuZ3RoIC0gcmVzLmxlbmd0aDtcclxuICAgICAgcmVzID0gYXBwZW5kZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpbnNlcnRlZCAmJiByZW1vdmVkQ291bnQpIHtcclxuICAgICAgLy8gaWYgZGVsZXRlIGF0IHJpZ2h0XHJcbiAgICAgIGlmIChkZXRhaWxzLm9sZFNlbGVjdGlvbi5lbmQgPT09IGN1cnNvclBvcykge1xyXG4gICAgICAgIGZvciAoOzsrK2N1cnNvclBvcykge1xyXG4gICAgICAgICAgdmFyIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgoY3Vyc29yUG9zKTtcclxuICAgICAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgICAgICBpZiAoIWRlZiB8fCBkZWYudHlwZSAhPT0gUGF0dGVybk1hc2suREVGX1RZUEVTLkZJWEVEKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSBoZWFkIGZpeGVkIGFuZCBob2xsb3dzIGlmIHJlbW92ZWQgYXQgZW5kXHJcbiAgICAgIGlmIChjdXJzb3JQb3MgPT09IHJlcy5sZW5ndGgpIHtcclxuICAgICAgICB2YXIgZGkgPSB0aGlzLl9tYXBQb3NUb0RlZkluZGV4KGN1cnNvclBvcy0xKTtcclxuICAgICAgICB2YXIgaGFzSG9sbG93cyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAoOyBkaSA+IDA7IC0tZGkpIHtcclxuICAgICAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNIb2xsb3coZGkpKSBoYXNIb2xsb3dzID0gdHJ1ZTtcclxuICAgICAgICAgICAgZWxzZSBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhhc0hvbGxvd3MpIHJlcyA9IHJlcy5zbGljZSgwLCBkaSArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXBwZW5kIHBsYWNlaG9sZGVyXHJcbiAgICByZXMgPSB0aGlzLl9hcHBlbmRQbGFjZWhvbGRlckVuZChyZXMpO1xyXG4gICAgZGV0YWlscy5jdXJzb3JQb3MgPSBjdXJzb3JQb3M7XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIF9maXJlQ2hhbmdlRXZlbnRzICgpIHtcclxuICAgIC8vIGZpcmUgJ2NvbXBsZXRlJyBhZnRlciAnYWNjZXB0JyBldmVudFxyXG4gICAgc3VwZXIuX2ZpcmVDaGFuZ2VFdmVudHMoKTtcclxuICAgIGlmICh0aGlzLmlzQ29tcGxldGUpIHRoaXMuZmlyZUV2ZW50KFwiY29tcGxldGVcIik7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDb21wbGV0ZSAoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuX2NoYXJEZWZzLmZpbHRlcigoZGVmLCBkaSkgPT5cclxuICAgICAgZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiAhZGVmLm9wdGlvbmFsICYmXHJcbiAgICAgIHRoaXMuX2lzSG9sbG93KGRpKSkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgX2FwcGVuZEZpeGVkRW5kIChyZXMpIHtcclxuICAgIGZvciAodmFyIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgocmVzLmxlbmd0aCk7OyArK2RpKSB7XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgIGlmICghZGVmKSBicmVhaztcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pc0hpZGRlbkhvbGxvdyhkaSkpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCkgYnJlYWs7XHJcbiAgICAgIGlmIChkaSA+PSByZXMubGVuZ3RoKSByZXMgKz0gZGVmLmNoYXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgX2FwcGVuZFBsYWNlaG9sZGVyRW5kIChyZXMpIHtcclxuICAgIGZvciAodmFyIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgocmVzLmxlbmd0aCk7IGRpPHRoaXMuX2NoYXJEZWZzLmxlbmd0aDsgKytkaSkge1xyXG4gICAgICB2YXIgZGVmID0gdGhpcy5fY2hhckRlZnNbZGldO1xyXG4gICAgICBpZiAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiAhdGhpcy5faXNIb2xsb3coZGkpKSB7XHJcbiAgICAgICAgdGhpcy5faG9sbG93cy5wdXNoKGRpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fcGxhY2Vob2xkZXIuc2hvdyA9PT0gJ2Fsd2F5cycpIHtcclxuICAgICAgICByZXMgKz0gZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5GSVhFRCA/XHJcbiAgICAgICAgICBkZWYuY2hhciA6XHJcbiAgICAgICAgICAhZGVmLm9wdGlvbmFsID9cclxuICAgICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIuY2hhciA6XHJcbiAgICAgICAgICAgICcnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgX2NhbGNVbm1hc2tlZCAoc3RyKSB7XHJcbiAgICB2YXIgdW5tYXNrZWQgPSAnJztcclxuICAgIGZvciAodmFyIGNpPTAsIGRpPTA7IGNpPHN0ci5sZW5ndGggJiYgZGk8dGhpcy5fY2hhckRlZnMubGVuZ3RoOyArK2RpKSB7XHJcbiAgICAgIHZhciBjaCA9IHN0cltjaV07XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcblxyXG4gICAgICBpZiAodGhpcy5faXNIaWRkZW5Ib2xsb3coZGkpKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGlmIChkZWYudW5tYXNraW5nICYmICF0aGlzLl9pc0hvbGxvdyhkaSkgJiZcclxuICAgICAgICAoZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiB0aGlzLl9yZXNvbHZlcnNbZGVmLmNoYXJdLnJlc29sdmUoY2gsIGNpLCBzdHIpIHx8XHJcbiAgICAgICAgICBkZWYuY2hhciA9PT0gY2gpKSB7XHJcbiAgICAgICAgdW5tYXNrZWQgKz0gY2g7XHJcbiAgICAgIH1cclxuICAgICAgKytjaTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bm1hc2tlZDtcclxuICB9XHJcblxyXG4gIGdldCB1bm1hc2tlZFZhbHVlICgpIHtcclxuICAgIHJldHVybiB0aGlzLl91bm1hc2tlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHVubWFza2VkVmFsdWUgKHN0cikge1xyXG4gICAgdGhpcy5faG9sbG93cy5sZW5ndGggPSAwO1xyXG4gICAgdmFyIHJlcztcclxuICAgIFtyZXMsIHRoaXMuX2hvbGxvd3NdID0gdGhpcy5fYXBwZW5kVGFpbCgnJywgc3RyKTtcclxuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLl9hcHBlbmRQbGFjZWhvbGRlckVuZChyZXMpKTtcclxuICB9XHJcblxyXG4gIGdldCBwbGFjZWhvbGRlciAoKSB7IHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjsgfVxyXG5cclxuICBzZXQgcGxhY2Vob2xkZXIgKHBoKSB7XHJcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHtcclxuICAgICAgLi4uUGF0dGVybk1hc2suREVGQVVMVF9QTEFDRUhPTERFUixcclxuICAgICAgLi4ucGhcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHRoaXMudW5tYXNrZWRWYWx1ZSA9IHRoaXMudW5tYXNrZWRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBwbGFjZWhvbGRlckxhYmVsICgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFyRGVmcy5tYXAoZGVmID0+XHJcbiAgICAgIGRlZi50eXBlID09PSBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuRklYRUQgP1xyXG4gICAgICAgIGRlZi5jaGFyIDpcclxuICAgICAgICAhZGVmLm9wdGlvbmFsID9cclxuICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyLmNoYXIgOlxyXG4gICAgICAgICAgJycpLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRlZmluaXRpb25zICgpIHsgcmV0dXJuIHRoaXMuX2RlZmluaXRpb25zOyB9XHJcblxyXG4gIHNldCBkZWZpbml0aW9ucyAoZGVmcykge1xyXG4gICAgdGhpcy5faW5zdGFsbERlZmluaXRpb25zKGRlZnMpO1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB0aGlzLnVubWFza2VkVmFsdWUgPSB0aGlzLnVubWFza2VkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbWFzayAoKSB7IHJldHVybiB0aGlzLl9tYXNrOyB9XHJcblxyXG4gIHNldCBtYXNrIChtYXNrKSB7XHJcbiAgICB0aGlzLl9tYXNrID0gbWFzaztcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgdGhpcy5kZWZpbml0aW9ucyA9IHRoaXMuZGVmaW5pdGlvbnM7XHJcbiAgfVxyXG5cclxuICBfYWxpZ25DdXJzb3IgKCkge1xyXG4gICAgdmFyIGN1cnNvckRlZkluZGV4ID0gdGhpcy5fbWFwUG9zVG9EZWZJbmRleCh0aGlzLmN1cnNvclBvcyk7XHJcbiAgICBmb3IgKHZhciByUG9zID0gY3Vyc29yRGVmSW5kZXg7IHJQb3MgPj0gMDsgLS1yUG9zKSB7XHJcbiAgICAgIHZhciByRGVmID0gdGhpcy5fY2hhckRlZnNbclBvc107XHJcbiAgICAgIHZhciBsUG9zID0gclBvcy0xO1xyXG4gICAgICB2YXIgbERlZiA9IHRoaXMuX2NoYXJEZWZzW2xQb3NdO1xyXG4gICAgICBpZiAodGhpcy5faXNIaWRkZW5Ib2xsb3cobFBvcykpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCghckRlZiB8fCByRGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCAmJiB0aGlzLl9pc0hvbGxvdyhyUG9zKSAmJiAhdGhpcy5faXNIaWRkZW5Ib2xsb3coclBvcykpICYmXHJcbiAgICAgICAgIXRoaXMuX2lzSG9sbG93KGxQb3MpKSB7XHJcbiAgICAgICAgY3Vyc29yRGVmSW5kZXggPSByUG9zO1xyXG4gICAgICAgIGlmICghbERlZiB8fCBsRGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCkgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY3Vyc29yUG9zID0gdGhpcy5fbWFwRGVmSW5kZXhUb1BvcyhjdXJzb3JEZWZJbmRleCk7XHJcbiAgfVxyXG59XHJcblBhdHRlcm5NYXNrLkRFRklOSVRJT05TID0ge1xyXG4gICcwJzogL1xcZC8sXHJcbiAgJ2EnOiAvW1xcdTAwNDEtXFx1MDA1QVxcdTAwNjEtXFx1MDA3QVxcdTAwQUFcXHUwMEI1XFx1MDBCQVxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0OEEtXFx1MDUyN1xcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjIwLVxcdTA2NEFcXHUwNjZFXFx1MDY2RlxcdTA2NzEtXFx1MDZEM1xcdTA2RDVcXHUwNkU1XFx1MDZFNlxcdTA2RUVcXHUwNkVGXFx1MDZGQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTBcXHUwNzEyLVxcdTA3MkZcXHUwNzRELVxcdTA3QTVcXHUwN0IxXFx1MDdDQS1cXHUwN0VBXFx1MDdGNFxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODE1XFx1MDgxQVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhBMFxcdTA4QTItXFx1MDhBQ1xcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTc3XFx1MDk3OS1cXHUwOTdGXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzNcXHUwQzM1LVxcdTBDMzlcXHUwQzNEXFx1MEM1OFxcdTBDNTlcXHUwQzYwXFx1MEM2MVxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ2MFxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y0XFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFDXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlDMS1cXHUxOUM3XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE4M1xcdTIxODRcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRUVcXHUyQ0YyXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEODAtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJFMkZcXHUzMDA1XFx1MzAwNlxcdTMwMzEtXFx1MzAzNVxcdTMwM0JcXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkNDXFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OTdcXHVBNkEwLVxcdUE2RTVcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3OEVcXHVBNzkwLVxcdUE3OTNcXHVBN0EwLVxcdUE3QUFcXHVBN0Y4LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QTkwQS1cXHVBOTI1XFx1QTkzMC1cXHVBOTQ2XFx1QTk2MC1cXHVBOTdDXFx1QTk4NC1cXHVBOUIyXFx1QTlDRlxcdUFBMDAtXFx1QUEyOFxcdUFBNDAtXFx1QUE0MlxcdUFBNDQtXFx1QUE0QlxcdUFBNjAtXFx1QUE3NlxcdUFBN0FcXHVBQTgwLVxcdUFBQUZcXHVBQUIxXFx1QUFCNVxcdUFBQjZcXHVBQUI5LVxcdUFBQkRcXHVBQUMwXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFQVxcdUFBRjItXFx1QUFGNFxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCQzAtXFx1QUJFMlxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMURcXHVGQjFGLVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMjEtXFx1RkYzQVxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ10vLCAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjIwNzUwNzBcclxuICAnKic6IC8uL1xyXG59O1xyXG5QYXR0ZXJuTWFzay5ERUZfVFlQRVMgPSB7XHJcbiAgSU5QVVQ6ICdpbnB1dCcsXHJcbiAgRklYRUQ6ICdmaXhlZCdcclxufVxyXG5QYXR0ZXJuTWFzay5ERUZBVUxUX1BMQUNFSE9MREVSID0ge1xyXG4gIHNob3c6ICdsYXp5JyxcclxuICBjaGFyOiAnXydcclxufTtcclxuIiwiaW1wb3J0IHtpc1N0cmluZ30gZnJvbSAnLi91dGlscyc7XHJcblxyXG5pbXBvcnQgQmFzZU1hc2sgZnJvbSAnLi9tYXNrcy9iYXNlJztcclxuaW1wb3J0IFJlZ0V4cE1hc2sgZnJvbSAnLi9tYXNrcy9yZWdleHAnO1xyXG5pbXBvcnQgRnVuY01hc2sgZnJvbSAnLi9tYXNrcy9mdW5jJztcclxuaW1wb3J0IFBhdHRlcm5NYXNrIGZyb20gJy4vbWFza3MvcGF0dGVybic7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuZnVuY3Rpb24gSU1hc2sgKGVsLCBvcHRzPXt9KSB7XHJcbiAgdmFyIG1hc2sgPSBJTWFzay5NYXNrRmFjdG9yeShlbCwgb3B0cyk7XHJcbiAgbWFzay5iaW5kRXZlbnRzKCk7XHJcbiAgLy8gcmVmcmVzaFxyXG4gIG1hc2sucmF3VmFsdWUgPSBlbC52YWx1ZTtcclxuICByZXR1cm4gbWFzaztcclxufVxyXG5cclxuSU1hc2suTWFza0ZhY3RvcnkgPSBmdW5jdGlvbiAoZWwsIG9wdHMpIHtcclxuICB2YXIgbWFzayA9IG9wdHMubWFzaztcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEJhc2VNYXNrKSByZXR1cm4gbWFzaztcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIG5ldyBSZWdFeHBNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gbmV3IEZ1bmNNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAoaXNTdHJpbmcobWFzaykpIHJldHVybiBuZXcgUGF0dGVybk1hc2soZWwsIG9wdHMpO1xyXG4gIHJldHVybiBuZXcgQmFzZU1hc2soZWwsIG9wdHMpO1xyXG59XHJcbklNYXNrLkJhc2VNYXNrID0gQmFzZU1hc2s7XHJcbklNYXNrLkZ1bmNNYXNrID0gRnVuY01hc2s7XHJcbklNYXNrLlJlZ0V4cE1hc2sgPSBSZWdFeHBNYXNrO1xyXG5JTWFzay5QYXR0ZXJuTWFzayA9IFBhdHRlcm5NYXNrO1xyXG53aW5kb3cuSU1hc2sgPSBJTWFzaztcclxuIl0sIm5hbWVzIjpbImlzU3RyaW5nIiwic3RyIiwiU3RyaW5nIiwiY29uZm9ybSIsInJlcyIsImZhbGxiYWNrIiwiZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzIiwiZGV0YWlscyIsImN1cnNvclBvcyIsIm9sZFNlbGVjdGlvbiIsIm9sZFZhbHVlIiwic3RhcnRDaGFuZ2VQb3MiLCJNYXRoIiwibWluIiwic3RhcnQiLCJpbnNlcnRlZENvdW50IiwicmVtb3ZlZENvdW50IiwibWF4IiwiZW5kIiwibGVuZ3RoIiwiaGVhZCIsInN1YnN0cmluZyIsInRhaWwiLCJpbnNlcnRlZCIsInN1YnN0ciIsInJlbW92ZWQiLCJCYXNlTWFzayIsImVsIiwib3B0cyIsIm1hc2siLCJfbGlzdGVuZXJzIiwiX3JlZnJlc2hpbmdDb3VudCIsIl9yYXdWYWx1ZSIsIl91bm1hc2tlZFZhbHVlIiwic2F2ZVNlbGVjdGlvbiIsImJpbmQiLCJfb25JbnB1dCIsIl9vbkRyb3AiLCJldiIsImhhbmRsZXIiLCJwdXNoIiwiaEluZGV4IiwiaW5kZXhPZiIsInNwbGljZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibGlzdGVuZXJzIiwiZm9yRWFjaCIsImwiLCJpbnB1dFZhbHVlIiwiX3NlbGVjdGlvbiIsInJhd1ZhbHVlIiwidW5tYXNrZWRWYWx1ZSIsInJlc29sdmUiLCJ1cGRhdGVFbGVtZW50IiwidmFsdWUiLCJ3YXJuIiwic2VsZWN0aW9uU3RhcnQiLCJ1bmJpbmRFdmVudHMiLCJfY2FsY1VubWFza2VkIiwiaXNDaGFuZ2VkIiwiX2N1cnNvckNoYW5naW5nIiwiY2xlYXJUaW1lb3V0IiwiX2NoYW5naW5nQ3Vyc29yUG9zIiwic2V0VGltZW91dCIsIl9maXJlQ2hhbmdlRXZlbnRzIiwiZmlyZUV2ZW50IiwicHJldmVudERlZmF1bHQiLCJwcm9jZXNzSW5wdXQiLCJzdG9wUHJvcGFnYXRpb24iLCJzZWxlY3Rpb25FbmQiLCJwb3MiLCJzZXRTZWxlY3Rpb25SYW5nZSIsIlJlZ0V4cE1hc2siLCJ0ZXN0IiwiRnVuY01hc2siLCJQYXR0ZXJuTWFzayIsIl9ob2xsb3dzIiwicGxhY2Vob2xkZXIiLCJkZWZpbml0aW9ucyIsIkRFRklOSVRJT05TIiwiX2FsaWduQ3Vyc29yIiwiX2FsaWduQ3Vyc29yRnJpZW5kbHkiLCJfaW5pdGlhbGl6ZWQiLCJfZGVmaW5pdGlvbnMiLCJfY2hhckRlZnMiLCJwYXR0ZXJuIiwidW5tYXNraW5nQmxvY2siLCJvcHRpb25hbEJsb2NrIiwiaSIsImNoIiwidHlwZSIsIkRFRl9UWVBFUyIsIklOUFVUIiwiRklYRUQiLCJ1bm1hc2tpbmciLCJvcHRpb25hbCIsIl9idWlsZFJlc29sdmVycyIsIl9yZXNvbHZlcnMiLCJkZWZLZXkiLCJJTWFzayIsIk1hc2tGYWN0b3J5IiwicGxhY2Vob2xkZXJCdWZmZXIiLCJob2xsb3dzIiwic2xpY2UiLCJvdmVyZmxvdyIsImNpIiwiZGkiLCJfbWFwUG9zVG9EZWZJbmRleCIsImRlZiIsInJlc29sdmVyIiwiY2hhciIsImNocmVzIiwiX3BsYWNlaG9sZGVyIiwiZnJvbVBvcyIsImlucHV0IiwiX2lzSGlkZGVuSG9sbG93IiwiX2lzSG9sbG93IiwiZGVmSW5kZXgiLCJmaWx0ZXIiLCJoIiwiX2hvbGxvd3NCZWZvcmUiLCJsYXN0SG9sbG93SW5kZXgiLCJpbnNlcnRTdGVwcyIsInRhaWxJbnB1dCIsIl9leHRyYWN0SW5wdXQiLCJfZ2VuZXJhdGVJbnNlcnRTdGVwcyIsImlzdGVwIiwic3RlcCIsIl9hcHBlbmRUYWlsIiwidHJlcyIsInRob2xsb3dzIiwiYXBwZW5kZWQiLCJfYXBwZW5kRml4ZWRFbmQiLCJoYXNIb2xsb3dzIiwiX2FwcGVuZFBsYWNlaG9sZGVyRW5kIiwiaXNDb21wbGV0ZSIsInNob3ciLCJ1bm1hc2tlZCIsImN1cnNvckRlZkluZGV4IiwiclBvcyIsInJEZWYiLCJsUG9zIiwibERlZiIsIl9tYXBEZWZJbmRleFRvUG9zIiwicGgiLCJERUZBVUxUX1BMQUNFSE9MREVSIiwibWFwIiwiam9pbiIsImRlZnMiLCJfaW5zdGFsbERlZmluaXRpb25zIiwiX21hc2siLCJiaW5kRXZlbnRzIiwiUmVnRXhwIiwiRnVuY3Rpb24iLCJ3aW5kb3ciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLFNBQVNBLFFBQVQsQ0FBbUJDLEdBQW5CLEVBQXdCO1NBQ2YsT0FBT0EsR0FBUCxLQUFlLFFBQWYsSUFBMkJB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"} \ No newline at end of file +{"version":3,"file":"imask.js","sources":["utils.js","masks/base.js","masks/regexp.js","masks/func.js","masks/pattern.js","masks/pipe.js","imask.js"],"sourcesContent":["export\r\nfunction isString (str) {\r\n return typeof str === 'string' || str instanceof String;\r\n}\r\n\r\nexport\r\nfunction conform (res, str, fallback='') {\r\n return isString(res) ?\r\n res :\r\n res ?\r\n str :\r\n fallback;\r\n}\r\n\r\nexport\r\nfunction extendDetailsAdjustments(str, details) {\r\n var cursorPos = details.cursorPos;\r\n var oldSelection = details.oldSelection;\r\n var oldValue = details.oldValue;\r\n\r\n var startChangePos = Math.min(cursorPos, oldSelection.start);\r\n var insertedCount = cursorPos - startChangePos;\r\n // Math.max for opposite operation\r\n var removedCount = Math.max((oldSelection.end - startChangePos) ||\r\n // for Delete\r\n oldValue.length - str.length, 0);\r\n var head = str.substring(0, startChangePos);\r\n var tail = str.substring(startChangePos + insertedCount);\r\n var inserted = str.substr(startChangePos, insertedCount);\r\n var removed = str.substr(startChangePos, removedCount);\r\n\r\n return {\r\n startChangePos,\r\n head,\r\n tail,\r\n inserted,\r\n removed,\r\n ...details\r\n };\r\n}\r\n","import {conform, extendDetailsAdjustments} from '../utils';\r\n\r\n\r\nexport default\r\nclass BaseMask {\r\n constructor (el, opts) {\r\n this.el = el;\r\n this.mask = opts.mask;\r\n\r\n this._listeners = {};\r\n this._refreshingCount = 0;\r\n this._rawValue = \"\";\r\n this._unmaskedValue = \"\";\r\n\r\n this.saveSelection = this.saveSelection.bind(this);\r\n this._onInput = this._onInput.bind(this);\r\n this._onDrop = this._onDrop.bind(this);\r\n }\r\n\r\n on (ev, handler) {\r\n if (!this._listeners[ev]) this._listeners[ev] = [];\r\n this._listeners[ev].push(handler);\r\n return this;\r\n }\r\n\r\n off (ev, handler) {\r\n if (!this._listeners[ev]) return;\r\n if (!handler) {\r\n delete this._listeners[ev];\r\n return;\r\n }\r\n var hIndex = this._listeners[ev].indexOf(handler);\r\n if (hIndex >= 0) this._listeners.splice(hIndex, 1);\r\n return this;\r\n }\r\n\r\n get rawValue () {\r\n return this._rawValue;\r\n }\r\n\r\n set rawValue (str) {\r\n this.processInput(str, {\r\n cursorPos: str.length,\r\n oldValue: this.rawValue,\r\n oldSelection: {\r\n start: 0,\r\n end: this.rawValue.length\r\n }\r\n });\r\n }\r\n\r\n get unmaskedValue () {\r\n return this._unmaskedValue;\r\n }\r\n\r\n set unmaskedValue (value) {\r\n this.rawValue = value;\r\n }\r\n\r\n\r\n bindEvents () {\r\n this.el.addEventListener('keydown', this.saveSelection);\r\n this.el.addEventListener('input', this._onInput);\r\n this.el.addEventListener('drop', this._onDrop);\r\n }\r\n\r\n unbindEvents () {\r\n this.el.removeEventListener('keydown', this.saveSelection);\r\n this.el.removeEventListener('input', this._onInput);\r\n this.el.removeEventListener('drop', this._onDrop);\r\n }\r\n\r\n fireEvent (ev) {\r\n var listeners = this._listeners[ev] || [];\r\n listeners.forEach(l => l());\r\n }\r\n\r\n processInput (inputValue, details) {\r\n details = {\r\n cursorPos: this.cursorPos,\r\n oldSelection: this._selection,\r\n oldValue: this.rawValue,\r\n oldUnmaskedValue: this.unmaskedValue,\r\n ...details\r\n };\r\n\r\n details = extendDetailsAdjustments(inputValue, details);\r\n\r\n var res = conform(this.resolve(inputValue, details),\r\n inputValue,\r\n this.rawValue);\r\n\r\n this.updateElement(res, details.cursorPos);\r\n return res;\r\n }\r\n\r\n\r\n get selectionStart () {\r\n return this._cursorChanging ?\r\n this._changingCursorPos :\r\n\r\n this.el.selectionStart;\r\n }\r\n\r\n get cursorPos () {\r\n return this._cursorChanging ?\r\n this._changingCursorPos :\r\n\r\n this.el.selectionEnd;\r\n }\r\n\r\n set cursorPos (pos) {\r\n this.el.setSelectionRange(pos, pos);\r\n }\r\n\r\n saveSelection (ev) {\r\n if (this.rawValue !== this.el.value) {\r\n console.warn(\"Uncontrolled input change, refresh mask manually!\");\r\n }\r\n this._selection = {\r\n start: this.selectionStart,\r\n end: this.cursorPos\r\n };\r\n }\r\n\r\n destroy () {\r\n this.unbindEvents();\r\n this._listeners.length = 0;\r\n }\r\n\r\n updateElement (value, cursorPos) {\r\n var unmaskedValue = this._calcUnmasked(value);\r\n var isChanged = (this.unmaskedValue !== unmaskedValue ||\r\n this.rawValue !== value);\r\n\r\n this._unmaskedValue = unmaskedValue;\r\n this._rawValue = value;\r\n\r\n if (this.el.value !== value) this.el.value = value;\r\n if (this.cursorPos != cursorPos && cursorPos != null) {\r\n this.cursorPos = cursorPos;\r\n\r\n // also queue change cursor for mobile browsers\r\n if (this._cursorChanging) clearTimeout(this._cursorChanging);\r\n if (this.cursorPos != cursorPos) {\r\n this._changingCursorPos = cursorPos;\r\n this._cursorChanging = setTimeout(() => {\r\n this.cursorPos = this._changingCursorPos;\r\n delete this._cursorChanging;\r\n }, 10);\r\n }\r\n }\r\n this.saveSelection();\r\n\r\n if (isChanged) this._fireChangeEvents();\r\n }\r\n\r\n _fireChangeEvents () {\r\n this.fireEvent(\"accept\");\r\n }\r\n\r\n _onInput (ev) {\r\n this.processInput(this.el.value);\r\n }\r\n\r\n _onDrop (ev) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n\r\n // override\r\n resolve (str, details) { return str; }\r\n\r\n _calcUnmasked (value) { return value; }\r\n}\r\n","import BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass RegExpMask extends BaseMask {\r\n resolve (str) {\r\n return this.mask.test(str);\r\n }\r\n}\r\n","import BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass FuncMask extends BaseMask {\r\n resolve (...args) {\r\n return this.mask(...args);\r\n }\r\n}\r\n","import {conform} from '../utils';\r\nimport BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass PatternMask extends BaseMask {\r\n constructor (el, opts) {\r\n super(el, opts);\r\n\r\n this._hollows = [];\r\n this.placeholder = opts.placeholder;\r\n this.definitions = {\r\n ...PatternMask.DEFINITIONS,\r\n ...opts.definitions\r\n };\r\n\r\n this._alignCursor = this._alignCursor.bind(this);\r\n this._alignCursorFriendly = this._alignCursorFriendly.bind(this);\r\n\r\n this._initialized = true;\r\n }\r\n\r\n _alignCursorFriendly () {\r\n if (this.selectionStart !== this.cursorPos) return;\r\n this._alignCursor();\r\n }\r\n\r\n bindEvents () {\r\n super.bindEvents();\r\n this.el.addEventListener('click', this._alignCursorFriendly);\r\n }\r\n\r\n unbindEvents () {\r\n super.unbindEvents();\r\n this.el.removeEventListener('click', this._alignCursorFriendly);\r\n }\r\n\r\n _installDefinitions (definitions) {\r\n this._definitions = definitions;\r\n this._charDefs = [];\r\n var pattern = this.mask;\r\n\r\n if (!pattern || !definitions) return;\r\n\r\n var unmaskingBlock = false;\r\n var optionalBlock = false;\r\n for (var i=0; i= 0;\r\n }\r\n\r\n _isHiddenHollow (defIndex) {\r\n return this._isHollow(defIndex) &&\r\n this._charDefs[defIndex] && this._charDefs[defIndex].optional;\r\n }\r\n\r\n _hollowsBefore (defIndex) {\r\n return this._hollows.filter(h => h < defIndex && this._isHiddenHollow(h));\r\n }\r\n\r\n _mapDefIndexToPos (defIndex) {\r\n return defIndex - this._hollowsBefore(defIndex).length;\r\n }\r\n\r\n _mapPosToDefIndex (pos) {\r\n var lastHollowIndex = pos;\r\n // extend contiguous\r\n while (this._isHiddenHollow(lastHollowIndex-1)) ++lastHollowIndex;\r\n\r\n return pos + this._hollowsBefore(lastHollowIndex).length;\r\n }\r\n\r\n _generateInsertSteps (head, inserted) {\r\n var res = head;\r\n var hollows = this._hollows.slice();\r\n var placeholderBuffer = '';\r\n var insertSteps = [[res, hollows.slice()]];\r\n\r\n for (var ci=0, di=this._mapPosToDefIndex(head.length); ci h < lastHollowIndex);\r\n\r\n var res = details.head;\r\n\r\n // insert available\r\n var insertSteps = this._generateInsertSteps(res, inserted);\r\n for (var istep=insertSteps.length-1; istep >= 0; --istep) {\r\n var step;\r\n [step, this._hollows] = insertSteps[istep];\r\n var [tres, thollows, overflow] = this._appendTail(step, tailInput);\r\n if (!overflow) {\r\n [res, this._hollows] = [tres, thollows];\r\n cursorPos = step.length;\r\n break;\r\n }\r\n }\r\n\r\n // if input at the end - append fixed\r\n if (inserted && cursorPos === res.length) {\r\n // append fixed at end\r\n var appended = this._appendFixedEnd(res);\r\n cursorPos += appended.length - res.length;\r\n res = appended;\r\n }\r\n\r\n if (!inserted && removedCount) {\r\n // if delete at right\r\n if (details.oldSelection.end === cursorPos) {\r\n for (;;++cursorPos) {\r\n var di=this._mapPosToDefIndex(cursorPos);\r\n var def = this._charDefs[di];\r\n if (!def || def.type !== PatternMask.DEF_TYPES.FIXED) break;\r\n }\r\n }\r\n\r\n // remove head fixed and hollows if removed at end\r\n if (cursorPos === res.length) {\r\n var di = this._mapPosToDefIndex(cursorPos-1);\r\n var hasHollows = false;\r\n for (; di > 0; --di) {\r\n var def = this._charDefs[di];\r\n if (def.type === PatternMask.DEF_TYPES.INPUT) {\r\n if (this._isHollow(di)) hasHollows = true;\r\n else break;\r\n }\r\n }\r\n if (hasHollows) res = res.slice(0, di + 1);\r\n }\r\n }\r\n\r\n // append placeholder\r\n res = this._appendPlaceholderEnd(res);\r\n details.cursorPos = cursorPos;\r\n\r\n return res;\r\n }\r\n\r\n _fireChangeEvents () {\r\n // fire 'complete' after 'accept' event\r\n super._fireChangeEvents();\r\n if (this.isComplete) this.fireEvent(\"complete\");\r\n }\r\n\r\n get isComplete () {\r\n return !this._charDefs.filter((def, di) =>\r\n def.type === PatternMask.DEF_TYPES.INPUT && !def.optional &&\r\n this._isHollow(di)).length;\r\n }\r\n\r\n _appendFixedEnd (res) {\r\n for (var di=this._mapPosToDefIndex(res.length);; ++di) {\r\n var def = this._charDefs[di];\r\n if (!def) break;\r\n\r\n if (this._isHiddenHollow(di)) continue;\r\n if (def.type === PatternMask.DEF_TYPES.INPUT) break;\r\n if (di >= res.length) res += def.char;\r\n }\r\n return res;\r\n }\r\n\r\n _appendPlaceholderEnd (res) {\r\n for (var di=this._mapPosToDefIndex(res.length); di\r\n def.type === PatternMask.DEF_TYPES.FIXED ?\r\n def.char :\r\n !def.optional ?\r\n this._placeholder.char :\r\n '').join('');\r\n }\r\n\r\n get definitions () { return this._definitions; }\r\n\r\n set definitions (defs) {\r\n this._installDefinitions(defs);\r\n if (this._initialized) this.unmaskedValue = this.unmaskedValue;\r\n }\r\n\r\n get mask () { return this._mask; }\r\n\r\n set mask (mask) {\r\n this._mask = mask;\r\n if (this._initialized) this.definitions = this.definitions;\r\n }\r\n\r\n _alignCursor () {\r\n var cursorDefIndex = this._mapPosToDefIndex(this.cursorPos);\r\n for (var rPos = cursorDefIndex; rPos >= 0; --rPos) {\r\n var rDef = this._charDefs[rPos];\r\n var lPos = rPos-1;\r\n var lDef = this._charDefs[lPos];\r\n if (this._isHiddenHollow(lPos)) continue;\r\n\r\n if ((!rDef || rDef.type === PatternMask.DEF_TYPES.INPUT && this._isHollow(rPos) && !this._isHiddenHollow(rPos)) &&\r\n !this._isHollow(lPos)) {\r\n cursorDefIndex = rPos;\r\n if (!lDef || lDef.type === PatternMask.DEF_TYPES.INPUT) break;\r\n }\r\n }\r\n this.cursorPos = this._mapDefIndexToPos(cursorDefIndex);\r\n }\r\n}\r\nPatternMask.DEFINITIONS = {\r\n '0': /\\d/,\r\n 'a': /[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/, // http://stackoverflow.com/a/22075070\r\n '*': /./\r\n};\r\nPatternMask.DEF_TYPES = {\r\n INPUT: 'input',\r\n FIXED: 'fixed'\r\n}\r\nPatternMask.DEFAULT_PLACEHOLDER = {\r\n show: 'lazy',\r\n char: '_'\r\n};\r\n","import BaseMask from './base';\r\nimport {extendDetailsAdjustments} from '../utils';\r\n\r\n\r\nexport default\r\nclass PipeMask extends BaseMask {\r\n constructor (el, opts) {\r\n super(el, opts);\r\n\r\n this.multipass = opts.multipass;\r\n\r\n this._compiledMasks = this.mask.map(m => IMask.MaskFactory(el, m));\r\n }\r\n\r\n resolve (str, details) {\r\n var res = this._pipe(str, details);\r\n if (!this.multipass) return res;\r\n\r\n var cursorPos = details.cursorPos;\r\n\r\n var stepRes;\r\n var tempRes = res;\r\n\r\n while (stepRes !== tempRes) {\r\n stepRes = tempRes;\r\n tempRes = this._pipe(stepRes, {\r\n cursorPos: stepRes.length,\r\n oldValue: stepRes,\r\n oldSelection: {\r\n start: 0,\r\n end: stepRes.length\r\n }\r\n });\r\n }\r\n\r\n details.cursorPos = cursorPos - (res.length - stepRes.length);\r\n\r\n return stepRes;\r\n }\r\n\r\n _pipe (str, details) {\r\n return this._compiledMasks.reduce((s, m) => {\r\n var d = extendDetailsAdjustments(s, details);\r\n var res = m.resolve(s, d);\r\n details.cursorPos = d.cursorPos;\r\n return res;\r\n }, str);\r\n }\r\n\r\n bindEvents () {\r\n super.bindEvents();\r\n this._compiledMasks.forEach(m => {\r\n m.bindEvents();\r\n // disable basemask events for child masks\r\n BaseMask.prototype.unbindEvents.apply(m);\r\n });\r\n }\r\n\r\n unbindEvents () {\r\n super.unbindEvents();\r\n this._compiledMasks.forEach(m => m.unbindEvents());\r\n }\r\n}\r\n","import {isString} from './utils';\r\n\r\nimport BaseMask from './masks/base';\r\nimport RegExpMask from './masks/regexp';\r\nimport FuncMask from './masks/func';\r\nimport PatternMask from './masks/pattern';\r\nimport PipeMask from './masks/pipe';\r\n\r\n\r\nexport default\r\nfunction IMask (el, opts={}) {\r\n var mask = IMask.MaskFactory(el, opts);\r\n mask.bindEvents();\r\n // refresh\r\n mask.rawValue = el.value;\r\n return mask;\r\n}\r\n\r\nIMask.MaskFactory = function (el, opts) {\r\n var mask = opts.mask;\r\n if (mask instanceof BaseMask) return mask;\r\n if (mask instanceof RegExp) return new RegExpMask(el, opts);\r\n if (mask instanceof Function) return new FuncMask(el, opts);\r\n if (mask instanceof Array) return new PipeMask(el, opts);\r\n if (isString(mask)) return new PatternMask(el, opts);\r\n return new BaseMask(el, opts);\r\n}\r\nIMask.BaseMask = BaseMask;\r\nIMask.FuncMask = FuncMask;\r\nIMask.RegExpMask = RegExpMask;\r\nIMask.PatternMask = PatternMask;\r\nwindow.IMask = IMask;\r\n"],"names":["isString","str","String","conform","res","fallback","extendDetailsAdjustments","details","cursorPos","oldSelection","oldValue","startChangePos","Math","min","start","insertedCount","removedCount","max","end","length","head","substring","tail","inserted","substr","removed","BaseMask","el","opts","mask","_listeners","_refreshingCount","_rawValue","_unmaskedValue","saveSelection","bind","_onInput","_onDrop","ev","handler","push","hIndex","indexOf","splice","addEventListener","removeEventListener","listeners","forEach","l","inputValue","_selection","rawValue","unmaskedValue","resolve","updateElement","value","warn","selectionStart","unbindEvents","_calcUnmasked","isChanged","_cursorChanging","clearTimeout","_changingCursorPos","setTimeout","_fireChangeEvents","fireEvent","processInput","preventDefault","stopPropagation","selectionEnd","pos","setSelectionRange","RegExpMask","test","FuncMask","PatternMask","_hollows","placeholder","definitions","DEFINITIONS","_alignCursor","_alignCursorFriendly","_initialized","_definitions","_charDefs","pattern","unmaskingBlock","optionalBlock","i","ch","type","DEF_TYPES","INPUT","FIXED","unmasking","optional","_buildResolvers","_resolvers","defKey","IMask","MaskFactory","placeholderBuffer","hollows","slice","overflow","ci","di","_mapPosToDefIndex","def","resolver","char","chres","_placeholder","fromPos","input","_isHiddenHollow","_isHollow","defIndex","filter","h","_hollowsBefore","lastHollowIndex","insertSteps","tailInput","_extractInput","_generateInsertSteps","istep","step","_appendTail","tres","thollows","appended","_appendFixedEnd","hasHollows","_appendPlaceholderEnd","isComplete","show","unmasked","cursorDefIndex","rPos","rDef","lPos","lDef","_mapDefIndexToPos","ph","DEFAULT_PLACEHOLDER","map","join","defs","_installDefinitions","_mask","PipeMask","multipass","_compiledMasks","m","_pipe","stepRes","tempRes","reduce","s","d","bindEvents","prototype","apply","RegExp","Function","Array","window"],"mappings":"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","preExisting":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL3V0aWxzLmpzIiwiQzovUHJvamVjdHMvaW1hc2tqcy9zcmMvbWFza3MvYmFzZS5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL21hc2tzL3JlZ2V4cC5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL21hc2tzL2Z1bmMuanMiLCJDOi9Qcm9qZWN0cy9pbWFza2pzL3NyYy9tYXNrcy9wYXR0ZXJuLmpzIiwiQzovUHJvamVjdHMvaW1hc2tqcy9zcmMvbWFza3MvcGlwZS5qcyIsIkM6L1Byb2plY3RzL2ltYXNranMvc3JjL2ltYXNrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydFxyXG5mdW5jdGlvbiBpc1N0cmluZyAoc3RyKSB7XHJcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnIHx8IHN0ciBpbnN0YW5jZW9mIFN0cmluZztcclxufVxyXG5cclxuZXhwb3J0XHJcbmZ1bmN0aW9uIGNvbmZvcm0gKHJlcywgc3RyLCBmYWxsYmFjaz0nJykge1xyXG4gIHJldHVybiBpc1N0cmluZyhyZXMpID9cclxuICAgIHJlcyA6XHJcbiAgICByZXMgP1xyXG4gICAgICBzdHIgOlxyXG4gICAgICBmYWxsYmFjaztcclxufVxyXG5cclxuZXhwb3J0XHJcbmZ1bmN0aW9uIGV4dGVuZERldGFpbHNBZGp1c3RtZW50cyhzdHIsIGRldGFpbHMpIHtcclxuICB2YXIgY3Vyc29yUG9zID0gZGV0YWlscy5jdXJzb3JQb3M7XHJcbiAgdmFyIG9sZFNlbGVjdGlvbiA9IGRldGFpbHMub2xkU2VsZWN0aW9uO1xyXG4gIHZhciBvbGRWYWx1ZSA9IGRldGFpbHMub2xkVmFsdWU7XHJcblxyXG4gIHZhciBzdGFydENoYW5nZVBvcyA9IE1hdGgubWluKGN1cnNvclBvcywgb2xkU2VsZWN0aW9uLnN0YXJ0KTtcclxuICB2YXIgaW5zZXJ0ZWRDb3VudCA9IGN1cnNvclBvcyAtIHN0YXJ0Q2hhbmdlUG9zO1xyXG4gIC8vIE1hdGgubWF4IGZvciBvcHBvc2l0ZSBvcGVyYXRpb25cclxuICB2YXIgcmVtb3ZlZENvdW50ID0gTWF0aC5tYXgoKG9sZFNlbGVjdGlvbi5lbmQgLSBzdGFydENoYW5nZVBvcykgfHxcclxuICAgIC8vIGZvciBEZWxldGVcclxuICAgIG9sZFZhbHVlLmxlbmd0aCAtIHN0ci5sZW5ndGgsIDApO1xyXG4gIHZhciBoZWFkID0gc3RyLnN1YnN0cmluZygwLCBzdGFydENoYW5nZVBvcyk7XHJcbiAgdmFyIHRhaWwgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0Q2hhbmdlUG9zICsgaW5zZXJ0ZWRDb3VudCk7XHJcbiAgdmFyIGluc2VydGVkID0gc3RyLnN1YnN0cihzdGFydENoYW5nZVBvcywgaW5zZXJ0ZWRDb3VudCk7XHJcbiAgdmFyIHJlbW92ZWQgPSBzdHIuc3Vic3RyKHN0YXJ0Q2hhbmdlUG9zLCByZW1vdmVkQ291bnQpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc3RhcnRDaGFuZ2VQb3MsXHJcbiAgICBoZWFkLFxyXG4gICAgdGFpbCxcclxuICAgIGluc2VydGVkLFxyXG4gICAgcmVtb3ZlZCxcclxuICAgIC4uLmRldGFpbHNcclxuICB9O1xyXG59XHJcbiIsImltcG9ydCB7Y29uZm9ybSwgZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzfSBmcm9tICcuLi91dGlscyc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuY2xhc3MgQmFzZU1hc2sge1xyXG4gIGNvbnN0cnVjdG9yIChlbCwgb3B0cykge1xyXG4gICAgdGhpcy5lbCA9IGVsO1xyXG4gICAgdGhpcy5tYXNrID0gb3B0cy5tYXNrO1xyXG5cclxuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xyXG4gICAgdGhpcy5fcmVmcmVzaGluZ0NvdW50ID0gMDtcclxuICAgIHRoaXMuX3Jhd1ZhbHVlID0gXCJcIjtcclxuICAgIHRoaXMuX3VubWFza2VkVmFsdWUgPSBcIlwiO1xyXG5cclxuICAgIHRoaXMuc2F2ZVNlbGVjdGlvbiA9IHRoaXMuc2F2ZVNlbGVjdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5fb25JbnB1dCA9IHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKTtcclxuICAgIHRoaXMuX29uRHJvcCA9IHRoaXMuX29uRHJvcC5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgb24gKGV2LCBoYW5kbGVyKSB7XHJcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1tldl0pIHRoaXMuX2xpc3RlbmVyc1tldl0gPSBbXTtcclxuICAgIHRoaXMuX2xpc3RlbmVyc1tldl0ucHVzaChoYW5kbGVyKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgb2ZmIChldiwgaGFuZGxlcikge1xyXG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbZXZdKSByZXR1cm47XHJcbiAgICBpZiAoIWhhbmRsZXIpIHtcclxuICAgICAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tldl07XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHZhciBoSW5kZXggPSB0aGlzLl9saXN0ZW5lcnNbZXZdLmluZGV4T2YoaGFuZGxlcik7XHJcbiAgICBpZiAoaEluZGV4ID49IDApIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaEluZGV4LCAxKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJhd1ZhbHVlICgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yYXdWYWx1ZTtcclxuICB9XHJcblxyXG4gIHNldCByYXdWYWx1ZSAoc3RyKSB7XHJcbiAgICB0aGlzLnByb2Nlc3NJbnB1dChzdHIsIHtcclxuICAgICAgY3Vyc29yUG9zOiBzdHIubGVuZ3RoLFxyXG4gICAgICBvbGRWYWx1ZTogdGhpcy5yYXdWYWx1ZSxcclxuICAgICAgb2xkU2VsZWN0aW9uOiB7XHJcbiAgICAgICAgc3RhcnQ6IDAsXHJcbiAgICAgICAgZW5kOiB0aGlzLnJhd1ZhbHVlLmxlbmd0aFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCB1bm1hc2tlZFZhbHVlICgpIHtcclxuICAgIHJldHVybiB0aGlzLl91bm1hc2tlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHVubWFza2VkVmFsdWUgKHZhbHVlKSB7XHJcbiAgICB0aGlzLnJhd1ZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgYmluZEV2ZW50cyAoKSB7XHJcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnNhdmVTZWxlY3Rpb24pO1xyXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX29uSW5wdXQpO1xyXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5fb25Ecm9wKTtcclxuICB9XHJcblxyXG4gIHVuYmluZEV2ZW50cyAoKSB7XHJcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnNhdmVTZWxlY3Rpb24pO1xyXG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX29uSW5wdXQpO1xyXG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5fb25Ecm9wKTtcclxuICB9XHJcblxyXG4gIGZpcmVFdmVudCAoZXYpIHtcclxuICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZdIHx8IFtdO1xyXG4gICAgbGlzdGVuZXJzLmZvckVhY2gobCA9PiBsKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc0lucHV0IChpbnB1dFZhbHVlLCBkZXRhaWxzKSB7XHJcbiAgICBkZXRhaWxzID0ge1xyXG4gICAgICBjdXJzb3JQb3M6IHRoaXMuY3Vyc29yUG9zLFxyXG4gICAgICBvbGRTZWxlY3Rpb246IHRoaXMuX3NlbGVjdGlvbixcclxuICAgICAgb2xkVmFsdWU6IHRoaXMucmF3VmFsdWUsXHJcbiAgICAgIG9sZFVubWFza2VkVmFsdWU6IHRoaXMudW5tYXNrZWRWYWx1ZSxcclxuICAgICAgLi4uZGV0YWlsc1xyXG4gICAgfTtcclxuXHJcbiAgICBkZXRhaWxzID0gZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzKGlucHV0VmFsdWUsIGRldGFpbHMpO1xyXG5cclxuICAgIHZhciByZXMgPSBjb25mb3JtKHRoaXMucmVzb2x2ZShpbnB1dFZhbHVlLCBkZXRhaWxzKSxcclxuICAgICAgaW5wdXRWYWx1ZSxcclxuICAgICAgdGhpcy5yYXdWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVFbGVtZW50KHJlcywgZGV0YWlscy5jdXJzb3JQb3MpO1xyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG5cclxuICBnZXQgc2VsZWN0aW9uU3RhcnQgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvckNoYW5naW5nID9cclxuICAgICAgdGhpcy5fY2hhbmdpbmdDdXJzb3JQb3MgOlxyXG5cclxuICAgICAgdGhpcy5lbC5zZWxlY3Rpb25TdGFydDtcclxuICB9XHJcblxyXG4gIGdldCBjdXJzb3JQb3MgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvckNoYW5naW5nID9cclxuICAgICAgdGhpcy5fY2hhbmdpbmdDdXJzb3JQb3MgOlxyXG5cclxuICAgICAgdGhpcy5lbC5zZWxlY3Rpb25FbmQ7XHJcbiAgfVxyXG5cclxuICBzZXQgY3Vyc29yUG9zIChwb3MpIHtcclxuICAgIHRoaXMuZWwuc2V0U2VsZWN0aW9uUmFuZ2UocG9zLCBwb3MpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlbGVjdGlvbiAoZXYpIHtcclxuICAgIGlmICh0aGlzLnJhd1ZhbHVlICE9PSB0aGlzLmVsLnZhbHVlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIlVuY29udHJvbGxlZCBpbnB1dCBjaGFuZ2UsIHJlZnJlc2ggbWFzayBtYW51YWxseSFcIik7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zZWxlY3Rpb24gPSB7XHJcbiAgICAgIHN0YXJ0OiB0aGlzLnNlbGVjdGlvblN0YXJ0LFxyXG4gICAgICBlbmQ6IHRoaXMuY3Vyc29yUG9zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSAoKSB7XHJcbiAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xyXG4gICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbGVtZW50ICh2YWx1ZSwgY3Vyc29yUG9zKSB7XHJcbiAgICB2YXIgdW5tYXNrZWRWYWx1ZSA9IHRoaXMuX2NhbGNVbm1hc2tlZCh2YWx1ZSk7XHJcbiAgICB2YXIgaXNDaGFuZ2VkID0gKHRoaXMudW5tYXNrZWRWYWx1ZSAhPT0gdW5tYXNrZWRWYWx1ZSB8fFxyXG4gICAgICB0aGlzLnJhd1ZhbHVlICE9PSB2YWx1ZSk7XHJcblxyXG4gICAgdGhpcy5fdW5tYXNrZWRWYWx1ZSA9IHVubWFza2VkVmFsdWU7XHJcbiAgICB0aGlzLl9yYXdWYWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLmVsLnZhbHVlICE9PSB2YWx1ZSkgdGhpcy5lbC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuY3Vyc29yUG9zICE9IGN1cnNvclBvcyAmJiBjdXJzb3JQb3MgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmN1cnNvclBvcyA9IGN1cnNvclBvcztcclxuXHJcbiAgICAgIC8vIGFsc28gcXVldWUgY2hhbmdlIGN1cnNvciBmb3IgbW9iaWxlIGJyb3dzZXJzXHJcbiAgICAgIGlmICh0aGlzLl9jdXJzb3JDaGFuZ2luZykgY2xlYXJUaW1lb3V0KHRoaXMuX2N1cnNvckNoYW5naW5nKTtcclxuICAgICAgaWYgKHRoaXMuY3Vyc29yUG9zICE9IGN1cnNvclBvcykge1xyXG4gICAgICAgIHRoaXMuX2NoYW5naW5nQ3Vyc29yUG9zID0gY3Vyc29yUG9zO1xyXG4gICAgICAgIHRoaXMuX2N1cnNvckNoYW5naW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN1cnNvclBvcyA9IHRoaXMuX2NoYW5naW5nQ3Vyc29yUG9zO1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXMuX2N1cnNvckNoYW5naW5nO1xyXG4gICAgICAgIH0sIDEwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgaWYgKGlzQ2hhbmdlZCkgdGhpcy5fZmlyZUNoYW5nZUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgX2ZpcmVDaGFuZ2VFdmVudHMgKCkge1xyXG4gICAgdGhpcy5maXJlRXZlbnQoXCJhY2NlcHRcIik7XHJcbiAgfVxyXG5cclxuICBfb25JbnB1dCAoZXYpIHtcclxuICAgIHRoaXMucHJvY2Vzc0lucHV0KHRoaXMuZWwudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgX29uRHJvcCAoZXYpIHtcclxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vIG92ZXJyaWRlXHJcbiAgcmVzb2x2ZSAoc3RyLCBkZXRhaWxzKSB7IHJldHVybiBzdHI7IH1cclxuXHJcbiAgX2NhbGNVbm1hc2tlZCAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9XHJcbn1cclxuIiwiaW1wb3J0IEJhc2VNYXNrIGZyb20gJy4vYmFzZSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuY2xhc3MgUmVnRXhwTWFzayBleHRlbmRzIEJhc2VNYXNrIHtcclxuICByZXNvbHZlIChzdHIpIHtcclxuICAgIHJldHVybiB0aGlzLm1hc2sudGVzdChzdHIpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgQmFzZU1hc2sgZnJvbSAnLi9iYXNlJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdFxyXG5jbGFzcyBGdW5jTWFzayBleHRlbmRzIEJhc2VNYXNrIHtcclxuICByZXNvbHZlICguLi5hcmdzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXNrKC4uLmFyZ3MpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge2NvbmZvcm19IGZyb20gJy4uL3V0aWxzJztcclxuaW1wb3J0IEJhc2VNYXNrIGZyb20gJy4vYmFzZSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuY2xhc3MgUGF0dGVybk1hc2sgZXh0ZW5kcyBCYXNlTWFzayB7XHJcbiAgY29uc3RydWN0b3IgKGVsLCBvcHRzKSB7XHJcbiAgICBzdXBlcihlbCwgb3B0cyk7XHJcblxyXG4gICAgdGhpcy5faG9sbG93cyA9IFtdO1xyXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IG9wdHMucGxhY2Vob2xkZXI7XHJcbiAgICB0aGlzLmRlZmluaXRpb25zID0ge1xyXG4gICAgICAuLi5QYXR0ZXJuTWFzay5ERUZJTklUSU9OUyxcclxuICAgICAgLi4ub3B0cy5kZWZpbml0aW9uc1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9hbGlnbkN1cnNvciA9IHRoaXMuX2FsaWduQ3Vyc29yLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLl9hbGlnbkN1cnNvckZyaWVuZGx5ID0gdGhpcy5fYWxpZ25DdXJzb3JGcmllbmRseS5iaW5kKHRoaXMpO1xyXG5cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIF9hbGlnbkN1cnNvckZyaWVuZGx5ICgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0ICE9PSB0aGlzLmN1cnNvclBvcykgcmV0dXJuO1xyXG4gICAgdGhpcy5fYWxpZ25DdXJzb3IoKTtcclxuICB9XHJcblxyXG4gIGJpbmRFdmVudHMgKCkge1xyXG4gICAgc3VwZXIuYmluZEV2ZW50cygpO1xyXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2FsaWduQ3Vyc29yRnJpZW5kbHkpO1xyXG4gIH1cclxuXHJcbiAgdW5iaW5kRXZlbnRzICgpIHtcclxuICAgIHN1cGVyLnVuYmluZEV2ZW50cygpO1xyXG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2FsaWduQ3Vyc29yRnJpZW5kbHkpO1xyXG4gIH1cclxuXHJcbiAgX2luc3RhbGxEZWZpbml0aW9ucyAoZGVmaW5pdGlvbnMpIHtcclxuICAgIHRoaXMuX2RlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XHJcbiAgICB0aGlzLl9jaGFyRGVmcyA9IFtdO1xyXG4gICAgdmFyIHBhdHRlcm4gPSB0aGlzLm1hc2s7XHJcblxyXG4gICAgaWYgKCFwYXR0ZXJuIHx8ICFkZWZpbml0aW9ucykgcmV0dXJuO1xyXG5cclxuICAgIHZhciB1bm1hc2tpbmdCbG9jayA9IGZhbHNlO1xyXG4gICAgdmFyIG9wdGlvbmFsQmxvY2sgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGk9MDsgaTxwYXR0ZXJuLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHZhciBjaCA9IHBhdHRlcm5baV07XHJcbiAgICAgIHZhciB0eXBlID0gIXVubWFza2luZ0Jsb2NrICYmIGNoIGluIGRlZmluaXRpb25zID9cclxuICAgICAgICBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuSU5QVVQgOlxyXG4gICAgICAgIFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5GSVhFRDtcclxuICAgICAgdmFyIHVubWFza2luZyA9IHR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5JTlBVVCB8fCB1bm1hc2tpbmdCbG9jaztcclxuICAgICAgdmFyIG9wdGlvbmFsID0gdHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmIG9wdGlvbmFsQmxvY2s7XHJcblxyXG4gICAgICBpZiAoY2ggPT09ICd7JyB8fCBjaCA9PT0gJ30nKSB7XHJcbiAgICAgICAgdW5tYXNraW5nQmxvY2sgPSAhdW5tYXNraW5nQmxvY2s7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaCA9PT0gJ1snIHx8IGNoID09PSAnXScpIHtcclxuICAgICAgICBvcHRpb25hbEJsb2NrID0gIW9wdGlvbmFsQmxvY2s7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaCA9PT0gJ1xcXFwnKSB7XHJcbiAgICAgICAgKytpO1xyXG4gICAgICAgIGNoID0gcGF0dGVybltpXTtcclxuICAgICAgICAvLyBUT0RPIHZhbGlkYXRpb25cclxuICAgICAgICBpZiAoIWNoKSBicmVhaztcclxuICAgICAgICB0eXBlID0gUGF0dGVybk1hc2suREVGX1RZUEVTLkZJWEVEO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9jaGFyRGVmcy5wdXNoKHtcclxuICAgICAgICBjaGFyOiBjaCxcclxuICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgIG9wdGlvbmFsOiBvcHRpb25hbCxcclxuICAgICAgICB1bm1hc2tpbmc6IHVubWFza2luZ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9idWlsZFJlc29sdmVycygpO1xyXG4gIH1cclxuXHJcbiAgX2J1aWxkUmVzb2x2ZXJzICgpIHtcclxuICAgIHRoaXMuX3Jlc29sdmVycyA9IHt9O1xyXG4gICAgZm9yICh2YXIgZGVmS2V5IGluIHRoaXMuZGVmaW5pdGlvbnMpIHtcclxuICAgICAgdGhpcy5fcmVzb2x2ZXJzW2RlZktleV0gPSBJTWFzay5NYXNrRmFjdG9yeSh0aGlzLmVsLCB7XHJcbiAgICAgICAgbWFzazogdGhpcy5kZWZpbml0aW9uc1tkZWZLZXldXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX2FwcGVuZFRhaWwgKHN0ciwgdGFpbCkge1xyXG4gICAgdmFyIHBsYWNlaG9sZGVyQnVmZmVyID0gJyc7XHJcbiAgICB2YXIgaG9sbG93cyA9IHRoaXMuX2hvbGxvd3Muc2xpY2UoKTtcclxuICAgIHZhciBvdmVyZmxvdyA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAodmFyIGNpPTAsIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgoc3RyLmxlbmd0aCk7IGNpIDwgdGFpbC5sZW5ndGg7ICsrZGkpIHtcclxuICAgICAgdmFyIGNoID0gdGFpbFtjaV07XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcblxyXG4gICAgICAvLyBmYWlsZWRcclxuICAgICAgaWYgKCFkZWYpIHtcclxuICAgICAgICBvdmVyZmxvdyA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSB7XHJcbiAgICAgICAgdmFyIHJlc29sdmVyID0gdGhpcy5fcmVzb2x2ZXJzW2RlZi5jaGFyXTtcclxuICAgICAgICB2YXIgY2hyZXMgPSByZXNvbHZlci5yZXNvbHZlKGNoLCBkaSwgc3RyKSB8fCAnJztcclxuICAgICAgICBpZiAoY2hyZXMpIHtcclxuICAgICAgICAgIGNocmVzID0gY29uZm9ybShjaHJlcywgY2gpO1xyXG4gICAgICAgICAgKytjaTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCFkZWYub3B0aW9uYWwpIGNocmVzID0gdGhpcy5fcGxhY2Vob2xkZXIuY2hhcjtcclxuICAgICAgICAgIGhvbGxvd3MucHVzaChkaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0ciArPSBwbGFjZWhvbGRlckJ1ZmZlciArIGNocmVzO1xyXG4gICAgICAgIHBsYWNlaG9sZGVyQnVmZmVyID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGxhY2Vob2xkZXJCdWZmZXIgKz0gZGVmLmNoYXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3N0ciwgaG9sbG93cywgb3ZlcmZsb3ddO1xyXG4gIH1cclxuXHJcbiAgX2V4dHJhY3RJbnB1dCAoc3RyLCBmcm9tUG9zPTApIHtcclxuICAgIHZhciBpbnB1dCA9ICcnO1xyXG5cclxuICAgIGZvciAodmFyIGNpPTAsIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgoZnJvbVBvcyk7IGNpPHN0ci5sZW5ndGggJiYgZGk8dGhpcy5fY2hhckRlZnMubGVuZ3RoOyArK2RpKSB7XHJcbiAgICAgIHZhciBjaCA9IHN0cltjaV07XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcblxyXG4gICAgICBpZiAodGhpcy5faXNIaWRkZW5Ib2xsb3coZGkpKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmICF0aGlzLl9pc0hvbGxvdyhkaSkpIGlucHV0ICs9IGNoO1xyXG4gICAgICArK2NpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgX2lzSG9sbG93IChkZWZJbmRleCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvbGxvd3MuaW5kZXhPZihkZWZJbmRleCkgPj0gMDtcclxuICB9XHJcblxyXG4gIF9pc0hpZGRlbkhvbGxvdyAoZGVmSW5kZXgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0hvbGxvdyhkZWZJbmRleCkgJiZcclxuICAgICAgdGhpcy5fY2hhckRlZnNbZGVmSW5kZXhdICYmIHRoaXMuX2NoYXJEZWZzW2RlZkluZGV4XS5vcHRpb25hbDtcclxuICB9XHJcblxyXG4gIF9ob2xsb3dzQmVmb3JlIChkZWZJbmRleCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvbGxvd3MuZmlsdGVyKGggPT4gaCA8IGRlZkluZGV4ICYmIHRoaXMuX2lzSGlkZGVuSG9sbG93KGgpKTtcclxuICB9XHJcblxyXG4gIF9tYXBEZWZJbmRleFRvUG9zIChkZWZJbmRleCkge1xyXG4gICAgcmV0dXJuIGRlZkluZGV4IC0gdGhpcy5faG9sbG93c0JlZm9yZShkZWZJbmRleCkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgX21hcFBvc1RvRGVmSW5kZXggKHBvcykge1xyXG4gICAgdmFyIGxhc3RIb2xsb3dJbmRleCA9IHBvcztcclxuICAgIC8vIGV4dGVuZCBjb250aWd1b3VzXHJcbiAgICB3aGlsZSAodGhpcy5faXNIaWRkZW5Ib2xsb3cobGFzdEhvbGxvd0luZGV4LTEpKSArK2xhc3RIb2xsb3dJbmRleDtcclxuXHJcbiAgICByZXR1cm4gcG9zICsgdGhpcy5faG9sbG93c0JlZm9yZShsYXN0SG9sbG93SW5kZXgpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIF9nZW5lcmF0ZUluc2VydFN0ZXBzIChoZWFkLCBpbnNlcnRlZCkge1xyXG4gICAgdmFyIHJlcyA9IGhlYWQ7XHJcbiAgICB2YXIgaG9sbG93cyA9IHRoaXMuX2hvbGxvd3Muc2xpY2UoKTtcclxuICAgIHZhciBwbGFjZWhvbGRlckJ1ZmZlciA9ICcnO1xyXG4gICAgdmFyIGluc2VydFN0ZXBzID0gW1tyZXMsIGhvbGxvd3Muc2xpY2UoKV1dO1xyXG5cclxuICAgIGZvciAodmFyIGNpPTAsIGRpPXRoaXMuX21hcFBvc1RvRGVmSW5kZXgoaGVhZC5sZW5ndGgpOyBjaTxpbnNlcnRlZC5sZW5ndGg7KSB7XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgIGlmICghZGVmKSBicmVhaztcclxuXHJcbiAgICAgIHZhciBjaCA9IGluc2VydGVkW2NpXTtcclxuICAgICAgaWYgKGRlZi50eXBlID09PSBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuSU5QVVQpIHtcclxuICAgICAgICB2YXIgcmVzb2x2ZXIgPSB0aGlzLl9yZXNvbHZlcnNbZGVmLmNoYXJdO1xyXG4gICAgICAgIHZhciBjaHJlcyA9IHJlc29sdmVyLnJlc29sdmUoY2gsIGNpLCByZXMpIHx8ICcnO1xyXG4gICAgICAgIC8vIGlmIG9rIC0gbmV4dCBkaVxyXG4gICAgICAgIGlmIChjaHJlcykge1xyXG4gICAgICAgICAgcmVzICs9IHBsYWNlaG9sZGVyQnVmZmVyICsgY29uZm9ybShjaHJlcywgY2gpOyBwbGFjZWhvbGRlckJ1ZmZlciA9ICcnO1xyXG4gICAgICAgICAgaW5zZXJ0U3RlcHMucHVzaChbcmVzLCBob2xsb3dzLnNsaWNlKCldKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRlZi5vcHRpb25hbCkge1xyXG4gICAgICAgICAgaWYgKGhvbGxvd3MuaW5kZXhPZihkaSkgPCAwKSBob2xsb3dzLnB1c2goZGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hyZXMgfHwgZGVmLm9wdGlvbmFsKSArK2RpO1xyXG4gICAgICAgIGlmIChjaHJlcyB8fCAhZGVmLm9wdGlvbmFsKSArK2NpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBsYWNlaG9sZGVyQnVmZmVyICs9IGRlZi5jaGFyO1xyXG5cclxuICAgICAgICBpZiAoY2ggPT09IGRlZi5jaGFyKSArK2NpO1xyXG4gICAgICAgICsrZGk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zZXJ0U3RlcHM7XHJcbiAgfVxyXG5cclxuICByZXNvbHZlIChzdHIsIGRldGFpbHMpIHtcclxuICAgIHZhciBjdXJzb3JQb3MgPSBkZXRhaWxzLmN1cnNvclBvcztcclxuICAgIHZhciBzdGFydENoYW5nZVBvcyA9IGRldGFpbHMuc3RhcnRDaGFuZ2VQb3M7XHJcbiAgICB2YXIgaW5zZXJ0ZWQgPSBkZXRhaWxzLmluc2VydGVkO1xyXG4gICAgdmFyIHJlbW92ZWRDb3VudCA9IGRldGFpbHMucmVtb3ZlZC5sZW5ndGg7XHJcbiAgICB2YXIgdGFpbElucHV0ID0gdGhpcy5fZXh0cmFjdElucHV0KGRldGFpbHMudGFpbCwgc3RhcnRDaGFuZ2VQb3MgKyByZW1vdmVkQ291bnQpO1xyXG5cclxuICAgIC8vIHJlbW92ZSBob2xsb3dzIGFmdGVyIGN1cnNvclxyXG4gICAgdmFyIGxhc3RIb2xsb3dJbmRleCA9IHRoaXMuX21hcFBvc1RvRGVmSW5kZXgoc3RhcnRDaGFuZ2VQb3MpO1xyXG4gICAgdGhpcy5faG9sbG93cyA9IHRoaXMuX2hvbGxvd3MuZmlsdGVyKGggPT4gaCA8IGxhc3RIb2xsb3dJbmRleCk7XHJcblxyXG4gICAgdmFyIHJlcyA9IGRldGFpbHMuaGVhZDtcclxuXHJcbiAgICAvLyBpbnNlcnQgYXZhaWxhYmxlXHJcbiAgICB2YXIgaW5zZXJ0U3RlcHMgPSB0aGlzLl9nZW5lcmF0ZUluc2VydFN0ZXBzKHJlcywgaW5zZXJ0ZWQpO1xyXG4gICAgZm9yICh2YXIgaXN0ZXA9aW5zZXJ0U3RlcHMubGVuZ3RoLTE7IGlzdGVwID49IDA7IC0taXN0ZXApIHtcclxuICAgICAgdmFyIHN0ZXA7XHJcbiAgICAgIFtzdGVwLCB0aGlzLl9ob2xsb3dzXSA9IGluc2VydFN0ZXBzW2lzdGVwXTtcclxuICAgICAgdmFyIFt0cmVzLCB0aG9sbG93cywgb3ZlcmZsb3ddID0gdGhpcy5fYXBwZW5kVGFpbChzdGVwLCB0YWlsSW5wdXQpO1xyXG4gICAgICBpZiAoIW92ZXJmbG93KSB7XHJcbiAgICAgICAgW3JlcywgdGhpcy5faG9sbG93c10gPSBbdHJlcywgdGhvbGxvd3NdO1xyXG4gICAgICAgIGN1cnNvclBvcyA9IHN0ZXAubGVuZ3RoO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgaW5wdXQgYXQgdGhlIGVuZCAtIGFwcGVuZCBmaXhlZFxyXG4gICAgaWYgKGluc2VydGVkICYmIGN1cnNvclBvcyA9PT0gcmVzLmxlbmd0aCkge1xyXG4gICAgICAvLyBhcHBlbmQgZml4ZWQgYXQgZW5kXHJcbiAgICAgIHZhciBhcHBlbmRlZCA9IHRoaXMuX2FwcGVuZEZpeGVkRW5kKHJlcyk7XHJcbiAgICAgIGN1cnNvclBvcyArPSBhcHBlbmRlZC5sZW5ndGggLSByZXMubGVuZ3RoO1xyXG4gICAgICByZXMgPSBhcHBlbmRlZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWluc2VydGVkICYmIHJlbW92ZWRDb3VudCkge1xyXG4gICAgICAvLyBpZiBkZWxldGUgYXQgcmlnaHRcclxuICAgICAgaWYgKGRldGFpbHMub2xkU2VsZWN0aW9uLmVuZCA9PT0gY3Vyc29yUG9zKSB7XHJcbiAgICAgICAgZm9yICg7OysrY3Vyc29yUG9zKSB7XHJcbiAgICAgICAgICB2YXIgZGk9dGhpcy5fbWFwUG9zVG9EZWZJbmRleChjdXJzb3JQb3MpO1xyXG4gICAgICAgICAgdmFyIGRlZiA9IHRoaXMuX2NoYXJEZWZzW2RpXTtcclxuICAgICAgICAgIGlmICghZGVmIHx8IGRlZi50eXBlICE9PSBQYXR0ZXJuTWFzay5ERUZfVFlQRVMuRklYRUQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVtb3ZlIGhlYWQgZml4ZWQgYW5kIGhvbGxvd3MgaWYgcmVtb3ZlZCBhdCBlbmRcclxuICAgICAgaWYgKGN1cnNvclBvcyA9PT0gcmVzLmxlbmd0aCkge1xyXG4gICAgICAgIHZhciBkaSA9IHRoaXMuX21hcFBvc1RvRGVmSW5kZXgoY3Vyc29yUG9zLTEpO1xyXG4gICAgICAgIHZhciBoYXNIb2xsb3dzID0gZmFsc2U7XHJcbiAgICAgICAgZm9yICg7IGRpID4gMDsgLS1kaSkge1xyXG4gICAgICAgICAgdmFyIGRlZiA9IHRoaXMuX2NoYXJEZWZzW2RpXTtcclxuICAgICAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0hvbGxvdyhkaSkpIGhhc0hvbGxvd3MgPSB0cnVlO1xyXG4gICAgICAgICAgICBlbHNlIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaGFzSG9sbG93cykgcmVzID0gcmVzLnNsaWNlKDAsIGRpICsgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgcGxhY2Vob2xkZXJcclxuICAgIHJlcyA9IHRoaXMuX2FwcGVuZFBsYWNlaG9sZGVyRW5kKHJlcyk7XHJcbiAgICBkZXRhaWxzLmN1cnNvclBvcyA9IGN1cnNvclBvcztcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgX2ZpcmVDaGFuZ2VFdmVudHMgKCkge1xyXG4gICAgLy8gZmlyZSAnY29tcGxldGUnIGFmdGVyICdhY2NlcHQnIGV2ZW50XHJcbiAgICBzdXBlci5fZmlyZUNoYW5nZUV2ZW50cygpO1xyXG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZSkgdGhpcy5maXJlRXZlbnQoXCJjb21wbGV0ZVwiKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0NvbXBsZXRlICgpIHtcclxuICAgIHJldHVybiAhdGhpcy5fY2hhckRlZnMuZmlsdGVyKChkZWYsIGRpKSA9PlxyXG4gICAgICBkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmICFkZWYub3B0aW9uYWwgJiZcclxuICAgICAgdGhpcy5faXNIb2xsb3coZGkpKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBfYXBwZW5kRml4ZWRFbmQgKHJlcykge1xyXG4gICAgZm9yICh2YXIgZGk9dGhpcy5fbWFwUG9zVG9EZWZJbmRleChyZXMubGVuZ3RoKTs7ICsrZGkpIHtcclxuICAgICAgdmFyIGRlZiA9IHRoaXMuX2NoYXJEZWZzW2RpXTtcclxuICAgICAgaWYgKCFkZWYpIGJyZWFrO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2lzSGlkZGVuSG9sbG93KGRpKSkgY29udGludWU7XHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSBicmVhaztcclxuICAgICAgaWYgKGRpID49IHJlcy5sZW5ndGgpIHJlcyArPSBkZWYuY2hhcjtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBfYXBwZW5kUGxhY2Vob2xkZXJFbmQgKHJlcykge1xyXG4gICAgZm9yICh2YXIgZGk9dGhpcy5fbWFwUG9zVG9EZWZJbmRleChyZXMubGVuZ3RoKTsgZGk8dGhpcy5fY2hhckRlZnMubGVuZ3RoOyArK2RpKSB7XHJcbiAgICAgIHZhciBkZWYgPSB0aGlzLl9jaGFyRGVmc1tkaV07XHJcbiAgICAgIGlmIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmICF0aGlzLl9pc0hvbGxvdyhkaSkpIHtcclxuICAgICAgICB0aGlzLl9ob2xsb3dzLnB1c2goZGkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9wbGFjZWhvbGRlci5zaG93ID09PSAnYWx3YXlzJykge1xyXG4gICAgICAgIHJlcyArPSBkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLkZJWEVEID9cclxuICAgICAgICAgIGRlZi5jaGFyIDpcclxuICAgICAgICAgICFkZWYub3B0aW9uYWwgP1xyXG4gICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlci5jaGFyIDpcclxuICAgICAgICAgICAgJyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBfY2FsY1VubWFza2VkIChzdHIpIHtcclxuICAgIHZhciB1bm1hc2tlZCA9ICcnO1xyXG4gICAgZm9yICh2YXIgY2k9MCwgZGk9MDsgY2k8c3RyLmxlbmd0aCAmJiBkaTx0aGlzLl9jaGFyRGVmcy5sZW5ndGg7ICsrZGkpIHtcclxuICAgICAgdmFyIGNoID0gc3RyW2NpXTtcclxuICAgICAgdmFyIGRlZiA9IHRoaXMuX2NoYXJEZWZzW2RpXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pc0hpZGRlbkhvbGxvdyhkaSkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKGRlZi51bm1hc2tpbmcgJiYgIXRoaXMuX2lzSG9sbG93KGRpKSAmJlxyXG4gICAgICAgIChkZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmIHRoaXMuX3Jlc29sdmVyc1tkZWYuY2hhcl0ucmVzb2x2ZShjaCwgY2ksIHN0cikgfHxcclxuICAgICAgICAgIGRlZi5jaGFyID09PSBjaCkpIHtcclxuICAgICAgICB1bm1hc2tlZCArPSBjaDtcclxuICAgICAgfVxyXG4gICAgICArK2NpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVubWFza2VkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVubWFza2VkVmFsdWUgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VubWFza2VkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdW5tYXNrZWRWYWx1ZSAoc3RyKSB7XHJcbiAgICB0aGlzLl9ob2xsb3dzLmxlbmd0aCA9IDA7XHJcbiAgICB2YXIgcmVzO1xyXG4gICAgW3JlcywgdGhpcy5faG9sbG93c10gPSB0aGlzLl9hcHBlbmRUYWlsKCcnLCBzdHIpO1xyXG4gICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuX2FwcGVuZFBsYWNlaG9sZGVyRW5kKHJlcykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYWNlaG9sZGVyICgpIHsgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyOyB9XHJcblxyXG4gIHNldCBwbGFjZWhvbGRlciAocGgpIHtcclxuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0ge1xyXG4gICAgICAuLi5QYXR0ZXJuTWFzay5ERUZBVUxUX1BMQUNFSE9MREVSLFxyXG4gICAgICAuLi5waFxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgdGhpcy51bm1hc2tlZFZhbHVlID0gdGhpcy51bm1hc2tlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYWNlaG9sZGVyTGFiZWwgKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYXJEZWZzLm1hcChkZWYgPT5cclxuICAgICAgZGVmLnR5cGUgPT09IFBhdHRlcm5NYXNrLkRFRl9UWVBFUy5GSVhFRCA/XHJcbiAgICAgICAgZGVmLmNoYXIgOlxyXG4gICAgICAgICFkZWYub3B0aW9uYWwgP1xyXG4gICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIuY2hhciA6XHJcbiAgICAgICAgICAnJykuam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGVmaW5pdGlvbnMgKCkgeyByZXR1cm4gdGhpcy5fZGVmaW5pdGlvbnM7IH1cclxuXHJcbiAgc2V0IGRlZmluaXRpb25zIChkZWZzKSB7XHJcbiAgICB0aGlzLl9pbnN0YWxsRGVmaW5pdGlvbnMoZGVmcyk7XHJcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHRoaXMudW5tYXNrZWRWYWx1ZSA9IHRoaXMudW5tYXNrZWRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBtYXNrICgpIHsgcmV0dXJuIHRoaXMuX21hc2s7IH1cclxuXHJcbiAgc2V0IG1hc2sgKG1hc2spIHtcclxuICAgIHRoaXMuX21hc2sgPSBtYXNrO1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB0aGlzLmRlZmluaXRpb25zID0gdGhpcy5kZWZpbml0aW9ucztcclxuICB9XHJcblxyXG4gIF9hbGlnbkN1cnNvciAoKSB7XHJcbiAgICB2YXIgY3Vyc29yRGVmSW5kZXggPSB0aGlzLl9tYXBQb3NUb0RlZkluZGV4KHRoaXMuY3Vyc29yUG9zKTtcclxuICAgIGZvciAodmFyIHJQb3MgPSBjdXJzb3JEZWZJbmRleDsgclBvcyA+PSAwOyAtLXJQb3MpIHtcclxuICAgICAgdmFyIHJEZWYgPSB0aGlzLl9jaGFyRGVmc1tyUG9zXTtcclxuICAgICAgdmFyIGxQb3MgPSByUG9zLTE7XHJcbiAgICAgIHZhciBsRGVmID0gdGhpcy5fY2hhckRlZnNbbFBvc107XHJcbiAgICAgIGlmICh0aGlzLl9pc0hpZGRlbkhvbGxvdyhsUG9zKSkgY29udGludWU7XHJcblxyXG4gICAgICBpZiAoKCFyRGVmIHx8IHJEZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUICYmIHRoaXMuX2lzSG9sbG93KHJQb3MpICYmICF0aGlzLl9pc0hpZGRlbkhvbGxvdyhyUG9zKSkgJiZcclxuICAgICAgICAhdGhpcy5faXNIb2xsb3cobFBvcykpIHtcclxuICAgICAgICBjdXJzb3JEZWZJbmRleCA9IHJQb3M7XHJcbiAgICAgICAgaWYgKCFsRGVmIHx8IGxEZWYudHlwZSA9PT0gUGF0dGVybk1hc2suREVGX1RZUEVTLklOUFVUKSBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jdXJzb3JQb3MgPSB0aGlzLl9tYXBEZWZJbmRleFRvUG9zKGN1cnNvckRlZkluZGV4KTtcclxuICB9XHJcbn1cclxuUGF0dGVybk1hc2suREVGSU5JVElPTlMgPSB7XHJcbiAgJzAnOiAvXFxkLyxcclxuICAnYSc6IC9bXFx1MDA0MS1cXHUwMDVBXFx1MDA2MS1cXHUwMDdBXFx1MDBBQVxcdTAwQjVcXHUwMEJBXFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTI3XFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOEEwXFx1MDhBMi1cXHUwOEFDXFx1MDkwNC1cXHUwOTM5XFx1MDkzRFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5NzdcXHUwOTc5LVxcdTA5N0ZcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJEXFx1MDlDRVxcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMFxcdTA5RjFcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTcyLVxcdTBBNzRcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkRcXHUwQUQwXFx1MEFFMFxcdTBBRTFcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzRFxcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYxXFx1MEI3MVxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJEMFxcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzM1xcdTBDMzUtXFx1MEMzOVxcdTBDM0RcXHUwQzU4XFx1MEM1OVxcdTBDNjBcXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDYwXFx1MEQ2MVxcdTBEN0EtXFx1MEQ3RlxcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRTAxLVxcdTBFMzBcXHUwRTMyXFx1MEUzM1xcdTBFNDAtXFx1MEU0NlxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUIwXFx1MEVCMlxcdTBFQjNcXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjQwLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjg4LVxcdTBGOENcXHUxMDAwLVxcdTEwMkFcXHUxMDNGXFx1MTA1MC1cXHUxMDU1XFx1MTA1QS1cXHUxMDVEXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2RS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4RVxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzgwLVxcdTE3QjNcXHUxN0Q3XFx1MTdEQ1xcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBOFxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUNcXHUxOTUwLVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUMxLVxcdTE5QzdcXHUxQTAwLVxcdTFBMTZcXHUxQTIwLVxcdTFBNTRcXHUxQUE3XFx1MUIwNS1cXHUxQjMzXFx1MUI0NS1cXHUxQjRCXFx1MUI4My1cXHUxQkEwXFx1MUJBRVxcdTFCQUZcXHUxQkJBLVxcdTFCRTVcXHUxQzAwLVxcdTFDMjNcXHUxQzRELVxcdTFDNEZcXHUxQzVBLVxcdTFDN0RcXHUxQ0U5LVxcdTFDRUNcXHUxQ0VFLVxcdTFDRjFcXHUxQ0Y1XFx1MUNGNlxcdTFEMDAtXFx1MURCRlxcdTFFMDAtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEyRFxcdTIxMkYtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTgzXFx1MjE4NFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkUyRlxcdTMwMDVcXHUzMDA2XFx1MzAzMS1cXHUzMDM1XFx1MzAzQlxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDlELVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGQ0NcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MUZcXHVBNjJBXFx1QTYyQlxcdUE2NDAtXFx1QTY2RVxcdUE2N0YtXFx1QTY5N1xcdUE2QTAtXFx1QTZFNVxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTc4RVxcdUE3OTAtXFx1QTc5M1xcdUE3QTAtXFx1QTdBQVxcdUE3RjgtXFx1QTgwMVxcdUE4MDMtXFx1QTgwNVxcdUE4MDctXFx1QTgwQVxcdUE4MEMtXFx1QTgyMlxcdUE4NDAtXFx1QTg3M1xcdUE4ODItXFx1QThCM1xcdUE4RjItXFx1QThGN1xcdUE4RkJcXHVBOTBBLVxcdUE5MjVcXHVBOTMwLVxcdUE5NDZcXHVBOTYwLVxcdUE5N0NcXHVBOTg0LVxcdUE5QjJcXHVBOUNGXFx1QUEwMC1cXHVBQTI4XFx1QUE0MC1cXHVBQTQyXFx1QUE0NC1cXHVBQTRCXFx1QUE2MC1cXHVBQTc2XFx1QUE3QVxcdUFBODAtXFx1QUFBRlxcdUFBQjFcXHVBQUI1XFx1QUFCNlxcdUFBQjktXFx1QUFCRFxcdUFBQzBcXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVBXFx1QUFGMi1cXHVBQUY0XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUJDMC1cXHVBQkUyXFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRFxcdUZCMUYtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYyMS1cXHVGRjNBXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXS8sICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjA3NTA3MFxyXG4gICcqJzogLy4vXHJcbn07XHJcblBhdHRlcm5NYXNrLkRFRl9UWVBFUyA9IHtcclxuICBJTlBVVDogJ2lucHV0JyxcclxuICBGSVhFRDogJ2ZpeGVkJ1xyXG59XHJcblBhdHRlcm5NYXNrLkRFRkFVTFRfUExBQ0VIT0xERVIgPSB7XHJcbiAgc2hvdzogJ2xhenknLFxyXG4gIGNoYXI6ICdfJ1xyXG59O1xyXG4iLCJpbXBvcnQgQmFzZU1hc2sgZnJvbSAnLi9iYXNlJztcclxuaW1wb3J0IHtleHRlbmREZXRhaWxzQWRqdXN0bWVudHN9IGZyb20gJy4uL3V0aWxzJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdFxyXG5jbGFzcyBQaXBlTWFzayBleHRlbmRzIEJhc2VNYXNrIHtcclxuICBjb25zdHJ1Y3RvciAoZWwsIG9wdHMpIHtcclxuICAgIHN1cGVyKGVsLCBvcHRzKTtcclxuXHJcbiAgICB0aGlzLm11bHRpcGFzcyA9IG9wdHMubXVsdGlwYXNzO1xyXG5cclxuICAgIHRoaXMuX2NvbXBpbGVkTWFza3MgPSB0aGlzLm1hc2subWFwKG0gPT4gSU1hc2suTWFza0ZhY3RvcnkoZWwsIG0pKTtcclxuICB9XHJcblxyXG4gIHJlc29sdmUgKHN0ciwgZGV0YWlscykge1xyXG4gICAgdmFyIHJlcyA9IHRoaXMuX3BpcGUoc3RyLCBkZXRhaWxzKTtcclxuICAgIGlmICghdGhpcy5tdWx0aXBhc3MpIHJldHVybiByZXM7XHJcblxyXG4gICAgdmFyIGN1cnNvclBvcyA9IGRldGFpbHMuY3Vyc29yUG9zO1xyXG5cclxuICAgIHZhciBzdGVwUmVzO1xyXG4gICAgdmFyIHRlbXBSZXMgPSByZXM7XHJcblxyXG4gICAgd2hpbGUgKHN0ZXBSZXMgIT09IHRlbXBSZXMpIHtcclxuICAgICAgc3RlcFJlcyA9IHRlbXBSZXM7XHJcbiAgICAgIHRlbXBSZXMgPSB0aGlzLl9waXBlKHN0ZXBSZXMsIHtcclxuICAgICAgICBjdXJzb3JQb3M6IHN0ZXBSZXMubGVuZ3RoLFxyXG4gICAgICAgIG9sZFZhbHVlOiBzdGVwUmVzLFxyXG4gICAgICAgIG9sZFNlbGVjdGlvbjoge1xyXG4gICAgICAgICAgc3RhcnQ6IDAsXHJcbiAgICAgICAgICBlbmQ6IHN0ZXBSZXMubGVuZ3RoXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRhaWxzLmN1cnNvclBvcyA9IGN1cnNvclBvcyAtIChyZXMubGVuZ3RoIC0gc3RlcFJlcy5sZW5ndGgpO1xyXG5cclxuICAgIHJldHVybiBzdGVwUmVzO1xyXG4gIH1cclxuXHJcbiAgX3BpcGUgKHN0ciwgZGV0YWlscykge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVkTWFza3MucmVkdWNlKChzLCBtKSA9PiB7XHJcbiAgICAgIHZhciBkID0gZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzKHMsIGRldGFpbHMpO1xyXG4gICAgICB2YXIgcmVzID0gbS5yZXNvbHZlKHMsIGQpO1xyXG4gICAgICBkZXRhaWxzLmN1cnNvclBvcyA9IGQuY3Vyc29yUG9zO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfSwgc3RyKTtcclxuICB9XHJcblxyXG4gIGJpbmRFdmVudHMgKCkge1xyXG4gICAgc3VwZXIuYmluZEV2ZW50cygpO1xyXG4gICAgdGhpcy5fY29tcGlsZWRNYXNrcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICBtLmJpbmRFdmVudHMoKTtcclxuICAgICAgLy8gZGlzYWJsZSBiYXNlbWFzayBldmVudHMgZm9yIGNoaWxkIG1hc2tzXHJcbiAgICAgIEJhc2VNYXNrLnByb3RvdHlwZS51bmJpbmRFdmVudHMuYXBwbHkobSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVuYmluZEV2ZW50cyAoKSB7XHJcbiAgICBzdXBlci51bmJpbmRFdmVudHMoKTtcclxuICAgIHRoaXMuX2NvbXBpbGVkTWFza3MuZm9yRWFjaChtID0+IG0udW5iaW5kRXZlbnRzKCkpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge2lzU3RyaW5nfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmltcG9ydCBCYXNlTWFzayBmcm9tICcuL21hc2tzL2Jhc2UnO1xyXG5pbXBvcnQgUmVnRXhwTWFzayBmcm9tICcuL21hc2tzL3JlZ2V4cCc7XHJcbmltcG9ydCBGdW5jTWFzayBmcm9tICcuL21hc2tzL2Z1bmMnO1xyXG5pbXBvcnQgUGF0dGVybk1hc2sgZnJvbSAnLi9tYXNrcy9wYXR0ZXJuJztcclxuaW1wb3J0IFBpcGVNYXNrIGZyb20gJy4vbWFza3MvcGlwZSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHRcclxuZnVuY3Rpb24gSU1hc2sgKGVsLCBvcHRzPXt9KSB7XHJcbiAgdmFyIG1hc2sgPSBJTWFzay5NYXNrRmFjdG9yeShlbCwgb3B0cyk7XHJcbiAgbWFzay5iaW5kRXZlbnRzKCk7XHJcbiAgLy8gcmVmcmVzaFxyXG4gIG1hc2sucmF3VmFsdWUgPSBlbC52YWx1ZTtcclxuICByZXR1cm4gbWFzaztcclxufVxyXG5cclxuSU1hc2suTWFza0ZhY3RvcnkgPSBmdW5jdGlvbiAoZWwsIG9wdHMpIHtcclxuICB2YXIgbWFzayA9IG9wdHMubWFzaztcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEJhc2VNYXNrKSByZXR1cm4gbWFzaztcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIG5ldyBSZWdFeHBNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gbmV3IEZ1bmNNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAobWFzayBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gbmV3IFBpcGVNYXNrKGVsLCBvcHRzKTtcclxuICBpZiAoaXNTdHJpbmcobWFzaykpIHJldHVybiBuZXcgUGF0dGVybk1hc2soZWwsIG9wdHMpO1xyXG4gIHJldHVybiBuZXcgQmFzZU1hc2soZWwsIG9wdHMpO1xyXG59XHJcbklNYXNrLkJhc2VNYXNrID0gQmFzZU1hc2s7XHJcbklNYXNrLkZ1bmNNYXNrID0gRnVuY01hc2s7XHJcbklNYXNrLlJlZ0V4cE1hc2sgPSBSZWdFeHBNYXNrO1xyXG5JTWFzay5QYXR0ZXJuTWFzayA9IFBhdHRlcm5NYXNrO1xyXG53aW5kb3cuSU1hc2sgPSBJTWFzaztcclxuIl0sIm5hbWVzIjpbImlzU3RyaW5nIiwic3RyIiwiU3RyaW5nIiwiY29uZm9ybSIsInJlcyIsImZhbGxiYWNrIiwiZXh0ZW5kRGV0YWlsc0FkanVzdG1lbnRzIiwiZGV0YWlscyIsImN1cnNvclBvcyIsIm9sZFNlbGVjdGlvbiIsIm9sZFZhbHVlIiwic3RhcnRDaGFuZ2VQb3MiLCJNYXRoIiwibWluIiwic3RhcnQiLCJpbnNlcnRlZENvdW50IiwicmVtb3ZlZENvdW50IiwibWF4IiwiZW5kIiwibGVuZ3RoIiwiaGVhZCIsInN1YnN0cmluZyIsInRhaWwiLCJpbnNlcnRlZCIsInN1YnN0ciIsInJlbW92ZWQiLCJCYXNlTWFzayIsImVsIiwib3B0cyIsIm1hc2siLCJfbGlzdGVuZXJzIiwiX3JlZnJlc2hpbmdDb3VudCIsIl9yYXdWYWx1ZSIsIl91bm1hc2tlZFZhbHVlIiwic2F2ZVNlbGVjdGlvbiIsImJpbmQiLCJfb25JbnB1dCIsIl9vbkRyb3AiLCJldiIsImhhbmRsZXIiLCJwdXNoIiwiaEluZGV4IiwiaW5kZXhPZiIsInNwbGljZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibGlzdGVuZXJzIiwiZm9yRWFjaCIsImwiLCJpbnB1dFZhbHVlIiwiX3NlbGVjdGlvbiIsInJhd1ZhbHVlIiwidW5tYXNrZWRWYWx1ZSIsInJlc29sdmUiLCJ1cGRhdGVFbGVtZW50IiwidmFsdWUiLCJ3YXJuIiwic2VsZWN0aW9uU3RhcnQiLCJ1bmJpbmRFdmVudHMiLCJfY2FsY1VubWFza2VkIiwiaXNDaGFuZ2VkIiwiX2N1cnNvckNoYW5naW5nIiwiY2xlYXJUaW1lb3V0IiwiX2NoYW5naW5nQ3Vyc29yUG9zIiwic2V0VGltZW91dCIsIl9maXJlQ2hhbmdlRXZlbnRzIiwiZmlyZUV2ZW50IiwicHJvY2Vzc0lucHV0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJzZWxlY3Rpb25FbmQiLCJwb3MiLCJzZXRTZWxlY3Rpb25SYW5nZSIsIlJlZ0V4cE1hc2siLCJ0ZXN0IiwiRnVuY01hc2siLCJQYXR0ZXJuTWFzayIsIl9ob2xsb3dzIiwicGxhY2Vob2xkZXIiLCJkZWZpbml0aW9ucyIsIkRFRklOSVRJT05TIiwiX2FsaWduQ3Vyc29yIiwiX2FsaWduQ3Vyc29yRnJpZW5kbHkiLCJfaW5pdGlhbGl6ZWQiLCJfZGVmaW5pdGlvbnMiLCJfY2hhckRlZnMiLCJwYXR0ZXJuIiwidW5tYXNraW5nQmxvY2siLCJvcHRpb25hbEJsb2NrIiwiaSIsImNoIiwidHlwZSIsIkRFRl9UWVBFUyIsIklOUFVUIiwiRklYRUQiLCJ1bm1hc2tpbmciLCJvcHRpb25hbCIsIl9idWlsZFJlc29sdmVycyIsIl9yZXNvbHZlcnMiLCJkZWZLZXkiLCJJTWFzayIsIk1hc2tGYWN0b3J5IiwicGxhY2Vob2xkZXJCdWZmZXIiLCJob2xsb3dzIiwic2xpY2UiLCJvdmVyZmxvdyIsImNpIiwiZGkiLCJfbWFwUG9zVG9EZWZJbmRleCIsImRlZiIsInJlc29sdmVyIiwiY2hhciIsImNocmVzIiwiX3BsYWNlaG9sZGVyIiwiZnJvbVBvcyIsImlucHV0IiwiX2lzSGlkZGVuSG9sbG93IiwiX2lzSG9sbG93IiwiZGVmSW5kZXgiLCJmaWx0ZXIiLCJoIiwiX2hvbGxvd3NCZWZvcmUiLCJsYXN0SG9sbG93SW5kZXgiLCJpbnNlcnRTdGVwcyIsInRhaWxJbnB1dCIsIl9leHRyYWN0SW5wdXQiLCJfZ2VuZXJhdGVJbnNlcnRTdGVwcyIsImlzdGVwIiwic3RlcCIsIl9hcHBlbmRUYWlsIiwidHJlcyIsInRob2xsb3dzIiwiYXBwZW5kZWQiLCJfYXBwZW5kRml4ZWRFbmQiLCJoYXNIb2xsb3dzIiwiX2FwcGVuZFBsYWNlaG9sZGVyRW5kIiwiaXNDb21wbGV0ZSIsInNob3ciLCJ1bm1hc2tlZCIsImN1cnNvckRlZkluZGV4IiwiclBvcyIsInJEZWYiLCJsUG9zIiwibERlZiIsIl9tYXBEZWZJbmRleFRvUG9zIiwicGgiLCJERUZBVUxUX1BMQUNFSE9MREVSIiwibWFwIiwiam9pbiIsImRlZnMiLCJfaW5zdGFsbERlZmluaXRpb25zIiwiX21hc2siLCJQaXBlTWFzayIsIm11bHRpcGFzcyIsIl9jb21waWxlZE1hc2tzIiwibSIsIl9waXBlIiwic3RlcFJlcyIsInRlbXBSZXMiLCJyZWR1Y2UiLCJzIiwiZCIsImJpbmRFdmVudHMiLCJwcm90b3R5cGUiLCJhcHBseSIsIlJlZ0V4cCIsIkZ1bmN0aW9uIiwiQXJyYXkiLCJ3aW5kb3ciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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"} \ No newline at end of file diff --git a/dist/imask.min.js b/dist/imask.min.js index 7b58f206..8e72e7b0 100644 --- a/dist/imask.min.js +++ b/dist/imask.min.js @@ -1,2 +1,2 @@ -!function(u,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):u.imask=e()}(this,function(){"use strict";function u(u){return"string"==typeof u||u instanceof String}function e(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return u(e)?e:e?t:n}function t(u,e){var t=e.cursorPos,n=e.oldSelection,i=e.oldValue,s=Math.min(t,n.start),o=t-s,a=Math.max(n.end-s||i.length-u.length,0),l=u.substring(0,s),h=u.substring(s+o),A=u.substr(s,o),c=u.substr(s,a);return r({startChangePos:s,head:l,tail:h,inserted:A,removed:c},e)}function n(u){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=n.MaskFactory(u,e);return t.bindEvents(),t.rawValue=u.value,t}var i=function(u,e){if(!(u instanceof e))throw new TypeError("Cannot call a class as a function")},s=function(){function u(u,e){for(var t=0;t=0&&this._listeners.splice(t,1),this}}},{key:"bindEvents",value:function(){this.el.addEventListener("keydown",this.saveSelection),this.el.addEventListener("input",this._onInput),this.el.addEventListener("drop",this._onDrop)}},{key:"unbindEvents",value:function(){this.el.removeEventListener("keydown",this.saveSelection),this.el.removeEventListener("input",this._onInput),this.el.removeEventListener("drop",this._onDrop)}},{key:"fireEvent",value:function(u){var e=this._listeners[u]||[];e.forEach(function(u){return u()})}},{key:"processInput",value:function(u,n){n=r({cursorPos:this.cursorPos,oldSelection:this._selection,oldValue:this.rawValue,oldUnmaskedValue:this.unmaskedValue},n),n=t(u,n);var i=e(this.resolve(u,n),u,this.rawValue);return this.updateElement(i,n.cursorPos),i}},{key:"saveSelection",value:function(u){this.rawValue!==this.el.value&&console.warn("Uncontrolled input change, refresh mask manually!"),this._selection={start:this.selectionStart,end:this.cursorPos}}},{key:"destroy",value:function(){this.unbindEvents(),this._listeners.length=0}},{key:"updateElement",value:function(u,e){var t=this,n=this._calcUnmasked(u),i=this.unmaskedValue!==n||this.rawValue!==u;this._unmaskedValue=n,this._rawValue=u,this.el.value!==u&&(this.el.value=u),this.cursorPos!=e&&null!=e&&(this._cursorChanging&&clearTimeout(this._cursorChanging),this._changingCursorPos=e,this._cursorChanging=setTimeout(function(){t.cursorPos=t._changingCursorPos,delete t._cursorChanging},10),this.cursorPos=e),this.saveSelection(),i&&this._fireChangeEvents()}},{key:"_fireChangeEvents",value:function(){this.fireEvent("accept")}},{key:"_onInput",value:function(u){return this._cursorChanging?void u.preventDefault():void this.processInput(this.el.value)}},{key:"_onDrop",value:function(u){u.preventDefault(),u.stopPropagation()}},{key:"resolve",value:function(u,e){return u}},{key:"_calcUnmasked",value:function(u){return u}},{key:"rawValue",get:function(){return this._rawValue},set:function(u){this.processInput(u,{cursorPos:u.length,oldSelection:{start:0,end:this.rawValue.length}})}},{key:"unmaskedValue",get:function(){return this._unmaskedValue},set:function(u){this.rawValue=u}},{key:"selectionStart",get:function(){return this.el.selectionStart}},{key:"cursorPos",get:function(){return this._cursorChanging?this._changingCursorPos:this.el.selectionEnd},set:function(u){this.el.setSelectionRange(u,u)}}]),u}(),c=function(u){function e(){return i(this,e),l(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return a(e,u),s(e,[{key:"resolve",value:function(u){return this.mask.test(u)}}]),e}(A),f=function(u){function e(){return i(this,e),l(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return a(e,u),s(e,[{key:"resolve",value:function(){return this.mask.apply(this,arguments)}}]),e}(A),F=function(u){function t(u,e){i(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,u,e));return n._hollows=[],n.placeholder=e.placeholder,n.definitions=r({},t.DEFINITIONS,e.definitions),n._alignCursor=n._alignCursor.bind(n),n._alignCursorFriendly=n._alignCursorFriendly.bind(n),n._initialized=!0,n}return a(t,u),s(t,[{key:"_alignCursorFriendly",value:function(){this.selectionStart===this.cursorPos&&this._alignCursor()}},{key:"bindEvents",value:function(){o(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"bindEvents",this).call(this),this.el.addEventListener("click",this._alignCursorFriendly)}},{key:"unbindEvents",value:function(){o(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"unbindEvents",this).call(this),this.el.removeEventListener("click",this._alignCursorFriendly)}},{key:"_installDefinitions",value:function(u){this._definitions=u,this._charDefs=[];var e=this.mask;if(e&&u){for(var n=!1,i=!1,s=0;s1&&void 0!==arguments[1]?arguments[1]:0,n="",i=0,s=this._mapPosToDefIndex(e);i=0}},{key:"_isHiddenHollow",value:function(u){return this._isHollow(u)&&this._charDefs[u]&&this._charDefs[u].optional}},{key:"_hollowsBefore",value:function(u){var e=this;return this._hollows.filter(function(t){return t=0;--c){var f,F=h(A[c],2);f=F[0],this._hollows=F[1];var D=this._appendTail(f,o),_=h(D,3),E=_[0],p=_[1],d=_[2];if(!d){var v=[E,p];l=v[0],this._hollows=v[1],n=f.length;break}}if(s&&n===l.length){var C=this._appendFixedEnd(l);n+=C.length-l.length,l=C}if(!s&&r){if(e.oldSelection.end===n)for(;;++n){var B=this._mapPosToDefIndex(n),y=this._charDefs[B];if(!y||y.type!==t.DEF_TYPES.FIXED)break}if(n===l.length){for(var B=this._mapPosToDefIndex(n-1),g=!1;B>0;--B){var y=this._charDefs[B];if(y.type===t.DEF_TYPES.INPUT){if(!this._isHollow(B))break;g=!0}}g&&(l=l.slice(0,B+1))}}return l=this._appendPlaceholderEnd(l),e.cursorPos=n,l}},{key:"_fireChangeEvents",value:function(){o(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"_fireChangeEvents",this).call(this),this.isComplete&&this.fireEvent("complete")}},{key:"_appendFixedEnd",value:function(u){for(var e=this._mapPosToDefIndex(u.length);;++e){var n=this._charDefs[e];if(!n)break;if(!this._isHiddenHollow(e)){if(n.type===t.DEF_TYPES.INPUT)break;e>=u.length&&(u+=n.char)}}return u}},{key:"_appendPlaceholderEnd",value:function(u){for(var e=this._mapPosToDefIndex(u.length);e=0;--e){var n=this._charDefs[e],i=e-1,s=this._charDefs[i];if(!this._isHiddenHollow(i)&&(!n||n.type===t.DEF_TYPES.INPUT&&this._isHollow(e)&&!this._isHiddenHollow(e))&&!this._isHollow(i)&&(u=e,!s||s.type===t.DEF_TYPES.INPUT))break}this.cursorPos=this._mapDefIndexToPos(u)}},{key:"isComplete",get:function(){var u=this;return!this._charDefs.filter(function(e,n){return e.type===t.DEF_TYPES.INPUT&&!e.optional&&u._isHollow(n)}).length}},{key:"unmaskedValue",get:function(){return this._unmaskedValue},set:function(u){this._hollows.length=0;var e,t=this._appendTail("",u),n=h(t,2);e=n[0],this._hollows=n[1],this.updateElement(this._appendPlaceholderEnd(e))}},{key:"placeholder",get:function(){return this._placeholder},set:function(u){this._placeholder=r({},t.DEFAULT_PLACEHOLDER,u),this._initialized&&(this.unmaskedValue=this.unmaskedValue)}},{key:"placeholderLabel",get:function(){var u=this;return this._charDefs.map(function(e){return e.type===t.DEF_TYPES.FIXED?e.char:e.optional?"":u._placeholder.char}).join("")}},{key:"definitions",get:function(){return this._definitions},set:function(u){this._installDefinitions(u),this._initialized&&(this.unmaskedValue=this.unmaskedValue)}},{key:"mask",get:function(){return this._mask},set:function(u){this._mask=u,this._initialized&&(this.definitions=this.definitions)}}]),t}(A);return F.DEFINITIONS={0:/\d/,a:/[\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,"*":/./},F.DEF_TYPES={INPUT:"input",FIXED:"fixed"},F.DEFAULT_PLACEHOLDER={show:"lazy",char:"_"},n.MaskFactory=function(e,t){var n=t.mask;return n instanceof A?n:n instanceof RegExp?new c(e,t):n instanceof Function?new f(e,t):u(n)?new F(e,t):new A(e,t)},n.BaseMask=A,n.FuncMask=f,n.RegExpMask=c,n.PatternMask=F,window.IMask=n,n}); +!function(u,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):u.imask=e()}(this,function(){"use strict";function u(u){return"string"==typeof u||u instanceof String}function e(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return u(e)?e:e?t:n}function t(u,e){var t=e.cursorPos,n=e.oldSelection,i=e.oldValue,s=Math.min(t,n.start),o=t-s,a=Math.max(n.end-s||i.length-u.length,0),l=u.substring(0,s),h=u.substring(s+o),c=u.substr(s,o),A=u.substr(s,a);return r({startChangePos:s,head:l,tail:h,inserted:c,removed:A},e)}function n(u){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=n.MaskFactory(u,e);return t.bindEvents(),t.rawValue=u.value,t}var i=function(u,e){if(!(u instanceof e))throw new TypeError("Cannot call a class as a function")},s=function(){function u(u,e){for(var t=0;t=0&&this._listeners.splice(t,1),this}}},{key:"bindEvents",value:function(){this.el.addEventListener("keydown",this.saveSelection),this.el.addEventListener("input",this._onInput),this.el.addEventListener("drop",this._onDrop)}},{key:"unbindEvents",value:function(){this.el.removeEventListener("keydown",this.saveSelection),this.el.removeEventListener("input",this._onInput),this.el.removeEventListener("drop",this._onDrop)}},{key:"fireEvent",value:function(u){var e=this._listeners[u]||[];e.forEach(function(u){return u()})}},{key:"processInput",value:function(u,n){n=r({cursorPos:this.cursorPos,oldSelection:this._selection,oldValue:this.rawValue,oldUnmaskedValue:this.unmaskedValue},n),n=t(u,n);var i=e(this.resolve(u,n),u,this.rawValue);return this.updateElement(i,n.cursorPos),i}},{key:"saveSelection",value:function(u){this.rawValue!==this.el.value&&console.warn("Uncontrolled input change, refresh mask manually!"),this._selection={start:this.selectionStart,end:this.cursorPos}}},{key:"destroy",value:function(){this.unbindEvents(),this._listeners.length=0}},{key:"updateElement",value:function(u,e){var t=this,n=this._calcUnmasked(u),i=this.unmaskedValue!==n||this.rawValue!==u;this._unmaskedValue=n,this._rawValue=u,this.el.value!==u&&(this.el.value=u),this.cursorPos!=e&&null!=e&&(this.cursorPos=e,this._cursorChanging&&clearTimeout(this._cursorChanging),this.cursorPos!=e&&(this._changingCursorPos=e,this._cursorChanging=setTimeout(function(){t.cursorPos=t._changingCursorPos,delete t._cursorChanging},10))),this.saveSelection(),i&&this._fireChangeEvents()}},{key:"_fireChangeEvents",value:function(){this.fireEvent("accept")}},{key:"_onInput",value:function(u){this.processInput(this.el.value)}},{key:"_onDrop",value:function(u){u.preventDefault(),u.stopPropagation()}},{key:"resolve",value:function(u,e){return u}},{key:"_calcUnmasked",value:function(u){return u}},{key:"rawValue",get:function(){return this._rawValue},set:function(u){this.processInput(u,{cursorPos:u.length,oldValue:this.rawValue,oldSelection:{start:0,end:this.rawValue.length}})}},{key:"unmaskedValue",get:function(){return this._unmaskedValue},set:function(u){this.rawValue=u}},{key:"selectionStart",get:function(){return this._cursorChanging?this._changingCursorPos:this.el.selectionStart}},{key:"cursorPos",get:function(){return this._cursorChanging?this._changingCursorPos:this.el.selectionEnd},set:function(u){this.el.setSelectionRange(u,u)}}]),u}(),A=function(u){function e(){return i(this,e),l(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return a(e,u),s(e,[{key:"resolve",value:function(u){return this.mask.test(u)}}]),e}(c),f=function(u){function e(){return i(this,e),l(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return a(e,u),s(e,[{key:"resolve",value:function(){return this.mask.apply(this,arguments)}}]),e}(c),F=function(u){function t(u,e){i(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,u,e));return n._hollows=[],n.placeholder=e.placeholder,n.definitions=r({},t.DEFINITIONS,e.definitions),n._alignCursor=n._alignCursor.bind(n),n._alignCursorFriendly=n._alignCursorFriendly.bind(n),n._initialized=!0,n}return a(t,u),s(t,[{key:"_alignCursorFriendly",value:function(){this.selectionStart===this.cursorPos&&this._alignCursor()}},{key:"bindEvents",value:function(){o(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"bindEvents",this).call(this),this.el.addEventListener("click",this._alignCursorFriendly)}},{key:"unbindEvents",value:function(){o(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"unbindEvents",this).call(this),this.el.removeEventListener("click",this._alignCursorFriendly)}},{key:"_installDefinitions",value:function(u){this._definitions=u,this._charDefs=[];var e=this.mask;if(e&&u){for(var n=!1,i=!1,s=0;s1&&void 0!==arguments[1]?arguments[1]:0,n="",i=0,s=this._mapPosToDefIndex(e);i=0}},{key:"_isHiddenHollow",value:function(u){return this._isHollow(u)&&this._charDefs[u]&&this._charDefs[u].optional}},{key:"_hollowsBefore",value:function(u){var e=this;return this._hollows.filter(function(t){return t=0;--A){var f,F=h(c[A],2);f=F[0],this._hollows=F[1];var _=this._appendTail(f,o),D=h(_,3),E=D[0],p=D[1],d=D[2];if(!d){var v=[E,p];l=v[0],this._hollows=v[1],n=f.length;break}}if(s&&n===l.length){var C=this._appendFixedEnd(l);n+=C.length-l.length,l=C}if(!s&&r){if(e.oldSelection.end===n)for(;;++n){var B=this._mapPosToDefIndex(n),y=this._charDefs[B];if(!y||y.type!==t.DEF_TYPES.FIXED)break}if(n===l.length){for(var B=this._mapPosToDefIndex(n-1),g=!1;B>0;--B){var y=this._charDefs[B];if(y.type===t.DEF_TYPES.INPUT){if(!this._isHollow(B))break;g=!0}}g&&(l=l.slice(0,B+1))}}return l=this._appendPlaceholderEnd(l),e.cursorPos=n,l}},{key:"_fireChangeEvents",value:function(){o(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"_fireChangeEvents",this).call(this),this.isComplete&&this.fireEvent("complete")}},{key:"_appendFixedEnd",value:function(u){for(var e=this._mapPosToDefIndex(u.length);;++e){var n=this._charDefs[e];if(!n)break;if(!this._isHiddenHollow(e)){if(n.type===t.DEF_TYPES.INPUT)break;e>=u.length&&(u+=n.char)}}return u}},{key:"_appendPlaceholderEnd",value:function(u){for(var e=this._mapPosToDefIndex(u.length);e=0;--e){var n=this._charDefs[e],i=e-1,s=this._charDefs[i];if(!this._isHiddenHollow(i)&&(!n||n.type===t.DEF_TYPES.INPUT&&this._isHollow(e)&&!this._isHiddenHollow(e))&&!this._isHollow(i)&&(u=e,!s||s.type===t.DEF_TYPES.INPUT))break}this.cursorPos=this._mapDefIndexToPos(u)}},{key:"isComplete",get:function(){var u=this;return!this._charDefs.filter(function(e,n){return e.type===t.DEF_TYPES.INPUT&&!e.optional&&u._isHollow(n)}).length}},{key:"unmaskedValue",get:function(){return this._unmaskedValue},set:function(u){this._hollows.length=0;var e,t=this._appendTail("",u),n=h(t,2);e=n[0],this._hollows=n[1],this.updateElement(this._appendPlaceholderEnd(e))}},{key:"placeholder",get:function(){return this._placeholder},set:function(u){this._placeholder=r({},t.DEFAULT_PLACEHOLDER,u),this._initialized&&(this.unmaskedValue=this.unmaskedValue)}},{key:"placeholderLabel",get:function(){var u=this;return this._charDefs.map(function(e){return e.type===t.DEF_TYPES.FIXED?e.char:e.optional?"":u._placeholder.char}).join("")}},{key:"definitions",get:function(){return this._definitions},set:function(u){this._installDefinitions(u),this._initialized&&(this.unmaskedValue=this.unmaskedValue)}},{key:"mask",get:function(){return this._mask},set:function(u){this._mask=u,this._initialized&&(this.definitions=this.definitions)}}]),t}(c);F.DEFINITIONS={0:/\d/,a:/[\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,"*":/./},F.DEF_TYPES={INPUT:"input",FIXED:"fixed"},F.DEFAULT_PLACEHOLDER={show:"lazy",char:"_"};var _=function(u){function e(u,t){i(this,e);var n=l(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,u,t));return n.multipass=t.multipass,n._compiledMasks=n.mask.map(function(e){return IMask.MaskFactory(u,e)}),n}return a(e,u),s(e,[{key:"resolve",value:function(u,e){var t=this._pipe(u,e);if(!this.multipass)return t;for(var n,i=e.cursorPos,s=t;n!==s;)n=s,s=this._pipe(n,{cursorPos:n.length,oldValue:n,oldSelection:{start:0,end:n.length}});return e.cursorPos=i-(t.length-n.length),n}},{key:"_pipe",value:function(u,e){return this._compiledMasks.reduce(function(u,n){var i=t(u,e),s=n.resolve(u,i);return e.cursorPos=i.cursorPos,s},u)}},{key:"bindEvents",value:function(){o(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"bindEvents",this).call(this),this._compiledMasks.forEach(function(u){u.bindEvents(),c.prototype.unbindEvents.apply(u)})}},{key:"unbindEvents",value:function(){o(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"unbindEvents",this).call(this),this._compiledMasks.forEach(function(u){return u.unbindEvents()})}}]),e}(c);return n.MaskFactory=function(e,t){var n=t.mask;return n instanceof c?n:n instanceof RegExp?new A(e,t):n instanceof Function?new f(e,t):n instanceof Array?new _(e,t):u(n)?new F(e,t):new c(e,t)},n.BaseMask=c,n.FuncMask=f,n.RegExpMask=A,n.PatternMask=F,window.IMask=n,n}); //# sourceMappingURL=imask.min.js.map diff --git a/dist/imask.min.js.map b/dist/imask.min.js.map index 1e1ac5e1..12394f04 100644 --- a/dist/imask.min.js.map +++ b/dist/imask.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["utils.js","imask.js","masks/base.js","masks/regexp.js","masks/func.js","masks/pattern.js"],"names":["isString","str","String","conform","res","fallback","arguments","length","undefined","extendDetailsAdjustments","details","cursorPos","oldSelection","oldValue","startChangePos","Math","min","start","insertedCount","removedCount","max","end","head","substring","tail","inserted","substr","removed","IMask","el","opts","mask","MaskFactory","bindEvents","rawValue","value","BaseMask","_listeners","_refreshingCount","_rawValue","_unmaskedValue","saveSelection","this","bind","_onInput","_onDrop","ev","handler","push","hIndex","indexOf","splice","addEventListener","removeEventListener","listeners","forEach","l","inputValue","_selection","unmaskedValue","resolve","updateElement","warn","selectionStart","unbindEvents","_calcUnmasked","isChanged","_cursorChanging","clearTimeout","_changingCursorPos","setTimeout","_this","_fireChangeEvents","fireEvent","preventDefault","processInput","stopPropagation","selectionEnd","pos","setSelectionRange","RegExpMask","test","FuncMask","apply","PatternMask","_hollows","placeholder","definitions","_extends","DEFINITIONS","_alignCursor","_alignCursorFriendly","_initialized","_definitions","_charDefs","pattern","unmaskingBlock","optionalBlock","i","ch","type","DEF_TYPES","INPUT","FIXED","unmasking","optional","_buildResolvers","_resolvers","defKey","placeholderBuffer","hollows","slice","overflow","ci","di","_mapPosToDefIndex","def","resolver","char","chres","_placeholder","fromPos","input","_isHiddenHollow","_isHollow","defIndex","filter","h","_this2","_hollowsBefore","lastHollowIndex","insertSteps","tailInput","_extractInput","_generateInsertSteps","istep","step","_insertSteps$istep","_appendTail","tres","_appendTail3","thollows","_ref","appended","_appendFixedEnd","hasHollows","_appendPlaceholderEnd","isComplete","show","unmasked","cursorDefIndex","rPos","rDef","lPos","lDef","_mapDefIndexToPos","_this3","_appendTail5","ph","DEFAULT_PLACEHOLDER","map","_this4","join","defs","_installDefinitions","_mask","RegExp","Function","window"],"mappings":"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","file":"imask.min.js","sourcesContent":["export\r\nfunction isString (str) {\r\n return typeof str === 'string' || str instanceof String;\r\n}\r\n\r\nexport\r\nfunction conform (res, str, fallback='') {\r\n return isString(res) ?\r\n res :\r\n res ?\r\n str :\r\n fallback;\r\n}\r\n\r\nexport\r\nfunction extendDetailsAdjustments(str, details) {\r\n var cursorPos = details.cursorPos;\r\n var oldSelection = details.oldSelection;\r\n var oldValue = details.oldValue;\r\n\r\n var startChangePos = Math.min(cursorPos, oldSelection.start);\r\n var insertedCount = cursorPos - startChangePos;\r\n // Math.max for opposite operation\r\n var removedCount = Math.max((oldSelection.end - startChangePos) ||\r\n // for Delete\r\n oldValue.length - str.length, 0);\r\n var head = str.substring(0, startChangePos);\r\n var tail = str.substring(startChangePos + insertedCount);\r\n var inserted = str.substr(startChangePos, insertedCount);\r\n var removed = str.substr(startChangePos, removedCount);\r\n\r\n return {\r\n startChangePos,\r\n head,\r\n tail,\r\n inserted,\r\n removed,\r\n ...details\r\n };\r\n}\r\n","import {isString} from './utils';\r\n\r\nimport BaseMask from './masks/base';\r\nimport RegExpMask from './masks/regexp';\r\nimport FuncMask from './masks/func';\r\nimport PatternMask from './masks/pattern';\r\n\r\n\r\nexport default\r\nfunction IMask (el, opts={}) {\r\n var mask = IMask.MaskFactory(el, opts);\r\n mask.bindEvents();\r\n // refresh\r\n mask.rawValue = el.value;\r\n return mask;\r\n}\r\n\r\nIMask.MaskFactory = function (el, opts) {\r\n var mask = opts.mask;\r\n if (mask instanceof BaseMask) return mask;\r\n if (mask instanceof RegExp) return new RegExpMask(el, opts);\r\n if (mask instanceof Function) return new FuncMask(el, opts);\r\n if (isString(mask)) return new PatternMask(el, opts);\r\n return new BaseMask(el, opts);\r\n}\r\nIMask.BaseMask = BaseMask;\r\nIMask.FuncMask = FuncMask;\r\nIMask.RegExpMask = RegExpMask;\r\nIMask.PatternMask = PatternMask;\r\nwindow.IMask = IMask;\r\n","import {conform, extendDetailsAdjustments} from '../utils';\r\n\r\n\r\nexport default\r\nclass BaseMask {\r\n constructor (el, opts) {\r\n this.el = el;\r\n this.mask = opts.mask;\r\n\r\n this._listeners = {};\r\n this._refreshingCount = 0;\r\n this._rawValue = \"\";\r\n this._unmaskedValue = \"\";\r\n\r\n this.saveSelection = this.saveSelection.bind(this);\r\n this._onInput = this._onInput.bind(this);\r\n this._onDrop = this._onDrop.bind(this);\r\n }\r\n\r\n on (ev, handler) {\r\n if (!this._listeners[ev]) this._listeners[ev] = [];\r\n this._listeners[ev].push(handler);\r\n return this;\r\n }\r\n\r\n off (ev, handler) {\r\n if (!this._listeners[ev]) return;\r\n if (!handler) {\r\n delete this._listeners[ev];\r\n return;\r\n }\r\n var hIndex = this._listeners[ev].indexOf(handler);\r\n if (hIndex >= 0) this._listeners.splice(hIndex, 1);\r\n return this;\r\n }\r\n\r\n get rawValue () {\r\n return this._rawValue;\r\n }\r\n\r\n set rawValue (str) {\r\n this.processInput(str, {\r\n cursorPos: str.length,\r\n oldSelection: {\r\n start: 0,\r\n end: this.rawValue.length\r\n },\r\n });\r\n }\r\n\r\n get unmaskedValue () {\r\n return this._unmaskedValue;\r\n }\r\n\r\n set unmaskedValue (value) {\r\n this.rawValue = value;\r\n }\r\n\r\n\r\n bindEvents () {\r\n this.el.addEventListener('keydown', this.saveSelection);\r\n this.el.addEventListener('input', this._onInput);\r\n this.el.addEventListener('drop', this._onDrop);\r\n }\r\n\r\n unbindEvents () {\r\n this.el.removeEventListener('keydown', this.saveSelection);\r\n this.el.removeEventListener('input', this._onInput);\r\n this.el.removeEventListener('drop', this._onDrop);\r\n }\r\n\r\n fireEvent (ev) {\r\n var listeners = this._listeners[ev] || [];\r\n listeners.forEach(l => l());\r\n }\r\n\r\n processInput (inputValue, details) {\r\n details = {\r\n cursorPos: this.cursorPos,\r\n oldSelection: this._selection,\r\n oldValue: this.rawValue,\r\n oldUnmaskedValue: this.unmaskedValue,\r\n ...details\r\n };\r\n\r\n details = extendDetailsAdjustments(inputValue, details);\r\n\r\n var res = conform(this.resolve(inputValue, details),\r\n inputValue,\r\n this.rawValue);\r\n\r\n this.updateElement(res, details.cursorPos);\r\n return res;\r\n }\r\n\r\n\r\n get selectionStart () {\r\n return this.el.selectionStart;\r\n }\r\n\r\n get cursorPos () {\r\n return this._cursorChanging ?\r\n this._changingCursorPos :\r\n this.el.selectionEnd;\r\n }\r\n\r\n set cursorPos (pos) {\r\n this.el.setSelectionRange(pos, pos);\r\n }\r\n\r\n saveSelection (ev) {\r\n if (this.rawValue !== this.el.value) {\r\n console.warn(\"Uncontrolled input change, refresh mask manually!\");\r\n }\r\n this._selection = {\r\n start: this.selectionStart,\r\n end: this.cursorPos\r\n };\r\n }\r\n\r\n destroy () {\r\n this.unbindEvents();\r\n this._listeners.length = 0;\r\n }\r\n\r\n updateElement (value, cursorPos) {\r\n var unmaskedValue = this._calcUnmasked(value);\r\n var isChanged = (this.unmaskedValue !== unmaskedValue ||\r\n this.rawValue !== value);\r\n\r\n this._unmaskedValue = unmaskedValue;\r\n this._rawValue = value;\r\n\r\n if (this.el.value !== value) this.el.value = value;\r\n if (this.cursorPos != cursorPos && cursorPos != null) {\r\n // also queue change cursor for some browsers\r\n if (this._cursorChanging) clearTimeout(this._cursorChanging);\r\n this._changingCursorPos = cursorPos;\r\n this._cursorChanging = setTimeout(() => {\r\n this.cursorPos = this._changingCursorPos;\r\n delete this._cursorChanging;\r\n }, 10);\r\n this.cursorPos = cursorPos;\r\n }\r\n this.saveSelection();\r\n\r\n if (isChanged) this._fireChangeEvents();\r\n }\r\n\r\n _fireChangeEvents () {\r\n this.fireEvent(\"accept\");\r\n }\r\n\r\n _onInput (ev) {\r\n if (this._cursorChanging) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n this.processInput(this.el.value);\r\n }\r\n\r\n _onDrop (ev) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n\r\n // override\r\n resolve (str, details) { return str; }\r\n\r\n _calcUnmasked (value) { return value; }\r\n}\r\n","import BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass RegExpMask extends BaseMask {\r\n resolve (str) {\r\n return this.mask.test(str);\r\n }\r\n}\r\n","import BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass FuncMask extends BaseMask {\r\n resolve (...args) {\r\n return this.mask(...args);\r\n }\r\n}\r\n","import {conform} from '../utils';\r\nimport BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass PatternMask extends BaseMask {\r\n constructor (el, opts) {\r\n super(el, opts);\r\n\r\n this._hollows = [];\r\n this.placeholder = opts.placeholder;\r\n this.definitions = {\r\n ...PatternMask.DEFINITIONS,\r\n ...opts.definitions\r\n };\r\n\r\n this._alignCursor = this._alignCursor.bind(this);\r\n this._alignCursorFriendly = this._alignCursorFriendly.bind(this);\r\n\r\n this._initialized = true;\r\n }\r\n\r\n _alignCursorFriendly () {\r\n if (this.selectionStart !== this.cursorPos) return;\r\n this._alignCursor();\r\n }\r\n\r\n bindEvents () {\r\n super.bindEvents();\r\n this.el.addEventListener('click', this._alignCursorFriendly);\r\n }\r\n\r\n unbindEvents () {\r\n super.unbindEvents();\r\n this.el.removeEventListener('click', this._alignCursorFriendly);\r\n }\r\n\r\n _installDefinitions (definitions) {\r\n this._definitions = definitions;\r\n this._charDefs = [];\r\n var pattern = this.mask;\r\n\r\n if (!pattern || !definitions) return;\r\n\r\n var unmaskingBlock = false;\r\n var optionalBlock = false;\r\n for (var i=0; i= 0;\r\n }\r\n\r\n _isHiddenHollow (defIndex) {\r\n return this._isHollow(defIndex) &&\r\n this._charDefs[defIndex] && this._charDefs[defIndex].optional;\r\n }\r\n\r\n _hollowsBefore (defIndex) {\r\n return this._hollows.filter(h => h < defIndex && this._isHiddenHollow(h));\r\n }\r\n\r\n _mapDefIndexToPos (defIndex) {\r\n return defIndex - this._hollowsBefore(defIndex).length;\r\n }\r\n\r\n _mapPosToDefIndex (pos) {\r\n var lastHollowIndex = pos;\r\n // extend contiguous\r\n while (this._isHiddenHollow(lastHollowIndex-1)) ++lastHollowIndex;\r\n\r\n return pos + this._hollowsBefore(lastHollowIndex).length;\r\n }\r\n\r\n _generateInsertSteps (head, inserted) {\r\n var res = head;\r\n var hollows = this._hollows.slice();\r\n var placeholderBuffer = '';\r\n var insertSteps = [[res, hollows.slice()]];\r\n\r\n for (var ci=0, di=this._mapPosToDefIndex(head.length); ci h < lastHollowIndex);\r\n\r\n var res = details.head;\r\n\r\n // insert available\r\n var insertSteps = this._generateInsertSteps(res, inserted);\r\n for (var istep=insertSteps.length-1; istep >= 0; --istep) {\r\n var step;\r\n [step, this._hollows] = insertSteps[istep];\r\n var [tres, thollows, overflow] = this._appendTail(step, tailInput);\r\n if (!overflow) {\r\n [res, this._hollows] = [tres, thollows];\r\n cursorPos = step.length;\r\n break;\r\n }\r\n }\r\n\r\n // if input at the end - append fixed\r\n if (inserted && cursorPos === res.length) {\r\n // append fixed at end\r\n var appended = this._appendFixedEnd(res);\r\n cursorPos += appended.length - res.length;\r\n res = appended;\r\n }\r\n\r\n if (!inserted && removedCount) {\r\n // if delete at right\r\n if (details.oldSelection.end === cursorPos) {\r\n for (;;++cursorPos) {\r\n var di=this._mapPosToDefIndex(cursorPos);\r\n var def = this._charDefs[di];\r\n if (!def || def.type !== PatternMask.DEF_TYPES.FIXED) break;\r\n }\r\n }\r\n\r\n // remove head fixed and hollows if removed at end\r\n if (cursorPos === res.length) {\r\n var di = this._mapPosToDefIndex(cursorPos-1);\r\n var hasHollows = false;\r\n for (; di > 0; --di) {\r\n var def = this._charDefs[di];\r\n if (def.type === PatternMask.DEF_TYPES.INPUT) {\r\n if (this._isHollow(di)) hasHollows = true;\r\n else break;\r\n }\r\n }\r\n if (hasHollows) res = res.slice(0, di + 1);\r\n }\r\n }\r\n\r\n // append placeholder\r\n res = this._appendPlaceholderEnd(res);\r\n details.cursorPos = cursorPos;\r\n\r\n return res;\r\n }\r\n\r\n _fireChangeEvents () {\r\n // fire 'complete' after 'accept' event\r\n super._fireChangeEvents();\r\n if (this.isComplete) this.fireEvent(\"complete\");\r\n }\r\n\r\n get isComplete () {\r\n return !this._charDefs.filter((def, di) =>\r\n def.type === PatternMask.DEF_TYPES.INPUT && !def.optional &&\r\n this._isHollow(di)).length;\r\n }\r\n\r\n _appendFixedEnd (res) {\r\n for (var di=this._mapPosToDefIndex(res.length);; ++di) {\r\n var def = this._charDefs[di];\r\n if (!def) break;\r\n\r\n if (this._isHiddenHollow(di)) continue;\r\n if (def.type === PatternMask.DEF_TYPES.INPUT) break;\r\n if (di >= res.length) res += def.char;\r\n }\r\n return res;\r\n }\r\n\r\n _appendPlaceholderEnd (res) {\r\n for (var di=this._mapPosToDefIndex(res.length); di\r\n def.type === PatternMask.DEF_TYPES.FIXED ?\r\n def.char :\r\n !def.optional ?\r\n this._placeholder.char :\r\n '').join('');\r\n }\r\n\r\n get definitions () { return this._definitions; }\r\n\r\n set definitions (defs) {\r\n this._installDefinitions(defs);\r\n if (this._initialized) this.unmaskedValue = this.unmaskedValue;\r\n }\r\n\r\n get mask () { return this._mask; }\r\n\r\n set mask (mask) {\r\n this._mask = mask;\r\n if (this._initialized) this.definitions = this.definitions;\r\n }\r\n\r\n _alignCursor () {\r\n var cursorDefIndex = this._mapPosToDefIndex(this.cursorPos);\r\n for (var rPos = cursorDefIndex; rPos >= 0; --rPos) {\r\n var rDef = this._charDefs[rPos];\r\n var lPos = rPos-1;\r\n var lDef = this._charDefs[lPos];\r\n if (this._isHiddenHollow(lPos)) continue;\r\n\r\n if ((!rDef || rDef.type === PatternMask.DEF_TYPES.INPUT && this._isHollow(rPos) && !this._isHiddenHollow(rPos)) &&\r\n !this._isHollow(lPos)) {\r\n cursorDefIndex = rPos;\r\n if (!lDef || lDef.type === PatternMask.DEF_TYPES.INPUT) break;\r\n }\r\n }\r\n this.cursorPos = this._mapDefIndexToPos(cursorDefIndex);\r\n }\r\n}\r\nPatternMask.DEFINITIONS = {\r\n '0': /\\d/,\r\n 'a': /[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/, // http://stackoverflow.com/a/22075070\r\n '*': /./\r\n};\r\nPatternMask.DEF_TYPES = {\r\n INPUT: 'input',\r\n FIXED: 'fixed'\r\n}\r\nPatternMask.DEFAULT_PLACEHOLDER = {\r\n show: 'lazy',\r\n char: '_'\r\n};\r\n"]} \ No newline at end of file +{"version":3,"sources":["utils.js","imask.js","masks/base.js","masks/regexp.js","masks/func.js","masks/pattern.js","masks/pipe.js"],"names":["isString","str","String","conform","res","fallback","arguments","length","undefined","extendDetailsAdjustments","details","cursorPos","oldSelection","oldValue","startChangePos","Math","min","start","insertedCount","removedCount","max","end","head","substring","tail","inserted","substr","removed","IMask","el","opts","mask","MaskFactory","bindEvents","rawValue","value","BaseMask","_listeners","_refreshingCount","_rawValue","_unmaskedValue","saveSelection","this","bind","_onInput","_onDrop","ev","handler","push","hIndex","indexOf","splice","addEventListener","removeEventListener","listeners","forEach","l","inputValue","_selection","unmaskedValue","resolve","updateElement","warn","selectionStart","unbindEvents","_calcUnmasked","isChanged","_cursorChanging","clearTimeout","_changingCursorPos","setTimeout","_this","_fireChangeEvents","fireEvent","processInput","preventDefault","stopPropagation","selectionEnd","pos","setSelectionRange","RegExpMask","test","FuncMask","apply","PatternMask","_hollows","placeholder","definitions","_extends","DEFINITIONS","_alignCursor","_alignCursorFriendly","_initialized","_definitions","_charDefs","pattern","unmaskingBlock","optionalBlock","i","ch","type","DEF_TYPES","INPUT","FIXED","unmasking","optional","_buildResolvers","_resolvers","defKey","placeholderBuffer","hollows","slice","overflow","ci","di","_mapPosToDefIndex","def","resolver","char","chres","_placeholder","fromPos","input","_isHiddenHollow","_isHollow","defIndex","filter","h","_this2","_hollowsBefore","lastHollowIndex","insertSteps","tailInput","_extractInput","_generateInsertSteps","istep","step","_insertSteps$istep","_appendTail","tres","_appendTail3","thollows","_ref","appended","_appendFixedEnd","hasHollows","_appendPlaceholderEnd","isComplete","show","unmasked","cursorDefIndex","rPos","rDef","lPos","lDef","_mapDefIndexToPos","_this3","_appendTail5","ph","DEFAULT_PLACEHOLDER","map","_this4","join","defs","_installDefinitions","_mask","PipeMask","multipass","_compiledMasks","m","_pipe","stepRes","tempRes","reduce","s","d","prototype","RegExp","Function","Array","window"],"mappings":"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","file":"imask.min.js","sourcesContent":["export\r\nfunction isString (str) {\r\n return typeof str === 'string' || str instanceof String;\r\n}\r\n\r\nexport\r\nfunction conform (res, str, fallback='') {\r\n return isString(res) ?\r\n res :\r\n res ?\r\n str :\r\n fallback;\r\n}\r\n\r\nexport\r\nfunction extendDetailsAdjustments(str, details) {\r\n var cursorPos = details.cursorPos;\r\n var oldSelection = details.oldSelection;\r\n var oldValue = details.oldValue;\r\n\r\n var startChangePos = Math.min(cursorPos, oldSelection.start);\r\n var insertedCount = cursorPos - startChangePos;\r\n // Math.max for opposite operation\r\n var removedCount = Math.max((oldSelection.end - startChangePos) ||\r\n // for Delete\r\n oldValue.length - str.length, 0);\r\n var head = str.substring(0, startChangePos);\r\n var tail = str.substring(startChangePos + insertedCount);\r\n var inserted = str.substr(startChangePos, insertedCount);\r\n var removed = str.substr(startChangePos, removedCount);\r\n\r\n return {\r\n startChangePos,\r\n head,\r\n tail,\r\n inserted,\r\n removed,\r\n ...details\r\n };\r\n}\r\n","import {isString} from './utils';\r\n\r\nimport BaseMask from './masks/base';\r\nimport RegExpMask from './masks/regexp';\r\nimport FuncMask from './masks/func';\r\nimport PatternMask from './masks/pattern';\r\nimport PipeMask from './masks/pipe';\r\n\r\n\r\nexport default\r\nfunction IMask (el, opts={}) {\r\n var mask = IMask.MaskFactory(el, opts);\r\n mask.bindEvents();\r\n // refresh\r\n mask.rawValue = el.value;\r\n return mask;\r\n}\r\n\r\nIMask.MaskFactory = function (el, opts) {\r\n var mask = opts.mask;\r\n if (mask instanceof BaseMask) return mask;\r\n if (mask instanceof RegExp) return new RegExpMask(el, opts);\r\n if (mask instanceof Function) return new FuncMask(el, opts);\r\n if (mask instanceof Array) return new PipeMask(el, opts);\r\n if (isString(mask)) return new PatternMask(el, opts);\r\n return new BaseMask(el, opts);\r\n}\r\nIMask.BaseMask = BaseMask;\r\nIMask.FuncMask = FuncMask;\r\nIMask.RegExpMask = RegExpMask;\r\nIMask.PatternMask = PatternMask;\r\nwindow.IMask = IMask;\r\n","import {conform, extendDetailsAdjustments} from '../utils';\r\n\r\n\r\nexport default\r\nclass BaseMask {\r\n constructor (el, opts) {\r\n this.el = el;\r\n this.mask = opts.mask;\r\n\r\n this._listeners = {};\r\n this._refreshingCount = 0;\r\n this._rawValue = \"\";\r\n this._unmaskedValue = \"\";\r\n\r\n this.saveSelection = this.saveSelection.bind(this);\r\n this._onInput = this._onInput.bind(this);\r\n this._onDrop = this._onDrop.bind(this);\r\n }\r\n\r\n on (ev, handler) {\r\n if (!this._listeners[ev]) this._listeners[ev] = [];\r\n this._listeners[ev].push(handler);\r\n return this;\r\n }\r\n\r\n off (ev, handler) {\r\n if (!this._listeners[ev]) return;\r\n if (!handler) {\r\n delete this._listeners[ev];\r\n return;\r\n }\r\n var hIndex = this._listeners[ev].indexOf(handler);\r\n if (hIndex >= 0) this._listeners.splice(hIndex, 1);\r\n return this;\r\n }\r\n\r\n get rawValue () {\r\n return this._rawValue;\r\n }\r\n\r\n set rawValue (str) {\r\n this.processInput(str, {\r\n cursorPos: str.length,\r\n oldValue: this.rawValue,\r\n oldSelection: {\r\n start: 0,\r\n end: this.rawValue.length\r\n }\r\n });\r\n }\r\n\r\n get unmaskedValue () {\r\n return this._unmaskedValue;\r\n }\r\n\r\n set unmaskedValue (value) {\r\n this.rawValue = value;\r\n }\r\n\r\n\r\n bindEvents () {\r\n this.el.addEventListener('keydown', this.saveSelection);\r\n this.el.addEventListener('input', this._onInput);\r\n this.el.addEventListener('drop', this._onDrop);\r\n }\r\n\r\n unbindEvents () {\r\n this.el.removeEventListener('keydown', this.saveSelection);\r\n this.el.removeEventListener('input', this._onInput);\r\n this.el.removeEventListener('drop', this._onDrop);\r\n }\r\n\r\n fireEvent (ev) {\r\n var listeners = this._listeners[ev] || [];\r\n listeners.forEach(l => l());\r\n }\r\n\r\n processInput (inputValue, details) {\r\n details = {\r\n cursorPos: this.cursorPos,\r\n oldSelection: this._selection,\r\n oldValue: this.rawValue,\r\n oldUnmaskedValue: this.unmaskedValue,\r\n ...details\r\n };\r\n\r\n details = extendDetailsAdjustments(inputValue, details);\r\n\r\n var res = conform(this.resolve(inputValue, details),\r\n inputValue,\r\n this.rawValue);\r\n\r\n this.updateElement(res, details.cursorPos);\r\n return res;\r\n }\r\n\r\n\r\n get selectionStart () {\r\n return this._cursorChanging ?\r\n this._changingCursorPos :\r\n\r\n this.el.selectionStart;\r\n }\r\n\r\n get cursorPos () {\r\n return this._cursorChanging ?\r\n this._changingCursorPos :\r\n\r\n this.el.selectionEnd;\r\n }\r\n\r\n set cursorPos (pos) {\r\n this.el.setSelectionRange(pos, pos);\r\n }\r\n\r\n saveSelection (ev) {\r\n if (this.rawValue !== this.el.value) {\r\n console.warn(\"Uncontrolled input change, refresh mask manually!\");\r\n }\r\n this._selection = {\r\n start: this.selectionStart,\r\n end: this.cursorPos\r\n };\r\n }\r\n\r\n destroy () {\r\n this.unbindEvents();\r\n this._listeners.length = 0;\r\n }\r\n\r\n updateElement (value, cursorPos) {\r\n var unmaskedValue = this._calcUnmasked(value);\r\n var isChanged = (this.unmaskedValue !== unmaskedValue ||\r\n this.rawValue !== value);\r\n\r\n this._unmaskedValue = unmaskedValue;\r\n this._rawValue = value;\r\n\r\n if (this.el.value !== value) this.el.value = value;\r\n if (this.cursorPos != cursorPos && cursorPos != null) {\r\n this.cursorPos = cursorPos;\r\n\r\n // also queue change cursor for mobile browsers\r\n if (this._cursorChanging) clearTimeout(this._cursorChanging);\r\n if (this.cursorPos != cursorPos) {\r\n this._changingCursorPos = cursorPos;\r\n this._cursorChanging = setTimeout(() => {\r\n this.cursorPos = this._changingCursorPos;\r\n delete this._cursorChanging;\r\n }, 10);\r\n }\r\n }\r\n this.saveSelection();\r\n\r\n if (isChanged) this._fireChangeEvents();\r\n }\r\n\r\n _fireChangeEvents () {\r\n this.fireEvent(\"accept\");\r\n }\r\n\r\n _onInput (ev) {\r\n this.processInput(this.el.value);\r\n }\r\n\r\n _onDrop (ev) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n\r\n // override\r\n resolve (str, details) { return str; }\r\n\r\n _calcUnmasked (value) { return value; }\r\n}\r\n","import BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass RegExpMask extends BaseMask {\r\n resolve (str) {\r\n return this.mask.test(str);\r\n }\r\n}\r\n","import BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass FuncMask extends BaseMask {\r\n resolve (...args) {\r\n return this.mask(...args);\r\n }\r\n}\r\n","import {conform} from '../utils';\r\nimport BaseMask from './base';\r\n\r\n\r\nexport default\r\nclass PatternMask extends BaseMask {\r\n constructor (el, opts) {\r\n super(el, opts);\r\n\r\n this._hollows = [];\r\n this.placeholder = opts.placeholder;\r\n this.definitions = {\r\n ...PatternMask.DEFINITIONS,\r\n ...opts.definitions\r\n };\r\n\r\n this._alignCursor = this._alignCursor.bind(this);\r\n this._alignCursorFriendly = this._alignCursorFriendly.bind(this);\r\n\r\n this._initialized = true;\r\n }\r\n\r\n _alignCursorFriendly () {\r\n if (this.selectionStart !== this.cursorPos) return;\r\n this._alignCursor();\r\n }\r\n\r\n bindEvents () {\r\n super.bindEvents();\r\n this.el.addEventListener('click', this._alignCursorFriendly);\r\n }\r\n\r\n unbindEvents () {\r\n super.unbindEvents();\r\n this.el.removeEventListener('click', this._alignCursorFriendly);\r\n }\r\n\r\n _installDefinitions (definitions) {\r\n this._definitions = definitions;\r\n this._charDefs = [];\r\n var pattern = this.mask;\r\n\r\n if (!pattern || !definitions) return;\r\n\r\n var unmaskingBlock = false;\r\n var optionalBlock = false;\r\n for (var i=0; i= 0;\r\n }\r\n\r\n _isHiddenHollow (defIndex) {\r\n return this._isHollow(defIndex) &&\r\n this._charDefs[defIndex] && this._charDefs[defIndex].optional;\r\n }\r\n\r\n _hollowsBefore (defIndex) {\r\n return this._hollows.filter(h => h < defIndex && this._isHiddenHollow(h));\r\n }\r\n\r\n _mapDefIndexToPos (defIndex) {\r\n return defIndex - this._hollowsBefore(defIndex).length;\r\n }\r\n\r\n _mapPosToDefIndex (pos) {\r\n var lastHollowIndex = pos;\r\n // extend contiguous\r\n while (this._isHiddenHollow(lastHollowIndex-1)) ++lastHollowIndex;\r\n\r\n return pos + this._hollowsBefore(lastHollowIndex).length;\r\n }\r\n\r\n _generateInsertSteps (head, inserted) {\r\n var res = head;\r\n var hollows = this._hollows.slice();\r\n var placeholderBuffer = '';\r\n var insertSteps = [[res, hollows.slice()]];\r\n\r\n for (var ci=0, di=this._mapPosToDefIndex(head.length); ci h < lastHollowIndex);\r\n\r\n var res = details.head;\r\n\r\n // insert available\r\n var insertSteps = this._generateInsertSteps(res, inserted);\r\n for (var istep=insertSteps.length-1; istep >= 0; --istep) {\r\n var step;\r\n [step, this._hollows] = insertSteps[istep];\r\n var [tres, thollows, overflow] = this._appendTail(step, tailInput);\r\n if (!overflow) {\r\n [res, this._hollows] = [tres, thollows];\r\n cursorPos = step.length;\r\n break;\r\n }\r\n }\r\n\r\n // if input at the end - append fixed\r\n if (inserted && cursorPos === res.length) {\r\n // append fixed at end\r\n var appended = this._appendFixedEnd(res);\r\n cursorPos += appended.length - res.length;\r\n res = appended;\r\n }\r\n\r\n if (!inserted && removedCount) {\r\n // if delete at right\r\n if (details.oldSelection.end === cursorPos) {\r\n for (;;++cursorPos) {\r\n var di=this._mapPosToDefIndex(cursorPos);\r\n var def = this._charDefs[di];\r\n if (!def || def.type !== PatternMask.DEF_TYPES.FIXED) break;\r\n }\r\n }\r\n\r\n // remove head fixed and hollows if removed at end\r\n if (cursorPos === res.length) {\r\n var di = this._mapPosToDefIndex(cursorPos-1);\r\n var hasHollows = false;\r\n for (; di > 0; --di) {\r\n var def = this._charDefs[di];\r\n if (def.type === PatternMask.DEF_TYPES.INPUT) {\r\n if (this._isHollow(di)) hasHollows = true;\r\n else break;\r\n }\r\n }\r\n if (hasHollows) res = res.slice(0, di + 1);\r\n }\r\n }\r\n\r\n // append placeholder\r\n res = this._appendPlaceholderEnd(res);\r\n details.cursorPos = cursorPos;\r\n\r\n return res;\r\n }\r\n\r\n _fireChangeEvents () {\r\n // fire 'complete' after 'accept' event\r\n super._fireChangeEvents();\r\n if (this.isComplete) this.fireEvent(\"complete\");\r\n }\r\n\r\n get isComplete () {\r\n return !this._charDefs.filter((def, di) =>\r\n def.type === PatternMask.DEF_TYPES.INPUT && !def.optional &&\r\n this._isHollow(di)).length;\r\n }\r\n\r\n _appendFixedEnd (res) {\r\n for (var di=this._mapPosToDefIndex(res.length);; ++di) {\r\n var def = this._charDefs[di];\r\n if (!def) break;\r\n\r\n if (this._isHiddenHollow(di)) continue;\r\n if (def.type === PatternMask.DEF_TYPES.INPUT) break;\r\n if (di >= res.length) res += def.char;\r\n }\r\n return res;\r\n }\r\n\r\n _appendPlaceholderEnd (res) {\r\n for (var di=this._mapPosToDefIndex(res.length); di\r\n def.type === PatternMask.DEF_TYPES.FIXED ?\r\n def.char :\r\n !def.optional ?\r\n this._placeholder.char :\r\n '').join('');\r\n }\r\n\r\n get definitions () { return this._definitions; }\r\n\r\n set definitions (defs) {\r\n this._installDefinitions(defs);\r\n if (this._initialized) this.unmaskedValue = this.unmaskedValue;\r\n }\r\n\r\n get mask () { return this._mask; }\r\n\r\n set mask (mask) {\r\n this._mask = mask;\r\n if (this._initialized) this.definitions = this.definitions;\r\n }\r\n\r\n _alignCursor () {\r\n var cursorDefIndex = this._mapPosToDefIndex(this.cursorPos);\r\n for (var rPos = cursorDefIndex; rPos >= 0; --rPos) {\r\n var rDef = this._charDefs[rPos];\r\n var lPos = rPos-1;\r\n var lDef = this._charDefs[lPos];\r\n if (this._isHiddenHollow(lPos)) continue;\r\n\r\n if ((!rDef || rDef.type === PatternMask.DEF_TYPES.INPUT && this._isHollow(rPos) && !this._isHiddenHollow(rPos)) &&\r\n !this._isHollow(lPos)) {\r\n cursorDefIndex = rPos;\r\n if (!lDef || lDef.type === PatternMask.DEF_TYPES.INPUT) break;\r\n }\r\n }\r\n this.cursorPos = this._mapDefIndexToPos(cursorDefIndex);\r\n }\r\n}\r\nPatternMask.DEFINITIONS = {\r\n '0': /\\d/,\r\n 'a': /[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/, // http://stackoverflow.com/a/22075070\r\n '*': /./\r\n};\r\nPatternMask.DEF_TYPES = {\r\n INPUT: 'input',\r\n FIXED: 'fixed'\r\n}\r\nPatternMask.DEFAULT_PLACEHOLDER = {\r\n show: 'lazy',\r\n char: '_'\r\n};\r\n","import BaseMask from './base';\r\nimport {extendDetailsAdjustments} from '../utils';\r\n\r\n\r\nexport default\r\nclass PipeMask extends BaseMask {\r\n constructor (el, opts) {\r\n super(el, opts);\r\n\r\n this.multipass = opts.multipass;\r\n\r\n this._compiledMasks = this.mask.map(m => IMask.MaskFactory(el, m));\r\n }\r\n\r\n resolve (str, details) {\r\n var res = this._pipe(str, details);\r\n if (!this.multipass) return res;\r\n\r\n var cursorPos = details.cursorPos;\r\n\r\n var stepRes;\r\n var tempRes = res;\r\n\r\n while (stepRes !== tempRes) {\r\n stepRes = tempRes;\r\n tempRes = this._pipe(stepRes, {\r\n cursorPos: stepRes.length,\r\n oldValue: stepRes,\r\n oldSelection: {\r\n start: 0,\r\n end: stepRes.length\r\n }\r\n });\r\n }\r\n\r\n details.cursorPos = cursorPos - (res.length - stepRes.length);\r\n\r\n return stepRes;\r\n }\r\n\r\n _pipe (str, details) {\r\n return this._compiledMasks.reduce((s, m) => {\r\n var d = extendDetailsAdjustments(s, details);\r\n var res = m.resolve(s, d);\r\n details.cursorPos = d.cursorPos;\r\n return res;\r\n }, str);\r\n }\r\n\r\n bindEvents () {\r\n super.bindEvents();\r\n this._compiledMasks.forEach(m => {\r\n m.bindEvents();\r\n // disable basemask events for child masks\r\n BaseMask.prototype.unbindEvents.apply(m);\r\n });\r\n }\r\n\r\n unbindEvents () {\r\n super.unbindEvents();\r\n this._compiledMasks.forEach(m => m.unbindEvents());\r\n }\r\n}\r\n"]} \ No newline at end of file diff --git a/src/imask.js b/src/imask.js index 82cacc69..913947b8 100644 --- a/src/imask.js +++ b/src/imask.js @@ -4,6 +4,7 @@ import BaseMask from './masks/base'; import RegExpMask from './masks/regexp'; import FuncMask from './masks/func'; import PatternMask from './masks/pattern'; +import PipeMask from './masks/pipe'; export default @@ -20,6 +21,7 @@ IMask.MaskFactory = function (el, opts) { if (mask instanceof BaseMask) return mask; if (mask instanceof RegExp) return new RegExpMask(el, opts); if (mask instanceof Function) return new FuncMask(el, opts); + if (mask instanceof Array) return new PipeMask(el, opts); if (isString(mask)) return new PatternMask(el, opts); return new BaseMask(el, opts); } diff --git a/src/masks/base.js b/src/masks/base.js index d2c925f4..7c05885c 100644 --- a/src/masks/base.js +++ b/src/masks/base.js @@ -41,10 +41,11 @@ class BaseMask { set rawValue (str) { this.processInput(str, { cursorPos: str.length, + oldValue: this.rawValue, oldSelection: { start: 0, end: this.rawValue.length - }, + } }); } @@ -95,12 +96,16 @@ class BaseMask { get selectionStart () { - return this.el.selectionStart; + return this._cursorChanging ? + this._changingCursorPos : + + this.el.selectionStart; } get cursorPos () { return this._cursorChanging ? this._changingCursorPos : + this.el.selectionEnd; } @@ -133,14 +138,17 @@ class BaseMask { if (this.el.value !== value) this.el.value = value; if (this.cursorPos != cursorPos && cursorPos != null) { - // also queue change cursor for some browsers - if (this._cursorChanging) clearTimeout(this._cursorChanging); - this._changingCursorPos = cursorPos; - this._cursorChanging = setTimeout(() => { - this.cursorPos = this._changingCursorPos; - delete this._cursorChanging; - }, 10); this.cursorPos = cursorPos; + + // also queue change cursor for mobile browsers + if (this._cursorChanging) clearTimeout(this._cursorChanging); + if (this.cursorPos != cursorPos) { + this._changingCursorPos = cursorPos; + this._cursorChanging = setTimeout(() => { + this.cursorPos = this._changingCursorPos; + delete this._cursorChanging; + }, 10); + } } this.saveSelection(); @@ -152,10 +160,6 @@ class BaseMask { } _onInput (ev) { - if (this._cursorChanging) { - ev.preventDefault(); - return; - } this.processInput(this.el.value); } diff --git a/src/masks/pipe.js b/src/masks/pipe.js new file mode 100644 index 00000000..eced8312 --- /dev/null +++ b/src/masks/pipe.js @@ -0,0 +1,63 @@ +import BaseMask from './base'; +import {extendDetailsAdjustments} from '../utils'; + + +export default +class PipeMask extends BaseMask { + constructor (el, opts) { + super(el, opts); + + this.multipass = opts.multipass; + + this._compiledMasks = this.mask.map(m => IMask.MaskFactory(el, m)); + } + + resolve (str, details) { + var res = this._pipe(str, details); + if (!this.multipass) return res; + + var cursorPos = details.cursorPos; + + var stepRes; + var tempRes = res; + + while (stepRes !== tempRes) { + stepRes = tempRes; + tempRes = this._pipe(stepRes, { + cursorPos: stepRes.length, + oldValue: stepRes, + oldSelection: { + start: 0, + end: stepRes.length + } + }); + } + + details.cursorPos = cursorPos - (res.length - stepRes.length); + + return stepRes; + } + + _pipe (str, details) { + return this._compiledMasks.reduce((s, m) => { + var d = extendDetailsAdjustments(s, details); + var res = m.resolve(s, d); + details.cursorPos = d.cursorPos; + return res; + }, str); + } + + bindEvents () { + super.bindEvents(); + this._compiledMasks.forEach(m => { + m.bindEvents(); + // disable basemask events for child masks + BaseMask.prototype.unbindEvents.apply(m); + }); + } + + unbindEvents () { + super.unbindEvents(); + this._compiledMasks.forEach(m => m.unbindEvents()); + } +}