@blox/material
Version:
Material Components for Angular
254 lines • 35.4 kB
JavaScript
import { Directive, ElementRef, HostBinding, Input, Optional, Renderer2, Self, forwardRef, HostListener, Output, EventEmitter, ContentChildren, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { NgControl } from '@angular/forms';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { MDCCheckboxFoundation } from '@material/checkbox';
import { AbstractMdcInput } from '../abstract/abstract.mdc.input';
import { asBoolean } from '../../utils/value.utils';
import { MdcEventRegistry } from '../../utils/mdc.event.registry';
import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple';
/**
* Directive for the input element of an <code>MdcCheckboxDirective</code>.
*/
export class MdcCheckboxInputDirective extends AbstractMdcInput {
constructor(_elm, _cntr) {
super();
this._elm = _elm;
this._cntr = _cntr;
/** @internal */
this._cls = true;
this.onDestroy$ = new Subject();
this._id = null;
this._disabled = false;
this._checked = false;
this._indeterminate = false;
/** @internal */
this._checkedChange = new EventEmitter();
/** @internal */
this._indeterminateChange = new EventEmitter();
/** @internal */
this._disabledChange = new EventEmitter();
}
ngOnInit() {
var _a;
(_a = this._cntr) === null || _a === void 0 ? void 0 : _a.valueChanges.pipe(takeUntil(this.onDestroy$)).subscribe((value) => {
this.updateValue(value, true);
});
}
ngOnDestroy() {
this.onDestroy$.next();
this.onDestroy$.complete();
}
/** @docs-private */
get id() {
return this._id;
}
set id(value) {
this._id = value;
}
/** @docs-private */
get disabled() {
return this._cntr ? !!this._cntr.disabled : this._disabled;
}
set disabled(value) {
const newVal = asBoolean(value);
if (newVal != this._disabled) {
this._disabled = asBoolean(newVal);
this._disabledChange.emit(newVal);
}
}
/** @docs-private */
get checked() {
return this._checked;
}
set checked(value) {
this.updateValue(value, false);
}
updateValue(value, fromControl) {
// When the 'checked' property is the source of the change, we want to coerce boolean
// values using asBoolean, so that initializing with an attribute with no value works
// as expected.
// When the NgControl is the source of the change we don't want that. The value should
// be interpreted like NgControl/NgForms handles non-boolean values when binding.
const newVal = fromControl ? !!value : asBoolean(value);
if (newVal !== this._checked) {
this._checked = newVal;
this._checkedChange.emit(newVal);
}
if (!fromControl && this._cntr && newVal !== this._cntr.value) {
this._cntr.control.setValue(newVal);
}
}
/** @docs-private */
get indeterminate() {
return this._indeterminate;
}
set indeterminate(value) {
const newVal = asBoolean(value);
if (newVal !== this._indeterminate) {
this._indeterminate = newVal;
Promise.resolve().then(() => this._indeterminateChange.emit(newVal));
}
}
// We listen to click-event instead of change-event, because IE doesn't fire the
// change-event when an indeterminate checkbox is clicked. There's no need to
// also listen to change-events.
_onChange() {
// only update the checked state from click if there is no control for which we already
// listen to value changes:
if (!this._cntr)
this.checked = this._elm.nativeElement.checked;
this.indeterminate = this._elm.nativeElement.indeterminate;
}
}
MdcCheckboxInputDirective.decorators = [
{ type: Directive, args: [{
selector: 'input[mdcCheckboxInput][type=checkbox]',
providers: [{ provide: AbstractMdcInput, useExisting: forwardRef(() => MdcCheckboxInputDirective) }]
},] }
];
MdcCheckboxInputDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] }
];
MdcCheckboxInputDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-checkbox__native-control',] }],
_checkedChange: [{ type: Output }],
_indeterminateChange: [{ type: Output }],
_disabledChange: [{ type: Output }],
id: [{ type: HostBinding }, { type: Input }],
disabled: [{ type: HostBinding }, { type: Input }],
checked: [{ type: HostBinding }, { type: Input }],
indeterminate: [{ type: HostBinding }, { type: Input }],
_onChange: [{ type: HostListener, args: ['click',] }]
};
/**
* Directive for creating a Material Design checkbox. The checkbox is driven by an
* underlying native checkbox input, which must use the <code>MdcCheckboxInputDirective</code>
* directive.
* The current implementation will add all other required DOM elements (such as the
* background and ripple).
* Future implementations will also support supplying (customized) background
* elements.
*
* This directive can be used together with an <code>mdcFormField</code> to
* easily position checkboxes and their labels, see
* <a href="/components/form-field">mdcFormField</a>.
*/
export class MdcCheckboxDirective extends AbstractMdcRipple {
constructor(renderer, root, registry, doc) {
super(root, renderer, registry, doc);
this.root = root;
/** @internal */
this._cls = true;
this.onDestroy$ = new Subject();
this.onInputChange$ = new Subject();
this.mdcAdapter = {
addClass: (className) => this._renderer.addClass(this.root.nativeElement, className),
removeClass: (className) => this._renderer.removeClass(this.root.nativeElement, className),
setNativeControlAttr: (attr, value) => this._renderer.setAttribute(this._input._elm.nativeElement, attr, value),
removeNativeControlAttr: (attr) => this._renderer.removeAttribute(this._input._elm.nativeElement, attr),
forceLayout: () => this.root.nativeElement.offsetWidth,
isAttachedToDOM: () => !!this._input,
hasNativeControl: () => !!this._input,
isChecked: () => this._input._elm.nativeElement.checked,
isIndeterminate: () => this._input._elm.nativeElement.indeterminate,
setNativeControlDisabled: (disabled) => this._input.disabled = disabled
};
/** @internal */
this._foundation = null;
this.addRippleSurface('mdc-checkbox__ripple');
}
ngAfterContentInit() {
MdcCheckboxDirective.addBackground(this._rippleElm, this._renderer);
this.initRipple(true);
if (this._input) {
this._foundation = new MDCCheckboxFoundation(this.mdcAdapter);
this._foundation.init();
}
this._inputs.changes.pipe(takeUntil(this.onDestroy$)).subscribe(() => {
this.reinitRipple();
if (this._foundation)
this._foundation.destroy();
if (this._input) {
this._foundation = new MDCCheckboxFoundation(this.mdcAdapter);
this._foundation.init();
}
else
this._foundation = null;
this.subscribeInputChanges();
});
this.subscribeInputChanges();
}
ngOnDestroy() {
this.onInputChange$.next();
this.onInputChange$.complete();
this.onDestroy$.next();
this.onDestroy$.complete();
if (this._foundation) {
this._foundation.destroy();
this._foundation = null;
}
this.destroyRipple();
}
subscribeInputChanges() {
var _a, _b, _c;
this.onInputChange$.next();
(_a = this._input) === null || _a === void 0 ? void 0 : _a._indeterminateChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(() => { var _a; return (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.handleChange(); });
(_b = this._input) === null || _b === void 0 ? void 0 : _b._checkedChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(() => { var _a; return (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.handleChange(); });
(_c = this._input) === null || _c === void 0 ? void 0 : _c._disabledChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(val => { var _a; return (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.setDisabled(val); });
}
static addBackground(elm, renderer) {
let path = renderer.createElement('path', 'svg');
renderer.addClass(path, 'mdc-checkbox__checkmark-path');
renderer.setAttribute(path, 'fill', 'none');
renderer.setAttribute(path, 'd', 'M1.73,12.91 8.1,19.28 22.79,4.59');
let svg = renderer.createElement('svg', 'svg');
renderer.appendChild(svg, path);
renderer.addClass(svg, 'mdc-checkbox__checkmark');
renderer.setAttribute(svg, 'viewBox', '0 0 24 24');
let mixedmark = renderer.createElement('div');
renderer.addClass(mixedmark, 'mdc-checkbox__mixedmark');
let bg = renderer.createElement('div');
renderer.appendChild(bg, svg);
renderer.appendChild(bg, mixedmark);
renderer.addClass(bg, 'mdc-checkbox__background');
renderer.appendChild(elm.nativeElement, bg);
}
/** @internal */
getRippleInteractionElement() {
var _a;
return (_a = this._input) === null || _a === void 0 ? void 0 : _a._elm;
}
/** @internal */
onAnimationEnd() {
var _a;
(_a = this._foundation) === null || _a === void 0 ? void 0 : _a.handleAnimationEnd();
}
/** @internal */
get _input() {
return this._inputs && this._inputs.length > 0 ? this._inputs.first : null;
}
}
MdcCheckboxDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcCheckbox]'
},] }
];
MdcCheckboxDirective.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef },
{ type: MdcEventRegistry },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
MdcCheckboxDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-checkbox',] }],
_inputs: [{ type: ContentChildren, args: [MdcCheckboxInputDirective,] }],
onAnimationEnd: [{ type: HostListener, args: ['animationend',] }]
};
export const CHECKBOX_DIRECTIVES = [
MdcCheckboxInputDirective,
MdcCheckboxDirective
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLmNoZWNrYm94LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NoZWNrYm94L21kYy5jaGVja2JveC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxTQUFTLEVBQ3hHLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBc0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbEU7O0dBRUc7QUFLSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsZ0JBQWdCO0lBZTNELFlBQW1CLElBQWdCLEVBQTZCLEtBQWdCO1FBQzVFLEtBQUssRUFBRSxDQUFDO1FBRE8sU0FBSSxHQUFKLElBQUksQ0FBWTtRQUE2QixVQUFLLEdBQUwsS0FBSyxDQUFXO1FBZGhGLGdCQUFnQjtRQUM0QyxTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hFLGVBQVUsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN6QyxRQUFHLEdBQWtCLElBQUksQ0FBQztRQUMxQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDL0IsZ0JBQWdCO1FBQ0csbUJBQWMsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN2RixnQkFBZ0I7UUFDRyx5QkFBb0IsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUM3RixnQkFBZ0I7UUFDRyxvQkFBZSxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO0lBSXhGLENBQUM7SUFFRCxRQUFROztRQUNKLE1BQUEsSUFBSSxDQUFDLEtBQUssMENBQUUsWUFBWSxDQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzNFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUMsRUFBRTtJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsSUFDYSxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLEVBQUUsQ0FBQyxLQUFvQjtRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLElBQ2EsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBYztRQUN2QixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQztJQUNMLENBQUM7SUFJRCxvQkFBb0I7SUFDcEIsSUFDYSxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBYztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBSU8sV0FBVyxDQUFDLEtBQVUsRUFBRSxXQUFvQjtRQUNoRCxxRkFBcUY7UUFDckYscUZBQXFGO1FBQ3JGLGVBQWU7UUFDZixzRkFBc0Y7UUFDdEYsaUZBQWlGO1FBQ2pGLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1lBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QztJQUNMLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsSUFDYSxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxhQUFhLENBQUMsS0FBYztRQUM1QixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQztZQUM3QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4RTtJQUNMLENBQUM7SUFJRCxnRkFBZ0Y7SUFDaEYsNkVBQTZFO0lBQzdFLGdDQUFnQztJQUNULFNBQVM7UUFDNUIsdUZBQXVGO1FBQ3ZGLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztJQUMvRCxDQUFDOzs7WUFqSEosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSx3Q0FBd0M7Z0JBQ2xELFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO2FBQ3RHOzs7WUFsQnFDLFVBQVU7WUFHdkMsU0FBUyx1QkErQndCLFFBQVEsWUFBSSxJQUFJOzs7bUJBYnJELFdBQVcsU0FBQyxvQ0FBb0M7NkJBT2hELE1BQU07bUNBRU4sTUFBTTs4QkFFTixNQUFNO2lCQWtCTixXQUFXLFlBQ1gsS0FBSzt1QkFTTCxXQUFXLFlBQ1gsS0FBSztzQkFlTCxXQUFXLFlBQ1gsS0FBSzs0QkEyQkwsV0FBVyxZQUNYLEtBQUs7d0JBaUJMLFlBQVksU0FBQyxPQUFPOztBQVN6Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFJSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsaUJBQWlCO0lBc0J2RCxZQUFZLFFBQW1CLEVBQVUsSUFBZ0IsRUFBRSxRQUEwQixFQUFvQixHQUFRO1FBQzdHLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFlLENBQUMsQ0FBQztRQURaLFNBQUksR0FBSixJQUFJLENBQVk7UUFyQnpELGdCQUFnQjtRQUM0QixTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hELGVBQVUsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN6QyxtQkFBYyxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRzdDLGVBQVUsR0FBdUI7WUFDckMsUUFBUSxFQUFFLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDO1lBQzVGLFdBQVcsRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQztZQUNsRyxvQkFBb0IsRUFBRSxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO1lBQ2hJLHVCQUF1QixFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDO1lBQ2hILFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXO1lBQ3RELGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDcEMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ3JDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTztZQUN4RCxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWE7WUFDcEUsd0JBQXdCLEVBQUUsQ0FBQyxRQUFpQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTyxDQUFDLFFBQVEsR0FBRyxRQUFRO1NBQ3BGLENBQUM7UUFDRixnQkFBZ0I7UUFDaEIsZ0JBQVcsR0FBaUMsSUFBSSxDQUFDO1FBSTdDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQkFBa0I7UUFDZCxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsT0FBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDbEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVc7Z0JBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNiLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDM0I7O2dCQUNHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUMzQjtRQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8scUJBQXFCOztRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsb0JBQW9CLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFdBQVcsMENBQUUsWUFBWSxLQUFFLEVBQUU7UUFDeEksTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxjQUFjLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFdBQVcsMENBQUUsWUFBWSxLQUFFLEVBQUU7UUFDbEksTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxlQUFlLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSx3QkFBQyxJQUFJLENBQUMsV0FBVywwQ0FBRSxXQUFXLENBQUMsR0FBRyxJQUFDLEVBQUU7SUFDMUksQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBZSxFQUFFLFFBQW1CO1FBQzdELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3JFLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDbEQsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUN4RCxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLDBCQUEwQixDQUFDLENBQUM7UUFDbEQsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxnQkFBZ0I7SUFDTiwyQkFBMkI7O1FBQ2pDLGFBQU8sSUFBSSxDQUFDLE1BQU0sMENBQUUsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxnQkFBZ0I7SUFFaEIsY0FBYzs7UUFDVixNQUFBLElBQUksQ0FBQyxXQUFXLDBDQUFFLGtCQUFrQixHQUFHO0lBQzNDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRSxDQUFDOzs7WUFwR0osU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxlQUFlO2FBQzVCOzs7WUFsSmtHLFNBQVM7WUFBdEUsVUFBVTtZQVN2QyxnQkFBZ0I7NENBZ0ttRSxNQUFNLFNBQUMsUUFBUTs7O21CQXBCdEcsV0FBVyxTQUFDLG9CQUFvQjtzQkFJaEMsZUFBZSxTQUFDLHlCQUF5Qjs2QkFtRnpDLFlBQVksU0FBQyxjQUFjOztBQVdoQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRztJQUMvQix5QkFBeUI7SUFDekIsb0JBQW9CO0NBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBSZW5kZXJlcjIsXG4gICAgU2VsZiwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTURDQ2hlY2tib3hGb3VuZGF0aW9uLCBNRENDaGVja2JveEFkYXB0ZXIgfSBmcm9tICdAbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZGNJbnB1dCB9IGZyb20gJy4uL2Fic3RyYWN0L2Fic3RyYWN0Lm1kYy5pbnB1dCc7XG5pbXBvcnQgeyBhc0Jvb2xlYW4gfSBmcm9tICcuLi8uLi91dGlscy92YWx1ZS51dGlscyc7XG5pbXBvcnQgeyBNZGNFdmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvbWRjLmV2ZW50LnJlZ2lzdHJ5JztcbmltcG9ydCB7IEFic3RyYWN0TWRjUmlwcGxlIH0gZnJvbSAnLi4vcmlwcGxlL2Fic3RyYWN0Lm1kYy5yaXBwbGUnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgdGhlIGlucHV0IGVsZW1lbnQgb2YgYW4gPGNvZGU+TWRjQ2hlY2tib3hEaXJlY3RpdmU8L2NvZGU+LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2lucHV0W21kY0NoZWNrYm94SW5wdXRdW3R5cGU9Y2hlY2tib3hdJyxcbiAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogQWJzdHJhY3RNZGNJbnB1dCwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjQ2hlY2tib3hJbnB1dERpcmVjdGl2ZSkgfV1cbn0pXG5leHBvcnQgY2xhc3MgTWRjQ2hlY2tib3hJbnB1dERpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjSW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbCcpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIHByaXZhdGUgb25EZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBwcml2YXRlIF9pZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jaGVja2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgX2NoZWNrZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IF9pbmRldGVybWluYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBfZGlzYWJsZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBfZWxtOiBFbGVtZW50UmVmLCBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBfY250cjogTmdDb250cm9sKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX2NudHI/LnZhbHVlQ2hhbmdlcyEucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIEBIb3N0QmluZGluZygpXG4gICAgQElucHV0KCkgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuICBcbiAgICBzZXQgaWQodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIEBIb3N0QmluZGluZygpXG4gICAgQElucHV0KCkgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY250ciA/ICEhdGhpcy5fY250ci5kaXNhYmxlZCA6IHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBuZXdWYWwgPSBhc0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICBpZiAobmV3VmFsICE9IHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGFzQm9vbGVhbihuZXdWYWwpO1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWRDaGFuZ2UuZW1pdChuZXdWYWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBib29sZWFuIHwgJyc7XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIEBIb3N0QmluZGluZygpXG4gICAgQElucHV0KCkgZ2V0IGNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICAgIH1cblxuICAgIHNldCBjaGVja2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfY2hlY2tlZDogYm9vbGVhbiB8ICcnO1xuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWx1ZSh2YWx1ZTogYW55LCBmcm9tQ29udHJvbDogYm9vbGVhbikge1xuICAgICAgICAvLyBXaGVuIHRoZSAnY2hlY2tlZCcgcHJvcGVydHkgaXMgdGhlIHNvdXJjZSBvZiB0aGUgY2hhbmdlLCB3ZSB3YW50IHRvIGNvZXJjZSBib29sZWFuXG4gICAgICAgIC8vIHZhbHVlcyB1c2luZyBhc0Jvb2xlYW4sIHNvIHRoYXQgaW5pdGlhbGl6aW5nIHdpdGggYW4gYXR0cmlidXRlIHdpdGggbm8gdmFsdWUgd29ya3NcbiAgICAgICAgLy8gYXMgZXhwZWN0ZWQuXG4gICAgICAgIC8vIFdoZW4gdGhlIE5nQ29udHJvbCBpcyB0aGUgc291cmNlIG9mIHRoZSBjaGFuZ2Ugd2UgZG9uJ3Qgd2FudCB0aGF0LiBUaGUgdmFsdWUgc2hvdWxkXG4gICAgICAgIC8vIGJlIGludGVycHJldGVkIGxpa2UgTmdDb250cm9sL05nRm9ybXMgaGFuZGxlcyBub24tYm9vbGVhbiB2YWx1ZXMgd2hlbiBiaW5kaW5nLlxuICAgICAgICBjb25zdCBuZXdWYWwgPSBmcm9tQ29udHJvbCA/ICEhdmFsdWUgOiBhc0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICBpZiAobmV3VmFsICE9PSB0aGlzLl9jaGVja2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2VkID0gbmV3VmFsO1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tlZENoYW5nZS5lbWl0KG5ld1ZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmcm9tQ29udHJvbCAmJiB0aGlzLl9jbnRyICYmIG5ld1ZhbCAhPT0gdGhpcy5fY250ci52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fY250ci5jb250cm9sIS5zZXRWYWx1ZShuZXdWYWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBASG9zdEJpbmRpbmcoKVxuICAgIEBJbnB1dCgpIGdldCBpbmRldGVybWluYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXRlcm1pbmF0ZTtcbiAgICB9XG5cbiAgICBzZXQgaW5kZXRlcm1pbmF0ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBuZXdWYWwgPSBhc0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICBpZiAobmV3VmFsICE9PSB0aGlzLl9pbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gbmV3VmFsO1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLl9pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQobmV3VmFsKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaW5kZXRlcm1pbmF0ZTogYm9vbGVhbiB8ICcnO1xuXG4gICAgLy8gV2UgbGlzdGVuIHRvIGNsaWNrLWV2ZW50IGluc3RlYWQgb2YgY2hhbmdlLWV2ZW50LCBiZWNhdXNlIElFIGRvZXNuJ3QgZmlyZSB0aGVcbiAgICAvLyBjaGFuZ2UtZXZlbnQgd2hlbiBhbiBpbmRldGVybWluYXRlIGNoZWNrYm94IGlzIGNsaWNrZWQuIFRoZXJlJ3Mgbm8gbmVlZCB0b1xuICAgIC8vIGFsc28gbGlzdGVuIHRvIGNoYW5nZS1ldmVudHMuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKSBfb25DaGFuZ2UoKSB7XG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSBjaGVja2VkIHN0YXRlIGZyb20gY2xpY2sgaWYgdGhlcmUgaXMgbm8gY29udHJvbCBmb3Igd2hpY2ggd2UgYWxyZWFkeVxuICAgICAgICAvLyBsaXN0ZW4gdG8gdmFsdWUgY2hhbmdlczpcbiAgICAgICAgaWYgKCF0aGlzLl9jbnRyKVxuICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5fZWxtLm5hdGl2ZUVsZW1lbnQuY2hlY2tlZDtcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlID0gdGhpcy5fZWxtLm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZTtcbiAgICB9XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBjcmVhdGluZyBhIE1hdGVyaWFsIERlc2lnbiBjaGVja2JveC4gVGhlIGNoZWNrYm94IGlzIGRyaXZlbiBieSBhblxuICogdW5kZXJseWluZyBuYXRpdmUgY2hlY2tib3ggaW5wdXQsIHdoaWNoIG11c3QgdXNlIHRoZSA8Y29kZT5NZGNDaGVja2JveElucHV0RGlyZWN0aXZlPC9jb2RlPlxuICogZGlyZWN0aXZlLlxuICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBhZGQgYWxsIG90aGVyIHJlcXVpcmVkIERPTSBlbGVtZW50cyAoc3VjaCBhcyB0aGVcbiAqIGJhY2tncm91bmQgYW5kIHJpcHBsZSkuXG4gKiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwgYWxzbyBzdXBwb3J0IHN1cHBseWluZyAoY3VzdG9taXplZCkgYmFja2dyb3VuZFxuICogZWxlbWVudHMuXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBhbiA8Y29kZT5tZGNGb3JtRmllbGQ8L2NvZGU+IHRvXG4gKiBlYXNpbHkgcG9zaXRpb24gY2hlY2tib3hlcyBhbmQgdGhlaXIgbGFiZWxzLCBzZWVcbiAqIDxhIGhyZWY9XCIvY29tcG9uZW50cy9mb3JtLWZpZWxkXCI+bWRjRm9ybUZpZWxkPC9hPi5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbbWRjQ2hlY2tib3hdJ1xufSlcbmV4cG9ydCBjbGFzcyBNZGNDaGVja2JveERpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjUmlwcGxlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtY2hlY2tib3gnKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcbiAgICBwcml2YXRlIG9uRGVzdHJveSQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHJpdmF0ZSBvbklucHV0Q2hhbmdlJDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNZGNDaGVja2JveElucHV0RGlyZWN0aXZlKSBfaW5wdXRzPzogUXVlcnlMaXN0PE1kY0NoZWNrYm94SW5wdXREaXJlY3RpdmU+O1xuICAgIHByaXZhdGUgbWRjQWRhcHRlcjogTURDQ2hlY2tib3hBZGFwdGVyID0ge1xuICAgICAgICBhZGRDbGFzczogKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnJvb3QubmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKSxcbiAgICAgICAgcmVtb3ZlQ2xhc3M6IChjbGFzc05hbWU6IHN0cmluZykgPT4gdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5yb290Lm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSksXG4gICAgICAgIHNldE5hdGl2ZUNvbnRyb2xBdHRyOiAoYXR0cjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5faW5wdXQhLl9lbG0ubmF0aXZlRWxlbWVudCwgYXR0ciwgdmFsdWUpLFxuICAgICAgICByZW1vdmVOYXRpdmVDb250cm9sQXR0cjogKGF0dHI6IHN0cmluZykgPT4gdGhpcy5fcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuX2lucHV0IS5fZWxtLm5hdGl2ZUVsZW1lbnQsIGF0dHIpLFxuICAgICAgICBmb3JjZUxheW91dDogKCkgPT4gdGhpcy5yb290Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsIC8vIGZvcmNlIGxheW91dFxuICAgICAgICBpc0F0dGFjaGVkVG9ET006ICgpID0+ICEhdGhpcy5faW5wdXQsXG4gICAgICAgIGhhc05hdGl2ZUNvbnRyb2w6ICgpID0+ICEhdGhpcy5faW5wdXQsXG4gICAgICAgIGlzQ2hlY2tlZDogKCkgPT4gdGhpcy5faW5wdXQhLl9lbG0ubmF0aXZlRWxlbWVudC5jaGVja2VkLFxuICAgICAgICBpc0luZGV0ZXJtaW5hdGU6ICgpID0+IHRoaXMuX2lucHV0IS5fZWxtLm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSxcbiAgICAgICAgc2V0TmF0aXZlQ29udHJvbERpc2FibGVkOiAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHRoaXMuX2lucHV0IS5kaXNhYmxlZCA9IGRpc2FibGVkXG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2ZvdW5kYXRpb246IE1EQ0NoZWNrYm94Rm91bmRhdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSByb290OiBFbGVtZW50UmVmLCByZWdpc3RyeTogTWRjRXZlbnRSZWdpc3RyeSwgQEluamVjdChET0NVTUVOVCkgZG9jOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocm9vdCwgcmVuZGVyZXIsIHJlZ2lzdHJ5LCBkb2MgYXMgRG9jdW1lbnQpO1xuICAgICAgICB0aGlzLmFkZFJpcHBsZVN1cmZhY2UoJ21kYy1jaGVja2JveF9fcmlwcGxlJyk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBNZGNDaGVja2JveERpcmVjdGl2ZS5hZGRCYWNrZ3JvdW5kKHRoaXMuX3JpcHBsZUVsbSwgdGhpcy5fcmVuZGVyZXIpO1xuICAgICAgICB0aGlzLmluaXRSaXBwbGUodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbiA9IG5ldyBNRENDaGVja2JveEZvdW5kYXRpb24odGhpcy5tZGNBZGFwdGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvdW5kYXRpb24uaW5pdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lucHV0cyEuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWluaXRSaXBwbGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb3VuZGF0aW9uKVxuICAgICAgICAgICAgICAgIHRoaXMuX2ZvdW5kYXRpb24uZGVzdHJveSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbiA9IG5ldyBNRENDaGVja2JveEZvdW5kYXRpb24odGhpcy5tZGNBZGFwdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3VuZGF0aW9uLmluaXQoKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuX2ZvdW5kYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVJbnB1dENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlSW5wdXRDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMub25JbnB1dENoYW5nZSQubmV4dCgpOyB0aGlzLm9uSW5wdXRDaGFuZ2UkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMub25EZXN0cm95JC5uZXh0KCk7IHRoaXMub25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICBpZiAodGhpcy5fZm91bmRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9mb3VuZGF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3Ryb3lSaXBwbGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1YnNjcmliZUlucHV0Q2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5vbklucHV0Q2hhbmdlJC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2lucHV0Py5faW5kZXRlcm1pbmF0ZUNoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uSW5wdXRDaGFuZ2UkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2ZvdW5kYXRpb24/LmhhbmRsZUNoYW5nZSgpKTtcbiAgICAgICAgdGhpcy5faW5wdXQ/Ll9jaGVja2VkQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMub25JbnB1dENoYW5nZSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZm91bmRhdGlvbj8uaGFuZGxlQ2hhbmdlKCkpO1xuICAgICAgICB0aGlzLl9pbnB1dD8uX2Rpc2FibGVkQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMub25JbnB1dENoYW5nZSQpKS5zdWJzY3JpYmUodmFsID0+IHRoaXMuX2ZvdW5kYXRpb24/LnNldERpc2FibGVkKHZhbCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFkZEJhY2tncm91bmQoZWxtOiBFbGVtZW50UmVmLCByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgICAgIGxldCBwYXRoID0gcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgncGF0aCcsICdzdmcnKTtcbiAgICAgICAgcmVuZGVyZXIuYWRkQ2xhc3MocGF0aCwgJ21kYy1jaGVja2JveF9fY2hlY2ttYXJrLXBhdGgnKTtcbiAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKHBhdGgsICdmaWxsJywgJ25vbmUnKTtcbiAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKHBhdGgsICdkJywgJ00xLjczLDEyLjkxIDguMSwxOS4yOCAyMi43OSw0LjU5Jyk7XG4gICAgICAgIGxldCBzdmcgPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdmcnLCAnc3ZnJyk7XG4gICAgICAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKHN2ZywgcGF0aCk7XG4gICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKHN2ZywgJ21kYy1jaGVja2JveF9fY2hlY2ttYXJrJyk7XG4gICAgICAgIHJlbmRlcmVyLnNldEF0dHJpYnV0ZShzdmcsICd2aWV3Qm94JywgJzAgMCAyNCAyNCcpO1xuICAgICAgICBsZXQgbWl4ZWRtYXJrID0gcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKG1peGVkbWFyaywgJ21kYy1jaGVja2JveF9fbWl4ZWRtYXJrJyk7XG4gICAgICAgIGxldCBiZyA9IHJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChiZywgc3ZnKTtcbiAgICAgICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQoYmcsIG1peGVkbWFyayk7XG4gICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGJnLCAnbWRjLWNoZWNrYm94X19iYWNrZ3JvdW5kJyk7XG4gICAgICAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKGVsbS5uYXRpdmVFbGVtZW50LCBiZyk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByb3RlY3RlZCBnZXRSaXBwbGVJbnRlcmFjdGlvbkVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dD8uX2VsbTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RMaXN0ZW5lcignYW5pbWF0aW9uZW5kJylcbiAgICBvbkFuaW1hdGlvbkVuZCgpIHtcbiAgICAgICAgdGhpcy5fZm91bmRhdGlvbj8uaGFuZGxlQW5pbWF0aW9uRW5kKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGdldCBfaW5wdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dHMgJiYgdGhpcy5faW5wdXRzLmxlbmd0aCA+IDAgPyB0aGlzLl9pbnB1dHMuZmlyc3QgOiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IENIRUNLQk9YX0RJUkVDVElWRVMgPSBbXG4gICAgTWRjQ2hlY2tib3hJbnB1dERpcmVjdGl2ZSxcbiAgICBNZGNDaGVja2JveERpcmVjdGl2ZVxuXTtcbiJdfQ==