UNPKG

ngx-tags-input

Version:
319 lines 26.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, forwardRef, Input, Output, EventEmitter } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** @type {?} */ var noop = (/** * @return {?} */ function () { }); var ɵ0 = noop; /** @type {?} */ var TAGS_INPUT_TEMPLATE = "\n <div class=\"tags-input\">\n <span class=\"tags-input__tag label label-primary badge badge-primary\" *ngFor=\"let tag of tags\">\n {{tag[displayField]}}\n <span *ngIf=\"isDeleteable(tag)\" role=\"button\" class=\"tags-input__tag-remove-btn\" (click)=\"removeTag(tag)\" (touch)=\"removeTag(tag)\">\n <span aria-hidden=\"true\">&times;</span>\n <span class=\"sr-only\">Close</span>\n </span>\n </span>\n <input\n *ngIf=\"options === null; else withTypeahead\" \n class=\"tags-input__input-field\" \n type=\"text\" \n [placeholder]=\"getPlaceholder()\"\n name=\"tags\"\n (keyup.enter)=\"addTag(tagInput)\" (keydown.backspace)=\"removeLastTag(tagInput)\"\n [disabled]=\"!canAddTags || maximumOfTagsReached()\"\n [hidden]=\"!canAddTags || maximumOfTagsReached()\"\n #tagInput />\n <ng-template #withTypeahead>\n <input\n *ngIf=\"options !== null\" \n class=\"tags-input__input-field\" \n type=\"text\" \n [placeholder]=\"getPlaceholder()\"\n name=\"tags\"\n (keydown.backspace)=\"removeLastTag(tagInput)\"\n [(ngModel)]=\"selected\" \n [typeahead]=\"options\"\n [typeaheadOptionField]=\"displayField\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n (typeaheadNoResults)=\"typeaheadOnNoMatch($event)\"\n [typeaheadMinLength]=\"minLengthBeforeOptions\"\n [typeaheadScrollable]=\"scrollableOptions\"\n [typeaheadLatinize]=\"true\"\n [typeaheadOptionsInScrollableView]=\"scrollableOptionsInView\"\n [disabled]=\"!canAddTags || maximumOfTagsReached()\"\n [hidden]=\"!canAddTags || maximumOfTagsReached()\"\n #tagInput />\n </ng-template>\n </div>\n"; /** @type {?} */ var TAGS_INPUT_STYLE = "\n :host {\n overflow: auto;\n white-space: nowrap;\n }\n\n .tags-input {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n }\n\n .tags-input__tag {\n display: inline-block;\n margin-bottom: 2px;\n margin-right: 5px;\n padding-right: 0.3em;\n }\n\n .tags-input__tag-remove-btn {\n cursor: pointer;\n display: inline-block;\n font-size: 12px;\n margin: -3px 0 0 3px;\n padding: 0;\n vertical-align: top;\n }\n\n .tags-input__input-field {\n border: none;\n flex-grow: 1;\n outline: none;\n }\n"; /** @type {?} */ var CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return NgxTagsInputComponent; })), multi: true }; /** * @record */ export function TagsChangedEvent() { } if (false) { /** @type {?} */ TagsChangedEvent.prototype.change; /** @type {?} */ TagsChangedEvent.prototype.tag; } var NgxTagsInputComponent = /** @class */ (function () { function NgxTagsInputComponent() { this.selected = ''; this.tags = []; this.onTouchedCallback = noop; this.onChangeCallback = noop; this.removeLastOnBackspace = false; this.canDeleteTags = true; this.canAddTags = true; this.placeholder = ''; this.options = null; this.displayField = 'displayValue'; this.minLengthBeforeOptions = 1; this.scrollableOptions = false; this.scrollableOptionsInView = 5; this.onTagsChanged = new EventEmitter(); this.onMaxTagsReached = new EventEmitter(); this.onNoOptionsMatch = new EventEmitter(); } /** * @return {?} */ NgxTagsInputComponent.prototype.getPlaceholder = /** * @return {?} */ function () { if (this.tags && this.tags.length > 0) { return ''; } return this.placeholder; }; /** * @private * @param {?} type * @param {?} tag * @return {?} */ NgxTagsInputComponent.prototype.tagsChanged = /** * @private * @param {?} type * @param {?} tag * @return {?} */ function (type, tag) { this.onChangeCallback(this.tags); this.onTagsChanged.emit({ change: type, tag: tag }); if (this.maximumOfTagsReached()) { this.onMaxTagsReached.emit(); } }; /** * @param {?} tagInput * @return {?} */ NgxTagsInputComponent.prototype.removeLastTag = /** * @param {?} tagInput * @return {?} */ function (tagInput) { if (!this.removeLastOnBackspace || !this.tags.length) { return; } if (tagInput.value === '') { this.removeTag(this.tags[this.tags.length - 1]); } }; /** * @param {?} tagInput * @return {?} */ NgxTagsInputComponent.prototype.addTag = /** * @param {?} tagInput * @return {?} */ function (tagInput) { var _a; if (tagInput.value.trim() !== '') { /** @type {?} */ var tag = (_a = {}, _a[this.displayField] = tagInput.value, _a); this.addPredefinedTag(tag); } tagInput.value = ''; }; /** * @private * @param {?} tag * @return {?} */ NgxTagsInputComponent.prototype.addPredefinedTag = /** * @private * @param {?} tag * @return {?} */ function (tag) { if (!this.maximumOfTagsReached()) { this.tags.push(tag); this.tagsChanged('add', tag); } }; /** * @param {?} tagToRemove * @return {?} */ NgxTagsInputComponent.prototype.removeTag = /** * @param {?} tagToRemove * @return {?} */ function (tagToRemove) { if (!this.isDeleteable(tagToRemove)) { return; } this.tags = this.tags.filter((/** * @param {?} tag * @return {?} */ function (tag) { return tagToRemove !== tag; })); this.tagsChanged('remove', tagToRemove); }; /** * @return {?} */ NgxTagsInputComponent.prototype.maximumOfTagsReached = /** * @return {?} */ function () { return typeof this.maxTags !== 'undefined' && this.tags && this.tags.length >= this.maxTags; }; /** * @param {?} tag * @return {?} */ NgxTagsInputComponent.prototype.isDeleteable = /** * @param {?} tag * @return {?} */ function (tag) { if (typeof tag.deleteable !== "undefined" && !tag.deleteable) { return false; } return this.canDeleteTags; }; /** * @param {?} e * @return {?} */ NgxTagsInputComponent.prototype.typeaheadOnSelect = /** * @param {?} e * @return {?} */ function (e) { var _a; if (typeof e.item === 'string') { this.addPredefinedTag((_a = {}, _a[this.displayField] = e.value, _a)); } else { this.addPredefinedTag(e.item); } this.selected = ''; }; /** * @param {?} e * @return {?} */ NgxTagsInputComponent.prototype.typeaheadOnNoMatch = /** * @param {?} e * @return {?} */ function (e) { if (typeof this.onNoOptionsMatch !== 'undefined') { this.onNoOptionsMatch.emit(e); } }; /** * @param {?} value * @return {?} */ NgxTagsInputComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { if (value !== this.tags) { this.tags = value; } }; /** * @param {?} fn * @return {?} */ NgxTagsInputComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChangeCallback = fn; }; /** * @param {?} fn * @return {?} */ NgxTagsInputComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouchedCallback = fn; }; NgxTagsInputComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-tags-input', template: TAGS_INPUT_TEMPLATE, providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR], styles: [TAGS_INPUT_STYLE] }] } ]; NgxTagsInputComponent.propDecorators = { maxTags: [{ type: Input }], removeLastOnBackspace: [{ type: Input }], canDeleteTags: [{ type: Input }], canAddTags: [{ type: Input }], placeholder: [{ type: Input }], options: [{ type: Input }], displayField: [{ type: Input }], minLengthBeforeOptions: [{ type: Input }], scrollableOptions: [{ type: Input }], scrollableOptionsInView: [{ type: Input }], onTagsChanged: [{ type: Output }], onMaxTagsReached: [{ type: Output }], onNoOptionsMatch: [{ type: Output }] }; return NgxTagsInputComponent; }()); export { NgxTagsInputComponent }; if (false) { /** @type {?} */ NgxTagsInputComponent.prototype.selected; /** @type {?} */ NgxTagsInputComponent.prototype.tags; /** * @type {?} * @private */ NgxTagsInputComponent.prototype.onTouchedCallback; /** * @type {?} * @private */ NgxTagsInputComponent.prototype.onChangeCallback; /** @type {?} */ NgxTagsInputComponent.prototype.maxTags; /** @type {?} */ NgxTagsInputComponent.prototype.removeLastOnBackspace; /** @type {?} */ NgxTagsInputComponent.prototype.canDeleteTags; /** @type {?} */ NgxTagsInputComponent.prototype.canAddTags; /** @type {?} */ NgxTagsInputComponent.prototype.placeholder; /** @type {?} */ NgxTagsInputComponent.prototype.options; /** @type {?} */ NgxTagsInputComponent.prototype.displayField; /** @type {?} */ NgxTagsInputComponent.prototype.minLengthBeforeOptions; /** @type {?} */ NgxTagsInputComponent.prototype.scrollableOptions; /** @type {?} */ NgxTagsInputComponent.prototype.scrollableOptionsInView; /** @type {?} */ NgxTagsInputComponent.prototype.onTagsChanged; /** @type {?} */ NgxTagsInputComponent.prototype.onMaxTagsReached; /** @type {?} */ NgxTagsInputComponent.prototype.onNoOptionsMatch; } export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRhZ3MtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXRhZ3MtaW5wdXQvIiwic291cmNlcyI6WyJsaWIvbmd4LXRhZ3MtaW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7O0lBR25FLElBQUk7OztBQUFHLGNBQU8sQ0FBQyxDQUFBOzs7SUFFZixtQkFBbUIsR0FBRyx3NkRBeUMzQjs7SUFFSyxnQkFBZ0IsR0FBRyxxcEJBaUN4Qjs7SUFFSyxtQ0FBbUMsR0FBUTtJQUMvQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxjQUFNLE9BQUEscUJBQXFCLEVBQXJCLENBQXFCLEVBQUM7SUFDcEQsS0FBSyxFQUFFLElBQUk7Q0FDWjs7OztBQUVELHNDQUdDOzs7SUFGQyxrQ0FBZTs7SUFDZiwrQkFBUTs7QUFHVjtJQUFBO1FBT0UsYUFBUSxHQUFVLEVBQUUsQ0FBQztRQUNkLFNBQUksR0FBZSxFQUFFLENBQUM7UUFDckIsc0JBQWlCLEdBQWUsSUFBSSxDQUFDO1FBQ3JDLHFCQUFnQixHQUFxQixJQUFJLENBQUM7UUFHekMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBQzlCLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0IsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsWUFBTyxHQUFRLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFXLGNBQWMsQ0FBQztRQUN0QywyQkFBc0IsR0FBVyxDQUFDLENBQUM7UUFDbkMsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLDRCQUF1QixHQUFXLENBQUMs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b0JBRTdCLFNBQVMsRUFBRSxDQUFDLG1DQUFtQyxDQUFDOzZCQUR2QyxnQkFBZ0I7aUJBRTFCOzs7MEJBT0UsS0FBSzt3Q0FDTCxLQUFLO2dDQUNMLEtBQUs7NkJBQ0wsS0FBSzs4QkFDTCxLQUFLOzBCQUNMLEtBQUs7K0JBQ0wsS0FBSzt5Q0FDTCxLQUFLO29DQUNMLEtBQUs7MENBQ0wsS0FBSztnQ0FDTCxNQUFNO21DQUNOLE1BQU07bUNBQ04sTUFBTTs7SUFnR1QsNEJBQUM7Q0FBQSxBQXhIRCxJQXdIQztTQWxIWSxxQkFBcUI7OztJQUNoQyx5Q0FBcUI7O0lBQ3JCLHFDQUE2Qjs7Ozs7SUFDN0Isa0RBQTZDOzs7OztJQUM3QyxpREFBa0Q7O0lBRWxELHdDQUF5Qjs7SUFDekIsc0RBQWdEOztJQUNoRCw4Q0FBdUM7O0lBQ3ZDLDJDQUFvQzs7SUFDcEMsNENBQWtDOztJQUNsQyx3Q0FBNkI7O0lBQzdCLDZDQUErQzs7SUFDL0MsdURBQTRDOztJQUM1QyxrREFBNEM7O0lBQzVDLHdEQUE2Qzs7SUFDN0MsOENBQTZFOztJQUM3RSxpREFBb0U7O0lBQ3BFLGlEQUF1RSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHlwZWFoZWFkTWF0Y2ggfSBmcm9tICduZ3gtYm9vdHN0cmFwL3R5cGVhaGVhZC9wdWJsaWNfYXBpJztcclxuXHJcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcclxuXHJcbmNvbnN0IFRBR1NfSU5QVVRfVEVNUExBVEUgPSBgXHJcbiAgICA8ZGl2IGNsYXNzPVwidGFncy1pbnB1dFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFncy1pbnB1dF9fdGFnIGxhYmVsIGxhYmVsLXByaW1hcnkgYmFkZ2UgYmFkZ2UtcHJpbWFyeVwiICpuZ0Zvcj1cImxldCB0YWcgb2YgdGFnc1wiPlxyXG4gICAgICAgICAgICB7e3RhZ1tkaXNwbGF5RmllbGRdfX1cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0RlbGV0ZWFibGUodGFnKVwiIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cInRhZ3MtaW5wdXRfX3RhZy1yZW1vdmUtYnRuXCIgKGNsaWNrKT1cInJlbW92ZVRhZyh0YWcpXCIgKHRvdWNoKT1cInJlbW92ZVRhZyh0YWcpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICpuZ0lmPVwib3B0aW9ucyA9PT0gbnVsbDsgZWxzZSB3aXRoVHlwZWFoZWFkXCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGFncy1pbnB1dF9faW5wdXQtZmllbGRcIiBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxyXG4gICAgICAgICAgICBuYW1lPVwidGFnc1wiXHJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhZGRUYWcodGFnSW5wdXQpXCIgKGtleWRvd24uYmFja3NwYWNlKT1cInJlbW92ZUxhc3RUYWcodGFnSW5wdXQpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5BZGRUYWdzIHx8IG1heGltdW1PZlRhZ3NSZWFjaGVkKClcIlxyXG4gICAgICAgICAgICBbaGlkZGVuXT1cIiFjYW5BZGRUYWdzIHx8IG1heGltdW1PZlRhZ3NSZWFjaGVkKClcIlxyXG4gICAgICAgICAgICAjdGFnSW5wdXQgLz5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhUeXBlYWhlYWQ+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgKm5nSWY9XCJvcHRpb25zICE9PSBudWxsXCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGFncy1pbnB1dF9faW5wdXQtZmllbGRcIiBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxyXG4gICAgICAgICAgICBuYW1lPVwidGFnc1wiXHJcbiAgICAgICAgICAgIChrZXlkb3duLmJhY2tzcGFjZSk9XCJyZW1vdmVMYXN0VGFnKHRhZ0lucHV0KVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRcIiBcclxuICAgICAgICAgICAgW3R5cGVhaGVhZF09XCJvcHRpb25zXCJcclxuICAgICAgICAgICAgW3R5cGVhaGVhZE9wdGlvbkZpZWxkXT1cImRpc3BsYXlGaWVsZFwiXHJcbiAgICAgICAgICAgICh0eXBlYWhlYWRPblNlbGVjdCk9XCJ0eXBlYWhlYWRPblNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHR5cGVhaGVhZE5vUmVzdWx0cyk9XCJ0eXBlYWhlYWRPbk5vTWF0Y2goJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFt0eXBlYWhlYWRNaW5MZW5ndGhdPVwibWluTGVuZ3RoQmVmb3JlT3B0aW9uc1wiXHJcbiAgICAgICAgICAgIFt0eXBlYWhlYWRTY3JvbGxhYmxlXT1cInNjcm9sbGFibGVPcHRpb25zXCJcclxuICAgICAgICAgICAgW3R5cGVhaGVhZExhdGluaXplXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwic2Nyb2xsYWJsZU9wdGlvbnNJblZpZXdcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbkFkZFRhZ3MgfHwgbWF4aW11bU9mVGFnc1JlYWNoZWQoKVwiXHJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiIWNhbkFkZFRhZ3MgfHwgbWF4aW11bU9mVGFnc1JlYWNoZWQoKVwiXHJcbiAgICAgICAgICAgICN0YWdJbnB1dCAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuYDtcclxuXHJcbmNvbnN0IFRBR1NfSU5QVVRfU1RZTEUgPSBgXHJcbiAgICA6aG9zdCB7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAudGFncy1pbnB1dCB7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAudGFncy1pbnB1dF9fdGFnIHtcclxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogNXB4O1xyXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuM2VtO1xyXG4gICAgfVxyXG5cclxuICAgIC50YWdzLWlucHV0X190YWctcmVtb3ZlLWJ0biB7XHJcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgICAgbWFyZ2luOiAtM3B4IDAgMCAzcHg7XHJcbiAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xyXG4gICAgfVxyXG5cclxuICAgIC50YWdzLWlucHV0X19pbnB1dC1maWVsZCB7XHJcbiAgICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICAgIGZsZXgtZ3JvdzogMTtcclxuICAgICAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgfVxyXG5gO1xyXG5cclxuY29uc3QgQ1VTVE9NX0lOUFVUX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hUYWdzSW5wdXRDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRhZ3NDaGFuZ2VkRXZlbnQge1xyXG4gIGNoYW5nZTogc3RyaW5nLFxyXG4gIHRhZzogYW55XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LXRhZ3MtaW5wdXQnLFxyXG4gIHRlbXBsYXRlOiBUQUdTX0lOUFVUX1RFTVBMQVRFLFxyXG4gIHN0eWxlczogW1RBR1NfSU5QVVRfU1RZTEVdLFxyXG4gIHByb3ZpZGVyczogW0NVU1RPTV9JTlBVVF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4VGFnc0lucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIHNlbGVjdGVkOnN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyB0YWdzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcclxuXHJcbiAgQElucHV0KCkgbWF4VGFnczogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHJlbW92ZUxhc3RPbkJhY2tzcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhbkRlbGV0ZVRhZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNhbkFkZFRhZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGRpc3BsYXlGaWVsZDogc3RyaW5nID0gJ2Rpc3BsYXlWYWx1ZSc7XHJcbiAgQElucHV0KCkgbWluTGVuZ3RoQmVmb3JlT3B0aW9uczogbnVtYmVyID0gMTtcclxuICBASW5wdXQoKSBzY3JvbGxhYmxlT3B0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNjcm9sbGFibGVPcHRpb25zSW5WaWV3OiBudW1iZXIgPSA1O1xyXG4gIEBPdXRwdXQoKSBvblRhZ3NDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8VGFnc0NoYW5nZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uTWF4VGFnc1JlYWNoZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25Ob09wdGlvbnNNYXRjaDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBnZXRQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xyXG4gICAgaWYodGhpcy50YWdzICYmIHRoaXMudGFncy5sZW5ndGggPiAwKXtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGFnc0NoYW5nZWQodHlwZTogc3RyaW5nLCB0YWc6IGFueSk6IHZvaWQge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodGhpcy50YWdzKTtcclxuICAgICAgdGhpcy5vblRhZ3NDaGFuZ2VkLmVtaXQoe1xyXG4gICAgICAgICAgY2hhbmdlOiB0eXBlLFxyXG4gICAgICAgICAgdGFnOiB0YWdcclxuICAgICAgfSk7XHJcbiAgICAgIGlmKHRoaXMubWF4aW11bU9mVGFnc1JlYWNoZWQoKSl7XHJcbiAgICAgICAgICB0aGlzLm9uTWF4VGFnc1JlYWNoZWQuZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVMYXN0VGFnKHRhZ0lucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgIGlmKCF0aGlzLnJlbW92ZUxhc3RPbkJhY2tzcGFjZSB8fCAhdGhpcy50YWdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGFnSW5wdXQudmFsdWUgPT09ICcnKXtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlVGFnKHRoaXMudGFnc1t0aGlzLnRhZ3MubGVuZ3RoLTFdKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVGFnKHRhZ0lucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgIGlmICh0YWdJbnB1dC52YWx1ZS50cmltKCkgIT09ICcnKXtcclxuICAgICAgICAgIGxldCB0YWcgPSB7XHJcbiAgICAgICAgICAgICAgW3RoaXMuZGlzcGxheUZpZWxkXTogdGFnSW5wdXQudmFsdWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLmFkZFByZWRlZmluZWRUYWcodGFnKTtcclxuICAgICAgfVxyXG4gICAgICB0YWdJbnB1dC52YWx1ZSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRQcmVkZWZpbmVkVGFnKHRhZzogT2JqZWN0KTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5tYXhpbXVtT2ZUYWdzUmVhY2hlZCgpKXtcclxuICAgICAgICAgIHRoaXMudGFncy5wdXNoKHRhZyk7XHJcbiAgICAgICAgICB0aGlzLnRhZ3NDaGFuZ2VkKCdhZGQnLCB0YWcpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVUYWcodGFnVG9SZW1vdmU6IGFueSk6IHZvaWQge1xyXG4gICAgICBpZighdGhpcy5pc0RlbGV0ZWFibGUodGFnVG9SZW1vdmUpKXtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRhZ3MgPSB0aGlzLnRhZ3MuZmlsdGVyKHRhZyA9PiB0YWdUb1JlbW92ZSAhPT0gdGFnKTtcclxuICAgICAgdGhpcy50YWdzQ2hhbmdlZCgncmVtb3ZlJywgdGFnVG9SZW1vdmUpO1xyXG4gIH1cclxuXHJcbiAgbWF4aW11bU9mVGFnc1JlYWNoZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXhUYWdzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnRhZ3MgJiYgdGhpcy50YWdzLmxlbmd0aD49dGhpcy5tYXhUYWdzO1xyXG4gIH1cclxuXHJcbiAgaXNEZWxldGVhYmxlKHRhZzogYW55KSB7XHJcbiAgICAgIGlmKHR5cGVvZiB0YWcuZGVsZXRlYWJsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhdGFnLmRlbGV0ZWFibGUpe1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbkRlbGV0ZVRhZ3M7XHJcbiAgfVxyXG5cclxuICB0eXBlYWhlYWRPblNlbGVjdChlOlR5cGVhaGVhZE1hdGNoKTp2b2lkIHtcclxuICAgICAgaWYodHlwZW9mIGUuaXRlbSA9PT0gJ3N0cmluZycpe1xyXG4gICAgICAgICAgdGhpcy5hZGRQcmVkZWZpbmVkVGFnKHtcclxuICAgICAgICAgICAgICBbdGhpcy5kaXNwbGF5RmllbGRdOiBlLnZhbHVlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hZGRQcmVkZWZpbmVkVGFnKGUuaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RlZCA9ICcnO1xyXG4gIH1cclxuXHJcbiAgdHlwZWFoZWFkT25Ob01hdGNoKGU6YW55KTp2b2lkIHtcclxuICAgICAgaWYodHlwZW9mIHRoaXMub25Ob09wdGlvbnNNYXRjaCAhPT0gJ3VuZGVmaW5lZCcpe1xyXG4gICAgICAgICAgdGhpcy5vbk5vT3B0aW9uc01hdGNoLmVtaXQoZSlcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy50YWdzKSB7XHJcbiAgICAgICAgICB0aGlzLnRhZ3MgPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XHJcbiAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xyXG4gICAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XHJcbiAgfVxyXG59XHJcbiJdfQ==