angular4x-auto-complete-multi
Version:
Remote autocomple for andular 4, 5, 6. Setup the url and field names of database which value will show in list, Multiple fiels can be set by comma separator. The data format of return value of remote url should be JSON. After start typing i
203 lines (197 loc) • 25.1 kB
JavaScript
import { __values } from 'tslib';
import { Component, Renderer2, ViewChild, HostListener, NgModule } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Angula4xAutoCompleteComponent = /** @class */ (function () {
function Angula4xAutoCompleteComponent(http, renderer) {
this.http = http;
this.renderer = renderer;
this.all_list_child = [];
this.selected_row = [];
this.selected_row_obj = {};
this._loading = "hidden";
}
/**
* @param {?} setting_obj
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype.setting = /**
* @param {?} setting_obj
* @return {?}
*/
function (setting_obj) {
this.data_url = setting_obj.data_url;
this.db_fields = setting_obj.db_fields;
//console.log(this.data_url)
};
/**
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype.clickout = /**
* @return {?}
*/
function () {
this._clearList();
};
/**
* @param {?} event
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype.getData = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
var /** @type {?} */ input_val = event.target.value;
if (input_val.length == 0) {
this._clearList();
return;
}
var /** @type {?} */ final_url = this.data_url + '?q=' + input_val;
this._loading = "visible";
this.http.get(final_url).subscribe(function (todo) {
_this._clearList();
var _loop_1 = function (k) {
var /** @type {?} */ new_div = _this.renderer.createElement('div');
var /** @type {?} */ field_array = _this.db_fields.split(",");
var /** @type {?} */ display_text = "";
for (var /** @type {?} */ i = 0; i < field_array.length; i++) {
display_text += todo[k][field_array[i]] + " ";
}
display_text = display_text.trim();
_this.renderer.appendChild(new_div, _this.renderer.createText(display_text));
_this.all_list_child.push(new_div);
_this.renderer.listen(new_div, 'click', function (event) {
//this.text_fld.nativeElement.value=event.target.innerHTML
var /** @type {?} */ tindex = Array.from(event.target.parentNode.children).indexOf(event.target);
var /** @type {?} */ id = todo[tindex].id;
try {
for (var _a = __values(_this.selected_row), _b = _a.next(); !_b.done; _b = _a.next()) {
var row = _b.value;
if (row.id == id) {
_this.text_fld.nativeElement.value = "";
return;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
//this.selected_row.push(todo[tindex])
//this.selected_row.push(todo[tindex])
_this.selected_row_obj[display_text] = todo[tindex];
//console.log(this.selected_row_obj);
var /** @type {?} */ select_new_div = _this.renderer.createElement('div');
var /** @type {?} */ remove_new_div = _this.renderer.createElement('div');
_this.renderer.appendChild(remove_new_div, _this.renderer.createText("x"));
_this.renderer.addClass(remove_new_div, 'remove_div');
_this.renderer.setAttribute(remove_new_div, "id", display_text + "_" + "elem_autocomp");
_this.renderer.addClass(select_new_div, "selected_div");
_this.renderer.appendChild(select_new_div, remove_new_div);
_this.renderer.appendChild(select_new_div, _this.renderer.createText(event.target.innerHTML));
_this.renderer.listen(remove_new_div, 'click', function (event) {
var /** @type {?} */ id = event.target.id.split("_")[0];
delete _this.selected_row_obj[id];
_this.renderer.removeChild(_this.list_div.nativeElement, event.target.parentNode);
//console.log(this.selected_row_obj);
});
_this.text_fld.nativeElement.value = "";
_this.renderer.appendChild(_this.list_div.nativeElement, select_new_div);
var e_1, _c;
});
_this.renderer.appendChild(_this.list.nativeElement, new_div);
theight = _this.text_fld.nativeElement.parentElement.offsetHeight;
_this.renderer.setStyle(_this.list.nativeElement, "top", theight + "px");
_this.renderer.setStyle(_this.list.nativeElement, "display", "block");
_this.renderer.addClass(new_div, "ngxautocomp_list_el");
};
var theight;
for (var /** @type {?} */ k in todo) {
_loop_1(k);
}
_this._loading = "hidden";
});
};
/**
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype._clearList = /**
* @return {?}
*/
function () {
for (var /** @type {?} */ i = 0; i < this.all_list_child.length; i++)
this.renderer.removeChild(this.list.nativeElement, this.all_list_child[i]);
this.all_list_child = [];
this.renderer.setStyle(this.list.nativeElement, "display", "none");
};
/**
* @return {?}
*/
Angula4xAutoCompleteComponent.prototype.getSelectedRow = /**
* @return {?}
*/
function () {
var /** @type {?} */ i = 0;
this.selected_row = [];
for (var /** @type {?} */ row in this.selected_row_obj) {
this.selected_row[i++] = this.selected_row_obj[row];
}
return JSON.stringify(this.selected_row);
};
Angula4xAutoCompleteComponent.decorators = [
{ type: Component, args: [{
selector: 'angula4x-auto-complete',
template: "\n<div class=\"ngxautocomplete\">\n <div #_ng_autocomp_selected_list class=\"list_container\"></div>\n <input type=\"text\" value=\"\" name=\"ngx-autocomplete_field\" (keyup)=\"getData($event)\" #_ng_autocomp_txt>\n <div #_ng_autocom_list class=\"ngx-auto-list\"></div>\n <i class=\"fa fa-cog fa-spin\" [style.visibility]=\"_loading\" ></i>\n</div>",
styles: [":focus{outline:0}.ngxautocomplete{position:relative;width:100%;border:1px solid #ccc}.ngxautocomplete .list_container{width:100%;float:left}.ngxautocomplete input{border:0;width:90%}.ngx-auto-list{display:none;position:absolute;width:100%;min-height:300px;overflow-y:scroll;border-left:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc;top:0;background:#fff;z-index:99}.ngxautocomp_list_el{text-align:left;cursor:pointer;padding:5px}.ngxautocomp_list_el:hover{background-color:#ccc}.ngxautocomplete .selected_div{background-color:#d0e1ec;border:1px solid #d0e1ec;border-radius:10px;padding:5px;margin:3px;width:auto;float:left}.ngxautocomplete .selected_div .remove_div{cursor:pointer;margin-left:4px;border:1px solid #7c7a7a;padding:0 2px 5px;color:#2c2b2b;text-align:center;font-size:13px;line-height:17px;border-radius:100px;width:14px;height:14px;background:#fff;float:right;font-family:Arial,Helvetica,sans-serif}.ngxautocomplete .selected_div .remove_div:hover{color:#ec0606;border:1px solid #ec0606}"]
},] },
];
/** @nocollapse */
Angula4xAutoCompleteComponent.ctorParameters = function () { return [
{ type: HttpClient },
{ type: Renderer2 }
]; };
Angula4xAutoCompleteComponent.propDecorators = {
list: [{ type: ViewChild, args: ['_ng_autocom_list',] }],
text_fld: [{ type: ViewChild, args: ['_ng_autocomp_txt',] }],
list_div: [{ type: ViewChild, args: ['_ng_autocomp_selected_list',] }],
clickout: [{ type: HostListener, args: ['document:click',] }]
};
return Angula4xAutoCompleteComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Angular4xAutoCompleteModule = /** @class */ (function () {
function Angular4xAutoCompleteModule() {
}
Angular4xAutoCompleteModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule
],
declarations: [Angula4xAutoCompleteComponent],
exports: [Angula4xAutoCompleteComponent]
},] },
];
return Angular4xAutoCompleteModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { Angular4xAutoCompleteModule, Angula4xAutoCompleteComponent as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhcjR4LWF1dG8tY29tcGxldGUtbXVsdGkuanMubWFwIiwic291cmNlcyI6WyJuZzovL2FuZ3VsYXI0eC1hdXRvLWNvbXBsZXRlLW11bHRpL3NyYy9hcHAvbW9kdWxlcy9hbmd1bGFyNHgtYXV0by1jb21wbGV0ZS9hbmd1bGE0eC1hdXRvLWNvbXBsZXRlL2FuZ3VsYTR4LWF1dG8tY29tcGxldGUuY29tcG9uZW50LnRzIiwibmc6Ly9hbmd1bGFyNHgtYXV0by1jb21wbGV0ZS1tdWx0aS9zcmMvYXBwL21vZHVsZXMvYW5ndWxhcjR4LWF1dG8tY29tcGxldGUvYW5ndWxhcjR4LWF1dG8tY29tcGxldGUubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBDbGllbnR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbmd1bGE0eC1hdXRvLWNvbXBsZXRlJyxcbiAgdGVtcGxhdGU6IGBcbjxkaXYgY2xhc3M9XCJuZ3hhdXRvY29tcGxldGVcIj5cbiAgPGRpdiAjX25nX2F1dG9jb21wX3NlbGVjdGVkX2xpc3QgY2xhc3M9XCJsaXN0X2NvbnRhaW5lclwiPjwvZGl2PlxuICA8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT1cIlwiIG5hbWU9XCJuZ3gtYXV0b2NvbXBsZXRlX2ZpZWxkXCIgKGtleXVwKT1cImdldERhdGEoJGV2ZW50KVwiICNfbmdfYXV0b2NvbXBfdHh0PlxuICA8ZGl2ICNfbmdfYXV0b2NvbV9saXN0IGNsYXNzPVwibmd4LWF1dG8tbGlzdFwiPjwvZGl2PlxuICA8aSBjbGFzcz1cImZhIGZhLWNvZyBmYS1zcGluXCIgW3N0eWxlLnZpc2liaWxpdHldPVwiX2xvYWRpbmdcIiA+PC9pPlxuPC9kaXY+YCxcbiAgc3R5bGVzOiBbYDpmb2N1c3tvdXRsaW5lOjB9Lm5neGF1dG9jb21wbGV0ZXtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2JvcmRlcjoxcHggc29saWQgI2NjY30ubmd4YXV0b2NvbXBsZXRlIC5saXN0X2NvbnRhaW5lcnt3aWR0aDoxMDAlO2Zsb2F0OmxlZnR9Lm5neGF1dG9jb21wbGV0ZSBpbnB1dHtib3JkZXI6MDt3aWR0aDo5MCV9Lm5neC1hdXRvLWxpc3R7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCU7bWluLWhlaWdodDozMDBweDtvdmVyZmxvdy15OnNjcm9sbDtib3JkZXItbGVmdDoxcHggc29saWQgI2NjYztib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzt0b3A6MDtiYWNrZ3JvdW5kOiNmZmY7ei1pbmRleDo5OX0ubmd4YXV0b2NvbXBfbGlzdF9lbHt0ZXh0LWFsaWduOmxlZnQ7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzo1cHh9Lm5neGF1dG9jb21wX2xpc3RfZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojY2NjfS5uZ3hhdXRvY29tcGxldGUgLnNlbGVjdGVkX2RpdntiYWNrZ3JvdW5kLWNvbG9yOiNkMGUxZWM7Ym9yZGVyOjFweCBzb2xpZCAjZDBlMWVjO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjVweDttYXJnaW46M3B4O3dpZHRoOmF1dG87ZmxvYXQ6bGVmdH0ubmd4YXV0b2NvbXBsZXRlIC5zZWxlY3RlZF9kaXYgLnJlbW92ZV9kaXZ7Y3Vyc29yOnBvaW50ZXI7bWFyZ2luLWxlZnQ6NHB4O2JvcmRlcjoxcHggc29saWQgIzdjN2E3YTtwYWRkaW5nOjAgMnB4IDVweDtjb2xvcjojMmMyYjJiO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE3cHg7Ym9yZGVyLXJhZGl1czoxMDBweDt3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JhY2tncm91bmQ6I2ZmZjtmbG9hdDpyaWdodDtmb250LWZhbWlseTpBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZn0ubmd4YXV0b2NvbXBsZXRlIC5zZWxlY3RlZF9kaXYgLnJlbW92ZV9kaXY6aG92ZXJ7Y29sb3I6I2VjMDYwNjtib3JkZXI6MXB4IHNvbGlkICNlYzA2MDZ9YF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhNHhBdXRvQ29tcGxldGVDb21wb25lbnQge1xuICBkYXRhX3VybDphbnk7XG4gIGRiX2ZpZWxkczphbnk7XG4gIGFsbF9saXN0X2NoaWxkPVtdO1xuICBzZWxlY3RlZF9yb3c9W11cbiAgc2VsZWN0ZWRfcm93X29iaj17fVxuICBfbG9hZGluZzpzdHJpbmc9XCJoaWRkZW5cIjtcbiAgQFZpZXdDaGlsZCgnX25nX2F1dG9jb21fbGlzdCcpIGxpc3Q6RWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnX25nX2F1dG9jb21wX3R4dCcpIHRleHRfZmxkOkVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ19uZ19hdXRvY29tcF9zZWxlY3RlZF9saXN0JykgbGlzdF9kaXY6RWxlbWVudFJlZjtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6SHR0cENsaWVudCxwcm90ZWN0ZWQgcmVuZGVyZXI6UmVuZGVyZXIyKSB7IH1cbiAgc2V0dGluZyhzZXR0aW5nX29iail7XG4gICAgdGhpcy5kYXRhX3VybD1zZXR0aW5nX29iai5kYXRhX3VybDtcbiAgICB0aGlzLmRiX2ZpZWxkcz0gc2V0dGluZ19vYmouZGJfZmllbGRzO1xuICAgIC8vY29uc29sZS5sb2codGhpcy5kYXRhX3VybClcbiAgfVxuICBcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXG4gIGNsaWNrb3V0KCkge1xuICAgIFxuICAgICB0aGlzLl9jbGVhckxpc3QoKVxuICB9XG4gIGdldERhdGEoZXZlbnQpe1xuICAgICAgICBsZXQgaW5wdXRfdmFsPSBldmVudC50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgXG4gICAgICAgIGlmKGlucHV0X3ZhbC5sZW5ndGg9PTApe1xuICAgICAgICAgIHRoaXMuX2NsZWFyTGlzdCgpO1xuICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBsZXQgZmluYWxfdXJsPXRoaXMuZGF0YV91cmwrJz9xPScraW5wdXRfdmFsXG4gICAgICAgIHRoaXMuX2xvYWRpbmc9XCJ2aXNpYmxlXCJcbiAgICAgICAgdGhpcy5odHRwLmdldChmaW5hbF91cmwpLnN1YnNjcmliZSh0b2RvPT57XG4gICAgICAgICAgICAgIHRoaXMuX2NsZWFyTGlzdCgpXG4gICAgICAgICAgICAgIGZvcihsZXQgayBpbiB0b2RvKXtcbiAgICAgICAgICAgICAgICBsZXQgbmV3X2Rpdj10aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGxldCBmaWVsZF9hcnJheT10aGlzLmRiX2ZpZWxkcy5zcGxpdChcIixcIilcbiAgICAgICAgICAgICAgICBsZXQgZGlzcGxheV90ZXh0PVwiXCJcbiAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDtpPGZpZWxkX2FycmF5Lmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgICAgICAgZGlzcGxheV90ZXh0Kz10b2RvW2tdW2ZpZWxkX2FycmF5W2ldXStcIiBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlzcGxheV90ZXh0PWRpc3BsYXlfdGV4dC50cmltKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChuZXdfZGl2LHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChkaXNwbGF5X3RleHQpKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLmFsbF9saXN0X2NoaWxkLnB1c2gobmV3X2RpdilcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihuZXdfZGl2LCdjbGljaycsKGV2ZW50KT0+e1xuICAgICAgICAgICAgICAgICAgLy90aGlzLnRleHRfZmxkLm5hdGl2ZUVsZW1lbnQudmFsdWU9ZXZlbnQudGFyZ2V0LmlubmVySFRNTFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIGxldCB0aW5kZXg9QXJyYXkuZnJvbShldmVudC50YXJnZXQucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihldmVudC50YXJnZXQpXG4gICAgICAgICAgICAgICAgICBsZXQgaWQ9dG9kb1t0aW5kZXhdLmlkXG4gICAgICAgICAgICAgICAgICBmb3IobGV0IHJvdyBvZiB0aGlzLnNlbGVjdGVkX3Jvdyl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHJvdy5pZD09aWQpe1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dF9mbGQubmF0aXZlRWxlbWVudC52YWx1ZT1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvL3RoaXMuc2VsZWN0ZWRfcm93LnB1c2godG9kb1t0aW5kZXhdKVxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZF9yb3dfb2JqW2Rpc3BsYXlfdGV4dF09dG9kb1t0aW5kZXhdO1xuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkX3Jvd19vYmopO1xuICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdF9uZXdfZGl2PXRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICBsZXQgcmVtb3ZlX25ld19kaXY9dGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChyZW1vdmVfbmV3X2Rpdix0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoXCJ4XCIpKVxuICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhyZW1vdmVfbmV3X2RpdiwncmVtb3ZlX2RpdicpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShyZW1vdmVfbmV3X2RpdixcImlkXCIsZGlzcGxheV90ZXh0K1wiX1wiK1wiZWxlbV9hdXRvY29tcFwiKVxuICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhzZWxlY3RfbmV3X2RpdixcInNlbGVjdGVkX2RpdlwiKVxuICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChzZWxlY3RfbmV3X2RpdixyZW1vdmVfbmV3X2RpdilcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc2VsZWN0X25ld19kaXYsdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGV2ZW50LnRhcmdldC5pbm5lckhUTUwpKVxuICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4ocmVtb3ZlX25ld19kaXYsJ2NsaWNrJywoZXZlbnQpPT57XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGlkPWV2ZW50LnRhcmdldC5pZC5zcGxpdChcIl9cIilbMF1cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgaT0wO1xuICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNlbGVjdGVkX3Jvd19vYmpbaWRdXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmxpc3RfZGl2Lm5hdGl2ZUVsZW1lbnQsZXZlbnQudGFyZ2V0LnBhcmVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkX3Jvd19vYmopO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIHRoaXMudGV4dF9mbGQubmF0aXZlRWxlbWVudC52YWx1ZT1cIlwiXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMubGlzdF9kaXYubmF0aXZlRWxlbWVudCxzZWxlY3RfbmV3X2RpdilcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5saXN0Lm5hdGl2ZUVsZW1lbnQsbmV3X2RpdilcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgdGhlaWdodD10aGlzLnRleHRfZmxkLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGlzdC5uYXRpdmVFbGVtZW50LFwidG9wXCIsdGhlaWdodCtcInB4XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmxpc3QubmF0aXZlRWxlbWVudCxcImRpc3BsYXlcIixcImJsb2NrXCIpXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKG5ld19kaXYsXCJuZ3hhdXRvY29tcF9saXN0X2VsXCIpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZz1cImhpZGRlblwiXG4gICAgICAgIH0pXG5cbiAgfSBcblxuICBwcml2YXRlIF9jbGVhckxpc3QoKXtcbiAgICBmb3IobGV0IGk9MDtpPHRoaXMuYWxsX2xpc3RfY2hpbGQubGVuZ3RoO2krKylcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmxpc3QubmF0aXZlRWxlbWVudCx0aGlzLmFsbF9saXN0X2NoaWxkW2ldKVxuICAgIHRoaXMuYWxsX2xpc3RfY2hpbGQ9W107ICAgICBcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGlzdC5uYXRpdmVFbGVtZW50LFwiZGlzcGxheVwiLFwibm9uZVwiKVxuICB9XG5cbiAgZ2V0U2VsZWN0ZWRSb3coKTpzdHJpbmd7XG4gICAgbGV0IGk9MDtcbiAgICB0aGlzLnNlbGVjdGVkX3Jvdz1bXTtcbiAgICBmb3IobGV0IHJvdyBpbiB0aGlzLnNlbGVjdGVkX3Jvd19vYmope1xuICAgICAgdGhpcy5zZWxlY3RlZF9yb3dbaSsrXT10aGlzLnNlbGVjdGVkX3Jvd19vYmpbcm93XTtcbiAgICB9XG4gICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkX3Jvdyk7XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBbmd1bGE0eEF1dG9Db21wbGV0ZUNvbXBvbmVudCB9IGZyb20gJy4vYW5ndWxhNHgtYXV0by1jb21wbGV0ZS9hbmd1bGE0eC1hdXRvLWNvbXBsZXRlLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGVcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbQW5ndWxhNHhBdXRvQ29tcGxldGVDb21wb25lbnRdLFxuICBleHBvcnRzOltBbmd1bGE0eEF1dG9Db21wbGV0ZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhcjR4QXV0b0NvbXBsZXRlTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbInRzbGliXzEuX192YWx1ZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7SUF5QkUsdUNBQXNCLElBQWUsRUFBVyxRQUFrQjtRQUE1QyxTQUFJLEdBQUosSUFBSSxDQUFXO1FBQVcsYUFBUSxHQUFSLFFBQVEsQ0FBVTs4QkFQbkQsRUFBRTs0QkFDSixFQUFFO2dDQUNFLEVBQUU7d0JBQ0gsUUFBUTtLQUkrQzs7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