@tripetto/runner-autoscroll
Version:
Autoscroll UI for running Tripetto forms and surveys.
449 lines (448 loc) • 42.3 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core";
import { isPromise } from "@tripetto/runner";
import { run } from "@tripetto/runner-autoscroll";
import * as i0 from "@angular/core";
export class TripettoAutoscrollComponent {
/** Retrieves a reference to the runner instance. */
get controller() {
return this.runnerController;
}
/** Retrieves the running definition. */
get definition() {
return this.runnerController?.definition || this.initialDefinition;
}
/** Specifies the definition to run. */
set definition(definition) {
if (this.runnerController && definition) {
this.zone.runOutsideAngular(() => {
if (isPromise(definition)) {
definition.then((value) => {
if (value) {
this.runnerController.definition = value;
}
});
} else if (definition) {
this.runnerController.l10n = definition;
}
});
return;
}
this.initialDefinition = definition;
}
/** Retrieves the view mode of the runner. */
get view() {
return this.runnerController?.view || this.initialView || "live";
}
/** Specifies the view mode of the runner. */
set view(view) {
if (this.runnerController) {
this.zone.runOutsideAngular(() => {
this.runnerController.view = view;
});
return;
}
this.initialView = view;
}
/** Retrieves the styles (colors, font, size, etc.) for the runner. */
get styles() {
return this.runnerController?.styles || this.initialStyles;
}
/** Specifies the styles (colors, font, size, etc.) for the runner. */
set styles(styles) {
if (this.runnerController) {
this.zone.runOutsideAngular(() => {
if (isPromise(styles)) {
styles.then((value) => {
if (value) {
this.runnerController.styles = value;
}
});
} else if (styles) {
this.runnerController.styles = styles;
}
});
return;
}
this.initialStyles = styles;
}
/** Retrieves the localization (locale and translation) information. */
get l10n() {
return this.runnerController?.l10n || this.initialL10n;
}
/** Specifies the localization (locale and translation) information. */
set l10n(l10n) {
if (this.runnerController) {
this.zone.runOutsideAngular(() => {
if (isPromise(l10n)) {
l10n.then((value) => {
if (value) {
this.runnerController.l10n = value;
}
});
} else if (l10n) {
this.runnerController.l10n = l10n;
}
});
return;
}
this.initialL10n = l10n;
}
/** Reference to a builder instance to enable live preview for the builder. */
set builder(ref) {
if (!ref) {
this.builderController = undefined;
} else {
new Promise((resolve) => {
const fnAwait = () => {
if (typeof ref === "function") {
const builder = ref();
if (builder) {
return resolve(builder.controller);
}
} else if (ref.controller) {
return resolve(ref.controller);
}
requestAnimationFrame(fnAwait);
};
fnAwait();
}).then((controller) => {
this.builderController = controller;
controller.hook("OnChange", "synchronous", (changeEvent) => {
if (this.runnerController) {
this.runnerController.definition = changeEvent.definition;
}
});
controller.hook("OnEdit", "synchronous", (editEvent) => {
this.runnerController?.doPreview(editEvent.data);
});
});
}
}
get builder() {
return (
this.builderController && {
controller: this.builderController,
}
);
}
constructor(element, zone) {
this.element = element;
this.zone = zone;
/** Invoked when the runner is ready. */
this.onReady = new EventEmitter();
/** Invoked when the runner processed a change. */
this.onChange = new EventEmitter();
/** Invoked when data can be imported into the instance. */
this.onImport = new EventEmitter();
/** Invoked when the data in the runner is changed. */
this.onData = new EventEmitter();
/** Specifies a function that is invoked when the user performs an action. */
this.onAction = new EventEmitter();
/** Invoked when the runner is about to end and submits data. */
this.onSubmit = new EventEmitter();
/** Invoked when the runner is completed (after the data is submitted). */
this.onComplete = new EventEmitter();
/** Specifies a function that is invoked when an edit action is requested. */
this.onEdit = new EventEmitter();
/** Specifies a function that is invoked when the runner is "touched" by a user. */
this.onTouch = new EventEmitter();
/** Invoked when the runner is destroyed. */
this.onDestroy = new EventEmitter();
}
ngOnInit() {
this.zone.runOutsideAngular(async () => {
this.runnerController = await run({
element: this.element.nativeElement,
definition: this.definition,
view: this.initialView,
display: this.display,
snapshot: this.snapshot,
styles: this.styles,
persistent: this.persistent,
license: this.license,
removeBranding: this.removeBranding,
attachments: this.attachments,
className: this.className,
customStyle: this.customStyle,
customCSS: this.customCSS,
l10n: this.l10n,
language: this.language,
locale: this.locale,
translations: this.translations,
onReady: (instance) => this.onReady.emit(instance),
onChange: (instance) => this.onChange.emit(instance),
onImport: (instance) => this.onImport.emit(instance),
onData: (instance) => this.onData.emit(instance),
onAction: (type, definition, block) =>
this.onAction.emit({
type,
definition,
block,
}),
onSubmit: (instance, language, locale, namespace) =>
this.onSubmit.emit({
instance,
language,
locale,
namespace,
}),
onComplete: (instance, id) =>
this.onComplete.emit({
instance,
id,
}),
onEdit: (type, id) => {
if (this.builderController) {
switch (type) {
case "prologue":
this.builderController.edit("prologue");
break;
case "epilogue":
this.builderController.edit("epilogue", id);
break;
case "block":
if (id) {
this.builderController.edit("node", id);
}
break;
}
}
this.onEdit.emit({
type,
id,
});
},
onReload: this.onReload,
onPause: this.onPause,
onTouch: () => this.onTouch.emit(),
onDestroy: () => this.onDestroy.emit(),
});
});
}
ngOnDestroy() {
if (this.runnerController) {
this.runnerController.destroy();
this.runnerController = this.builderController = undefined;
}
}
}
TripettoAutoscrollComponent.ɵfac = i0.ɵɵngDeclareFactory({
minVersion: "12.0.0",
version: "15.2.1",
ngImport: i0,
type: TripettoAutoscrollComponent,
deps: [{ token: i0.ElementRef }, { token: i0.NgZone }],
target: i0.ɵɵFactoryTarget.Component,
});
TripettoAutoscrollComponent.ɵcmp = i0.ɵɵngDeclareComponent({
minVersion: "14.0.0",
version: "15.2.1",
type: TripettoAutoscrollComponent,
selector: "tripetto-runner-autoscroll",
inputs: {
definition: "definition",
view: "view",
styles: "styles",
l10n: "l10n",
display: "display",
snapshot: "snapshot",
persistent: "persistent",
license: "license",
removeBranding: "removeBranding",
attachments: "attachments",
className: "className",
customStyle: "customStyle",
customCSS: "customCSS",
language: "language",
locale: "locale",
translations: "translations",
onReload: "onReload",
onPause: "onPause",
builder: "builder",
},
outputs: {
onReady: "onReady",
onChange: "onChange",
onImport: "onImport",
onData: "onData",
onAction: "onAction",
onSubmit: "onSubmit",
onComplete: "onComplete",
onEdit: "onEdit",
onTouch: "onTouch",
onDestroy: "onDestroy",
},
ngImport: i0,
template: "",
isInline: true,
changeDetection: i0.ChangeDetectionStrategy.OnPush,
});
i0.ɵɵngDeclareClassMetadata({
minVersion: "12.0.0",
version: "15.2.1",
ngImport: i0,
type: TripettoAutoscrollComponent,
decorators: [
{
type: Component,
args: [
{
selector: "tripetto-runner-autoscroll",
template: "",
changeDetection: ChangeDetectionStrategy.OnPush,
},
],
},
],
ctorParameters: function () {
return [{ type: i0.ElementRef }, { type: i0.NgZone }];
},
propDecorators: {
definition: [
{
type: Input,
},
],
view: [
{
type: Input,
},
],
styles: [
{
type: Input,
},
],
l10n: [
{
type: Input,
},
],
display: [
{
type: Input,
},
],
snapshot: [
{
type: Input,
},
],
persistent: [
{
type: Input,
},
],
license: [
{
type: Input,
},
],
removeBranding: [
{
type: Input,
},
],
attachments: [
{
type: Input,
},
],
className: [
{
type: Input,
},
],
customStyle: [
{
type: Input,
},
],
customCSS: [
{
type: Input,
},
],
language: [
{
type: Input,
},
],
locale: [
{
type: Input,
},
],
translations: [
{
type: Input,
},
],
onReady: [
{
type: Output,
},
],
onChange: [
{
type: Output,
},
],
onImport: [
{
type: Output,
},
],
onData: [
{
type: Output,
},
],
onAction: [
{
type: Output,
},
],
onSubmit: [
{
type: Output,
},
],
onComplete: [
{
type: Output,
},
],
onEdit: [
{
type: Output,
},
],
onTouch: [
{
type: Output,
},
],
onDestroy: [
{
type: Output,
},
],
onReload: [
{
type: Input,
},
],
onPause: [
{
type: Input,
},
],
builder: [
{
type: Input,
},
],
},
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmd1bGFyL3Byb2plY3RzL3J1bm5lci9zcmMvbGliL3J1bm5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUE2QixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkksT0FBTyxFQUErRCxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRyxPQUFPLEVBT0gsR0FBRyxHQUNOLE1BQU0sNkJBQTZCLENBQUM7O0FBU3JDLE1BQU0sT0FBTywyQkFBMkI7SUFRcEMsb0RBQW9EO0lBQ3BELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN2RSxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLElBQWEsVUFBVSxDQUFDLFVBQXNFO1FBQzFGLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLFVBQVUsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDN0IsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ3ZCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDdEIsSUFBSSxLQUFLLEVBQUU7NEJBQ1AsSUFBSSxDQUFDLGdCQUFpQixDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7eUJBQzdDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO3FCQUFNLElBQUksVUFBVSxFQUFFO29CQUNuQixJQUFJLENBQUMsZ0JBQWlCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztpQkFDNUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7SUFDeEMsQ0FBQztJQUVELDZDQUE2QztJQUM3QyxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUM7SUFDckUsQ0FBQztJQUVELDZDQUE2QztJQUM3QyxJQUFhLElBQUksQ0FBQyxJQUFrQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLGdCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQy9ELENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsSUFBYSxNQUFNLENBQUMsTUFBOEU7UUFDOUYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQzdCLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ2xCLElBQUksS0FBSyxFQUFFOzRCQUNQLElBQUksQ0FBQyxnQkFBaUIsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO3lCQUN6QztvQkFDTCxDQUFDLENBQUMsQ0FBQztpQkFDTjtxQkFBTSxJQUFJLE1BQU0sRUFBRTtvQkFDZixJQUFJLENBQUMsZ0JBQWlCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztpQkFDMUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDM0QsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxJQUFhLElBQUksQ0FBQyxJQUFvRDtRQUNsRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDN0IsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDaEIsSUFBSSxLQUFLLEVBQUU7NEJBQ1AsSUFBSSxDQUFDLGdCQUFpQixDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7eUJBQ3ZDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO3FCQUFNLElBQUksSUFBSSxFQUFFO29CQUNiLElBQUksQ0FBQyxnQkFBaUIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2lCQUN0QztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQXlHRCw4RUFBOEU7SUFDOUUsSUFBYSxPQUFPLENBQ2hCLEdBT2U7UUFFZixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztTQUN0QzthQUFNO1lBQ0gsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUErQyxFQUFFLEVBQUU7Z0JBQzVELE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRTtvQkFDakIsSUFBSSxPQUFPLEdBQUcsS0FBSyxVQUFVLEVBQUU7d0JBQzNCLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDO3dCQUV0QixJQUFJLE9BQU8sRUFBRTs0QkFDVCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7eUJBQ3RDO3FCQUNKO3lCQUFNLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTt3QkFDdkIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNsQztvQkFFRCxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkMsQ0FBQyxDQUFDO2dCQUVGLE9BQU8sRUFBRSxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7Z0JBRXBDLFVBQVUsQ0FBQyxJQUFJLENBS2IsVUFBVSxFQUFFLGFBQWEsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUN6QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO3FCQUM3RDtnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFFSCxVQUFVLENBQUMsSUFBSSxDQUNYLFFBQVEsRUFDUixhQUFhLEVBQ2IsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDVixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUNKLENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sQ0FDSCxJQUFJLENBQUMsaUJBQWlCLElBQUk7WUFDdEIsVUFBVSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7U0FDckMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELFlBQ1ksT0FBbUIsRUFDbkIsSUFBWTtRQURaLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQTFIeEIsd0NBQXdDO1FBQzlCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRWpELGtEQUFrRDtRQUN4QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUVsRCwyREFBMkQ7UUFDakQsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFFbEQsc0RBQXNEO1FBQzVDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRWhELDZFQUE2RTtRQUNuRSxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBVWpDLENBQUM7UUFFTCxnRUFBZ0U7UUFDdEQsYUFBUSxHQUFHLElBQUksWUFBWSxFQUtqQyxDQUFDO1FBRUwsMEVBQTBFO1FBQ2hFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFHbkMsQ0FBQztRQUVMLDZFQUE2RTtRQUNuRSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBRy9CLENBQUM7UUFFTCxtRkFBbUY7UUFDekUsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFN0MsNENBQTRDO1FBQ2xDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBMEU1QyxDQUFDO0lBRUosUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sR0FBRyxDQUFDO2dCQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO2dCQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2xELFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNwRCxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDcEQsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2hELFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ2YsSUFBSTtvQkFDSixVQUFVO29CQUNWLEtBQUs7aUJBQ1IsQ0FBQztnQkFDTixRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDZixRQUFRO29CQUNSLFFBQVE7b0JBQ1IsTUFBTTtvQkFDTixTQUFTO2lCQUNaLENBQUM7Z0JBQ04sVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO29CQUNqQixRQUFRO29CQUNSLEVBQUU7aUJBQ0wsQ0FBQztnQkFDTixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0JBQ2pCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO3dCQUN4QixRQUFRLElBQUksRUFBRTs0QkFDVixLQUFLLFVBQVU7Z0NBQ1gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQ0FDeEMsTUFBTTs0QkFDVixLQUFLLFVBQVU7Z0NBQ1gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0NBQzVDLE1BQU07NEJBQ1YsS0FBSyxPQUFPO2dDQUNSLElBQUksRUFBRSxFQUFFO29DQUNKLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lDQUMzQztnQ0FDRCxNQUFNO3lCQUNiO3FCQUNKO29CQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO3dCQUNiLElBQUk7d0JBQ0osRUFBRTtxQkFDTCxDQUFDLENBQUM7Z0JBQ1AsQ0FBQztnQkFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUNsQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7YUFDekMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztTQUM5RDtJQUNMLENBQUM7O3dIQXJXUSwyQkFBMkI7NEdBQTNCLDJCQUEyQiwrdEJBSDFCLEVBQUU7MkZBR0gsMkJBQTJCO2tCQUx2QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSw0QkFBNEI7b0JBQ3RDLFFBQVEsRUFBRSxFQUFFO29CQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNsRDtzSEFvQmdCLFVBQVU7c0JBQXRCLEtBQUs7Z0JBMEJPLElBQUk7c0JBQWhCLEtBQUs7Z0JBa0JPLE1BQU07c0JBQWxCLEtBQUs7Z0JBMEJPLElBQUk7c0JBQWhCLEtBQUs7Z0JBcUJHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsU0FBUztzQkFBakIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQVVJLE9BQU87c0JBQWhCLE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFHRyxRQUFRO3NCQUFqQixNQUFNO2dCQUdHLE1BQU07c0JBQWYsTUFBTTtnQkFHRyxRQUFRO3NCQUFqQixNQUFNO2dCQWFHLFFBQVE7c0JBQWpCLE1BQU07Z0JBUUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBTUcsT0FBTztzQkFBaEIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNO2dCQUdFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdPLE9BQU87c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSURlZmluaXRpb24sIElIb29rUGF5bG9hZCwgSVNuYXBzaG90LCBJbnN0YW5jZSwgTDEwbiwgVEwxMG4sIGlzUHJvbWlzZSB9IGZyb20gXCJAdHJpcGV0dG8vcnVubmVyXCI7XG5pbXBvcnQge1xuICAgIElBdXRvc2Nyb2xsUnVubmVyLFxuICAgIElBdXRvc2Nyb2xsU25hcHNob3QsXG4gICAgSUF1dG9zY3JvbGxTdHlsZXMsXG4gICAgSUJ1aWxkZXJJbnN0YW5jZSxcbiAgICBUQXV0b3Njcm9sbERpc3BsYXksXG4gICAgVEF1dG9zY3JvbGxQYXVzZSxcbiAgICBydW4sXG59IGZyb20gXCJAdHJpcGV0dG8vcnVubmVyLWF1dG9zY3JvbGxcIjtcbmltcG9ydCB7IElSdW5uZXJBdHRhY2htZW50cywgVFJ1bm5lclByZXZpZXdEYXRhLCBUUnVubmVyVmlld3MgfSBmcm9tIFwiQHRyaXBldHRvL3J1bm5lci1yZWFjdC1ob29rXCI7XG5pbXBvcnQgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSBcInJlYWN0XCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInRyaXBldHRvLXJ1bm5lci1hdXRvc2Nyb2xsXCIsXG4gICAgdGVtcGxhdGU6IFwiXCIsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRyaXBldHRvQXV0b3Njcm9sbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJ1bm5lckNvbnRyb2xsZXI/OiBJQXV0b3Njcm9sbFJ1bm5lcjtcbiAgICBwcml2YXRlIGJ1aWxkZXJDb250cm9sbGVyPzogSUJ1aWxkZXJJbnN0YW5jZTtcbiAgICBwcml2YXRlIGluaXRpYWxEZWZpbml0aW9uPzogSURlZmluaXRpb24gfCBQcm9taXNlPElEZWZpbml0aW9uIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGluaXRpYWxWaWV3PzogVFJ1bm5lclZpZXdzIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgaW5pdGlhbFN0eWxlcz86IElBdXRvc2Nyb2xsU3R5bGVzIHwgUHJvbWlzZTxJQXV0b3Njcm9sbFN0eWxlcyB8IHVuZGVmaW5lZD47XG4gICAgcHJpdmF0ZSBpbml0aWFsTDEwbj86IFRMMTBuIHwgUHJvbWlzZTxUTDEwbiB8IHVuZGVmaW5lZD47XG5cbiAgICAvKiogUmV0cmlldmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBydW5uZXIgaW5zdGFuY2UuICovXG4gICAgZ2V0IGNvbnRyb2xsZXIoKTogSUF1dG9zY3JvbGxSdW5uZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXJDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBSZXRyaWV2ZXMgdGhlIHJ1bm5pbmcgZGVmaW5pdGlvbi4gKi9cbiAgICBnZXQgZGVmaW5pdGlvbigpOiBJRGVmaW5pdGlvbiB8IFByb21pc2U8SURlZmluaXRpb24gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyQ29udHJvbGxlcj8uZGVmaW5pdGlvbiB8fCB0aGlzLmluaXRpYWxEZWZpbml0aW9uO1xuICAgIH1cblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGRlZmluaXRpb24gdG8gcnVuLiAqL1xuICAgIEBJbnB1dCgpIHNldCBkZWZpbml0aW9uKGRlZmluaXRpb246IElEZWZpbml0aW9uIHwgUHJvbWlzZTxJRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlciAmJiBkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb21pc2UoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbi50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS5kZWZpbml0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLmwxMG4gPSBkZWZpbml0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxEZWZpbml0aW9uID0gZGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICAvKiogUmV0cmlldmVzIHRoZSB2aWV3IG1vZGUgb2YgdGhlIHJ1bm5lci4gKi9cbiAgICBnZXQgdmlldygpOiBUUnVubmVyVmlld3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXJDb250cm9sbGVyPy52aWV3IHx8IHRoaXMuaW5pdGlhbFZpZXcgfHwgXCJsaXZlXCI7XG4gICAgfVxuXG4gICAgLyoqIFNwZWNpZmllcyB0aGUgdmlldyBtb2RlIG9mIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgc2V0IHZpZXcodmlldzogVFJ1bm5lclZpZXdzKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS52aWV3ID0gdmlldztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxWaWV3ID0gdmlldztcbiAgICB9XG5cbiAgICAvKiogUmV0cmlldmVzIHRoZSBzdHlsZXMgKGNvbG9ycywgZm9udCwgc2l6ZSwgZXRjLikgZm9yIHRoZSBydW5uZXIuICovXG4gICAgZ2V0IHN0eWxlcygpOiBJQXV0b3Njcm9sbFN0eWxlcyB8IFByb21pc2U8SUF1dG9zY3JvbGxTdHlsZXMgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyQ29udHJvbGxlcj8uc3R5bGVzIHx8IHRoaXMuaW5pdGlhbFN0eWxlcztcbiAgICB9XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBzdHlsZXMgKGNvbG9ycywgZm9udCwgc2l6ZSwgZXRjLikgZm9yIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgc2V0IHN0eWxlcyhzdHlsZXM6IElBdXRvc2Nyb2xsU3R5bGVzIHwgUHJvbWlzZTxJQXV0b3Njcm9sbFN0eWxlcyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHN0eWxlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLnN0eWxlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLnN0eWxlcyA9IHN0eWxlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsU3R5bGVzID0gc3R5bGVzO1xuICAgIH1cblxuICAgIC8qKiBSZXRyaWV2ZXMgdGhlIGxvY2FsaXphdGlvbiAobG9jYWxlIGFuZCB0cmFuc2xhdGlvbikgaW5mb3JtYXRpb24uICovXG4gICAgZ2V0IGwxMG4oKTogVEwxMG4gfCBQcm9taXNlPFRMMTBuIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bm5lckNvbnRyb2xsZXI/LmwxMG4gfHwgdGhpcy5pbml0aWFsTDEwbjtcbiAgICB9XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBsb2NhbGl6YXRpb24gKGxvY2FsZSBhbmQgdHJhbnNsYXRpb24pIGluZm9ybWF0aW9uLiAqL1xuICAgIEBJbnB1dCgpIHNldCBsMTBuKGwxMG46IFRMMTBuIHwgUHJvbWlzZTxUTDEwbiB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKGwxMG4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGwxMG4udGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlciEubDEwbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGwxMG4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS5sMTBuID0gbDEwbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsTDEwbiA9IGwxMG47XG4gICAgfVxuXG4gICAgLyoqIFNwZWNpZmllcyB0aGUgZGlzcGxheSBtb2RlIG9mIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgZGlzcGxheT86IFRBdXRvc2Nyb2xsRGlzcGxheTtcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIHNuYXBzaG90IHRoYXQgc2hvdWxkIGJlIHJlc3RvcmVkLiAqL1xuICAgIEBJbnB1dCgpIHNuYXBzaG90PzogSVNuYXBzaG90PElBdXRvc2Nyb2xsU25hcHNob3Q+IHwgUHJvbWlzZTxJU25hcHNob3Q8SUF1dG9zY3JvbGxTbmFwc2hvdD4gfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqIFRyeSB0byBzdG9yZSBzZXNzaW9ucyBpbiB0aGUgbG9jYWwgc3RvcmUgdG8gcHJlc2VydmUgcGVyc2lzdGVuY3kgb24gbmF2aWdhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHBhZ2VzIHRoYXQgaG9zdCB0aGUgcnVubmVyLiAqL1xuICAgIEBJbnB1dCgpIHBlcnNpc3RlbnQ/OiBib29sZWFuO1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGxpY2Vuc2UgY29kZSBmb3IgdGhlIHJ1bm5lci4gKi9cbiAgICBASW5wdXQoKSBsaWNlbnNlPzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqIFJlbW92ZXMgYWxsIFRyaXBldHRvIGJyYW5kaW5nIHdoZW4gYSB2YWxpZCBsaWNlbnNlIGlzIHN1cHBsaWVkLiAqL1xuICAgIEBJbnB1dCgpIHJlbW92ZUJyYW5kaW5nPzogYm9vbGVhbjtcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGF0dGFjaG1lbnRzIGhhbmRsZXIuICovXG4gICAgQElucHV0KCkgYXR0YWNobWVudHM/OiBJUnVubmVyQXR0YWNobWVudHM7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgY3VzdG9tIGNsYXNzIG5hbWUgZm9yIHRoZSBIVE1MIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgcnVubmVyLiAqL1xuICAgIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGlubGluZSBzdHlsZSBmb3IgdGhlIEhUTUwgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgY3VzdG9tU3R5bGU/OiBDU1NQcm9wZXJ0aWVzO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGN1c3RvbSBDU1MgcnVsZXMuXG4gICAgICogVG8gc3BlY2lmeSBydWxlcyBmb3IgYSBzcGVjaWZpYyBibG9jaywgdXNlIHRoaXMgc2VsZWN0b3I6IFtkYXRhLWJsb2NrPVwiPGJsb2NrIGlkZW50aWZpZXI+XCJdIHsgLi4uIH1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBjdXN0b21DU1M/OiBzdHJpbmc7XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgbGFuZ3VhZ2UgKHdoZW4gbm8gbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkIGluIHRoZSBkZWZpbml0aW9uKS4gKi9cbiAgICBASW5wdXQoKSBsYW5ndWFnZT86IHN0cmluZztcblxuICAgIC8qKiBQcm92aWRlcyBsb2NhbGUgaW5mb3JtYXRpb24uICovXG4gICAgQElucHV0KCkgbG9jYWxlPzogTDEwbi5JTG9jYWxlIHwgKChsb2NhbGU6IHN0cmluZykgPT4gTDEwbi5JTG9jYWxlIHwgUHJvbWlzZTxMMTBuLklMb2NhbGUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkKTtcblxuICAgIC8qKiBQcm92aWRlcyB0cmFuc2xhdGlvbnMuICovXG4gICAgQElucHV0KCkgdHJhbnNsYXRpb25zPzpcbiAgICAgICAgfCBMMTBuLlRUcmFuc2xhdGlvblxuICAgICAgICB8IEwxMG4uVFRyYW5zbGF0aW9uW11cbiAgICAgICAgfCAoKFxuICAgICAgICAgICAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgICAgICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHZlcnNpb246IHN0cmluZ1xuICAgICAgICAgICkgPT4gTDEwbi5UVHJhbnNsYXRpb24gfCBMMTBuLlRUcmFuc2xhdGlvbltdIHwgUHJvbWlzZTxMMTBuLlRUcmFuc2xhdGlvbiB8IEwxMG4uVFRyYW5zbGF0aW9uW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkKTtcblxuICAgIC8qKiBJbnZva2VkIHdoZW4gdGhlIHJ1bm5lciBpcyByZWFkeS4gKi9cbiAgICBAT3V0cHV0KCkgb25SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgcHJvY2Vzc2VkIGEgY2hhbmdlLiAqL1xuICAgIEBPdXRwdXQoKSBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIGRhdGEgY2FuIGJlIGltcG9ydGVkIGludG8gdGhlIGluc3RhbmNlLiAqL1xuICAgIEBPdXRwdXQoKSBvbkltcG9ydCA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBkYXRhIGluIHRoZSBydW5uZXIgaXMgY2hhbmdlZC4gKi9cbiAgICBAT3V0cHV0KCkgb25EYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxJbnN0YW5jZT4oKTtcblxuICAgIC8qKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24uICovXG4gICAgQE91dHB1dCgpIG9uQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6IFwic3RhcnRcIiB8IFwic3RhZ2VcIiB8IFwidW5zdGFnZVwiIHwgXCJmb2N1c1wiIHwgXCJibHVyXCIgfCBcInBhdXNlXCIgfCBcImNvbXBsZXRlXCI7XG4gICAgICAgIHJlYWRvbmx5IGRlZmluaXRpb246IHtcbiAgICAgICAgICAgIHJlYWRvbmx5IGZpbmdlcnByaW50OiBzdHJpbmc7XG4gICAgICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRvbmx5IGJsb2NrPzoge1xuICAgICAgICAgICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9PigpO1xuXG4gICAgLyoqIEludm9rZWQgd2hlbiB0aGUgcnVubmVyIGlzIGFib3V0IHRvIGVuZCBhbmQgc3VibWl0cyBkYXRhLiAqL1xuICAgIEBPdXRwdXQoKSBvblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgICAgICByZWFkb25seSBpbnN0YW5jZTogSW5zdGFuY2U7XG4gICAgICAgIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGxvY2FsZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9PigpO1xuXG4gICAgLyoqIEludm9rZWQgd2hlbiB0aGUgcnVubmVyIGlzIGNvbXBsZXRlZCAoYWZ0ZXIgdGhlIGRhdGEgaXMgc3VibWl0dGVkKS4gKi9cbiAgICBAT3V0cHV0KCkgb25Db21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgICAgICByZWFkb25seSBpbnN0YW5jZTogSW5zdGFuY2U7XG4gICAgICAgIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAgIH0+KCk7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIHdoZW4gYW4gZWRpdCBhY3Rpb24gaXMgcmVxdWVzdGVkLiAqL1xuICAgIEBPdXRwdXQoKSBvbkVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICAgICAgcmVhZG9ubHkgdHlwZTogXCJwcm9sb2d1ZVwiIHwgXCJlcGlsb2d1ZVwiIHwgXCJzdHlsZXNcIiB8IFwibDEwblwiIHwgXCJibG9ja1wiO1xuICAgICAgICByZWFkb25seSBpZD86IHN0cmluZztcbiAgICB9PigpO1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBydW5uZXIgaXMgXCJ0b3VjaGVkXCIgYnkgYSB1c2VyLiAqL1xuICAgIEBPdXRwdXQoKSBvblRvdWNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEludm9rZWQgd2hlbiB0aGUgcnVubmVyIGlzIGRlc3Ryb3llZC4gKi9cbiAgICBAT3V0cHV0KCkgb25EZXN0cm95ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBydW5uZXIgd2FudHMgdG8gcmVsb2FkIHRoZSBkZWZpbml0aW9uLiAqL1xuICAgIEBJbnB1dCgpIG9uUmVsb2FkPzogKCkgPT4gSURlZmluaXRpb24gfCBQcm9taXNlPElEZWZpbml0aW9uPjtcblxuICAgIC8qKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiBvciByZWNpcGUgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIHJ1bm5lciB3YW50cyB0byBwYXVzZS4gKi9cbiAgICBASW5wdXQoKSBvblBhdXNlPzogVEF1dG9zY3JvbGxQYXVzZTtcblxuICAgIC8qKiBSZWZlcmVuY2UgdG8gYSBidWlsZGVyIGluc3RhbmNlIHRvIGVuYWJsZSBsaXZlIHByZXZpZXcgZm9yIHRoZSBidWlsZGVyLiAqL1xuICAgIEBJbnB1dCgpIHNldCBidWlsZGVyKFxuICAgICAgICByZWY6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgIHJlYWRvbmx5IGNvbnRyb2xsZXI6IElCdWlsZGVySW5zdGFuY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwgKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlYWRvbmx5IGNvbnRyb2xsZXI6IElCdWlsZGVySW5zdGFuY2U7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB8IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgICBpZiAoIXJlZikge1xuICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlOiAoY29udHJvbGxlcjogSUJ1aWxkZXJJbnN0YW5jZSkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZuQXdhaXQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSByZWYoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShidWlsZGVyLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZi5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZWYuY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm5Bd2FpdCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGZuQXdhaXQoKTtcbiAgICAgICAgICAgIH0pLnRoZW4oKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyID0gY29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuaG9vazxcbiAgICAgICAgICAgICAgICAgICAgXCJPbkNoYW5nZVwiLFxuICAgICAgICAgICAgICAgICAgICBJSG9va1BheWxvYWQ8XCJPbkNoYW5nZVwiPiAmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5IGRlZmluaXRpb246IElEZWZpbml0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPihcIk9uQ2hhbmdlXCIsIFwic3luY2hyb25vdXNcIiwgKGNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJ1bm5lckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlci5kZWZpbml0aW9uID0gY2hhbmdlRXZlbnQuZGVmaW5pdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5ob29rPFwiT25FZGl0XCIsIElIb29rUGF5bG9hZDxcIk9uRWRpdFwiPiAmIHsgcmVhZG9ubHkgZGF0YTogVFJ1bm5lclByZXZpZXdEYXRhIH0+KFxuICAgICAgICAgICAgICAgICAgICBcIk9uRWRpdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN5bmNocm9ub3VzXCIsXG4gICAgICAgICAgICAgICAgICAgIChlZGl0RXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlcj8uZG9QcmV2aWV3KGVkaXRFdmVudC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBidWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29udHJvbGxlciAmJiB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogdGhpcy5idWlsZGVyQ29udHJvbGxlcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZVxuICAgICkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyID0gYXdhaXQgcnVuKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiB0aGlzLmRlZmluaXRpb24sXG4gICAgICAgICAgICAgICAgdmlldzogdGhpcy5pbml0aWFsVmlldyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiB0aGlzLmRpc3BsYXksXG4gICAgICAgICAgICAgICAgc25hcHNob3Q6IHRoaXMuc25hcHNob3QsXG4gICAgICAgICAgICAgICAgc3R5bGVzOiB0aGlzLnN0eWxlcyxcbiAgICAgICAgICAgICAgICBwZXJzaXN0ZW50OiB0aGlzLnBlcnNpc3RlbnQsXG4gICAgICAgICAgICAgICAgbGljZW5zZTogdGhpcy5saWNlbnNlLFxuICAgICAgICAgICAgICAgIHJlbW92ZUJyYW5kaW5nOiB0aGlzLnJlbW92ZUJyYW5kaW5nLFxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLmF0dGFjaG1lbnRzLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgY3VzdG9tU3R5bGU6IHRoaXMuY3VzdG9tU3R5bGUsXG4gICAgICAgICAgICAgICAgY3VzdG9tQ1NTOiB0aGlzLmN1c3RvbUNTUyxcbiAgICAgICAgICAgICAgICBsMTBuOiB0aGlzLmwxMG4sXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IHRoaXMudHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICAgIG9uUmVhZHk6IChpbnN0YW5jZSkgPT4gdGhpcy5vblJlYWR5LmVtaXQoaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAoaW5zdGFuY2UpID0+IHRoaXMub25DaGFuZ2UuZW1pdChpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgb25JbXBvcnQ6IChpbnN0YW5jZSkgPT4gdGhpcy5vbkltcG9ydC5lbWl0KGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBvbkRhdGE6IChpbnN0YW5jZSkgPT4gdGhpcy5vbkRhdGEuZW1pdChpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgb25BY3Rpb246ICh0eXBlLCBkZWZpbml0aW9uLCBibG9jaykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFjdGlvbi5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG9uU3VibWl0OiAoaW5zdGFuY2UsIGxhbmd1YWdlLCBsb2NhbGUsIG5hbWVzcGFjZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN1Ym1pdC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6IChpbnN0YW5jZSwgaWQpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Db21wbGV0ZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG9uRWRpdDogKHR5cGUsIGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkZXJDb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHJvbG9ndWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29udHJvbGxlci5lZGl0KFwicHJvbG9ndWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlcGlsb2d1ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyLmVkaXQoXCJlcGlsb2d1ZVwiLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJibG9ja1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbnRyb2xsZXIuZWRpdChcIm5vZGVcIiwgaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVkaXQuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25SZWxvYWQ6IHRoaXMub25SZWxvYWQsXG4gICAgICAgICAgICAgICAgb25QYXVzZTogdGhpcy5vblBhdXNlLFxuICAgICAgICAgICAgICAgIG9uVG91Y2g6ICgpID0+IHRoaXMub25Ub3VjaC5lbWl0KCksXG4gICAgICAgICAgICAgICAgb25EZXN0cm95OiAoKSA9PiB0aGlzLm9uRGVzdHJveS5lbWl0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIgPSB0aGlzLmJ1aWxkZXJDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19