ngx-selectbox-may
Version:
Angular selectbox with autocomplete
447 lines • 39.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, ElementRef, ViewChild, ViewChildren, QueryList, forwardRef, Output, EventEmitter, ContentChild, TemplateRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { NgxSelectboxMayService } from './ngx-selectbox-may.service';
import { NGXSelectMayConfigs } from './ngx-selectbox-may-configs';
export class NgxSelectboxMayComponent {
/**
* @param {?} _selectboxref
* @param {?} selectboxService
*/
constructor(_selectboxref, selectboxService) {
this._selectboxref = _selectboxref;
this.selectboxService = selectboxService;
this.dropdownRows = [];
this.configs = new NGXSelectMayConfigs();
this.selectedRows = [];
this.show_items = false;
this.searchText = "";
this.isEnable = true;
this.propagateChange = (_) => { };
this.propagateOnTouch = (_) => { };
this.onKeyUp = new EventEmitter();
this.onSelect = new EventEmitter();
this.onBlur = new EventEmitter();
}
/**
* @param {?} items
* @return {?}
*/
set items(items) {
this.createDropdownRows(items);
}
/**
* @param {?} cssClass
* @return {?}
*/
set cssClass(cssClass) {
this.configs.cssClass = cssClass;
}
/**
* @param {?} valueField
* @return {?}
*/
set valueField(valueField) {
this.configs.valueField = valueField;
}
/**
* @param {?} labelField
* @return {?}
*/
set labelField(labelField) {
this.configs.labelField = labelField;
this.reconfigureLabelsAndValues();
}
/**
* @param {?} placeholder
* @return {?}
*/
set placeholder(placeholder) {
this.configs.placeholderText = placeholder;
}
/**
* @param {?} emptyText
* @return {?}
*/
set emptyText(emptyText) {
this.configs.emptyText = emptyText;
}
/**
* @param {?} showEmptyText
* @return {?}
*/
set showEmptyResultText(showEmptyText) {
this.configs.showEmptyResultsLabel = showEmptyText;
}
/**
* @param {?} isMulti
* @return {?}
*/
set isMulti(isMulti) {
this.configs.isMultiSelect = isMulti;
}
/**
* @param {?} isLoading
* @return {?}
*/
set isLoading(isLoading) {
this._isLoading = isLoading;
}
/**
* @param {?} loadingText
* @return {?}
*/
set loadingText(loadingText) {
this._loadingText = loadingText;
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @param {?} items
* @return {?}
*/
createDropdownRows(items) {
this.dropdownRows = this.selectboxService.createDropdownRows(items, this.configs);
this.setValuesPassedExternal(this.ngModelValue);
}
/**
* @return {?}
*/
reconfigureLabelsAndValues() {
this.selectboxService.reconfigureDropdownRowLabelsAndValues(this.dropdownRows, this.configs);
}
/**
* @return {?}
*/
getSelectboxLabel() {
/** @type {?} */
let label = this.selectboxService.createDropdownLabel(this.configs, this.selectedRows);
return label ? label : this.configs.placeholderText;
}
/**
* @return {?}
*/
getEmptyTextLabel() {
return this.configs.emptyText ? this.configs.emptyText : NGXSelectMayConfigs.EMPTY_TEXT;
}
/**
* @return {?}
*/
getLoadingText() {
return this._loadingText ? this._loadingText : NGXSelectMayConfigs.LOADING_TEXT;
}
/**
* @return {?}
*/
onClickSelectBox() {
this.showItemsWindow();
}
/**
* @return {?}
*/
getActiveClass() {
return NGXSelectMayConfigs.ROW_ACTIVE_CLASS;
}
/**
* @return {?}
*/
showItemsWindow() {
this.show_items = true;
}
/**
* @return {?}
*/
hideItemsWindow() {
this.onBlur.emit(this.searchText);
this.resetFilters();
this.show_items = false;
}
/**
* @return {?}
*/
onRemoveClick() {
this.selectboxService.unselectAllSelectedRows(this.dropdownRows);
this.selectedRows = [];
this.publishValue();
}
/**
* @param {?} e
* @return {?}
*/
onSearchKeydown(e) {
if (e.key == "Escape") {
this.hideItemsWindow();
}
//Up and Down arrow events
if (e.keyCode == 38 || e.keyCode == 40) {
e.preventDefault();
}
}
/**
* @param {?} e
* @return {?}
*/
onSearchKeyup(e) {
if (e.keyCode == 38 || e.keyCode == 40 || e.key == "Escape") {
e.preventDefault();
}
else {
this.onKeyUp.emit(this.searchText);
}
}
/**
* @return {?}
*/
resetFilters() {
this.searchText = "";
}
/**
* @param {?} row
* @param {?} index
* @return {?}
*/
onClickItem(row, index) {
if (this.configs.isMultiSelect) {
}
else {
this.selectedRows = this.selectboxService.setSelectedItems(this.configs, this.selectedRows, this.dropdownRows, row);
this.onSelect.emit(row.data);
this.hideItemsWindow();
}
this.publishValue();
}
/**
* @return {?}
*/
publishValue() {
/** @type {?} */
let values = this.selectedRows.map(r => r.value);
if (this.configs.isMultiSelect) {
this.propagateChange(values);
}
else {
this.propagateChange(values.length > 0 ? values[0] : "");
}
}
/**
* @param {?} obj
* @return {?}
*/
setValuesPassedExternal(obj) {
if (this.configs.isMultiSelect) {
this.selectedRows = this.selectboxService.selectItemsByValue(this.dropdownRows, obj);
}
else {
this.selectedRows = this.selectboxService.selectItemByValue(this.dropdownRows, obj);
}
}
/*
*
* On Item browse open window begin & document outside click event Begins
*
*/
/**
* @param {?} content
* @return {?}
*/
set content(content) {
this.itemWindow = content;
// this.positionWindow();
this.focusToSearchField();
this.scrollToSelectedItem();
}
/**
* @return {?}
*/
positionWindow() {
if (this.searchField) {
/** @type {?} */
const selectBoxRef = this._selectboxref.nativeElement;
/** @type {?} */
var viewportOffset = selectBoxRef.getBoundingClientRect();
console.log(viewportOffset);
this.itemWindow.nativeElement.setAttribute('style', 'width: ' + (selectBoxRef.firstChild.offsetWidth + 3) + 'px; top: ' + (viewportOffset.top - 5) + 'px; margin-left: -12px;');
}
}
/**
* @return {?}
*/
focusToSearchField() {
if (this.searchField) {
this.searchField.nativeElement.focus();
}
}
/**
* @return {?}
*/
scrollToSelectedItem() {
this.listItems.forEach(li => {
if (li.nativeElement.classList.contains(NGXSelectMayConfigs.ROW_ACTIVE_CLASS)) {
/** @type {?} */
const scrollLi = li.nativeElement;
this.itemWindow.nativeElement.getElementsByTagName("ul")[0].scrollTop = scrollLi.offsetTop - (scrollLi.offsetHeight + 20);
}
});
}
/**
* @param {?} e
* @return {?}
*/
onClickOutside(e) {
if (!this._selectboxref.nativeElement.contains(event.target) && this.show_items) {
this.hideItemsWindow();
}
}
/**
* @param {?} e
* @return {?}
*/
onWindowResize(e) {
// this.positionWindow();
}
/**
* @return {?}
*/
setDisable() {
this.hideItemsWindow();
this.isEnable = false;
}
/**
* @return {?}
*/
setEnable() {
this.isEnable = true;
}
/**
* @param {?} obj
* @return {?}
*/
writeValue(obj) {
this.ngModelValue = obj;
this.setValuesPassedExternal(obj);
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.propagateOnTouch = fn;
}
/**
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
console.log(isDisabled, "set disable");
if (isDisabled) {
this.setDisable();
}
else {
this.setEnable();
}
}
}
NgxSelectboxMayComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-selectbox-may',
host: {
'(document:click)': 'onClickOutside($event)',
'(window:resize)': 'onWindowResize($event)'
},
template: "<div [ngClass]=\"configs.cssClass\" class=\"__ngx-selectbox-may\">\n <span class=\"__selected-label\">\n <span>{{getSelectboxLabel()}}</span>\n </span>\n <div *ngIf=\"_isLoading\" class=\"__loading-text\">{{getLoadingText()}}</div>\n <div class=\"__clickable-area\" (click)=\"onClickSelectBox()\"></div>\n <button *ngIf=\"selectedRows.length>0 && isEnable\" type=\"button\" class=\"__remove-selected-btn\" (click)=\"onRemoveClick()\">\n <i></i>\n </button>\n <div *ngIf=\"show_items\" class=\"__item-list-browser\" #item_window>\n <div class=\"__item-search\">\n <input #search_field type=\"text\" max-length=\"15\" (keydown)=\"onSearchKeydown($event)\"\n (keyup)=\"onSearchKeyup($event)\" placeholder=\"search\" [(ngModel)]=\"searchText\" />\n </div>\n <ng-container *ngTemplateOutlet=\"actionTemplate\"></ng-container>\n <ul class=\"__ngx-selectbox-ul\">\n <ng-container *ngFor=\"let item of dropdownRows | ngx_item_filter:searchText; let i = index; let l = count\">\n <li #li_item *ngIf=\"l>0\" (click)=\"onClickItem(item, i)\" [ngClass]=\"item.isSelected ? getActiveClass() : ''\">\n {{item.label}}\n </li>\n </ng-container>\n <li class=\"__empty-items\"\n *ngIf=\"(dropdownRows | ngx_item_filter:searchText).length === 0 && configs.showEmptyResultsLabel\">\n {{getEmptyTextLabel()}}\n </li>\n </ul>\n </div>\n <div *ngIf=\"!isEnable\" class=\"__disabled-mask\"></div>\n</div>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxSelectboxMayComponent),
multi: true,
}
],
styles: [".__ngx-selectbox-may{position:relative;min-width:200px;padding:3px 40px 3px 10px;display:flex;align-items:center;cursor:pointer;background-color:#fff}.__ngx-selectbox-may .__disabled-mask{position:absolute;background-color:rgba(0,0,0,.15);top:0;left:0;right:0;bottom:0}.__ngx-selectbox-may::before{content:\"\\f107\";position:absolute;font-family:FontAwesome;color:#3f495b;right:10px;top:0;bottom:0;display:flex;align-items:center;font-size:14px}.__ngx-selectbox-may .__selected-label{position:relative;display:block;width:100%;text-align:left;height:19px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.__ngx-selectbox-may .__remove-selected-btn{background-color:transparent;border:0;outline:0;cursor:pointer;position:absolute;right:20px;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__clickable-area{position:absolute;top:0;left:0;right:0;bottom:0}.__ngx-selectbox-may .__remove-selected-btn i::before{content:\"\\f00d\";font-family:FontAwesome;font-style:normal!important;-webkit-text-stroke:.5px #f1f4f8}.__ngx-selectbox-may .__selected-label .__remove-selected-btn::before{content:\"\\f00c\";position:absolute;font-family:FontAwesome;right:12px;font-size:12px;top:0;bottom:0;display:flex;align-items:center;-webkit-text-stroke:.5px #f1f4f8}.__ngx-selectbox-may .__item-list-browser{position:absolute;background-color:#fff;border-radius:4px;border:1px solid #dfe3e9;box-shadow:0 3px 18px -6px rgba(0,0,0,.5);z-index:1;top:-2px;left:-2px;right:-2px}.__ngx-selectbox-may .__item-list-browser ul{max-height:200px;overflow-y:auto;padding:0;margin:0;border-top:1px solid #dfe3e9}.__ngx-selectbox-may .__item-list-browser ul li{color:#777;font-size:13px;text-align:left;padding:9px 24px 9px 12px;border-bottom:1px solid #dfe3e9;cursor:pointer;line-height:17px}.__ngx-selectbox-may .__item-list-browser ul li.selected,.__ngx-selectbox-may .__item-list-browser ul li:hover{background-color:#f1f4f8;color:#2ea2f8}.__ngx-selectbox-may .__item-list-browser ul li.active{background-color:#f1f4f8;color:#2ea2f8;position:relative}.__ngx-selectbox-may .__item-list-browser ul li.active::before{content:\"\\f00c\";position:absolute;font-family:FontAwesome;right:12px;font-size:12px;-webkit-text-stroke:.5px #f1f4f8;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__item-list-browser ul li.__empty-items{color:#ff7f74;background-color:#fff4f4;cursor:auto}.__ngx-selectbox-may .__item-list-browser ul li:last-child{border-bottom:none}.__ngx-selectbox-may .__item-list-browser .__item-search{padding:5px;display:flex;position:relative}.__ngx-selectbox-may .__item-list-browser .__item-search::before{content:\"\\f002\";position:absolute;font-family:FontAwesome;right:16px;-webkit-text-stroke:.5px #fff;color:#ced0da;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__item-list-browser .__item-search input[type=text]{width:100%;border:1px solid #dfe3e9;border-radius:4px;padding:8px 30px 8px 10px;outline:0}.__ngx-selectbox-may .__item-list-browser .__item-search input[type=text]:focus{border:1px solid #2ea2f8;box-shadow:0 0 0 3px #2ea2f84d}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar{width:11px;height:18px}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-thumb{height:6px;border:3px solid transparent;background-clip:padding-box;-webkit-border-radius:7px;background-color:rgba(0,0,0,.15);-webkit-box-shadow:inset -1px -1px 0 rgba(0,0,0,.05) inset 1px 1px 0 rgba(0,0,0,.05)}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-button{width:0;height:0;display:none}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-corner{background-color:transparent}.__ngx-selectbox-may .__loading-text{position:absolute;background-color:#e5e5e5;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;padding-left:10px;border-radius:4px;z-index:2}"]
}] }
];
/** @nocollapse */
NgxSelectboxMayComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: NgxSelectboxMayService }
];
NgxSelectboxMayComponent.propDecorators = {
items: [{ type: Input, args: ["items",] }],
cssClass: [{ type: Input, args: ["css-class",] }],
valueField: [{ type: Input, args: ["value-field",] }],
labelField: [{ type: Input, args: ["label-field",] }],
placeholder: [{ type: Input, args: ["placeholder",] }],
emptyText: [{ type: Input, args: ["empty-text",] }],
showEmptyResultText: [{ type: Input, args: ["show-empty-text",] }],
isMulti: [{ type: Input, args: ["is-multi",] }],
isLoading: [{ type: Input, args: ["is-loading",] }],
loadingText: [{ type: Input, args: ["loading-text",] }],
onKeyUp: [{ type: Output, args: ["search-keyup",] }],
onSelect: [{ type: Output, args: ["on-select-item",] }],
onBlur: [{ type: Output, args: ["on-blur",] }],
searchField: [{ type: ViewChild, args: ['search_field',] }],
listItems: [{ type: ViewChildren, args: ["li_item",] }],
actionTemplate: [{ type: ContentChild, args: ['actionTemplate',] }],
content: [{ type: ViewChild, args: ['item_window',] }]
};
if (false) {
/** @type {?} */
NgxSelectboxMayComponent.prototype.dropdownRows;
/** @type {?} */
NgxSelectboxMayComponent.prototype.configs;
/** @type {?} */
NgxSelectboxMayComponent.prototype.selectedRows;
/** @type {?} */
NgxSelectboxMayComponent.prototype.show_items;
/** @type {?} */
NgxSelectboxMayComponent.prototype.searchText;
/** @type {?} */
NgxSelectboxMayComponent.prototype.isEnable;
/** @type {?} */
NgxSelectboxMayComponent.prototype.propagateChange;
/** @type {?} */
NgxSelectboxMayComponent.prototype.propagateOnTouch;
/** @type {?} */
NgxSelectboxMayComponent.prototype._isLoading;
/** @type {?} */
NgxSelectboxMayComponent.prototype._loadingText;
/** @type {?} */
NgxSelectboxMayComponent.prototype.onKeyUp;
/** @type {?} */
NgxSelectboxMayComponent.prototype.onSelect;
/** @type {?} */
NgxSelectboxMayComponent.prototype.onBlur;
/** @type {?} */
NgxSelectboxMayComponent.prototype.searchField;
/** @type {?} */
NgxSelectboxMayComponent.prototype.listItems;
/** @type {?} */
NgxSelectboxMayComponent.prototype.itemWindow;
/** @type {?} */
NgxSelectboxMayComponent.prototype.actionTemplate;
/** @type {?} */
NgxSelectboxMayComponent.prototype.ngModelValue;
/**
* @type {?}
* @private
*/
NgxSelectboxMayComponent.prototype._selectboxref;
/**
* @type {?}
* @private
*/
NgxSelectboxMayComponent.prototype.selectboxService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNlbGVjdGJveC1tYXkvIiwic291cmNlcyI6WyJsaWIvbmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFnQixNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQW1CLE1BQU0sNkJBQTZCLENBQUM7QUFrQm5GLE1BQU0sT0FBTyx3QkFBd0I7Ozs7O0lBeUVuQyxZQUFvQixhQUF5QixFQUFVLGdCQUF3QztRQUEzRSxrQkFBYSxHQUFiLGFBQWEsQ0FBWTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUF2RS9GLGlCQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUMxQyxZQUFPLEdBQXdCLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN6RCxpQkFBWSxHQUEyQixFQUFFLENBQUM7UUFDMUMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFDeEIsb0JBQWUsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLHFCQUFnQixHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUF1RFgsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsYUFBUSxHQUFHLElBQUks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bEMsb0RBQW1DOztJQTJDbkMsOENBQW9COztJQU1wQixnREFBcUI7O0lBTXJCLDJDQUFxRDs7SUFDckQsNENBQXdEOztJQUN4RCwwQ0FBK0M7O0lBRS9DLCtDQUFtRDs7SUFDbkQsNkNBQTBEOztJQUMxRCw4Q0FBdUI7O0lBRXZCLGtEQUF3RTs7SUFxTXhFLGdEQUFrQjs7Ozs7SUFwTU4saURBQWlDOzs7OztJQUFFLG9EQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29udGVudENoaWxkLCBUZW1wbGF0ZVJlZiwgT25EZXN0cm95LCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5neFNlbGVjdGJveE1heVNlcnZpY2UgfSBmcm9tICcuL25neC1zZWxlY3Rib3gtbWF5LnNlcnZpY2UnO1xuaW1wb3J0IHsgTkdYU2VsZWN0TWF5Q29uZmlncywgTkdYU2VsZWN0TWF5Um93IH0gZnJvbSAnLi9uZ3gtc2VsZWN0Ym94LW1heS1jb25maWdzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXNlbGVjdGJveC1tYXknLFxuICBob3N0OiB7XG4gICAgJyhkb2N1bWVudDpjbGljayknOiAnb25DbGlja091dHNpZGUoJGV2ZW50KScsXG4gICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJ1xuICB9LFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtc2VsZWN0Ym94LW1heS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neFNlbGVjdGJveE1heUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4U2VsZWN0Ym94TWF5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgZHJvcGRvd25Sb3dzOiBBcnJheTxOR1hTZWxlY3RNYXlSb3c+ID0gW107XG4gIGNvbmZpZ3M6IE5HWFNlbGVjdE1heUNvbmZpZ3MgPSBuZXcgTkdYU2VsZWN0TWF5Q29uZmlncygpO1xuICBzZWxlY3RlZFJvd3M6IEFycmF5PE5HWFNlbGVjdE1heVJvdz4gPSBbXTtcbiAgc2hvd19pdGVtczogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSBcIlwiO1xuICBpc0VuYWJsZTpib29sZWFuID0gdHJ1ZTtcbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuICBwcm9wYWdhdGVPblRvdWNoID0gKF86IGFueSkgPT4geyB9O1xuXG4gIEBJbnB1dChcIml0ZW1zXCIpXG4gIHNldCBpdGVtcyhpdGVtczogYW55W10pIHtcbiAgICB0aGlzLmNyZWF0ZURyb3Bkb3duUm93cyhpdGVtcyk7XG4gIH1cblxuICBASW5wdXQoXCJjc3MtY2xhc3NcIilcbiAgc2V0IGNzc0NsYXNzKGNzc0NsYXNzOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZ3MuY3NzQ2xhc3MgPSBjc3NDbGFzcztcbiAgfVxuXG4gIEBJbnB1dChcInZhbHVlLWZpZWxkXCIpXG4gIHNldCB2YWx1ZUZpZWxkKHZhbHVlRmllbGQ6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy52YWx1ZUZpZWxkID0gdmFsdWVGaWVsZDtcbiAgfVxuXG4gIEBJbnB1dChcImxhYmVsLWZpZWxkXCIpXG4gIHNldCBsYWJlbEZpZWxkKGxhYmVsRmllbGQ6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy5sYWJlbEZpZWxkID0gbGFiZWxGaWVsZDtcbiAgICB0aGlzLnJlY29uZmlndXJlTGFiZWxzQW5kVmFsdWVzKCk7XG4gIH1cblxuICBASW5wdXQoXCJwbGFjZWhvbGRlclwiKVxuICBzZXQgcGxhY2Vob2xkZXIocGxhY2Vob2xkZXI6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy5wbGFjZWhvbGRlclRleHQgPSBwbGFjZWhvbGRlcjtcbiAgfVxuXG4gIEBJbnB1dChcImVtcHR5LXRleHRcIilcbiAgc2V0IGVtcHR5VGV4dChlbXB0eVRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy5lbXB0eVRleHQgPSBlbXB0eVRleHQ7XG4gIH1cblxuICBASW5wdXQoXCJzaG93LWVtcHR5LXRleHRcIilcbiAgc2V0IHNob3dFbXB0eVJlc3VsdFRleHQoc2hvd0VtcHR5VGV4dDogYm9vbGVhbikge1xuICAgIHRoaXMuY29uZmlncy5zaG93RW1wdHlSZXN1bHRzTGFiZWwgPSBzaG93RW1wdHlUZXh0O1xuICB9XG5cbiAgQElucHV0KFwiaXMtbXVsdGlcIilcbiAgc2V0IGlzTXVsdGkoaXNNdWx0aTogYm9vbGVhbikge1xuICAgIHRoaXMuY29uZmlncy5pc011bHRpU2VsZWN0ID0gaXNNdWx0aTtcbiAgfVxuXG4gIF9pc0xvYWRpbmc6IGJvb2xlYW47XG4gIEBJbnB1dChcImlzLWxvYWRpbmdcIilcbiAgc2V0IGlzTG9hZGluZyhpc0xvYWRpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0xvYWRpbmcgPSBpc0xvYWRpbmc7XG4gIH1cblxuICBfbG9hZGluZ1RleHQ6IHN0cmluZztcbiAgQElucHV0KFwibG9hZGluZy10ZXh0XCIpXG4gIHNldCBsb2FkaW5nVGV4dChsb2FkaW5nVGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9hZGluZ1RleHQgPSBsb2FkaW5nVGV4dDtcbiAgfVxuXG4gIEBPdXRwdXQoXCJzZWFyY2gta2V5dXBcIikgb25LZXlVcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dChcIm9uLXNlbGVjdC1pdGVtXCIpIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwib24tYmx1clwiKSBvbkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoX2ZpZWxkJykgc2VhcmNoRmllbGQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oXCJsaV9pdGVtXCIpIGxpc3RJdGVtczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBpdGVtV2luZG93OiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoJ2FjdGlvblRlbXBsYXRlJykgYWN0aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPEVsZW1lbnRSZWY+O1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZWxlY3Rib3hyZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgc2VsZWN0Ym94U2VydmljZTogTmd4U2VsZWN0Ym94TWF5U2VydmljZSkge1xuXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgfVxuXG5cbiAgY3JlYXRlRHJvcGRvd25Sb3dzKGl0ZW1zOiBhbnlbXSkge1xuICAgIHRoaXMuZHJvcGRvd25Sb3dzID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLmNyZWF0ZURyb3Bkb3duUm93cyhpdGVtcywgdGhpcy5jb25maWdzKTtcbiAgICB0aGlzLnNldFZhbHVlc1Bhc3NlZEV4dGVybmFsKHRoaXMubmdNb2RlbFZhbHVlKTtcbiAgfVxuXG4gIHJlY29uZmlndXJlTGFiZWxzQW5kVmFsdWVzKCkge1xuICAgIHRoaXMuc2VsZWN0Ym94U2VydmljZS5yZWNvbmZpZ3VyZURyb3Bkb3duUm93TGFiZWxzQW5kVmFsdWVzKHRoaXMuZHJvcGRvd25Sb3dzLCB0aGlzLmNvbmZpZ3MpO1xuICB9XG5cbiAgZ2V0U2VsZWN0Ym94TGFiZWwoKSB7XG4gICAgbGV0IGxhYmVsID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLmNyZWF0ZURyb3Bkb3duTGFiZWwodGhpcy5jb25maWdzLCB0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgcmV0dXJuIGxhYmVsID8gbGFiZWwgOiB0aGlzLmNvbmZpZ3MucGxhY2Vob2xkZXJUZXh0O1xuICB9XG5cbiAgZ2V0RW1wdHlUZXh0TGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlncy5lbXB0eVRleHQgPyB0aGlzLmNvbmZpZ3MuZW1wdHlUZXh0IDogTkdYU2VsZWN0TWF5Q29uZmlncy5FTVBUWV9URVhUO1xuICB9XG5cbiAgZ2V0TG9hZGluZ1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdUZXh0ID8gdGhpcy5fbG9hZGluZ1RleHQgOiBOR1hTZWxlY3RNYXlDb25maWdzLkxPQURJTkdfVEVYVDtcbiAgfVxuXG4gIG9uQ2xpY2tTZWxlY3RCb3goKSB7XG4gICAgdGhpcy5zaG93SXRlbXNXaW5kb3coKTtcbiAgfVxuXG4gIGdldEFjdGl2ZUNsYXNzKCkge1xuICAgIHJldHVybiBOR1hTZWxlY3RNYXlDb25maWdzLlJPV19BQ1RJVkVfQ0xBU1M7XG4gIH1cblxuICBzaG93SXRlbXNXaW5kb3coKSB7XG4gICAgdGhpcy5zaG93X2l0ZW1zID0gdHJ1ZTtcbiAgfVxuXG4gIGhpZGVJdGVtc1dpbmRvdygpIHtcbiAgICB0aGlzLm9uQmx1ci5lbWl0KHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgdGhpcy5yZXNldEZpbHRlcnMoKTtcbiAgICB0aGlzLnNob3dfaXRlbXMgPSBmYWxzZTtcbiAgfVxuXG4gIG9uUmVtb3ZlQ2xpY2soKSB7XG4gICAgdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLnVuc2VsZWN0QWxsU2VsZWN0ZWRSb3dzKHRoaXMuZHJvcGRvd25Sb3dzKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFtdO1xuICAgIHRoaXMucHVibGlzaFZhbHVlKCk7XG4gIH1cblxuICBvblNlYXJjaEtleWRvd24oZSkge1xuICAgIGlmIChlLmtleSA9PSBcIkVzY2FwZVwiKSB7XG4gICAgICB0aGlzLmhpZGVJdGVtc1dpbmRvdygpO1xuICAgIH1cbiAgICAvL1VwIGFuZCBEb3duIGFycm93IGV2ZW50c1xuICAgIGlmIChlLmtleUNvZGUgPT0gMzggfHwgZS5rZXlDb2RlID09IDQwKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2hLZXl1cChlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PSAzOCB8fCBlLmtleUNvZGUgPT0gNDAgfHwgZS5rZXkgPT0gXCJFc2NhcGVcIikge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMub25LZXlVcC5lbWl0KHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRGaWx0ZXJzKCkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IFwiXCI7XG4gIH1cblxuICBvbkNsaWNrSXRlbShyb3c6IE5HWFNlbGVjdE1heVJvdywgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmNvbmZpZ3MuaXNNdWx0aVNlbGVjdCkge1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLnNldFNlbGVjdGVkSXRlbXModGhpcy5jb25maWdzLCB0aGlzLnNlbGVjdGVkUm93cywgdGhpcy5kcm9wZG93blJvd3MsIHJvdyk7XG4gICAgICB0aGlzLm9uU2VsZWN0LmVtaXQocm93LmRhdGEpO1xuICAgICAgdGhpcy5oaWRlSXRlbXNXaW5kb3coKTtcbiAgICB9XG4gICAgdGhpcy5wdWJsaXNoVmFsdWUoKTtcbiAgfVxuXG4gIHB1Ymxpc2hWYWx1ZSgpIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5zZWxlY3RlZFJvd3MubWFwKHIgPT4gci52YWx1ZSk7XG4gICAgaWYgKHRoaXMuY29uZmlncy5pc011bHRpU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6IFwiXCIpO1xuICAgIH1cbiAgfVxuXG4gIHNldFZhbHVlc1Bhc3NlZEV4dGVybmFsKG9iajogYW55KSB7XG4gICAgaWYgKHRoaXMuY29uZmlncy5pc011bHRpU2VsZWN0KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuc2VsZWN0Ym94U2VydmljZS5zZWxlY3RJdGVtc0J5VmFsdWUodGhpcy5kcm9wZG93blJvd3MsIG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLnNlbGVjdEl0ZW1CeVZhbHVlKHRoaXMuZHJvcGRvd25Sb3dzLCBvYmopO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICpcbiAgKiBPbiBJdGVtIGJyb3dzZSBvcGVuIHdpbmRvdyBiZWdpbiAmIGRvY3VtZW50IG91dHNpZGUgY2xpY2sgZXZlbnQgQmVnaW5zXG4gICogXG4gICovXG5cbiAgQFZpZXdDaGlsZCgnaXRlbV93aW5kb3cnKSBzZXQgY29udGVudChjb250ZW50OiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5pdGVtV2luZG93ID0gY29udGVudDtcbiAgICAvLyB0aGlzLnBvc2l0aW9uV2luZG93KCk7XG4gICAgdGhpcy5mb2N1c1RvU2VhcmNoRmllbGQoKTtcbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRJdGVtKCk7XG4gIH1cblxuICBwb3NpdGlvbldpbmRvdygpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hGaWVsZCkge1xuICAgICAgY29uc3Qgc2VsZWN0Qm94UmVmID0gdGhpcy5fc2VsZWN0Ym94cmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB2YXIgdmlld3BvcnRPZmZzZXQgPSBzZWxlY3RCb3hSZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zb2xlLmxvZyh2aWV3cG9ydE9mZnNldCk7XG4gICAgICB0aGlzLml0ZW1XaW5kb3cubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiAnICsgKHNlbGVjdEJveFJlZi5maXJzdENoaWxkLm9mZnNldFdpZHRoICsgMykgKyAncHg7IHRvcDogJyArICh2aWV3cG9ydE9mZnNldC50b3AgLSA1KSArICdweDsgbWFyZ2luLWxlZnQ6IC0xMnB4OycpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzVG9TZWFyY2hGaWVsZCgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hGaWVsZCkge1xuICAgICAgdGhpcy5zZWFyY2hGaWVsZC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKSB7XG4gICAgdGhpcy5saXN0SXRlbXMuZm9yRWFjaChsaSA9PiB7XG4gICAgICBpZiAobGkubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoTkdYU2VsZWN0TWF5Q29uZmlncy5ST1dfQUNUSVZFX0NMQVNTKSkge1xuICAgICAgICBjb25zdCBzY3JvbGxMaSA9IGxpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaXRlbVdpbmRvdy5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidWxcIilbMF0uc2Nyb2xsVG9wID0gc2Nyb2xsTGkub2Zmc2V0VG9wIC0gKHNjcm9sbExpLm9mZnNldEhlaWdodCArIDIwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uQ2xpY2tPdXRzaWRlKGUpIHtcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGJveHJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgdGhpcy5zaG93X2l0ZW1zKSB7XG4gICAgICB0aGlzLmhpZGVJdGVtc1dpbmRvdygpO1xuICAgIH1cbiAgfVxuXG4gIG9uV2luZG93UmVzaXplKGUpIHtcbiAgICAvLyB0aGlzLnBvc2l0aW9uV2luZG93KCk7XG4gIH1cblxuICBzZXREaXNhYmxlKCl7XG4gICAgdGhpcy5oaWRlSXRlbXNXaW5kb3coKTtcbiAgICB0aGlzLmlzRW5hYmxlID0gZmFsc2U7XG4gIH1cblxuICBzZXRFbmFibGUoKXtcbiAgICB0aGlzLmlzRW5hYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIC8qXG4gICpcbiAgKiBPbiBJdGVtIGJyb3dzZSBvcGVuIHdpbmRvdyBiZWdpbiAmIGRvY3VtZW50IG91dHNpZGUgY2xpY2sgZXZlbnQgRW5kc1xuICAqIFxuICAqL1xuXG5cblxuICAvKlxuICAvL29uIGRvY3VtZW50IGtleSB1cCBhbmQgZG93blxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKSBvbktleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYoKGV2ZW50LmtleUNvZGUgPT0gMzggfHwgZXZlbnQua2V5Q29kZSA9PSA0MCkgJiYgdGhpcy5pdGVtV2luZG93ICYmIHRoaXMuY2xvbmVkSXRlbXMubGVuZ3RoID4gMCl7XG4gICAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgdWwgPSB0aGlzLml0ZW1XaW5kb3cubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInVsXCIpWzBdXG4gICAgICAgIHZhciBzZWxlY3RlZExpID0gdWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKVswXTtcbiAgICAgICAgaWYoc2VsZWN0ZWRMaSl7XG4gICAgICAgICAgaW5kZXggPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHVsLmNoaWxkcmVuLCBzZWxlY3RlZExpKTtcbiAgICAgICAgICBzZWxlY3RlZExpLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvL3VwIGFycm93XG4gICAgICAgIGlmKGV2ZW50LmtleUNvZGUgPT0gMzgpe1xuICAgICAgICAgIGluZGV4ID0gKChpbmRleCAtIDEpIDwgMCkgPyAwIDogKGluZGV4IC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9kb3duIGFycm93XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgaW5kZXggPSAoKGluZGV4ICsgMSkgPiAodWwuY2hpbGRyZW4ubGVuZ3RoIC0xKSkgPyAodWwuY2hpbGRyZW4ubGVuZ3RoIC0xKSA6ICAoaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgICB1bC5jaGlsZHJlbltpbmRleF0uY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgICAgICB1bC5zY3JvbGxUb3AgPSB1bC5jaGlsZHJlbltpbmRleF0ub2Zmc2V0VG9wIC0gKHVsLmNoaWxkcmVuW2luZGV4XS5vZmZzZXRIZWlnaHQgKyAyMCk7XG4gICAgfVxuICB9XG4qL1xuICAvL0NvbnRyb2wgdmFsdWUgYWNjZXNzb3IgYmVnaW5zXG4gIC8vU3RvcmUgZXh0ZXJuYWwgdmFsdWUgb25jZSBpdGVtcyBnb3QgbG9hZGVkIGluIHRvIGRyb3Bkb3duXG4gIG5nTW9kZWxWYWx1ZTogYW55O1xuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgdGhpcy5uZ01vZGVsVmFsdWUgPSBvYmo7XG4gICAgdGhpcy5zZXRWYWx1ZXNQYXNzZWRFeHRlcm5hbChvYmopO1xuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlT25Ub3VjaCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhpc0Rpc2FibGVkLCBcInNldCBkaXNhYmxlXCIpO1xuICAgIGlmKGlzRGlzYWJsZWQpe1xuICAgICAgdGhpcy5zZXREaXNhYmxlKCk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnNldEVuYWJsZSgpO1xuICAgIH1cbiAgfVxuICAvL0NvbnRyb2wgdmFsdWUgYWNjZXNzb3IgZW5kc1xufSJdfQ==