UNPKG

@knora/action

Version:
289 lines 33.5 kB
import * as tslib_1 from "tslib"; import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { MatMenuTrigger } from '@angular/material'; var StringLiteralInputComponent = /** @class */ (function () { function StringLiteralInputComponent(_fb) { this._fb = _fb; this.languages = ['de', 'fr', 'it', 'en']; /** * Optional placeholder for the input field e.g. Label * * @param {string} [placeholder='Label'] */ this.placeholder = 'Label'; /** * Optional form field input type: textarea? set to true for textarea * otherwise it's a simple (short) input field * * @param {boolean} [textarea=false] */ this.textarea = false; /** * Optional form field value of type StringLiteral[] * * @param {StringLiteral[]} value */ this.value = []; /** * Optional disable the input field in case of no right to edit the field/value * * @param {boolean}: [disabled=false] */ this.disabled = false; /** * The readonly attribute specifies whether the control may be modified by the user. * * @param {boolean}: [readonly=false] */ this.readonly = false; /** * Returns (output) an array of StringLiteral on any change on the input field. * * @emits {StringLiteral[]} dataChanged */ this.dataChanged = new EventEmitter(); /** * Returns (output) true when the field was touched. This can be used to validate data, e.g. in case a value is required * * @emits {boolean} touched */ this.touched = new EventEmitter(); /** * Returns true when a user press ENTER. This can be used to submit data in the parent component. * * * @emits {boolean} enter */ this.enter = new EventEmitter(); // set selected language, if it's not defined yet if (!this.language) { if (localStorage.getItem('session') !== null) { // get language from the logged-in user profile data this.language = JSON.parse(localStorage.getItem('session')).user.lang; } else { // get default language from browser this.language = navigator.language.substr(0, 2); } } // does the defined language exists in our supported languages list? if (this.languages.indexOf(this.language) === -1) { // if not, select the first language from our list of supported languages this.language = this.languages[0]; } } StringLiteralInputComponent.prototype.ngOnInit = function () { // if (this.placeholder.length > 0) { // this.placeholder += ' (' + this.language + ')'; // } var _this = this; // reset stringLiterals if they have empty values this.resetValues(); // build the form this.form = this._fb.group({ text: new FormControl({ value: '', disabled: this.disabled }, { // updateOn: 'blur' }) }); // update values on form change this.form.valueChanges.subscribe(function (data) { return _this.onValueChanged(); }); // get value from stringLiterals var val = this.getValueFromStringLiteral(this.language); this.updateFormField(val); }; /** * @ignore * * emit data to parent on any change on the input field */ StringLiteralInputComponent.prototype.onValueChanged = function () { if (!this.form) { return; } var form = this.form; var control = form.get('text'); this.touched.emit(control && control.dirty); // if (control && control.dirty) { // console.warn('control dirty'); // } this.updateStringLiterals(this.language, this.form.controls['text'].value); this.dataChanged.emit(this.value); }; StringLiteralInputComponent.prototype.toggleAll = function () { // TODO: open/show all languages with their values }; /** * @ignore * * Set the language after selecting; This updates the array of StringLiterals: adds item with the selected language if it doesn't exist */ StringLiteralInputComponent.prototype.setLanguage = function (lang) { if (this.language === lang) { // console.warn('DO NOTHING! this language was already selected'); } else { // clean stringLIteral value for previous language, if text field is empty this.updateStringLiterals(this.language, this.form.controls['text'].value); this.language = lang; // update form field value / reset in case of no value var val = this.getValueFromStringLiteral(lang); this.updateFormField(val); } }; /** * @ignore * * Switch focus to input field after selecting a language */ StringLiteralInputComponent.prototype.switchFocus = function () { // close the menu if (!this.textarea && this.btnToSelectLanguage && this.btnToSelectLanguage.menuOpen) { this.btnToSelectLanguage.closeMenu(); } if (!this.disabled) { this.form.controls['text'].enable(); this.textInput.nativeElement.focus(); } }; /** * @ignore * * Set the value in the input field */ StringLiteralInputComponent.prototype.updateFormField = function (value) { if (!value) { value = ''; } this.form.controls['text'].setValue(value); }; /** * @ignore * * Update the array of StringLiterals depending on value / empty value add or remove item from array. */ StringLiteralInputComponent.prototype.updateStringLiterals = function (lang, value) { var index = this.value.findIndex(function (i) { return i.language === lang; }); if (index > -1 && this.value[index].value.length > 0) { // value is not empty and exists in list of stringLiterals // console.log('update existing value for ' + lang + ' on position ' + index); this.value[index].value = value; } if ((!value || value.length === 0) && index > -1) { // value is empty: delete stringLiteral item for this language // console.log('delete empty value for ' + lang + ' on position ' + index); this.value.splice(index, 1); } if (index < 0 && value) { // value doesn't exist in stringLiterals: add one // console.log('add new value (' + value + ') for ' + lang); var newValue = { value: value, language: lang }; this.value.push(newValue); } }; /** * @ignore * * In case of strange array of StringLiterals, this method will reset to a API-conform array. This means an array without empty values. */ StringLiteralInputComponent.prototype.resetValues = function () { var _this = this; var length = this.value.length; if (length > 0) { var index = length - 1; while (index >= 0) { // remove items with empty value if (!this.value[index].value.length) { this.value.splice(index, 1); } index--; } // does an item for selected lanuage exists if (this.value.findIndex(function (i) { return i.language === _this.language; }) === -1) { this.language = this.value[0].language; } } else { this.value = []; } }; /** * @ignore * * Get the value from array of StringLiterals for the selected language */ StringLiteralInputComponent.prototype.getValueFromStringLiteral = function (lang) { // console.log('existing value in', this.value); // get index for this language var index = this.value.findIndex(function (i) { return i.language === lang; }); if (this.value[index] && this.value[index].value.length > 0) { return this.value[index].value; } else { return undefined; } }; StringLiteralInputComponent.ctorParameters = function () { return [ { type: FormBuilder } ]; }; tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], StringLiteralInputComponent.prototype, "placeholder", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], StringLiteralInputComponent.prototype, "language", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], StringLiteralInputComponent.prototype, "textarea", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Array) ], StringLiteralInputComponent.prototype, "value", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], StringLiteralInputComponent.prototype, "disabled", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], StringLiteralInputComponent.prototype, "readonly", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], StringLiteralInputComponent.prototype, "dataChanged", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], StringLiteralInputComponent.prototype, "touched", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], StringLiteralInputComponent.prototype, "enter", void 0); tslib_1.__decorate([ ViewChild('textInput', { static: false }), tslib_1.__metadata("design:type", ElementRef) ], StringLiteralInputComponent.prototype, "textInput", void 0); tslib_1.__decorate([ ViewChild('btnToSelectLanguage', { static: false }), tslib_1.__metadata("design:type", MatMenuTrigger) ], StringLiteralInputComponent.prototype, "btnToSelectLanguage", void 0); StringLiteralInputComponent = tslib_1.__decorate([ Component({ selector: 'kui-string-literal-input', template: "<form [formGroup]=\"form\">\n\n <!-- default input element -->\n <mat-form-field *ngIf=\"!textarea\" class=\"string-literal short-text\">\n\n <!-- select: button to select language -->\n <button mat-button type=\"button\" matPrefix class=\"select-lang\" [matMenuTriggerFor]=\"selectLanguage\"\n #btnToSelectLanguage=\"matMenuTrigger\" (click)=\"form.controls['text'].disable()\">\n <span class=\"label\">{{language}}</span>\n <mat-icon class=\"icon\" matSuffix>keyboard_arrow_down</mat-icon>\n </button>\n\n <!-- select: menu with list of languages -->\n <mat-menu #selectLanguage=\"matMenu\">\n <button mat-menu-item type=\"button\" *ngFor=\"let lang of languages\"\n (click)=\"setLanguage(lang);switchFocus()\">\n <span [class.existing-value]=\"getValueFromStringLiteral(lang)\">{{lang}}</span>\n </button>\n <!-- TODO / QUESTION: should we support a show all button, to display values for all languages?\n <mat-divider></mat-divider>\n <button mat-menu-item type=\"button\" (click)=\"toggleAll()\">\n <span>Show values for all languages</span>\n </button>\n -->\n </mat-menu>\n\n <!-- input field-->\n <input matInput [placeholder]=\"placeholder\" [formControl]=\"form.controls['text']\" #textInput\n [readonly]=\"readonly\" (keyup.enter)=\"enter.emit(true)\">\n </mat-form-field>\n\n <!-- input element type is textarea -->\n <div *ngIf=\"textarea\" class=\"string-literal long-text\">\n <!-- button toggle group: buttons to select language -->\n <mat-button-toggle-group matPrefix #group=\"matButtonToggleGroup\" vertical class=\"string-literal-select-lang\">\n <mat-button-toggle *ngFor=\"let lang of languages\" (click)=\"setLanguage(lang);switchFocus()\"\n [checked]=\"lang === language\">\n <span [class.existing-value]=\"getValueFromStringLiteral(lang)\">{{lang}}</span>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <mat-form-field class=\"string-literal-textarea\">\n <!-- textarea -->\n <textarea matInput [placeholder]=\"placeholder\" [formControl]=\"form.controls['text']\" #textInput\n [readonly]=\"readonly\"></textarea>\n </mat-form-field>\n </div>\n\n</form>\n", styles: [".mat-form-field{width:100%!important}.existing-value{font-weight:700}"] }), tslib_1.__metadata("design:paramtypes", [FormBuilder]) ], StringLiteralInputComponent); return StringLiteralInputComponent; }()); export { StringLiteralInputComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLWxpdGVyYWwtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtub3JhL2FjdGlvbi8iLCJzb3VyY2VzIjpbImxpYi9zdHJpbmctbGl0ZXJhbC1pbnB1dC9zdHJpbmctbGl0ZXJhbC1pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFRbkQ7SUEyRUkscUNBQ1ksR0FBZ0I7UUFBaEIsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQXpFNUIsY0FBUyxHQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFL0M7Ozs7V0FJRztRQUNNLGdCQUFXLEdBQVksT0FBTyxDQUFDO1FBU3hDOzs7OztXQUtHO1FBQ00sYUFBUSxHQUFhLEtBQUssQ0FBQztRQUVwQzs7OztXQUlHO1FBQ00sVUFBSyxHQUFxQixFQUFFLENBQUM7UUFFdEM7Ozs7V0FJRztRQUNNLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEM7Ozs7V0FJRztRQUNNLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEM7Ozs7V0FJRztRQUNPLGdCQUFXLEdBQWtDLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRTNGOzs7O1dBSUc7UUFDTyxZQUFPLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdkU7Ozs7V0FJRztRQUNPLFVBQUssR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQVlqRSxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7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RDtJQU9qRjtRQUFULE1BQU0sRUFBRTswQ0FBVSxZQUFZO2dFQUF3QztJQU83RDtRQUFULE1BQU0sRUFBRTswQ0FBUSxZQUFZOzhEQUF3QztJQUUxQjtRQUExQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDOzBDQUFZLFVBQVU7a0VBQUM7SUFFWjtRQUFwRCxTQUFTLENBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7MENBQXNCLGNBQWM7NEVBQUM7SUF2RWhGLDJCQUEyQjtRQUx2QyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLCs4RUFBb0Q7O1NBRXZELENBQUM7aURBNkVtQixXQUFXO09BNUVuQiwyQkFBMkIsQ0E2UnZDO0lBQUQsa0NBQUM7Q0FBQSxBQTdSRCxJQTZSQztTQTdSWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBTdHJpbmdMaXRlcmFsIH0gZnJvbSAnQGtub3JhL2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna3VpLXN0cmluZy1saXRlcmFsLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3RyaW5nLWxpdGVyYWwtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3N0cmluZy1saXRlcmFsLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3RyaW5nTGl0ZXJhbElucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuXG4gICAgbGFuZ3VhZ2VzOiBzdHJpbmdbXSA9IFsnZGUnLCAnZnInLCAnaXQnLCAnZW4nXTtcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHBsYWNlaG9sZGVyIGZvciB0aGUgaW5wdXQgZmllbGQgZS5nLiBMYWJlbFxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBbcGxhY2Vob2xkZXI9J0xhYmVsJ11cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcj86IHN0cmluZyA9ICdMYWJlbCc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBwcmVkZWZpbmVkIChzZWxlY3RlZCkgbGFuZ3VhZ2U6IGVuLCBkZSwgaXQsIGZyLCBldGMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxhbmd1YWdlXG4gICAgICovXG4gICAgQElucHV0KCkgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBmb3JtIGZpZWxkIGlucHV0IHR5cGU6IHRleHRhcmVhPyBzZXQgdG8gdHJ1ZSBmb3IgdGV4dGFyZWFcbiAgICAgKiBvdGhlcndpc2UgaXQncyBhIHNpbXBsZSAoc2hvcnQpIGlucHV0IGZpZWxkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbdGV4dGFyZWE9ZmFsc2VdXG4gICAgICovXG4gICAgQElucHV0KCkgdGV4dGFyZWE/OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBmb3JtIGZpZWxkIHZhbHVlIG9mIHR5cGUgU3RyaW5nTGl0ZXJhbFtdXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ0xpdGVyYWxbXX0gdmFsdWVcbiAgICAgKi9cbiAgICBASW5wdXQoKSB2YWx1ZT86IFN0cmluZ0xpdGVyYWxbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgZGlzYWJsZSB0aGUgaW5wdXQgZmllbGQgaW4gY2FzZSBvZiBubyByaWdodCB0byBlZGl0IHRoZSBmaWVsZC92YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufTogW2Rpc2FibGVkPWZhbHNlXVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRpc2FibGVkPzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgY29udHJvbCBtYXkgYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59OiBbcmVhZG9ubHk9ZmFsc2VdXG4gICAgICovXG4gICAgQElucHV0KCkgcmVhZG9ubHk/OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIChvdXRwdXQpIGFuIGFycmF5IG9mIFN0cmluZ0xpdGVyYWwgb24gYW55IGNoYW5nZSBvbiB0aGUgaW5wdXQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAZW1pdHMge1N0cmluZ0xpdGVyYWxbXX0gZGF0YUNoYW5nZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZGF0YUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxTdHJpbmdMaXRlcmFsW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxTdHJpbmdMaXRlcmFsW10+KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIChvdXRwdXQpIHRydWUgd2hlbiB0aGUgZmllbGQgd2FzIHRvdWNoZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgZGF0YSwgZS5nLiBpbiBjYXNlIGEgdmFsdWUgaXMgcmVxdWlyZWRcbiAgICAgKlxuICAgICAqIEBlbWl0cyB7Ym9vbGVhbn0gdG91Y2hlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0b3VjaGVkOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhIHVzZXIgcHJlc3MgRU5URVIuIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3VibWl0IGRhdGEgaW4gdGhlIHBhcmVudCBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiAqIEBlbWl0cyB7Ym9vbGVhbn0gZW50ZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZW50ZXI6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ3RleHRJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSB0ZXh0SW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdidG5Ub1NlbGVjdExhbmd1YWdlJywgeyBzdGF0aWM6IGZhbHNlIH0pIGJ0blRvU2VsZWN0TGFuZ3VhZ2U6IE1hdE1lbnVUcmlnZ2VyO1xuXG4gICAgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgY29uc3RydWN0b3IgKFxuICAgICAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXJcbiAgICApIHtcblxuICAgICAgICAvLyBzZXQgc2VsZWN0ZWQgbGFuZ3VhZ2UsIGlmIGl0J3Mgbm90IGRlZmluZWQgeWV0XG4gICAgICAgIGlmICghdGhpcy5sYW5ndWFnZSkge1xuICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXNzaW9uJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgbGFuZ3VhZ2UgZnJvbSB0aGUgbG9nZ2VkLWluIHVzZXIgcHJvZmlsZSBkYXRhXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Nlc3Npb24nKSkudXNlci5sYW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgZGVmYXVsdCBsYW5ndWFnZSBmcm9tIGJyb3dzZXJcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbmF2aWdhdG9yLmxhbmd1YWdlLnN1YnN0cigwLCAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRvZXMgdGhlIGRlZmluZWQgbGFuZ3VhZ2UgZXhpc3RzIGluIG91ciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGxpc3Q/XG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlcy5pbmRleE9mKHRoaXMubGFuZ3VhZ2UpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gaWYgbm90LCBzZWxlY3QgdGhlIGZpcnN0IGxhbmd1YWdlIGZyb20gb3VyIGxpc3Qgb2Ygc3VwcG9ydGVkIGxhbmd1YWdlc1xuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IHRoaXMubGFuZ3VhZ2VzWzBdO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuICAgICAgICAvLyBpZiAodGhpcy5wbGFjZWhvbGRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnBsYWNlaG9sZGVyICs9ICcgKCcgKyB0aGlzLmxhbmd1YWdlICsgJyknO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gcmVzZXQgc3RyaW5nTGl0ZXJhbHMgaWYgdGhleSBoYXZlIGVtcHR5IHZhbHVlc1xuICAgICAgICB0aGlzLnJlc2V0VmFsdWVzKCk7XG5cbiAgICAgICAgLy8gYnVpbGQgdGhlIGZvcm1cbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5fZmIuZ3JvdXAoe1xuICAgICAgICAgICAgdGV4dDogbmV3IEZvcm1Db250cm9sKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVPbjogJ2JsdXInXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gdXBkYXRlIHZhbHVlcyBvbiBmb3JtIGNoYW5nZVxuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShkYXRhID0+IHRoaXMub25WYWx1ZUNoYW5nZWQoKSk7XG5cbiAgICAgICAgLy8gZ2V0IHZhbHVlIGZyb20gc3RyaW5nTGl0ZXJhbHNcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXRWYWx1ZUZyb21TdHJpbmdMaXRlcmFsKHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCh2YWwpO1xuXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICpcbiAgICAgKiBlbWl0IGRhdGEgdG8gcGFyZW50IG9uIGFueSBjaGFuZ2Ugb24gdGhlIGlucHV0IGZpZWxkXG4gICAgICovXG4gICAgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtO1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoJ3RleHQnKTtcbiAgICAgICAgdGhpcy50b3VjaGVkLmVtaXQoY29udHJvbCAmJiBjb250cm9sLmRpcnR5KTtcblxuICAgICAgICAvLyBpZiAoY29udHJvbCAmJiBjb250cm9sLmRpcnR5KSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignY29udHJvbCBkaXJ0eScpO1xuXG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVN0cmluZ0xpdGVyYWxzKHRoaXMubGFuZ3VhZ2UsIHRoaXMuZm9ybS5jb250cm9sc1sndGV4dCddLnZhbHVlKTtcblxuICAgICAgICB0aGlzLmRhdGFDaGFuZ2VkLmVtaXQodGhpcy52YWx1ZSk7XG5cbiAgICB9XG5cbiAgICB0b2dnbGVBbGwoKSB7XG4gICAgICAgIC8vIFRPRE86IG9wZW4vc2hvdyBhbGwgbGFuZ3VhZ2VzIHdpdGggdGhlaXIgdmFsdWVzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogU2V0IHRoZSBsYW5ndWFnZSBhZnRlciBzZWxlY3Rpbmc7IFRoaXMgdXBkYXRlcyB0aGUgYXJyYXkgb2YgU3RyaW5nTGl0ZXJhbHM6IGFkZHMgaXRlbSB3aXRoIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICovXG4gICAgc2V0TGFuZ3VhZ2UobGFuZzogc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKHRoaXMubGFuZ3VhZ2UgPT09IGxhbmcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignRE8gTk9USElORyEgdGhpcyBsYW5ndWFnZSB3YXMgYWxyZWFkeSBzZWxlY3RlZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2xlYW4gc3RyaW5nTEl0ZXJhbCB2YWx1ZSBmb3IgcHJldmlvdXMgbGFuZ3VhZ2UsIGlmIHRleHQgZmllbGQgaXMgZW1wdHlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RyaW5nTGl0ZXJhbHModGhpcy5sYW5ndWFnZSwgdGhpcy5mb3JtLmNvbnRyb2xzWyd0ZXh0J10udmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZztcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBmb3JtIGZpZWxkIHZhbHVlIC8gcmVzZXQgaW4gY2FzZSBvZiBubyB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXRWYWx1ZUZyb21TdHJpbmdMaXRlcmFsKGxhbmcpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtRmllbGQodmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKlxuICAgICAqIFN3aXRjaCBmb2N1cyB0byBpbnB1dCBmaWVsZCBhZnRlciBzZWxlY3RpbmcgYSBsYW5ndWFnZVxuICAgICAqL1xuICAgIHN3aXRjaEZvY3VzKCkge1xuICAgICAgICAvLyBjbG9zZSB0aGUgbWVudVxuICAgICAgICBpZiAoIXRoaXMudGV4dGFyZWEgJiYgdGhpcy5idG5Ub1NlbGVjdExhbmd1YWdlICYmIHRoaXMuYnRuVG9TZWxlY3RMYW5ndWFnZS5tZW51T3Blbikge1xuICAgICAgICAgICAgdGhpcy5idG5Ub1NlbGVjdExhbmd1YWdlLmNsb3NlTWVudSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3RleHQnXS5lbmFibGUoKTtcbiAgICAgICAgICAgIHRoaXMudGV4dElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKlxuICAgICAqIFNldCB0aGUgdmFsdWUgaW4gdGhlIGlucHV0IGZpZWxkXG4gICAgICovXG4gICAgdXBkYXRlRm9ybUZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3RleHQnXS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBhcnJheSBvZiBTdHJpbmdMaXRlcmFscyBkZXBlbmRpbmcgb24gdmFsdWUgLyBlbXB0eSB2YWx1ZSBhZGQgb3IgcmVtb3ZlIGl0ZW0gZnJvbSBhcnJheS5cbiAgICAgKi9cbiAgICB1cGRhdGVTdHJpbmdMaXRlcmFscyhsYW5nOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWx1ZS5maW5kSW5kZXgoaSA9PiBpLmxhbmd1YWdlID09PSBsYW5nKTtcblxuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiB0aGlzLnZhbHVlW2luZGV4XS52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB2YWx1ZSBpcyBub3QgZW1wdHkgYW5kIGV4aXN0cyBpbiBsaXN0IG9mIHN0cmluZ0xpdGVyYWxzXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndXBkYXRlIGV4aXN0aW5nIHZhbHVlIGZvciAnICsgbGFuZyArICcgb24gcG9zaXRpb24gJyArIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVbaW5kZXhdLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDApICYmIGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGlzIGVtcHR5OiBkZWxldGUgc3RyaW5nTGl0ZXJhbCBpdGVtIGZvciB0aGlzIGxhbmd1YWdlXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZGVsZXRlIGVtcHR5IHZhbHVlIGZvciAnICsgbGFuZyArICcgb24gcG9zaXRpb24gJyArIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA8IDAgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGRvZXNuJ3QgZXhpc3QgaW4gc3RyaW5nTGl0ZXJhbHM6IGFkZCBvbmVcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdhZGQgbmV3IHZhbHVlICgnICsgdmFsdWUgKyAnKSBmb3IgJyArIGxhbmcpO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWU6IFN0cmluZ0xpdGVyYWwgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogSW4gY2FzZSBvZiBzdHJhbmdlIGFycmF5IG9mIFN0cmluZ0xpdGVyYWxzLCB0aGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRvIGEgQVBJLWNvbmZvcm0gYXJyYXkuIFRoaXMgbWVhbnMgYW4gYXJyYXkgd2l0aG91dCBlbXB0eSB2YWx1ZXMuXG4gICAgICovXG4gICAgcmVzZXRWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aDogbnVtYmVyID0gdGhpcy52YWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpdGVtcyB3aXRoIGVtcHR5IHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlW2luZGV4XS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkb2VzIGFuIGl0ZW0gZm9yIHNlbGVjdGVkIGxhbnVhZ2UgZXhpc3RzXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5maW5kSW5kZXgoaSA9PiBpLmxhbmd1YWdlID09PSB0aGlzLmxhbmd1YWdlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gdGhpcy52YWx1ZVswXS5sYW5ndWFnZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIGFycmF5IG9mIFN0cmluZ0xpdGVyYWxzIGZvciB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2VcbiAgICAgKi9cbiAgICBnZXRWYWx1ZUZyb21TdHJpbmdMaXRlcmFsKGxhbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdleGlzdGluZyB2YWx1ZSBpbicsIHRoaXMudmFsdWUpO1xuICAgICAgICAvLyBnZXQgaW5kZXggZm9yIHRoaXMgbGFuZ3VhZ2VcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbHVlLmZpbmRJbmRleChpID0+IGkubGFuZ3VhZ2UgPT09IGxhbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlW2luZGV4XSAmJiB0aGlzLnZhbHVlW2luZGV4XS52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVtpbmRleF0udmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICB9XG5cbn1cbiJdfQ==