com.phloxui
Version:
PhloxUI Ng2+ Framework
573 lines (572 loc) • 44.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import { AbstractSimpleDropdown } from './AbstractSimpleDropdown';
import { NeedFocusService } from '../../../service/NeedFocusService.service';
import { ColorSelectItemModel } from '../../model/ColorSelectItemModel';
import { ColorUtils } from '../../../share/utils/ColorUtils';
import { I18N } from '../../../decorator/I18N.decorator';
import { Option } from '../../../decorator/Option.decorator';
import { PhloxAppInfoService } from '../../../service/PhloxAppInfoService.service';
const /** @type {?} */ TYPE_NAME = "phx-theme-color-swatch";
export class ThemeColorSwatch extends AbstractSimpleDropdown {
/**
* @param {?} needFocusService
* @param {?} elementRef
* @param {?} phloxAppInfoService
*/
constructor(needFocusService, elementRef, phloxAppInfoService) {
super(needFocusService, elementRef, phloxAppInfoService);
this.items = [];
this.gradientLevelMap = {};
this.baseSaturation = 25;
this.baseBright = 25;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
if (this.pigmentColors !== null && typeof this.pigmentColors !== 'undefined') {
this.setPigmentColors(this.pigmentColors);
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
super.ngOnChanges(changes);
}
/**
* @return {?}
*/
getSelectedItemHexColor() {
return this.getSelectedItem().getValue();
}
/**
* @param {?} index
* @return {?}
*/
_showNewLine(index) {
if (this.pigmentColors !== null && typeof this.pigmentColors !== 'undefined') {
let /** @type {?} */ pigmentColorsCount = this.pigmentColors.length;
let /** @type {?} */ count = index + 1;
if (count % pigmentColorsCount === 0) {
return true;
}
}
return false;
}
/**
* @return {?}
*/
getFakeGradientLevelArray() {
let /** @type {?} */ fakeArray = [];
if (this.gradientLevel > 0) {
fakeArray = new Array(this.gradientLevel);
}
return fakeArray;
}
/**
* @param {?} level
* @return {?}
*/
getShadeColorItemsLevel(level) {
let /** @type {?} */ result = [];
if (level >= 0) {
for (let /** @type {?} */ item of this.items) {
let /** @type {?} */ key = item.getValue();
let /** @type {?} */ levelArray = this.gradientLevelMap[key];
if (levelArray !== null && typeof levelArray !== 'undefined') {
if (level < levelArray.length) {
result.push(new ColorSelectItemModel(levelArray[level], levelArray[level]));
}
}
}
}
return result;
}
/**
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
onValidationEnd(inputValue, results) {
//! do sthing
}
/**
* @param {?} data
* @param {?} inputVal
* @return {?}
*/
onDataChange(data, inputVal) {
}
/**
* @param {?} $event
* @return {?}
*/
doFocus($event) {
$(this.elementRef.nativeElement).find(".swatch > button").focus();
}
/**
* @param {?} $event
* @return {?}
*/
doBlur($event) {
$(this.elementRef.nativeElement).find(".swatch > button").blur();
}
/**
* @return {?}
*/
getDropdownPopupSelector() {
return '.menu';
}
/**
* @param {?} colorModel
* @return {?}
*/
setPigmentColors(colorModel) {
this.pigmentColors = colorModel;
this.items = [];
this.gradientLevelMap = {};
if (this.pigmentColors !== null && typeof this.pigmentColors !== 'undefined') {
let /** @type {?} */ percentShade = 100;
if (this.gradientLevel !== null && typeof this.gradientLevel === 'number' && this.gradientLevel > 0) {
percentShade = Math.round(percentShade / this.gradientLevel);
}
for (let /** @type {?} */ color of this.pigmentColors) {
let /** @type {?} */ key = color.value;
this.items.push(new ColorSelectItemModel(color.name, color.value));
if (this.gradientLevel !== null && typeof this.gradientLevel === 'number' && this.gradientLevel > 0) {
let /** @type {?} */ grLVArray = [];
let /** @type {?} */ pigmentHex = color.value;
let /** @type {?} */ hsl = ColorUtils.hexToHsl(pigmentHex);
let /** @type {?} */ hue = Math.round(hsl[0] * 360);
let /** @type {?} */ saturation = Math.round(hsl[1] * 100);
let /** @type {?} */ br = Math.round(hsl[2] * 100);
let /** @type {?} */ baseSat = this.baseSaturation;
let /** @type {?} */ baseBr = this.baseBright;
for (let /** @type {?} */ i = 0; i < this.gradientLevel; i++) {
let /** @type {?} */ newShade = ColorUtils.hsbToHex(hue, saturation - baseSat, br + baseBr);
newShade = newShade.toUpperCase();
grLVArray.push(newShade);
pigmentHex = newShade;
// testing
// this.items.push(new ColorSelectItemModel(newShade, newShade));
baseSat += 5;
baseBr -= 5;
}
this.gradientLevelMap[key] = grLVArray;
}
}
// adding for shading
for (let /** @type {?} */ i = 0; i < this.gradientLevel; i++) {
let /** @type {?} */ shadingItems = this.getShadeColorItemsLevel(i);
for (let /** @type {?} */ item of shadingItems) {
this.items.push(item);
}
}
}
}
/**
* @return {?}
*/
getSelectedItem() {
let /** @type {?} */ sItem = super.getSelectedItem();
if (sItem != null) {
return /** @type {?} */ (sItem);
}
return null;
}
/**
* @return {?}
*/
getLabel() {
return this.label;
}
/**
* @return {?}
*/
getItems() {
return this.items;
}
/**
* @return {?}
*/
getDropdownWidth() {
return this.dropdownWidth;
}
}
ThemeColorSwatch.TYPE_NAME = TYPE_NAME;
ThemeColorSwatch.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-theme-color-swatch" [style.width]="getWidth()" [style.height]="getHeight()">
<div class="swatch-container fluid">
<div class="swatch">
<button type="button" (click)="click($event)" (focusin)="onFocusing($event)" (blur)="onLostFocusing($event)">
<div class="label-side" [style.text-align]="getAlign()" *ngIf="getSelectedItem() !== null">
<div class="box" [style.background-color]="getSelectedItemHexColor()"></div> <div class="label">{{getSelectedItem().label}}</div>
</div>
<div class="arrow-side">
<div class="flex-center">
<div class="down-triangle"></div>
</div>
</div>
</button>
</div>
<div class="menu-container" [class.show]="isShow()" [style.width]="getDropdownWidth()">
<ul class="menu">
<ng-template ngFor let-item [ngForOf]="getItems()" let-i="index">
<li (click)="onSelectItemClicked($event, i)" [style.text-align]="getAlign()">
<div class="box" [style.background-color]="item.value"></div>
</li>
<br *ngIf="_showNewLine(i)"/>
</ng-template>
</ul>
</div>
</div>
</div>
`
},] },
];
/** @nocollapse */
ThemeColorSwatch.ctorParameters = () => [
{ type: NeedFocusService, },
{ type: ElementRef, },
{ type: PhloxAppInfoService, },
];
ThemeColorSwatch.propDecorators = {
"dataParent": [{ type: Input },],
"ignoreParentData": [{ type: Input },],
"data": [{ type: Input },],
"ignoreParentDisabled": [{ type: Input },],
"delegateHistory": [{ type: Input },],
"onDisabled": [{ type: Input },],
"onEnabled": [{ type: Input },],
"loadingEnabled": [{ type: Input },],
"i18nKey": [{ type: Input },],
"bypass": [{ type: Input, args: ['i18nBypass',] },],
"options": [{ type: Input },],
"disabled": [{ type: Input },],
"field": [{ type: Input },],
"name": [{ type: Input },],
"typeOfData": [{ type: Input },],
"readOnly": [{ type: Input },],
"help": [{ type: Input },],
"dataComparator": [{ type: Input, args: ['comparator',] },],
"items": [{ type: Input },],
"align": [{ type: Input },],
"width": [{ type: Input },],
"height": [{ type: Input },],
"dropdownWidth": [{ type: Input },],
"dropdownHeight": [{ type: Input },],
"pigmentColors": [{ type: Input },],
"gradientLevel": [{ type: Input },],
"label": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
"startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },],
"endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },],
"beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },],
"focusEvent": [{ type: Output, args: ['phxFocus',] },],
"beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },],
"lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },],
"beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },],
"changeEvent": [{ type: Output, args: ['phxChange',] },],
"beforeSelectEvent": [{ type: Output, args: ['phxBeforeSelect',] },],
"selectEvent": [{ type: Output, args: ['phxSelect',] },],
"beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },],
"clickEvent": [{ type: Output, args: ['phxClick',] },],
"beforeShowEvent": [{ type: Output, args: ['phxBeforeShow',] },],
"showEvent": [{ type: Output, args: ['phxShow',] },],
"beforeHideEvent": [{ type: Output, args: ['phxBeforeHide',] },],
"hideEvent": [{ type: Output, args: ['phxHide',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ThemeColorSwatch.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ThemeColorSwatch.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ThemeColorSwatch.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ThemeColorSwatch.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "field", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "name", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "typeOfData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "readOnly", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], ThemeColorSwatch.prototype, "help", void 0);
tslib_1.__decorate([
Option('comparator'),
tslib_1.__metadata("design:type", Object)
], ThemeColorSwatch.prototype, "dataComparator", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Array)
], ThemeColorSwatch.prototype, "items", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "align", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "width", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "height", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "dropdownWidth", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "dropdownHeight", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Array)
], ThemeColorSwatch.prototype, "pigmentColors", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Number)
], ThemeColorSwatch.prototype, "gradientLevel", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "label", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('startValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "startValidateEvent", void 0);
tslib_1.__decorate([
Option('endValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "endValidateEvent", void 0);
tslib_1.__decorate([
Option('beforeFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeFocusEvent", void 0);
tslib_1.__decorate([
Option('focus'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "focusEvent", void 0);
tslib_1.__decorate([
Option('beforeLostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeLostFocusEvent", void 0);
tslib_1.__decorate([
Option('lostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "lostFocusEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeChangeEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeSelect'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeSelectEvent", void 0);
tslib_1.__decorate([
Option('select'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "selectEvent", void 0);
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeClickEvent", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "clickEvent", void 0);
tslib_1.__decorate([
Option('beforeShow'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeShowEvent", void 0);
tslib_1.__decorate([
Option('show'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "showEvent", void 0);
tslib_1.__decorate([
Option('beforeHide'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeHideEvent", void 0);
tslib_1.__decorate([
Option('hide'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "hideEvent", void 0);
function ThemeColorSwatch_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ThemeColorSwatch.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ThemeColorSwatch.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ThemeColorSwatch.propDecorators;
/** @type {?} */
ThemeColorSwatch.TYPE_NAME;
/** @type {?} */
ThemeColorSwatch.prototype.dataParent;
/** @type {?} */
ThemeColorSwatch.prototype.ignoreParentData;
/** @type {?} */
ThemeColorSwatch.prototype.data;
/** @type {?} */
ThemeColorSwatch.prototype.ignoreParentDisabled;
/** @type {?} */
ThemeColorSwatch.prototype.delegateHistory;
/** @type {?} */
ThemeColorSwatch.prototype.onDisabled;
/** @type {?} */
ThemeColorSwatch.prototype.onEnabled;
/** @type {?} */
ThemeColorSwatch.prototype.loadingEnabled;
/** @type {?} */
ThemeColorSwatch.prototype.i18nKey;
/** @type {?} */
ThemeColorSwatch.prototype.bypass;
/** @type {?} */
ThemeColorSwatch.prototype.options;
/** @type {?} */
ThemeColorSwatch.prototype.disabled;
/** @type {?} */
ThemeColorSwatch.prototype.field;
/** @type {?} */
ThemeColorSwatch.prototype.name;
/** @type {?} */
ThemeColorSwatch.prototype.typeOfData;
/** @type {?} */
ThemeColorSwatch.prototype.readOnly;
/** @type {?} */
ThemeColorSwatch.prototype.help;
/** @type {?} */
ThemeColorSwatch.prototype.dataComparator;
/** @type {?} */
ThemeColorSwatch.prototype.items;
/** @type {?} */
ThemeColorSwatch.prototype.align;
/** @type {?} */
ThemeColorSwatch.prototype.width;
/** @type {?} */
ThemeColorSwatch.prototype.height;
/** @type {?} */
ThemeColorSwatch.prototype.dropdownWidth;
/** @type {?} */
ThemeColorSwatch.prototype.dropdownHeight;
/** @type {?} */
ThemeColorSwatch.prototype.pigmentColors;
/** @type {?} */
ThemeColorSwatch.prototype.gradientLevel;
/** @type {?} */
ThemeColorSwatch.prototype.label;
/** @type {?} */
ThemeColorSwatch.prototype.gradientLevelMap;
/** @type {?} */
ThemeColorSwatch.prototype.baseSaturation;
/** @type {?} */
ThemeColorSwatch.prototype.baseBright;
/** @type {?} */
ThemeColorSwatch.prototype.loadEvent;
/** @type {?} */
ThemeColorSwatch.prototype.startValidateEvent;
/** @type {?} */
ThemeColorSwatch.prototype.endValidateEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeFocusEvent;
/** @type {?} */
ThemeColorSwatch.prototype.focusEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeLostFocusEvent;
/** @type {?} */
ThemeColorSwatch.prototype.lostFocusEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeChangeEvent;
/** @type {?} */
ThemeColorSwatch.prototype.changeEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeSelectEvent;
/** @type {?} */
ThemeColorSwatch.prototype.selectEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeClickEvent;
/** @type {?} */
ThemeColorSwatch.prototype.clickEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeShowEvent;
/** @type {?} */
ThemeColorSwatch.prototype.showEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeHideEvent;
/** @type {?} */
ThemeColorSwatch.prototype.hideEvent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGhlbWVDb2xvclN3YXRjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvVGhlbWVDb2xvclN3YXRjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUd4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUluRix1QkFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUM7QUFpQ25ELE1BQU0sdUJBQXdCLFNBQVEsc0JBQXNCOzs7Ozs7SUFnSzFELFlBQVksZ0JBQWtDLEVBQUUsVUFBc0IsRUFBRSxtQkFBd0M7UUFDOUcsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7S0FDdEI7Ozs7SUFF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ZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFNpbXBsZURyb3Bkb3duIH0gZnJvbSAnLi9BYnN0cmFjdFNpbXBsZURyb3Bkb3duJztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xuaW1wb3J0IHsgSURhdGFDb21wYXJhdG9yIH0gZnJvbSAnLi4vLi4vSURhdGFDb21wYXJhdG9yJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDb2xvclNlbGVjdEl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL0NvbG9yU2VsZWN0SXRlbU1vZGVsJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbC9WYWxpZGF0aW9uUmVzdWx0JztcbmltcG9ydCB7IENvbG9yTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9Db2xvck1vZGVsJztcbmltcG9ydCB7IENvbG9yVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9Db2xvclV0aWxzJztcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvUGhsb3hBcHBJbmZvU2VydmljZS5zZXJ2aWNlJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LXRoZW1lLWNvbG9yLXN3YXRjaFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LXRoZW1lLWNvbG9yLXN3YXRjaFwiIFtzdHlsZS53aWR0aF09XCJnZXRXaWR0aCgpXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWlnaHQoKVwiPlxuXHQ8ZGl2IGNsYXNzPVwic3dhdGNoLWNvbnRhaW5lciBmbHVpZFwiPlxuXHRcdDxkaXYgY2xhc3M9XCJzd2F0Y2hcIj5cblx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbGljaygkZXZlbnQpXCIgKGZvY3VzaW4pPVwib25Gb2N1c2luZygkZXZlbnQpXCIgKGJsdXIpPVwib25Mb3N0Rm9jdXNpbmcoJGV2ZW50KVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibGFiZWwtc2lkZVwiIFtzdHlsZS50ZXh0LWFsaWduXT1cImdldEFsaWduKClcIiAqbmdJZj1cImdldFNlbGVjdGVkSXRlbSgpICE9PSBudWxsXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJveFwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImdldFNlbGVjdGVkSXRlbUhleENvbG9yKClcIj48L2Rpdj4gPGRpdiBjbGFzcz1cImxhYmVsXCI+e3tnZXRTZWxlY3RlZEl0ZW0oKS5sYWJlbH19PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXJyb3ctc2lkZVwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmbGV4LWNlbnRlclwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImRvd24tdHJpYW5nbGVcIj48L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2J1dHRvbj5cblx0XHQ8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWVudS1jb250YWluZXJcIiBbY2xhc3Muc2hvd109XCJpc1Nob3coKVwiIFtzdHlsZS53aWR0aF09XCJnZXREcm9wZG93bldpZHRoKClcIj5cbiAgICAgICAgPHVsIGNsYXNzPVwibWVudVwiPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwiZ2V0SXRlbXMoKVwiIGxldC1pPVwiaW5kZXhcIj5cblx0XHRcdFx0XHQ8bGkgKGNsaWNrKT1cIm9uU2VsZWN0SXRlbUNsaWNrZWQoJGV2ZW50LCBpKVwiIFtzdHlsZS50ZXh0LWFsaWduXT1cImdldEFsaWduKClcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3hcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpdGVtLnZhbHVlXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9saT5cblx0XHRcdFx0XHQ8YnIgKm5nSWY9XCJfc2hvd05ld0xpbmUoaSlcIi8+XG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XG4gICAgXHRcdDwvdWw+XG4gICAgXHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgVGhlbWVDb2xvclN3YXRjaCBleHRlbmRzIEFic3RyYWN0U2ltcGxlRHJvcGRvd24gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcblxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQElucHV0LlxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XG4gIEBJbnB1dCgnaTE4bkJ5cGFzcycpXG4gIEBPcHRpb24oJ2kxOG5CeXBhc3MnKVxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRpc2FibGVkOiBib29sZWFuO1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RJbnB1dERhdGFWaWV3XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHR5cGVPZkRhdGE6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCByZWFkT25seTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGhlbHA6IGFueTtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTZWxlY3RJdGVtc1xuICBASW5wdXQoJ2NvbXBhcmF0b3InKVxuICBAT3B0aW9uKCdjb21wYXJhdG9yJylcbiAgcHJvdGVjdGVkIGRhdGFDb21wYXJhdG9yOiBJRGF0YUNvbXBhcmF0b3I8YW55PjtcbiAgQElucHV0KClcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGl0ZW1zOiBDb2xvclNlbGVjdEl0ZW1Nb2RlbFtdO1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNlbGVjdE9uZUl0ZW1cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTaW1wbGVEcm9wZG93blxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGFsaWduOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBoZWlnaHQ6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkcm9wZG93bldpZHRoOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZHJvcGRvd25IZWlnaHQ6IHN0cmluZztcbiAgXG4gIC8vIC0tLSBTZWxmXG4gIEBJMThOKClcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgcGlnbWVudENvbG9yczogQ29sb3JNb2RlbFtdO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJpdmF0ZSBncmFkaWVudExldmVsOiBudW1iZXI7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbGFiZWw6IHN0cmluZztcbiAgXG4gIHByaXZhdGUgZ3JhZGllbnRMZXZlbE1hcDogYW55O1xuICBwcml2YXRlIGJhc2VTYXR1cmF0aW9uOiBudW1iZXI7XG4gIHByaXZhdGUgYmFzZUJyaWdodDogbnVtYmVyO1xuICBcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxuICBAT3V0cHV0KCdwaHhMb2FkJylcbiAgQE9wdGlvbignbG9hZCcpXG4gIHByb3RlY3RlZCBsb2FkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xuICBAT3V0cHV0KCdwaHhTdGFydFZhbGlkYXRlJylcbiAgQE9wdGlvbignc3RhcnRWYWxpZGF0ZScpXG4gIHByb3RlY3RlZCBzdGFydFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhFbmRWYWxpZGF0ZScpXG4gIEBPcHRpb24oJ2VuZFZhbGlkYXRlJylcbiAgcHJvdGVjdGVkIGVuZFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhCZWZvcmVGb2N1cycpXG4gIEBPcHRpb24oJ2JlZm9yZUZvY3VzJylcbiAgcHJvdGVjdGVkIGJlZm9yZUZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhGb2N1cycpXG4gIEBPcHRpb24oJ2ZvY3VzJylcbiAgcHJvdGVjdGVkIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhCZWZvcmVMb3N0Rm9jdXMnKVxuICBAT3B0aW9uKCdiZWZvcmVMb3N0Rm9jdXMnKVxuICBwcm90ZWN0ZWQgYmVmb3JlTG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhMb3N0Rm9jdXMnKVxuICBAT3B0aW9uKCdsb3N0Rm9jdXMnKVxuICBwcm90ZWN0ZWQgbG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhCZWZvcmVDaGFuZ2UnKVxuICBAT3B0aW9uKCdiZWZvcmVDaGFuZ2UnKVxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhDaGFuZ2UnKVxuICBAT3B0aW9uKCdjaGFuZ2UnKVxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNlbGVjdEl0ZW1zXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZVNlbGVjdCcpXG4gIEBPcHRpb24oJ2JlZm9yZVNlbGVjdCcpXG4gIHByb3RlY3RlZCBiZWZvcmVTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeFNlbGVjdCcpXG4gIEBPcHRpb24oJ3NlbGVjdCcpXG4gIHByb3RlY3RlZCBzZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0U2VsZWN0T25lSXRlbVxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNpbXBsZURyb3Bkb3duXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNsaWNrJylcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxuICBwcm90ZWN0ZWQgYmVmb3JlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeENsaWNrJylcbiAgQE9wdGlvbignY2xpY2snKVxuICBwcm90ZWN0ZWQgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZVNob3cnKVxuICBAT3B0aW9uKCdiZWZvcmVTaG93JylcbiAgcHJvdGVjdGVkIGJlZm9yZVNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeFNob3cnKVxuICBAT3B0aW9uKCdzaG93JylcbiAgcHJvdGVjdGVkIHNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUhpZGUnKVxuICBAT3B0aW9uKCdiZWZvcmVIaWRlJylcbiAgcHJvdGVjdGVkIGJlZm9yZUhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEhpZGUnKVxuICBAT3B0aW9uKCdoaWRlJylcbiAgcHJvdGVjdGVkIGhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IobmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcGhsb3hBcHBJbmZvU2VydmljZTogUGhsb3hBcHBJbmZvU2VydmljZSkge1xuICAgIHN1cGVyKG5lZWRGb2N1c1NlcnZpY2UsIGVsZW1lbnRSZWYsIHBobG94QXBwSW5mb1NlcnZpY2UpO1xuXG4gICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIHRoaXMuZ3JhZGllbnRMZXZlbE1hcCA9IHt9O1xuICAgIHRoaXMuYmFzZVNhdHVyYXRpb24gPSAyNTtcbiAgICB0aGlzLmJhc2VCcmlnaHQgPSAyNTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgaWYgKHRoaXMucGlnbWVudENvbG9ycyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5waWdtZW50Q29sb3JzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5zZXRQaWdtZW50Q29sb3JzKHRoaXMucGlnbWVudENvbG9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xuICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkSXRlbUhleENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRJdGVtKCkuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBfc2hvd05ld0xpbmUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnBpZ21lbnRDb2xvcnMgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMucGlnbWVudENvbG9ycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCBwaWdtZW50Q29sb3JzQ291bnQgPSB0aGlzLnBpZ21lbnRDb2xvcnMubGVuZ3RoO1xuXG4gICAgICBsZXQgY291bnQgPSBpbmRleCArIDE7XG4gICAgICBpZiAoY291bnQgJSBwaWdtZW50Q29sb3JzQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmFrZUdyYWRpZW50TGV2ZWxBcnJheSgpOiBhbnlbXSB7XG4gICAgbGV0IGZha2VBcnJheTogYW55W10gPSBbXTtcblxuICAgIGlmICh0aGlzLmdyYWRpZW50TGV2ZWwgPiAwKSB7XG4gICAgICBmYWtlQXJyYXkgPSBuZXcgQXJyYXkodGhpcy5ncmFkaWVudExldmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFrZUFycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGFkZUNvbG9ySXRlbXNMZXZlbChsZXZlbDogbnVtYmVyKTogQ29sb3JTZWxlY3RJdGVtTW9kZWxbXSB7XG4gICAgbGV0IHJlc3VsdDogQ29sb3JTZWxlY3RJdGVtTW9kZWxbXSA9IFtdO1xuXG4gICAgaWYgKGxldmVsID49IDApIHtcbiAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xuICAgICAgICBsZXQga2V5OiBzdHJpbmcgPSBpdGVtLmdldFZhbHVlKCk7XG4gICAgICAgIGxldCBsZXZlbEFycmF5ID0gdGhpcy5ncmFkaWVudExldmVsTWFwW2tleV07XG4gICAgICAgIGlmIChsZXZlbEFycmF5ICE9PSBudWxsICYmIHR5cGVvZiBsZXZlbEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChsZXZlbCA8IGxldmVsQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgQ29sb3JTZWxlY3RJdGVtTW9kZWwobGV2ZWxBcnJheVtsZXZlbF0sIGxldmVsQXJyYXlbbGV2ZWxdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblZhbGlkYXRpb25FbmQoaW5wdXRWYWx1ZTogYW55LCByZXN1bHRzOiBWYWxpZGF0aW9uUmVzdWx0W10pOiB2b2lkIHtcbiAgICAvLyEgZG8gc3RoaW5nXG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlKGRhdGE6IGFueSwgaW5wdXRWYWw6IGFueSk6IHZvaWQge1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvRm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCIuc3dhdGNoID4gYnV0dG9uXCIpLmZvY3VzKCk7XG4gIH1cblxuICAvLyBPdmVycmlkZVxuICBwcm90ZWN0ZWQgZG9CbHVyKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiLnN3YXRjaCA+IGJ1dHRvblwiKS5ibHVyKCk7XG4gIH1cblxuICAvLyBPdmVycmlkZVxuICBwcm90ZWN0ZWQgZ2V0RHJvcGRvd25Qb3B1cFNlbGVjdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcubWVudSc7XG4gIH1cblxuICBwdWJsaWMgc2V0UGlnbWVudENvbG9ycyhjb2xvck1vZGVsOiBDb2xvck1vZGVsW10pOiB2b2lkIHtcbiAgICB0aGlzLnBpZ21lbnRDb2xvcnMgPSBjb2xvck1vZGVsO1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLmdyYWRpZW50TGV2ZWxNYXAgPSB7fTtcbiAgICBpZiAodGhpcy5waWdtZW50Q29sb3JzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBpZ21lbnRDb2xvcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgcGVyY2VudFNoYWRlID0gMTAwO1xuICAgICAgaWYgKHRoaXMuZ3JhZGllbnRMZXZlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5ncmFkaWVudExldmVsID09PSAnbnVtYmVyJyAmJiB0aGlzLmdyYWRpZW50TGV2ZWwgPiAwKSB7XG4gICAgICAgIHBlcmNlbnRTaGFkZSA9IE1hdGgucm91bmQocGVyY2VudFNoYWRlIC8gdGhpcy5ncmFkaWVudExldmVsKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgY29sb3Igb2YgdGhpcy5waWdtZW50Q29sb3JzKSB7XG4gICAgICAgIGxldCBrZXkgPSBjb2xvci52YWx1ZTtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKG5ldyBDb2xvclNlbGVjdEl0ZW1Nb2RlbChjb2xvci5uYW1lLCBjb2xvci52YWx1ZSkpO1xuICAgICAgICBpZiAodGhpcy5ncmFkaWVudExldmVsICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmdyYWRpZW50TGV2ZWwgPT09ICdudW1iZXInICYmIHRoaXMuZ3JhZGllbnRMZXZlbCA+IDApIHtcbiAgICAgICAgICBsZXQgZ3JMVkFycmF5OiBhbnlbXSA9IFtdO1xuICAgICAgICAgIGxldCBwaWdtZW50SGV4OiBzdHJpbmcgPSBjb2xvci52YWx1ZTtcblxuICAgICAgICAgIGxldCBoc2w6IG51bWJlcltdID0gQ29sb3JVdGlscy5oZXhUb0hzbChwaWdtZW50SGV4KTtcbiAgICAgICAgICBsZXQgaHVlOiBudW1iZXIgPSBNYXRoLnJvdW5kKGhzbFswXSAqIDM2MCk7XG4gICAgICAgICAgbGV0IHNhdHVyYXRpb246IG51bWJlciA9IE1hdGgucm91bmQoaHNsWzFdICogMTAwKTtcbiAgICAgICAgICBsZXQgYnI6IG51bWJlciA9IE1hdGgucm91bmQoaHNsWzJdICogMTAwKTtcblxuICAgICAgICAgIGxldCBiYXNlU2F0OiBudW1iZXIgPSB0aGlzLmJhc2VTYXR1cmF0aW9uO1xuICAgICAgICAgIGxldCBiYXNlQnI6IG51bWJlciA9IHRoaXMuYmFzZUJyaWdodDtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ncmFkaWVudExldmVsOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuZXdTaGFkZSA9IENvbG9yVXRpbHMuaHNiVG9IZXgoaHVlLCBzYXR1cmF0aW9uIC0gYmFzZVNhdCwgYnIgKyBiYXNlQnIpO1xuICAgICAgICAgICAgbmV3U2hhZGUgPSBuZXdTaGFkZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgZ3JMVkFycmF5LnB1c2gobmV3U2hhZGUpO1xuICAgICAgICAgICAgcGlnbWVudEhleCA9IG5ld1NoYWRlO1xuXG4gICAgICAgICAgICAvLyB0ZXN0aW5nXG4gICAgICAgICAgICAvLyB0aGlzLml0ZW1zLnB1c2gobmV3IENvbG9yU2VsZWN0SXRlbU1vZGVsKG5ld1NoYWRlLCBuZXdTaGFkZSkpO1xuICAgICAgICAgICAgYmFzZVNhdCArPSA1O1xuICAgICAgICAgICAgYmFzZUJyIC09IDU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ3JhZGllbnRMZXZlbE1hcFtrZXldID0gZ3JMVkFycmF5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZGluZyBmb3Igc2hhZGluZ1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdyYWRpZW50TGV2ZWw7IGkrKykge1xuICAgICAgICBsZXQgc2hhZGluZ0l0ZW1zID0gdGhpcy5nZXRTaGFkZUNvbG9ySXRlbXNMZXZlbChpKTtcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBzaGFkaW5nSXRlbXMpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtKCk6IENvbG9yU2VsZWN0SXRlbU1vZGVsIHtcbiAgICBsZXQgc0l0ZW0gPSBzdXBlci5nZXRTZWxlY3RlZEl0ZW0oKTtcblxuICAgIGlmIChzSXRlbSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gc0l0ZW0gYXMgQ29sb3JTZWxlY3RJdGVtTW9kZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtcygpOiBDb2xvclNlbGVjdEl0ZW1Nb2RlbFtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBnZXREcm9wZG93bldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd25XaWR0aDtcbiAgfVxuXG59XG4iXX0=