auto-complete.js 23.8 KB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { NgModule, Component, Input, Output, EventEmitter, forwardRef } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { SharedModule } from 'primeng/primeng';
import { Request } from '../_services/request.service';
import * as _ from 'lodash';
import { DxSelectBoxModule } from 'devextreme-angular';
import DataSource from 'devextreme/data/data_source';
import CustomStore from 'devextreme/data/custom_store';
import ArrayStore from 'devextreme/data/array_store';
export class SocAutoCompleteComponent {
    /**
     * @param {?} request
     */
    constructor(request) {
        this.request = request;
        this.filteredOptions = [];
        /**
         * local, remote
         */
        this.mode = 'local';
        /**
         * API ที่ต้องการเรียกใช้เมื่อพิมพ์ auto complete
         */
        this.api = '';
        /**
         * field ที่ต้องการ query เมื่อยิง API
         */
        this.field = '';
        this.id = '';
        this.placeholder = '';
        this.disabled = false;
        this.orderBy = '';
        this.filter = '';
        this.limit = 1000;
        this.onLoad = new EventEmitter();
        this.valueChange = new EventEmitter();
        this.resData = [];
        this.openOnFieldClick = false;
        this.showDropDownButton = false;
        this.acceptCustomValue = true;
        this.searchEnabled = true;
        this.inputValue = '';
        this.fnCustomStoreOnLoaded = (result) => {
            return result;
        };
        /**
         * START Bind Value
         */
        this.onModelChange = () => { };
        this.onModelTouched = () => { };
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            if (this.mode === 'dropdown') {
                this.acceptCustomValue = false;
                this.searchEnabled = false;
            }
            /** ถ้าเป็น โหมด local จะแสดง list ให้เลือกเลย แตถ้่เป็น remote จะต้องขึ้นเมื่อพิมพ์เท่านั้น */
            if (this.mode === 'local' || this.mode === 'dropdown') {
                this.openOnFieldClick = true;
                this.showDropDownButton = true;
                this.fnStartDataSourceLocal();
            }
            else {
                this.fnStartDataSourceRemote();
            }
        });
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
    }
    /**
     * @return {?}
     */
    fnStartDataSourceLocal() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            /** @type {?} */
            let params = `?_fields=${this.field}`;
            if (this.filter) {
                params += `&_where=(${this.filter})`;
            }
            if (this.orderBy && this.orderBy !== '') {
                params += `&_sort=${this.orderBy}`;
            }
            params += `&_limit=${this.limit}`;
            /** @type {?} */
            let resData = yield this.fnPreResponse(params);
            this.ds = new DataSource({
                store: new ArrayStore({
                    data: resData,
                    onLoaded: this.fnCustomStoreOnLoaded
                })
            });
        });
    }
    /**
     * @return {?}
     */
    fnStartDataSourceRemote() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            this.ds = new DataSource({
                store: new CustomStore({
                    byKey: (key) => tslib_1.__awaiter(this, void 0, void 0, function* () {
                        this.onLoad.emit(key);
                        return this.fnGetCustomStore(key);
                    }),
                    load: (loadOptions) => tslib_1.__awaiter(this, void 0, void 0, function* () {
                        this.onLoad.emit(loadOptions.searchValue);
                        return this.fnGetCustomStore(loadOptions.searchValue);
                        ;
                    }),
                    onLoaded: this.fnCustomStoreOnLoaded
                })
            });
        });
    }
    /**
     * @param {?} key
     * @return {?}
     */
    fnGetCustomStore(key) {
        /** @type {?} */
        let params = `?_fields=${this.field}&_where=(${this.field},like,$${key}$)`;
        if (this.filter) {
            params = `?_fields=${this.field}&_where=((${this.field},like,$${key}$)$and(${this.filter}))`;
        }
        if (this.orderBy && this.orderBy !== '') {
            params += `&_sort=${this.orderBy}`;
        }
        params += `&_limit=${this.limit}`;
        return this.fnPreResponse(params);
        ;
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onValueChanged(e) {
        console.log("​SocAutoCompleteComponent -> onValueChanged -> e", e);
        this.valueChange.emit(e.value);
    }
    /**
     * @param {?} params
     * @return {?}
     */
    fnPreResponse(params) {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            /** @type {?} */
            let resData = yield this.request.get(this.api + params);
            resData = _.map(resData, (obj) => {
                return obj[this.field];
            });
            resData = _.uniqBy(resData);
            return resData;
        });
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onOpened(e) {
        /** @type {?} */
        const element = document.querySelector('.dx-overlay-wrapper.dx-dropdowneditor-overlay.dx-popup-wrapper.dx-dropdownlist-popup-wrapper.dx-selectbox-popup-wrapper');
        element.setAttribute('style', 'z-index:9999;');
    }
    /**
     * @param {?} value
     * @return {?}
     */
    writeValue(value) { }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnChange(fn) { }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnTouched(fn) { }
}
SocAutoCompleteComponent.decorators = [
    { type: Component, args: [{
                selector: 'soc-auto-complete',
                providers: [{
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef(() => SocAutoCompleteComponent),
                        multi: true
                    }],
                template: `
      <dx-select-box [dataSource]="ds"
                [searchEnabled]="searchEnabled"
                [openOnFieldClick]="openOnFieldClick"
                [showClearButton]="true"
                [showDropDownButton]="showDropDownButton"
                [inputAttr]="{ id: id }"
                [acceptCustomValue]="acceptCustomValue"
                [placeholder]="placeholder"
                [(value)]="value"
                (onValueChanged)="onValueChanged($event)"
                (onOpened)="onOpened($event)"
                [disabled]="disabled"
                noDataText="ไม่พบข้อมูล"
                placeholder="กรุณาเลือกรายการ"
            ></dx-select-box>
`
            }] }
];
/** @nocollapse */
SocAutoCompleteComponent.ctorParameters = () => [
    { type: Request }
];
SocAutoCompleteComponent.propDecorators = {
    mode: [{ type: Input }],
    api: [{ type: Input }],
    field: [{ type: Input }],
    id: [{ type: Input }],
    placeholder: [{ type: Input }],
    value: [{ type: Input }],
    disabled: [{ type: Input }],
    orderBy: [{ type: Input }],
    filter: [{ type: Input }],
    limit: [{ type: Input }],
    onLoad: [{ type: Output }],
    valueChange: [{ type: Output }]
};
if (false) {
    /** @type {?} */
    SocAutoCompleteComponent.prototype.filteredOptions;
    /**
     * local, remote
     * @type {?}
     */
    SocAutoCompleteComponent.prototype.mode;
    /**
     * API ที่ต้องการเรียกใช้เมื่อพิมพ์ auto complete
     * @type {?}
     */
    SocAutoCompleteComponent.prototype.api;
    /**
     * field ที่ต้องการ query เมื่อยิง API
     * @type {?}
     */
    SocAutoCompleteComponent.prototype.field;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.id;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.placeholder;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.value;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.disabled;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.orderBy;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.filter;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.limit;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.onLoad;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.valueChange;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.resData;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.openOnFieldClick;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.showDropDownButton;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.acceptCustomValue;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.searchEnabled;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.inputValue;
    /**
     * ds
     * @type {?}
     */
    SocAutoCompleteComponent.prototype.ds;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.fnCustomStoreOnLoaded;
    /**
     * START Bind Value
     * @type {?}
     */
    SocAutoCompleteComponent.prototype.onModelChange;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.onModelTouched;
    /** @type {?} */
    SocAutoCompleteComponent.prototype.request;
}
export class SharedAutoCompleteModule {
}
SharedAutoCompleteModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, FormsModule, SharedModule, DxSelectBoxModule],
                exports: [SocAutoCompleteComponent, SharedModule],
                declarations: [SocAutoCompleteComponent],
            },] }
];

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NvYy1hcHAtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9fdGVtcGxhdGUvYXV0by1jb21wbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDSCxRQUFRLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFDdkUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLFVBQVUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRCxPQUFPLFdBQVcsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLFVBQVUsTUFBTSw2QkFBNkIsQ0FBQztBQTJCckQsTUFBTTs7OztJQXlCRixZQUFvQixPQUFnQjtRQUFoQixZQUFPLEdBQVAsT0FBTyxDQUFTOytCQXhCbEIsRUFBRTs7OztvQkFFNkIsT0FBTzs7OzttQkFFekMsRUFBRTs7OztxQkFFQSxFQUFFO2tCQUNMLEVBQUU7MkJBQ08sRUFBRTt3QkFFTCxLQUFLO3VCQUNOLEVBQUU7c0JBQ0gsRUFBRTtxQkFDSCxJQUFJO3NCQUNpQixJQUFJLFlBQVksRUFBTzsyQkFDZixJQUFJLFlBQVksRUFBVTt1QkFDOUQsRUFBRTtnQ0FDTyxLQUFLO2tDQUNILEtBQUs7aUNBQ04sSUFBSTs2QkFDUixJQUFJOzBCQUNQLEVBQUU7cUNB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LG1CQUFtQjtnQkFDN0IsU0FBUyxFQUFFLENBQUM7d0JBQ1IsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQzt3QkFDdkQsS0FBSyxFQUFFLElBQUk7cUJBQ2QsQ0FBQztnQkFDRixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnQmI7YUFDQTs7OztZQS9CUSxPQUFPOzs7bUJBbUNYLEtBQUs7a0JBRUwsS0FBSztvQkFFTCxLQUFLO2lCQUNMLEtBQUs7MEJBQ0wsS0FBSztvQkFDTCxLQUFLO3VCQUNMLEtBQUs7c0JBQ0wsS0FBSztxQkFDTCxLQUFLO29CQUNMLEtBQUs7cUJBQ0wsTUFBTTswQkFDTixNQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUdYLE1BQU07OztZQUxMLFFBQVEsU0FBQztnQkFDTixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztnQkFDckUsT0FBTyxFQUFFLENBQUMsd0JBQXdCLEVBQUUsWUFBWSxDQUFDO2dCQUNqRCxZQUFZLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQzthQUMzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgTmdNb2R1bGUsIENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEFmdGVyVmlld0luaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNoYXJlZE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcHJpbWVuZyc7XG5pbXBvcnQgeyBSZXF1ZXN0IH0gZnJvbSAnLi4vX3NlcnZpY2VzL3JlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBEeFNlbGVjdEJveE1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICdkZXZleHRyZW1lL2RhdGEvZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEN1c3RvbVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9jdXN0b21fc3RvcmUnO1xuaW1wb3J0IEFycmF5U3RvcmUgZnJvbSAnZGV2ZXh0cmVtZS9kYXRhL2FycmF5X3N0b3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzb2MtYXV0by1jb21wbGV0ZScsXG4gICAgcHJvdmlkZXJzOiBbe1xuICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU29jQXV0b0NvbXBsZXRlQ29tcG9uZW50KSxcbiAgICAgICAgbXVsdGk6IHRydWVcbiAgICB9XSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgPGR4LXNlbGVjdC1ib3ggW2RhdGFTb3VyY2VdPVwiZHNcIlxuICAgICAgICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cInNlYXJjaEVuYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtvcGVuT25GaWVsZENsaWNrXT1cIm9wZW5PbkZpZWxkQ2xpY2tcIlxuICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dEcm9wRG93bkJ1dHRvbl09XCJzaG93RHJvcERvd25CdXR0b25cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEF0dHJdPVwieyBpZDogaWQgfVwiXG4gICAgICAgICAgICAgICAgW2FjY2VwdEN1c3RvbVZhbHVlXT1cImFjY2VwdEN1c3RvbVZhbHVlXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uT3BlbmVkKT1cIm9uT3BlbmVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgbm9EYXRhVGV4dD1cIuC5hOC4oeC5iOC4nuC4muC4guC5ieC4reC4oeC4ueC4pVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLguIHguKPguLjguJPguLLguYDguKXguLfguK3guIHguKPguLLguKLguIHguLLguKNcIlxuICAgICAgICAgICAgPjwvZHgtc2VsZWN0LWJveD5cbmBcbn0pXG5leHBvcnQgY2xhc3MgU29jQXV0b0NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgZmlsdGVyZWRPcHRpb25zID0gW107XG4gICAgLyoqIGxvY2FsLCByZW1vdGUgKi9cbiAgICBASW5wdXQoKSBtb2RlOiAnbG9jYWwnIHwgJ3JlbW90ZScgfCAnZHJvcGRvd24nID0gJ2xvY2FsJztcbiAgICAvKiogQVBJIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5gOC4o+C4teC4ouC4geC5g+C4iuC5ieC5gOC4oeC4t+C5iOC4reC4nuC4tOC4oeC4nuC5jCBhdXRvIGNvbXBsZXRlICovXG4gICAgQElucHV0KCkgYXBpID0gJyc7XG4gICAgLyoqIGZpZWxkIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4oyBxdWVyeSDguYDguKHguLfguYjguK3guKLguLTguIcgQVBJICovXG4gICAgQElucHV0KCkgZmllbGQgPSAnJztcbiAgICBASW5wdXQoKSBpZCA9ICcnO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gICAgQElucHV0KCkgdmFsdWU6IFN0cmluZztcbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIG9yZGVyQnkgPSAnJztcbiAgICBASW5wdXQoKSBmaWx0ZXIgPSAnJztcbiAgICBASW5wdXQoKSBsaW1pdCA9IDEwMDA7XG4gICAgQE91dHB1dCgpIG9uTG9hZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICAgcmVzRGF0YSA9IFtdO1xuICAgIG9wZW5PbkZpZWxkQ2xpY2sgPSBmYWxzZTtcbiAgICBzaG93RHJvcERvd25CdXR0b24gPSBmYWxzZTtcbiAgICBhY2NlcHRDdXN0b21WYWx1ZSA9IHRydWU7XG4gICAgc2VhcmNoRW5hYmxlZCA9IHRydWU7XG4gICAgaW5wdXRWYWx1ZSA9ICcnO1xuICAgIC8qKiBkcyAqL1xuICAgIGRzOiBEYXRhU291cmNlO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVxdWVzdDogUmVxdWVzdCkgeyB9XG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdkcm9wZG93bicpIHtcbiAgICAgICAgICAgIHRoaXMuYWNjZXB0Q3VzdG9tVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qKiDguJbguYnguLLguYDguJvguYfguJkg4LmC4Lir4Lih4LiUIGxvY2FsIOC4iOC4sOC5geC4quC4lOC4hyBsaXN0IOC5g+C4q+C5ieC5gOC4peC4t+C4reC4geC5gOC4peC4oiDguYHguJXguJbguYnguYjguYDguJvguYfguJkgcmVtb3RlIOC4iOC4sOC4leC5ieC4reC4h+C4guC4tuC5ieC4meC5gOC4oeC4t+C5iOC4reC4nuC4tOC4oeC4nuC5jOC5gOC4l+C5iOC4suC4meC4seC5ieC4mSAqL1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnbG9jYWwnIHx8IHRoaXMubW9kZSA9PT0gJ2Ryb3Bkb3duJykge1xuICAgICAgICAgICAgdGhpcy5vcGVuT25GaWVsZENsaWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Ryb3BEb3duQnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZm5TdGFydERhdGFTb3VyY2VMb2NhbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mblN0YXJ0RGF0YVNvdXJjZVJlbW90ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB9XG5cbiAgICBhc3luYyBmblN0YXJ0RGF0YVNvdXJjZUxvY2FsKCkge1xuICAgICAgICBsZXQgcGFyYW1zID0gYD9fZmllbGRzPSR7dGhpcy5maWVsZH1gXG4gICAgICAgIGlmKHRoaXMuZmlsdGVyKSB7XG4gICAgICAgICAgICBwYXJhbXMgKz0gYCZfd2hlcmU9KCR7dGhpcy5maWx0ZXJ9KWBcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcmRlckJ5ICYmIHRoaXMub3JkZXJCeSAhPT0gJycpIHtcbiAgICAgICAgICAgIHBhcmFtcyArPSBgJl9zb3J0PSR7dGhpcy5vcmRlckJ5fWA7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zICs9IGAmX2xpbWl0PSR7dGhpcy5saW1pdH1gO1xuICAgICAgICBsZXQgcmVzRGF0YSA9IGF3YWl0IHRoaXMuZm5QcmVSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICB0aGlzLmRzID0gbmV3IERhdGFTb3VyY2Uoe1xuICAgICAgICAgICAgc3RvcmU6IG5ldyBBcnJheVN0b3JlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiByZXNEYXRhLFxuICAgICAgICAgICAgICAgIG9uTG9hZGVkOiB0aGlzLmZuQ3VzdG9tU3RvcmVPbkxvYWRlZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGZuU3RhcnREYXRhU291cmNlUmVtb3RlKCkge1xuICAgICAgICB0aGlzLmRzID0gbmV3IERhdGFTb3VyY2Uoe1xuICAgICAgICAgICAgc3RvcmU6IG5ldyBDdXN0b21TdG9yZSh7XG4gICAgICAgICAgICAgICAgYnlLZXk6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkxvYWQuZW1pdChrZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mbkdldEN1c3RvbVN0b3JlKGtleSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsb2FkOiBhc3luYyAobG9hZE9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTG9hZC5lbWl0KGxvYWRPcHRpb25zLnNlYXJjaFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm5HZXRDdXN0b21TdG9yZShsb2FkT3B0aW9ucy5zZWFyY2hWYWx1ZSk7O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25Mb2FkZWQ6IHRoaXMuZm5DdXN0b21TdG9yZU9uTG9hZGVkXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm5HZXRDdXN0b21TdG9yZShrZXk6IGFueSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gYD9fZmllbGRzPSR7dGhpcy5maWVsZH0mX3doZXJlPSgke3RoaXMuZmllbGR9LGxpa2UsJCR7a2V5fSQpYDtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBgP19maWVsZHM9JHt0aGlzLmZpZWxkfSZfd2hlcmU9KCgke3RoaXMuZmllbGR9LGxpa2UsJCR7a2V5fSQpJGFuZCgke3RoaXMuZmlsdGVyfSkpYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcmRlckJ5ICYmIHRoaXMub3JkZXJCeSAhPT0gJycpIHtcbiAgICAgICAgICAgIHBhcmFtcyArPSBgJl9zb3J0PSR7dGhpcy5vcmRlckJ5fWA7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zICs9IGAmX2xpbWl0PSR7dGhpcy5saW1pdH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5mblByZVJlc3BvbnNlKHBhcmFtcyk7O1xuICAgIH1cbiAgICBmbkN1c3RvbVN0b3JlT25Mb2FkZWQgPSAocmVzdWx0OiBhbnlbXSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvblZhbHVlQ2hhbmdlZChlOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLigItTb2NBdXRvQ29tcGxldGVDb21wb25lbnQgLT4gb25WYWx1ZUNoYW5nZWQgLT4gZVwiLCBlKVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZS52YWx1ZSk7XG5cbiAgICB9XG4gICAgYXN5bmMgZm5QcmVSZXNwb25zZShwYXJhbXMpIHtcbiAgICAgICAgbGV0IHJlc0RhdGEgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KHRoaXMuYXBpICsgcGFyYW1zKTtcbiAgICAgICAgcmVzRGF0YSA9IF8ubWFwKHJlc0RhdGEsIChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9ialt0aGlzLmZpZWxkXVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzRGF0YSA9IF8udW5pcUJ5KHJlc0RhdGEpO1xuICAgICAgICByZXR1cm4gcmVzRGF0YVxuICAgIH1cbiAgICBvbk9wZW5lZChlKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZHgtb3ZlcmxheS13cmFwcGVyLmR4LWRyb3Bkb3duZWRpdG9yLW92ZXJsYXkuZHgtcG9wdXAtd3JhcHBlci5keC1kcm9wZG93bmxpc3QtcG9wdXAtd3JhcHBlci5keC1zZWxlY3Rib3gtcG9wdXAtd3JhcHBlcicpO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnei1pbmRleDo5OTk5OycpO1xuICAgIH1cbiAgICAvKiogU1RBUlQgQmluZCBWYWx1ZSAqL1xuICAgIG9uTW9kZWxDaGFuZ2U6IEZ1bmN0aW9uID0gKCkgPT4geyB9O1xuICAgIG9uTW9kZWxUb3VjaGVkOiBGdW5jdGlvbiA9ICgpID0+IHsgfTtcbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHsgfVxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IEZ1bmN0aW9uKTogdm9pZCB7IH1cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogRnVuY3Rpb24pOiB2b2lkIHsgfVxuICAgIC8qKiBFTkQgQmluZCBWYWx1ZSAqL1xuXG59XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFNoYXJlZE1vZHVsZSwgRHhTZWxlY3RCb3hNb2R1bGVdLFxuICAgIGV4cG9ydHM6IFtTb2NBdXRvQ29tcGxldGVDb21wb25lbnQsIFNoYXJlZE1vZHVsZV0sXG4gICAgZGVjbGFyYXRpb25zOiBbU29jQXV0b0NvbXBsZXRlQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgU2hhcmVkQXV0b0NvbXBsZXRlTW9kdWxlIHsgfVxuIl19