UNPKG

ngx-form-control

Version:
433 lines (432 loc) 40.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, ViewChild } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import { BaseListControlComponent } from '../../utils/base-list-control.component'; import { Common } from '../../utils/common'; var FormSelect2Component = /** @class */ (function (_super) { tslib_1.__extends(FormSelect2Component, _super); function FormSelect2Component() { var _this = _super !== null && _super.apply(this, arguments) || this; _this._isTouched = false; return _this; } Object.defineProperty(FormSelect2Component.prototype, "placeholder", { set: /** * @param {?} value * @return {?} */ function (value) { this._placeholder = value; this.updateSelect2Options(); }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "required", { set: /** * @param {?} value * @return {?} */ function (value) { this._required = value; this.updateSelect2Options(); }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "disabled", { set: /** * @param {?} value * @return {?} */ function (value) { this._disabled = value; this.updateSelect2Options(); }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "multiple", { set: /** * @param {?} value * @return {?} */ function (value) { this._multiple = value; this.updateSelect2Options(); }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "tag", { set: /** * @param {?} value * @return {?} */ function (value) { this._tag = value; this.updateSelect2Options(); }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "tokenSeparators", { set: /** * @param {?} value * @return {?} */ function (value) { this._tag = value; this.updateSelect2Options(); }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "value", { get: /** * @return {?} */ function () { var _this = this; if (!this._selectedIndexes || !this._selectedIndexes.length) { return null; } /** @type {?} */ var result = this._selectedIndexes.reduce(function (currentResult, index) { if (Number.isInteger(index) && _this._selectOptions[index]) { currentResult.push(_this._selectOptions[index].value); } else if (_this._tag) { /** @type {?} */ var match = index['value'].match(/^number: {([\d]+)}$/); if (match) { currentResult.push(match[1]); } else { currentResult.push(index['value']); } } return currentResult; }, []); return this._multiple ? result : result[0]; }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "invalid", { get: /** * @return {?} */ function () { if (this.hasCustomError) { return true; } if (!this._isTouched) { return false; } return this.hasRequiredError; }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "valid", { get: /** * @return {?} */ function () { if (this.hasCustomError) { return false; } if (!this._isTouched) { return false; } return !this.hasRequiredError; }, enumerable: true, configurable: true }); Object.defineProperty(FormSelect2Component.prototype, "errorMessages", { get: /** * @return {?} */ function () { if (this.hasRequiredError) { return [this.requiredErrorMessage]; } if (this.hasCustomError) { return this.innerCustomErrorMessages; } }, enumerable: true, configurable: true }); /** * @return {?} */ FormSelect2Component.prototype.ngOnInit = /** * @return {?} */ function () { this.updateSelect2Options(); }; /** * @param {?} value * @return {?} */ FormSelect2Component.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { if (this._multiple && value && value.length) { this.selectValues(value); } else if (!this._multiple) { this.selectValue(value); } else { this.cleanValue(); } }; /** * @return {?} */ FormSelect2Component.prototype.validate = /** * @return {?} */ function () { /** @type {?} */ var result = {}; if (this.hasRequiredError) { result['required'] = true; } return result; }; // noinspection JSUnusedGlobalSymbols /** * @return {?} */ FormSelect2Component.prototype.reset = /** * @return {?} */ function () { this._isTouched = false; }; /** * @return {?} */ FormSelect2Component.prototype.afterInitOptions = /** * @return {?} */ function () { this._selectOptions = tslib_1.__spread(this._selectOptions); this.updateSelect2Options(); }; /** * @param {?} values * @return {?} */ FormSelect2Component.prototype.selectValues = /** * @param {?} values * @return {?} */ function (values) { var _this = this; this._selectedIndexes = []; /** @type {?} */ var select2Data = []; if (values && values.length) { values.map(function (value) { /** @type {?} */ var index = _this.findIndex(value); if (index > -1) { _this._selectedIndexes.push(index); select2Data.push(index); } else if (_this._tag) { _this._selectedIndexes.push({ value: value }); select2Data.push(value); } }); } if (Common.isClient()) { this._selectElement.val(select2Data); this._selectElement.trigger('change'); } }; /** * @return {?} */ FormSelect2Component.prototype.updateSelectedIndexes = /** * @return {?} */ function () { var _this = this; if (Common.isServer()) { return; } /** @type {?} */ var oldSelectedIndexes = JSON.stringify(this._selectedIndexes); /** @type {?} */ var value = this._selectElement.val(); if ('number' === typeof value || ('string' === typeof value && Number.isInteger(+value))) { this._selectedIndexes = [+value]; } else if ('string' === typeof value && this._tag) { this._selectedIndexes = [{ value: value }]; } else if (value && value.length) { this._selectedIndexes = value.map(function (item) { if (Number.isInteger(+item)) { return +item; } if (_this._tag) { return { value: item }; } return null; }); } else { this._selectedIndexes = []; } /** @type {?} */ var newSelectedIndexes = JSON.stringify(this._selectedIndexes); if (newSelectedIndexes !== oldSelectedIndexes) { this.triggerChange(); } }; /** * @param {?} value * @return {?} */ FormSelect2Component.prototype.selectValue = /** * @param {?} value * @return {?} */ function (value) { if (Common.isServer()) { return; } /** @type {?} */ var index = this.findIndex(value); if (index > -1) { this._selectedIndexes = [index]; this._selectElement.val(this._selectedIndexes); this._selectElement.trigger('change'); } else if (this._tag) { this._selectedIndexes = [{ value: value }]; this._selectElement.val(value); this._selectElement.trigger('change'); } else { this.cleanValue(); } }; /** * @return {?} */ FormSelect2Component.prototype.cleanValue = /** * @return {?} */ function () { if (Common.isServer()) { return; } this._selectedIndexes = []; this._selectElement.val(null); this._selectElement.trigger('change'); }; /** * @return {?} */ FormSelect2Component.prototype.updateSelect2Options = /** * @return {?} */ function () { var _this = this; if (Common.isServer() || !this.customSelectElement || !this.customSelectElement.nativeElement) { return; } this._selectElement = $(this.customSelectElement.nativeElement); if (this._selectElement.hasClass('select2-hidden-accessible')) { this._selectElement.select2().empty(); this._selectElement.select2('destroy'); } this._selectElement.select2({ tags: this._tag, tokenSeparators: this._tokenSeparators || [], placeholder: this._placeholder, allowClear: !this._required, multiple: this._multiple, data: this._selectOptions, disabled: this._disabled, createTag: function (params) { /** @type {?} */ var term = $.trim(params.term); if (term === '') { return null; } return { id: Number.isInteger(+term) ? "number: {" + term + "}" : term, text: term, newTag: true }; } }); this._selectElement.on('select2:select', function () { _this.updateSelectedIndexes(); }); this._selectElement.on('select2:unselect', function () { _this.updateSelectedIndexes(); }); this._selectElement.on('select2:close', function () { _this._isTouched = true; }); }; FormSelect2Component.decorators = [ { type: Component, args: [{ selector: 'ngx-form-select2', template: "<label *ngIf=\"label\" [for]=\"id\">{{label}}</label>\n\n<div class=\"form-control is-invalid\" [ngClass]=\"{'is-invalid': invalid, 'is-valid': valid}\">\n <!--suppress HtmlFormInputWithoutLabel -->\n <select [id]=\"id\" #customSelectElement></select>\n</div>\n\n<div class=\"valid-feedback\" *ngIf=\"valid && validMessage\">{{validMessage}}</div>\n\n<div class=\"invalid-feedback\" *ngIf=\"invalid\">\n <span *ngFor=\"let message of errorMessages; let last = last;\">\n {{message}}<br *ngIf=\"!last\">\n </span>\n</div>\n", styles: [":host .form-control{padding:0}:host .form-control /deep/ .select2-container{width:100%!important}:host .form-control /deep/ .select2-container .select2-selection--single{height:auto}:host .form-control /deep/ .select2-container--default .select2-selection--multiple,:host .form-control /deep/ .select2-container--default .select2-selection--single,:host .form-control /deep/ .select2-container--default.select2-container--focus .select2-selection--multiple{border:none;outline:0!important}:host .form-control /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control /deep/ .select2-container--default .select2-selection--single:focus{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}:host .form-control.is-invalid /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control.is-invalid /deep/ .select2-container--default .select2-selection--single:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}:host .form-control.is-valid /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control.is-valid /deep/ .select2-container--default .select2-selection--single:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}:host .form-control /deep/ .select2-container--default .select2-selection--single .select2-selection__rendered{min-height:40px;line-height:25px;padding:.375rem 25px .375rem .75rem}:host .form-control /deep/ .select2-container .select2-selection--multiple{min-height:40px;padding:.375rem .75rem}:host .form-control /deep/ .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding:0}:host .form-control /deep/ .select2-container--default .select2-selection--single .select2-selection__arrow{height:38px}"], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: FormSelect2Component, multi: true }, { provide: NG_VALIDATORS, useExisting: FormSelect2Component, multi: true } ] },] }, ]; FormSelect2Component.propDecorators = { customSelectElement: [{ type: ViewChild, args: ['customSelectElement',] }], placeholder: [{ type: Input }], required: [{ type: Input }], disabled: [{ type: Input }], multiple: [{ type: Input }], tag: [{ type: Input }], tokenSeparators: [{ type: Input }] }; return FormSelect2Component; }(BaseListControlComponent)); export { FormSelect2Component }; if (false) { /** @type {?} */ FormSelect2Component.prototype._selectElement; /** @type {?} */ FormSelect2Component.prototype._isTouched; /** @type {?} */ FormSelect2Component.prototype._placeholder; /** @type {?} */ FormSelect2Component.prototype.customSelectElement; /** @type {?} */ FormSelect2Component.prototype._required; /** @type {?} */ FormSelect2Component.prototype._disabled; /** @type {?} */ FormSelect2Component.prototype._tag; /** @type {?} */ FormSelect2Component.prototype._tokenSeparators; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zZWxlY3QyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mb3JtLWNvbnRyb2wvIiwic291cmNlcyI6WyJsaWIvZm9ybS1zZWxlY3QyL2Zvcm0tc2VsZWN0Mi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlFLE9BQU8sRUFBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7O0lBMkJBLGdEQUF3Qjs7OzJCQUczQyxLQUFLOzs7SUFLMUIsc0JBQWEsNkNBQVc7Ozs7O1FBQXhCLFVBQXlCLEtBQWE7WUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBSUQsc0JBQWEsMENBQVE7Ozs7O1FBQXJCLFVBQXNCLEtBQWM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBSUQsc0JBQWEsMENBQVE7Ozs7O1FBQXJCLFVBQXNCLEtBQWM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBRUQsc0JBQWEsMENBQVE7Ozs7O1FBQXJCLFVBQXNCLEtBQWM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBSUQsc0JBQWEscUNBQUc7Ozs7O1FBQWhCLFVBQWlCLEtBQWM7WUFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBSUQsc0JBQWEsaURBQWU7Ozs7O1FBQTVCLFVBQTZCLEtBQWM7WUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7OztPQUFBO0lBRUQsc0JBQUksdUNBQUs7Ozs7UUFBVDtZQUFBLGlCQXNCQztZQXJCQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ2I7O1lBRUQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFDLGFBQWEsRUFBRSxLQUFLO2dCQUMvRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxRCxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3REO2dCQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs7b0JBQ3JCLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFFMUQsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDVixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUM5QjtvQkFBQyxJQUFJLENBQUMsQ0FBQzt3QkFDTixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3FCQUNwQztpQkFDRjtnQkFFRCxNQUFNLENBQUMsYUFBYSxDQUFDO2FBQ3RCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFUCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7OztPQUFBO0lBRUQsc0JBQUkseUNBQU87Ozs7UUFBWDtZQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ2I7WUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2Q7WUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1NBQzlCOzs7T0FBQTtJQUVELHNCQUFJLHVDQUFLOzs7O1FBQVQ7WUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNkO1lBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDckIsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNkO1lBRUQsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1NBQy9COzs7T0FBQTtJQUVELHNCQUFJLCtDQUFhOzs7O1FBQWpCO1lBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDcEM7WUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQzthQUN0QztTQUNGOzs7T0FBQTs7OztJQUVELHVDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0tBQzdCOzs7OztJQUVELHlDQUFVOzs7O0lBQVYsVUFBVyxLQUF1QjtRQUNoQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFCO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0tBQ0Y7Ozs7SUFFRCx1Q0FBUTs7O0lBQVI7O1FBQ0UsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWxCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMzQjtRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUM7S0FDZjtJQUVELHFDQUFxQzs7OztJQUNyQyxvQ0FBSzs7O0lBQUw7UUFDRSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztLQUN6Qjs7OztJQUVTLCtDQUFnQjs7O0lBQTFCO1FBQ0UsSUFBSSxDQUFDLGNBQWMsb0JBQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0tBQzdCOzs7OztJQUVPLDJDQUFZOzs7O2NBQUMsTUFBTTs7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQzs7UUFDM0IsSUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXZCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLFVBQUMsS0FBSzs7Z0JBQ2YsSUFBTSxLQUFLLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFcEMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDZixLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNsQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN6QjtnQkFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3JCLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLE9BQUEsRUFBQyxDQUFDLENBQUM7b0JBQ3BDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3pCO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZDOzs7OztJQUdLLG9EQUFxQjs7Ozs7UUFDM0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUM7U0FDUjs7UUFFRCxJQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7O1FBQ2pFLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFeEMsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLE9BQU8sS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLE9BQU8sS0FBSyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFDLEtBQUssT0FBQSxFQUFDLENBQUMsQ0FBQztTQUNuQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJO2dCQUNwQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QixNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ2Q7Z0JBRUQsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2QsTUFBTSxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDO2lCQUN0QjtnQkFFRCxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ2IsQ0FBQyxDQUFDO1NBQ0o7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7U0FDNUI7O1FBRUQsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWpFLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixLQUFLLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7Ozs7OztJQUdLLDBDQUFXOzs7O2NBQUMsS0FBSztRQUN2QixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQztTQUNSOztRQUVELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZDO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEVBQUMsS0FBSyxPQUFBLEVBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7Ozs7O0lBR0sseUNBQVU7Ozs7UUFDaEIsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUM7U0FDUjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7O0lBR2hDLG1EQUFvQjs7Ozs7UUFDMUIsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDOUYsTUFBTSxDQUFDO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN4QztRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLGVBQWUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLElBQUksRUFBRTtZQUM1QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDOUIsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3hCLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYztZQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDeEIsU0FBUyxFQUFFLFVBQVUsTUFBTTs7Z0JBQ3pCLElBQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVqQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQztpQkFDYjtnQkFFRCxNQUFNLENBQUM7b0JBQ0wsRUFBRSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBWSxJQUFJLE1BQUcsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDeEQsSUFBSSxFQUFFLElBQUk7b0JBQ1YsTUFBTSxFQUFFLElBQUk7aUJBQ2IsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkMsS0FBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUU7WUFDekMsS0FBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFO1lBQ3RDLEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQ3hCLENBQUMsQ0FBQzs7O2dCQXZTTixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsUUFBUSxFQUFFLG1oQkFjWDtvQkFDQyxNQUFNLEVBQUUsQ0FBQyxrd0RBQWt3RCxDQUFDO29CQUM1d0QsU0FBUyxFQUFFO3dCQUNULEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO3dCQUM1RSxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7cUJBQ3pFO2lCQUNGOzs7c0NBT0UsU0FBUyxTQUFDLHFCQUFxQjs4QkFFL0IsS0FBSzsyQkFPTCxLQUFLOzJCQU9MLEtBQUs7MkJBS0wsS0FBSztzQkFPTCxLQUFLO2tDQU9MLEtBQUs7OytCQXZFUjtFQThCMEMsd0JBQXdCO1NBQXJELG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7QmFzZUxpc3RDb250cm9sQ29tcG9uZW50fSBmcm9tICcuLi8uLi91dGlscy9iYXNlLWxpc3QtY29udHJvbC5jb21wb25lbnQnO1xyXG5pbXBvcnQge0NvbW1vbn0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJztcclxuXHJcbmRlY2xhcmUgY29uc3QgJDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWZvcm0tc2VsZWN0MicsXHJcbiAgdGVtcGxhdGU6IGA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIj57e2xhYmVsfX08L2xhYmVsPlxyXG5cclxuPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbCBpcy1pbnZhbGlkXCIgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzogaW52YWxpZCwgJ2lzLXZhbGlkJzogdmFsaWR9XCI+XHJcbiAgPCEtLXN1cHByZXNzIEh0bWxGb3JtSW5wdXRXaXRob3V0TGFiZWwgLS0+XHJcbiAgPHNlbGVjdCBbaWRdPVwiaWRcIiAjY3VzdG9tU2VsZWN0RWxlbWVudD48L3NlbGVjdD5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwidmFsaWQtZmVlZGJhY2tcIiAqbmdJZj1cInZhbGlkICYmIHZhbGlkTWVzc2FnZVwiPnt7dmFsaWRNZXNzYWdlfX08L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJpbnZhbGlkXCI+XHJcbiAgPHNwYW4gKm5nRm9yPVwibGV0IG1lc3NhZ2Ugb2YgZXJyb3JNZXNzYWdlczsgbGV0IGxhc3QgPSBsYXN0O1wiPlxyXG4gICAge3ttZXNzYWdlfX08YnIgKm5nSWY9XCIhbGFzdFwiPlxyXG4gIDwvc3Bhbj5cclxuPC9kaXY+XHJcbmAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IC5mb3JtLWNvbnRyb2x7cGFkZGluZzowfTpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lcnt3aWR0aDoxMDAlIWltcG9ydGFudH06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXIgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGV7aGVpZ2h0OmF1dG99Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGUsOmhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlLDpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdC5zZWxlY3QyLWNvbnRhaW5lci0tZm9jdXMgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZXtib3JkZXI6bm9uZTtvdXRsaW5lOjAhaW1wb3J0YW50fTpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLW11bHRpcGxlOmZvY3VzLDpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZTpmb2N1c3tib3JkZXItY29sb3I6IzgwYmRmZjtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMCwxMjMsMjU1LC4yNSl9Omhvc3QgLmZvcm0tY29udHJvbC5pcy1pbnZhbGlkIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZTpmb2N1cyw6aG9zdCAuZm9ybS1jb250cm9sLmlzLWludmFsaWQgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZTpmb2N1c3tib3JkZXItY29sb3I6I2RjMzU0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjIwLDUzLDY5LC4yNSl9Omhvc3QgLmZvcm0tY29udHJvbC5pcy12YWxpZCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGU6Zm9jdXMsOmhvc3QgLmZvcm0tY29udHJvbC5pcy12YWxpZCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlOmZvY3Vze2JvcmRlci1jb2xvcjojMjhhNzQ1O2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg0MCwxNjcsNjksLjI1KX06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGUgLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZHttaW4taGVpZ2h0OjQwcHg7bGluZS1oZWlnaHQ6MjVweDtwYWRkaW5nOi4zNzVyZW0gMjVweCAuMzc1cmVtIC43NXJlbX06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXIgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZXttaW4taGVpZ2h0OjQwcHg7cGFkZGluZzouMzc1cmVtIC43NXJlbX06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZSAuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVke3BhZGRpbmc6MH06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGUgLnNlbGVjdDItc2VsZWN0aW9uX19hcnJvd3toZWlnaHQ6MzhweH1gXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IEZvcm1TZWxlY3QyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZX0sXHJcbiAgICB7cHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IEZvcm1TZWxlY3QyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZX1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtU2VsZWN0MkNvbXBvbmVudCBleHRlbmRzIEJhc2VMaXN0Q29udHJvbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfaXNUb3VjaGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHJcbiAgQFZpZXdDaGlsZCgnY3VzdG9tU2VsZWN0RWxlbWVudCcpIGN1c3RvbVNlbGVjdEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XHJcblxyXG4gIEBJbnB1dCgpIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX211bHRpcGxlID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90YWc6IGJvb2xlYW47XHJcblxyXG4gIEBJbnB1dCgpIHNldCB0YWcodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3RhZyA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG9rZW5TZXBhcmF0b3JzOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBzZXQgdG9rZW5TZXBhcmF0b3JzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl90YWcgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgaWYgKCF0aGlzLl9zZWxlY3RlZEluZGV4ZXMgfHwgIXRoaXMuX3NlbGVjdGVkSW5kZXhlcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc2VsZWN0ZWRJbmRleGVzLnJlZHVjZSgoY3VycmVudFJlc3VsdCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5kZXgpICYmIHRoaXMuX3NlbGVjdE9wdGlvbnNbaW5kZXhdKSB7XHJcbiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKHRoaXMuX3NlbGVjdE9wdGlvbnNbaW5kZXhdLnZhbHVlKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YWcpIHtcclxuICAgICAgICBjb25zdCBtYXRjaCA9IGluZGV4Wyd2YWx1ZSddLm1hdGNoKC9ebnVtYmVyOiB7KFtcXGRdKyl9JC8pO1xyXG5cclxuICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgIGN1cnJlbnRSZXN1bHQucHVzaChtYXRjaFsxXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGN1cnJlbnRSZXN1bHQucHVzaChpbmRleFsndmFsdWUnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY3VycmVudFJlc3VsdDtcclxuICAgIH0sIFtdKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGUgPyByZXN1bHQgOiByZXN1bHRbMF07XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmhhc0N1c3RvbUVycm9yKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5faXNUb3VjaGVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5oYXNSZXF1aXJlZEVycm9yO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tRXJyb3IpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5faXNUb3VjaGVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gIXRoaXMuaGFzUmVxdWlyZWRFcnJvcjtcclxuICB9XHJcblxyXG4gIGdldCBlcnJvck1lc3NhZ2VzKCk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgaWYgKHRoaXMuaGFzUmVxdWlyZWRFcnJvcikge1xyXG4gICAgICByZXR1cm4gW3RoaXMucmVxdWlyZWRFcnJvck1lc3NhZ2VdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0N1c3RvbUVycm9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlubmVyQ3VzdG9tRXJyb3JNZXNzYWdlcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55IHwgQXJyYXk8YW55Pik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX211bHRpcGxlICYmIHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdFZhbHVlcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl9tdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdFZhbHVlKHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xlYW5WYWx1ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoKToge30ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0ge307XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzUmVxdWlyZWRFcnJvcikge1xyXG4gICAgICByZXN1bHRbJ3JlcXVpcmVkJ10gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzXHJcbiAgcmVzZXQoKSB7XHJcbiAgICB0aGlzLl9pc1RvdWNoZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZnRlckluaXRPcHRpb25zKCkge1xyXG4gICAgdGhpcy5fc2VsZWN0T3B0aW9ucyA9IFsuLi50aGlzLl9zZWxlY3RPcHRpb25zXTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdFZhbHVlcyh2YWx1ZXMpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFtdO1xyXG4gICAgY29uc3Qgc2VsZWN0MkRhdGEgPSBbXTtcclxuXHJcbiAgICBpZiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZmluZEluZGV4KHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgIHNlbGVjdDJEYXRhLnB1c2goaW5kZXgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFnKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMucHVzaCh7dmFsdWV9KTtcclxuICAgICAgICAgIHNlbGVjdDJEYXRhLnB1c2godmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKENvbW1vbi5pc0NsaWVudCgpKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudmFsKHNlbGVjdDJEYXRhKTtcclxuICAgICAgdGhpcy5fc2VsZWN0RWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0ZWRJbmRleGVzKCkge1xyXG4gICAgaWYgKENvbW1vbi5pc1NlcnZlcigpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvbGRTZWxlY3RlZEluZGV4ZXMgPSBKU09OLnN0cmluZ2lmeSh0aGlzLl9zZWxlY3RlZEluZGV4ZXMpO1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbCgpO1xyXG5cclxuICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIHZhbHVlIHx8ICgnc3RyaW5nJyA9PT0gdHlwZW9mIHZhbHVlICYmIE51bWJlci5pc0ludGVnZXIoK3ZhbHVlKSkpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzID0gWyt2YWx1ZV07XHJcbiAgICB9IGVsc2UgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgdmFsdWUgJiYgdGhpcy5fdGFnKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFt7dmFsdWV9XTtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IHZhbHVlLm1hcChpdGVtID0+IHtcclxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcigraXRlbSkpIHtcclxuICAgICAgICAgIHJldHVybiAraXRlbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl90YWcpIHtcclxuICAgICAgICAgIHJldHVybiB7dmFsdWU6IGl0ZW19O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3U2VsZWN0ZWRJbmRleGVzID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fc2VsZWN0ZWRJbmRleGVzKTtcclxuXHJcbiAgICBpZiAobmV3U2VsZWN0ZWRJbmRleGVzICE9PSBvbGRTZWxlY3RlZEluZGV4ZXMpIHtcclxuICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdFZhbHVlKHZhbHVlKSB7XHJcbiAgICBpZiAoQ29tbW9uLmlzU2VydmVyKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maW5kSW5kZXgodmFsdWUpO1xyXG5cclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFtpbmRleF07XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudmFsKHRoaXMuX3NlbGVjdGVkSW5kZXhlcyk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3RhZykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbe3ZhbHVlfV07XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudmFsKHZhbHVlKTtcclxuICAgICAgdGhpcy5fc2VsZWN0RWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xlYW5WYWx1ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhblZhbHVlKCkge1xyXG4gICAgaWYgKENvbW1vbi5pc1NlcnZlcigpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbXTtcclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudmFsKG51bGwpO1xyXG4gICAgdGhpcy5fc2VsZWN0RWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0Mk9wdGlvbnMoKSB7XHJcbiAgICBpZiAoQ29tbW9uLmlzU2VydmVyKCkgfHwgIXRoaXMuY3VzdG9tU2VsZWN0RWxlbWVudCB8fCAhdGhpcy5jdXN0b21TZWxlY3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQgPSAkKHRoaXMuY3VzdG9tU2VsZWN0RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgIGlmICh0aGlzLl9zZWxlY3RFbGVtZW50Lmhhc0NsYXNzKCdzZWxlY3QyLWhpZGRlbi1hY2Nlc3NpYmxlJykpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0RWxlbWVudC5zZWxlY3QyKCkuZW1wdHkoKTtcclxuICAgICAgdGhpcy5fc2VsZWN0RWxlbWVudC5zZWxlY3QyKCdkZXN0cm95Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0RWxlbWVudC5zZWxlY3QyKHtcclxuICAgICAgdGFnczogdGhpcy5fdGFnLFxyXG4gICAgICB0b2tlblNlcGFyYXRvcnM6IHRoaXMuX3Rva2VuU2VwYXJhdG9ycyB8fCBbXSxcclxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMuX3BsYWNlaG9sZGVyLFxyXG4gICAgICBhbGxvd0NsZWFyOiAhdGhpcy5fcmVxdWlyZWQsXHJcbiAgICAgIG11bHRpcGxlOiB0aGlzLl9tdWx0aXBsZSxcclxuICAgICAgZGF0YTogdGhpcy5fc2VsZWN0T3B0aW9ucyxcclxuICAgICAgZGlzYWJsZWQ6IHRoaXMuX2Rpc2FibGVkLFxyXG4gICAgICBjcmVhdGVUYWc6IGZ1bmN0aW9uIChwYXJhbXMpIHtcclxuICAgICAgICBjb25zdCB0ZXJtID0gJC50cmltKHBhcmFtcy50ZXJtKTtcclxuXHJcbiAgICAgICAgaWYgKHRlcm0gPT09ICcnKSB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBpZDogTnVtYmVyLmlzSW50ZWdlcigrdGVybSkgPyBgbnVtYmVyOiB7JHt0ZXJtfX1gIDogdGVybSxcclxuICAgICAgICAgIHRleHQ6IHRlcm0sXHJcbiAgICAgICAgICBuZXdUYWc6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50Lm9uKCdzZWxlY3QyOnNlbGVjdCcsICgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEluZGV4ZXMoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQub24oJ3NlbGVjdDI6dW5zZWxlY3QnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRJbmRleGVzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50Lm9uKCdzZWxlY3QyOmNsb3NlJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLl9pc1RvdWNoZWQgPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=