UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

507 lines 61.8 kB
import { KeyEvent } from '../../core/enums/key-events'; import { Subject } from 'rxjs'; export class InputMask { constructor(element, renderer, maskValue) { this.renderer = renderer; // Desativa a mascara dos Input preenchendo com Underline ( _ ) this.maskGuides = false; this.addNinthDigit = false; this.shiftStart = ''; this.maskSpecialCharacters = ['/', '(', ')', '.', ':', '-', ' ', '+']; this.maskAwaliablePatterns = { '0': /\d/, '9': /\d/, 'H': /[0-1-2]/, 'h': /[0-9]/, 'M': /[0-5]/, 'm': /[0-9]/, 'A': /[a-zA-Z]/, }; this.tlInput = element; this.input = element.input; this.setMaskExpression(maskValue); this.initializeMask(); this.complete = new Subject(); } setMaskExpression(value) { if (!value) { return; } if (typeof value === 'string') { this.maskExpression = value; return; } if (value['guides'] === false) { this.maskGuides = value['guides']; } if (value['addNinthDigit']) { this.addNinthDigit = value['addNinthDigit']; } this.literalChar = value['withLiteralChar']; this.valueUppercase = value['uppercase']; this.maskExpression = value['mask']; } get value() { return this.input.nativeElement.value; } set value(value) { this.input.nativeElement.value = value; } initializeMask() { this.initializeOnFocus(); this.generateMaskGuideExpression(); this.applyMaskOnInit(); this.setPlaceholder(); this.setValidation(); this.onKeyPressInputListener(); this.onMouseUpInputListener(); this.onKeyDownInputListener(); this.onPastListener(); } onPastListener() { this.renderer.listen(this.input.nativeElement, 'paste', ($event) => { const clipboardData = $event.clipboardData || window['clipboardData']; let value = clipboardData .getData('text') .replace(/ /g, '') .replace(/[^\w\s]/gi, ''); value = this.handleAddNinthDigit(value); this.applyMask(value, false); }); } handleAddNinthDigit(value) { if (this.addNinthDigit) { if (value.length <= 10) { value = value.slice(0, 2) + '9' + value.slice(2); } } return value; } onKeyPressInputListener() { this.renderer.listen(this.input.nativeElement, 'keypress', $event => { this.handleKeypress($event); this.updateModel(); this.onComplete(); }); } onMouseUpInputListener() { this.renderer.listen(this.input.nativeElement, 'mouseup', $event => { $event.stopPropagation(); this.getPosition(); }); } onKeyDownInputListener() { this.renderer.listen(this.input.nativeElement, 'keydown', $event => { switch ($event.code) { case KeyEvent.BACKSPACE: this.handleBackspace($event); break; case KeyEvent.DELETE: this.handleDelete($event); break; case KeyEvent.ARROWRIGHT: this.handleArrowRight($event); break; case KeyEvent.ARROWLEFT: this.handleArrowLeft($event); break; case KeyEvent.HOME: this.handleHome($event); break; case KeyEvent.END: this.handleEnd($event); break; case 'KeyA': this.handleSelectAll($event); break; } }); } isDateString(x) { return !isNaN(Date.parse(x)); } applyMaskOnInit() { setTimeout(() => { if (this.value !== this.maskGuideExpression) { if (this.value.length > 0) { if (this.isDateString(this.value)) { return; } this.value = this.cleanValue(this.value); this.setValueOnInitialize(); this.applyGuides(); this.applyMask(); } } }, 10); } getPosition() { this.startPosition = this.input.nativeElement.selectionStart; this.endPosition = this.input.nativeElement.selectionEnd; } initializeOnFocus() { this.renderer.listen(this.input.nativeElement, 'focus', () => { this.onFocus(); }); this.renderer.listen(this.input.nativeElement, 'focusout', () => { this.handleNotMath(); }); } onFocus() { this.applyGuides(); setTimeout(() => { if (!this.isTextLengthMatchWithExpressionLength()) { this.setPosition(0); } else { this.setPosition(0, this.value.length); } }, 0); } handleNotMath() { if (!this.isTextLengthMatchWithExpressionLength()) { this.value = ''; this.updateModel(); this.tlInput.value = ''; } } handleBackspace(event) { const value = this.value; const start = this.input.nativeElement.selectionStart; const endPosition = this.input.nativeElement.selectionEnd; const valueArray = value.split(''); this.getPosition(); if (this.hasTextSelected(this.startPosition, this.endPosition)) { event.preventDefault(); this.deleteTextOnKeyPress(valueArray, this.startPosition, this.endPosition); return; } if (this.maskGuides) { event.preventDefault(); if (this.isCharBeforeEqualMaskGuide(value, endPosition)) { this.jumpCharMask(start, endPosition); } else { this.deleteTextOnKeyPress(valueArray, start, endPosition); } } this.updateModel(); this.onComplete(); } handleDelete(event) { const valueArray = this.value.split(''); const self = this; this.getPosition(); event.preventDefault(); if (this.maskGuides) { if (this.hasTextSelected(this.startPosition, this.endPosition)) { this.deleteTextOnKeyPress(valueArray, this.startPosition, this.endPosition); } else { this.value = this.deleteCharOnDeleteKey(valueArray); this.setPosition(self.endPosition); } } this.updateModel(); this.onComplete(); } handleKeypress(event) { const charInputted = event.key; let inputArray = this.value.split(''); if (event.key === 'Enter') { return; } if (this.hasTextSelected(this.startPosition, this.endPosition)) { this.deleteTextOnKeyPress(inputArray, this.startPosition, this.endPosition); this.setPosition(this.startPosition); inputArray = this.value.split(''); } if (this.maskGuides) { this.getPosition(); this.replaceValidChar(charInputted, this.getCursorPosition(this.endPosition), inputArray); event.preventDefault(); } else { this.applyMask(charInputted); event.preventDefault(); } } handleArrowRight(event) { this.getPosition(); if (event.shiftKey) { this.setShiftKey('Right'); event.preventDefault(); if (this.shiftStart === 'Left') { this.setPosition(this.startPosition + 1, this.endPosition); } else { this.setPosition(this.startPosition, this.endPosition + 1); } } } handleArrowLeft(event) { this.getPosition(); if (event.shiftKey) { this.setShiftKey('Left'); event.preventDefault(); if (this.shiftStart === 'Right') { this.setPosition(this.startPosition, this.endPosition - 1); } else { if (this.startPosition !== 0) { this.setPosition(this.startPosition - 1, this.endPosition); } } } } handleHome(event) { event.preventDefault(); this.getPosition(); if (event.shiftKey) { this.setShiftKey('Left'); this.setPosition(0, this.endPosition); } else { this.setPosition(0); } } handleEnd(event) { event.preventDefault(); this.getPosition(); if (event.shiftKey) { this.setShiftKey('Right'); this.setPosition(this.startPosition, this.value.length); } else { this.setPosition(this.value.length); } } handleSelectAll(event) { if (event.ctrlKey) { this.setPosition(0, this.value.length); } } setShiftKey(value) { if (this.startPosition === this.endPosition) { this.shiftStart = ''; } if (this.shiftStart === '') { this.shiftStart = value; } } applyMask(charInputted, utilizeOriginal = true) { let cursor = 0; let result = ''; if (charInputted !== undefined) { this.value += charInputted; } const inputArray = utilizeOriginal ? this.value.split('') : charInputted.split(''); for (let i = 0, inputSymbol = inputArray[0]; i < inputArray.length; i++, inputSymbol = inputArray[i]) { if (result.length === this.maskExpression.length) { break; } if (this.isValidSymbolMask(inputSymbol, this.maskExpression[cursor])) { result += inputSymbol; cursor++; } else if (this.maskSpecialCharacters.indexOf(this.maskExpression[cursor]) !== -1) { result += this.maskExpression[cursor]; cursor++; i--; } else if (this.maskExpression[cursor] === '9') { cursor++; i--; } } this.value = result; this.updateModel(); this.onComplete(); } deleteTextOnKeyPress(valueArray, startPosition, endPosition) { if (this.hasTextSelected(startPosition, endPosition)) { this.value = this.deleteTextSelected(valueArray, startPosition, endPosition); this.setPosition(startPosition, startPosition); } else { this.value = this.deleteCharOnBackspaceKey(valueArray, endPosition); this.setPosition(startPosition - 1, endPosition - 1); } } deleteTextSelected(valueArray, startPosition, endPosition) { const self = this; let valueResult = ''; valueArray.forEach(function (myValue, index) { if (index >= startPosition && index < endPosition && self.maskGuides && self.maskSpecialCharacters.indexOf(index) < 0) { valueResult = valueResult + self.maskGuideExpression[index]; } else if (index >= startPosition && index < endPosition && self.maskSpecialCharacters.indexOf(index) < 0) { valueResult = valueResult + ''; } else { valueResult = valueResult + myValue; } }); return valueResult; } deleteCharOnBackspaceKey(valueArray, endPosition) { const self = this; let valueResult = ''; valueArray.forEach(function (myValue, index) { if (index === endPosition - 1) { valueResult = valueResult + self.maskGuideExpression[endPosition - 1]; } else { valueResult = valueResult + myValue; } }); return valueResult; } deleteCharOnDeleteKey(valueArray) { const self = this; valueArray.forEach(function (value, index, array) { if (index === self.endPosition) { array[index] = self.maskGuideExpression[self.endPosition]; } }); return String(valueArray).replace(/,/gi, ''); } replaceUnderscoreForChar(valueArray, charInputted, cursorEnd) { if (valueArray.length === 0) { valueArray = [...this.maskGuideExpression]; } if (this.maskSpecialCharacters.indexOf(this.maskExpression[cursorEnd]) >= 0) { cursorEnd++; } valueArray.forEach(function (value, index, array) { if (index === cursorEnd) { array[index] = charInputted; } }); return valueArray.toString().replace(/,/gi, ''); } getCursorPosition(endPosition) { let cursor = endPosition; while (this.maskExpression.length - 1 > cursor) { if (this.maskSpecialCharacters.indexOf(this.maskExpression[cursor]) >= 0) { cursor++; this.setPosition(cursor); } else { break; } } return cursor; } replaceValidChar(charInputted, cursor, inputArray) { if (this.isValidSymbolMask(charInputted, this.maskExpression[cursor]) && this.validateHourMatch(charInputted, this.maskExpression[cursor])) { this.value = this.replaceUnderscoreForChar(inputArray, charInputted, cursor); this.setPosition(cursor + 1); } } onComplete() { if (this.isTextLengthMatchWithExpressionLength()) { this.tlInput.value = this.value; this.complete.next(true); } } isTextLengthMatchWithExpressionLength() { return (this.removeUnderscore(this.maskExpression).length === this.removeUnderscore(this.value).length); } isValidSymbolMask(inputSymbol, maskSymbolChar) { if (this.maskSpecialCharacters.indexOf(inputSymbol) >= 0) { return false; } return (inputSymbol === maskSymbolChar || this.maskAwaliablePatterns[maskSymbolChar]) && (this.maskAwaliablePatterns[maskSymbolChar].test(inputSymbol)); } validateHourMatch(inputSymbol, maskSymbolChar) { if (maskSymbolChar !== 'h') { return true; } if (Number(this.value[0]) < 2) { return true; } return maskSymbolChar === 'h' && Number(inputSymbol) <= 3; } updateModel() { const endPosition = this.input.nativeElement.selectionEnd; if (this.valueUppercase) { this.value = this.value.toUpperCase(); } this.setModelValue(); this.setPosition(endPosition); } setModelValue() { setTimeout(() => { this.tlInput.value = this.value; }, 0); } setValidation() { this.input.nativeElement.maxLength = this.maskExpression.length; this.input.nativeElement.minLength = this.maskExpression.length; } applyGuides() { const self = this; if (this.maskGuides) { setTimeout(function () { if (self.input.nativeElement.value.length === 0) { self.input.nativeElement.value = self.maskGuideExpression; } }, 1); } } generateMaskGuideExpression() { let mask = this.maskExpression; mask = mask.replace(/9/gi, '_'); mask = mask.replace(/0/gi, '_'); mask = mask.replace(/A/gi, '_'); mask = mask.replace(/H/gi, '_'); mask = mask.replace(/h/gi, '_'); mask = mask.replace(/M/gi, '_'); mask = mask.replace(/m/gi, '_'); return this.maskGuideExpression = mask; } clearMask(value) { if (!(this.literalChar)) { return this.cleanValue(value); } return this.removeUnderscore(value); } jumpCharMask(startPosition, endPosition) { if (this.isFirstPosition(startPosition)) { this.setPosition(startPosition - 1, endPosition - 1); } } setPosition(startPosition, endPosition) { if (endPosition === undefined) { endPosition = startPosition; } this.input.nativeElement.setSelectionRange(startPosition, endPosition); this.getPosition(); } isCharBeforeEqualMaskGuide(value, position) { return value[position - 1] === this.maskGuideExpression[position - 1]; } isFirstPosition(startPosition) { return startPosition > 0; } hasTextSelected(startPosition, endPosition) { return startPosition !== endPosition; } removeUnderscore(value) { return value.replace(/_/gi, ''); } setPlaceholder() { this.input.nativeElement.placeholder = this.maskExpression; } setValueOnInitialize() { this._value = this.value; } cleanValue(value) { return value.replace(/[^\d]+/g, ''); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbWFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2lucHV0L2NvcmUvaW5wdXQtbWFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixNQUFNLE9BQU8sU0FBUztJQXlDcEIsWUFBYSxPQUFPLEVBQVUsUUFBbUIsRUFBRSxTQUFTO1FBQTlCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFyQ2pELCtEQUErRDtRQUN2RCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRW5CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBY3RCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFNaEIsMEJBQXFCLEdBQWEsQ0FBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFFLENBQUM7UUFJN0UsMEJBQXFCLEdBQThCO1lBQ3pELEdBQUcsRUFBRSxJQUFJO1lBQ1QsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxPQUFPO1lBQ1osR0FBRyxFQUFFLE9BQU87WUFDWixHQUFHLEVBQUUsT0FBTztZQUNaLEdBQUcsRUFBRSxVQUFVO1NBQ2hCLENBQUM7UUFHQSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFFLFNBQVMsQ0FBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENB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QztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0QsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVPLFVBQVUsQ0FBRSxLQUFLO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBRSxTQUFTLEVBQUUsRUFBRSxDQUFFLENBQUM7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVuZGVyZXIyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgS2V5RXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2tleS1ldmVudHMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgY2xhc3MgSW5wdXRNYXNrIHtcblxuICBwcml2YXRlIHRsSW5wdXQ7XG5cbiAgLy8gRGVzYXRpdmEgYSBtYXNjYXJhIGRvcyBJbnB1dCBwcmVlbmNoZW5kbyBjb20gVW5kZXJsaW5lICggXyApXG4gIHByaXZhdGUgbWFza0d1aWRlcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgYWRkTmludGhEaWdpdCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgdmFsdWVVcHBlcmNhc2U7XG5cbiAgcHJpdmF0ZSBsaXRlcmFsQ2hhcjtcblxuICBwcml2YXRlIF92YWx1ZTtcblxuICBwcml2YXRlIGlucHV0O1xuXG4gIHByaXZhdGUgc3RhcnRQb3NpdGlvbjogbnVtYmVyO1xuXG4gIHByaXZhdGUgZW5kUG9zaXRpb246IG51bWJlcjtcblxuICBwcml2YXRlIHNoaWZ0U3RhcnQgPSAnJztcblxuICBwcml2YXRlIG1hc2tFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBtYXNrR3VpZGVFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBtYXNrU3BlY2lhbENoYXJhY3RlcnM6IHN0cmluZ1tdID0gWyAnLycsICcoJywgJyknLCAnLicsICc6JywgJy0nLCAnICcsICcrJyBdO1xuXG4gIHB1YmxpYyBjb21wbGV0ZTogU3ViamVjdDxib29sZWFuPjtcblxuICBwcml2YXRlIG1hc2tBd2FsaWFibGVQYXR0ZXJuczogeyBba2V5OiBzdHJpbmddOiBSZWdFeHAgfSA9IHtcbiAgICAnMCc6IC9cXGQvLFxuICAgICc5JzogL1xcZC8sXG4gICAgJ0gnOiAvWzAtMS0yXS8sXG4gICAgJ2gnOiAvWzAtOV0vLFxuICAgICdNJzogL1swLTVdLyxcbiAgICAnbSc6IC9bMC05XS8sXG4gICAgJ0EnOiAvW2EtekEtWl0vLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCBlbGVtZW50LCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIG1hc2tWYWx1ZSApIHtcbiAgICB0aGlzLnRsSW5wdXQgPSBlbGVtZW50O1xuICAgIHRoaXMuaW5wdXQgPSBlbGVtZW50LmlucHV0O1xuICAgIHRoaXMuc2V0TWFza0V4cHJlc3Npb24oIG1hc2tWYWx1ZSApO1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1hc2soKTtcbiAgICB0aGlzLmNvbXBsZXRlID0gbmV3IFN1YmplY3QoKTtcbiAgfVxuXG4gIHNldE1hc2tFeHByZXNzaW9uKCB2YWx1ZSApIHtcbiAgICBpZiAoICF2YWx1ZSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkge1xuICAgICAgdGhpcy5tYXNrRXhwcmVzc2lvbiA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIHZhbHVlWyAnZ3VpZGVzJyBdID09PSBmYWxzZSApIHtcbiAgICAgIHRoaXMubWFza0d1aWRlcyA9IHZhbHVlWyAnZ3VpZGVzJyBdO1xuICAgIH1cbiAgICBpZiAoIHZhbHVlWyAnYWRkTmludGhEaWdpdCcgXSApIHtcbiAgICAgIHRoaXMuYWRkTmludGhEaWdpdCA9IHZhbHVlWyAnYWRkTmludGhEaWdpdCcgXTtcbiAgICB9XG4gICAgdGhpcy5saXRlcmFsQ2hhciA9IHZhbHVlWyAnd2l0aExpdGVyYWxDaGFyJyBdO1xuICAgIHRoaXMudmFsdWVVcHBlcmNhc2UgPSB2YWx1ZVsgJ3VwcGVyY2FzZScgXTtcbiAgICB0aGlzLm1hc2tFeHByZXNzaW9uID0gdmFsdWVbICdtYXNrJyBdO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUoIHZhbHVlICkge1xuICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZU1hc2soKSB7XG4gICAgdGhpcy5pbml0aWFsaXplT25Gb2N1cygpO1xuICAgIHRoaXMuZ2VuZXJhdGVNYXNrR3VpZGVFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5hcHBseU1hc2tPbkluaXQoKTtcblxuICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcbiAgICB0aGlzLnNldFZhbGlkYXRpb24oKTtcblxuICAgIHRoaXMub25LZXlQcmVzc0lucHV0TGlzdGVuZXIoKTtcbiAgICB0aGlzLm9uTW91c2VVcElucHV0TGlzdGVuZXIoKTtcbiAgICB0aGlzLm9uS2V5RG93bklucHV0TGlzdGVuZXIoKTtcbiAgICB0aGlzLm9uUGFzdExpc3RlbmVyKCk7XG4gIH1cblxuICBvblBhc3RMaXN0ZW5lcigpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbiggdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAncGFzdGUnLCAoJGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9ICRldmVudC5jbGlwYm9hcmREYXRhIHx8IHdpbmRvd1snY2xpcGJvYXJkRGF0YSddO1xuICAgICAgbGV0IHZhbHVlID0gY2xpcGJvYXJkRGF0YVxuICAgICAgICAuZ2V0RGF0YSgndGV4dCcpXG4gICAgICAgIC5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvW15cXHdcXHNdL2dpLCAnJyk7XG4gICAgICB2YWx1ZSA9IHRoaXMuaGFuZGxlQWRkTmludGhEaWdpdCh2YWx1ZSk7XG4gICAgICB0aGlzLmFwcGx5TWFzayggdmFsdWUsIGZhbHNlICk7XG4gICAgfSApO1xuICB9XG5cbiAgaGFuZGxlQWRkTmludGhEaWdpdCggdmFsdWUgKSB7XG4gICAgaWYgKCB0aGlzLmFkZE5pbnRoRGlnaXQgKSB7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoIDw9IDEwICkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDIpICsgJzknICsgdmFsdWUuc2xpY2UoMik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIG9uS2V5UHJlc3NJbnB1dExpc3RlbmVyKCkge1xuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdrZXlwcmVzcycsICRldmVudCA9PiB7XG4gICAgICB0aGlzLmhhbmRsZUtleXByZXNzKCAkZXZlbnQgKTtcbiAgICAgIHRoaXMudXBkYXRlTW9kZWwoKTtcbiAgICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICAgIH0gKTtcbiAgfVxuXG4gIG9uTW91c2VVcElucHV0TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ21vdXNldXAnLCAkZXZlbnQgPT4ge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAgIH0gKTtcbiAgfVxuXG4gIG9uS2V5RG93bklucHV0TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ2tleWRvd24nLCAkZXZlbnQgPT4ge1xuICAgICAgc3dpdGNoICggJGV2ZW50LmNvZGUgKSB7XG4gICAgICAgIGNhc2UgS2V5RXZlbnQuQkFDS1NQQUNFOlxuICAgICAgICAgIHRoaXMuaGFuZGxlQmFja3NwYWNlKCAkZXZlbnQgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5ERUxFVEU6XG4gICAgICAgICAgdGhpcy5oYW5kbGVEZWxldGUoICRldmVudCApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUV2ZW50LkFSUk9XUklHSFQ6XG4gICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd1JpZ2h0KCAkZXZlbnQgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5BUlJPV0xFRlQ6XG4gICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0xlZnQoICRldmVudCApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUV2ZW50LkhPTUU6XG4gICAgICAgICAgdGhpcy5oYW5kbGVIb21lKCAkZXZlbnQgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5FTkQ6XG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmQoICRldmVudCApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdLZXlBJzpcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdEFsbCggJGV2ZW50ICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSApO1xuICB9XG5cbiAgaXNEYXRlU3RyaW5nKCB4ICkge1xuICAgIHJldHVybiAhaXNOYU4oIERhdGUucGFyc2UoIHggKSApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseU1hc2tPbkluaXQoKSB7XG4gICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgaWYgKCB0aGlzLnZhbHVlICE9PSB0aGlzLm1hc2tHdWlkZUV4cHJlc3Npb24gKSB7XG4gICAgICAgIGlmICggdGhpcy52YWx1ZS5sZW5ndGggPiAwICkge1xuICAgICAgICAgIGlmICh0aGlzLmlzRGF0ZVN0cmluZyh0aGlzLnZhbHVlICkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2xlYW5WYWx1ZSggdGhpcy52YWx1ZSApO1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWVPbkluaXRpYWxpemUoKTtcbiAgICAgICAgICB0aGlzLmFwcGx5R3VpZGVzKCk7XG4gICAgICAgICAgdGhpcy5hcHBseU1hc2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDEwICk7XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICB0aGlzLmVuZFBvc2l0aW9uID0gdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZU9uRm9jdXMoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgdGhpcy5vbkZvY3VzKCk7XG4gICAgfSApO1xuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdmb2N1c291dCcsICgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlTm90TWF0aCgpO1xuICAgIH0gKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Gb2N1cygpIHtcbiAgICB0aGlzLmFwcGx5R3VpZGVzKCk7XG4gICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgaWYgKCAhdGhpcy5pc1RleHRMZW5ndGhNYXRjaFdpdGhFeHByZXNzaW9uTGVuZ3RoKCkgKSB7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oIDAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oIDAsIHRoaXMudmFsdWUubGVuZ3RoICk7XG4gICAgICB9XG4gICAgfSwgMCApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb3RNYXRoKCkge1xuICAgIGlmICggIXRoaXMuaXNUZXh0TGVuZ3RoTWF0Y2hXaXRoRXhwcmVzc2lvbkxlbmd0aCgpICkge1xuICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICAgICAgdGhpcy50bElucHV0LnZhbHVlID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCYWNrc3BhY2UoIGV2ZW50ICkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQ7XG4gICAgY29uc3QgdmFsdWVBcnJheSA9IHZhbHVlLnNwbGl0KCAnJyApO1xuICAgIHRoaXMuZ2V0UG9zaXRpb24oKTtcblxuICAgIGlmICggdGhpcy5oYXNUZXh0U2VsZWN0ZWQoIHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5lbmRQb3NpdGlvbiApICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVsZXRlVGV4dE9uS2V5UHJlc3MoIHZhbHVlQXJyYXksIHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5lbmRQb3NpdGlvbiApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIHRoaXMubWFza0d1aWRlcyApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoIHRoaXMuaXNDaGFyQmVmb3JlRXF1YWxNYXNrR3VpZGUoIHZhbHVlLCBlbmRQb3NpdGlvbiApICkge1xuICAgICAgICB0aGlzLmp1bXBDaGFyTWFzayggc3RhcnQsIGVuZFBvc2l0aW9uICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZVRleHRPbktleVByZXNzKCB2YWx1ZUFycmF5LCBzdGFydCwgZW5kUG9zaXRpb24gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGUoIGV2ZW50ICkge1xuICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLnZhbHVlLnNwbGl0KCAnJyApO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZ2V0UG9zaXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICggdGhpcy5tYXNrR3VpZGVzICkge1xuICAgICAgaWYgKCB0aGlzLmhhc1RleHRTZWxlY3RlZCggdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmVuZFBvc2l0aW9uICkgKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlVGV4dE9uS2V5UHJlc3MoIHZhbHVlQXJyYXksIHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5lbmRQb3NpdGlvbiApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVsZXRlQ2hhck9uRGVsZXRlS2V5KCB2YWx1ZUFycmF5ICk7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oIHNlbGYuZW5kUG9zaXRpb24gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlwcmVzcyggZXZlbnQ6IEtleWJvYXJkRXZlbnQgKSB7XG4gICAgY29uc3QgY2hhcklucHV0dGVkID0gZXZlbnQua2V5O1xuICAgIGxldCBpbnB1dEFycmF5ID0gdGhpcy52YWx1ZS5zcGxpdCggJycgKTtcbiAgICBpZiAoIGV2ZW50LmtleSA9PT0gJ0VudGVyJyApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCB0aGlzLmhhc1RleHRTZWxlY3RlZCggdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmVuZFBvc2l0aW9uICkgKSB7XG4gICAgICB0aGlzLmRlbGV0ZVRleHRPbktleVByZXNzKCBpbnB1dEFycmF5LCB0aGlzLnN0YXJ0UG9zaXRpb24sIHRoaXMuZW5kUG9zaXRpb24gKTtcbiAgICAgIHRoaXMuc2V0UG9zaXRpb24oIHRoaXMuc3RhcnRQb3NpdGlvbiApO1xuICAgICAgaW5wdXRBcnJheSA9IHRoaXMudmFsdWUuc3BsaXQoICcnICk7XG4gICAgfVxuICAgIGlmICggdGhpcy5tYXNrR3VpZGVzICkge1xuICAgICAgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAgICAgdGhpcy5yZXBsYWNlVmFsaWRDaGFyKCBjaGFySW5wdXR0ZWQsIHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oIHRoaXMuZW5kUG9zaXRpb24gKSwgaW5wdXRBcnJheSApO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGx5TWFzayggY2hhcklucHV0dGVkICk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyb3dSaWdodCggZXZlbnQgKSB7XG4gICAgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAgIGlmICggZXZlbnQuc2hpZnRLZXkgKSB7XG4gICAgICB0aGlzLnNldFNoaWZ0S2V5KCAnUmlnaHQnICk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKCB0aGlzLnNoaWZ0U3RhcnQgPT09ICdMZWZ0JyApIHtcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbiggdGhpcy5zdGFydFBvc2l0aW9uICsgMSwgdGhpcy5lbmRQb3NpdGlvbiApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbiggdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmVuZFBvc2l0aW9uICsgMSApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyb3dMZWZ0KCBldmVudCApIHtcbiAgICB0aGlzLmdldFBvc2l0aW9uKCk7XG4gICAgaWYgKCBldmVudC5zaGlmdEtleSApIHtcbiAgIC