UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

563 lines 63 kB
/** * Copyright (c) 2025 Visa, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { Directive, HostBinding, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class FlexDirective { get hostClasses() { return [ this.vFlex ? (this.vFlexCol ? 'v-flex' : 'v-flex v-flex-row') : null, this.vFlexInline ? 'v-flex-inline' : null, this.vFlexCol ? 'v-flex-col' : null, this.vFlexColReverse ? 'v-flex-col-reverse' : null, this.vFlexRow ? 'v-flex-row' : null, this.vFlexRowReverse ? 'v-flex-row-reverse' : null, this.vFlexWrap ? 'v-flex-wrap' : null, this.vFlexWrapReverse ? 'v-flex-wrap-reverse' : null, this.vFlexNoWrap ? 'v-flex-nowrap' : null, this.vFlexGrow ? 'v-flex-grow' : null, this.vFlexGrow0 ? 'v-flex-grow-0' : null, this.vFlexShrink ? 'v-flex-shrink' : null, this.vFlexShrink0 ? 'v-flex-shrink-0' : null, this.vAlignContentCenter ? 'v-align-content-center' : null, this.vAlignContentStart ? 'v-align-content-start' : null, this.vAlignContentEnd ? 'v-align-content-end' : null, this.vAlignContentBetween ? 'v-align-content-between' : null, this.vAlignContentAround ? 'v-align-content-around' : null, this.vAlignContentEvenly ? 'v-align-content-evenly' : null, this.vAlignItemsStart ? 'v-align-items-start' : null, this.vAlignItemsEnd ? 'v-align-items-end' : null, this.vAlignItemsCenter ? 'v-align-items-center' : null, this.vAlignItemsBaseline ? 'v-align-items-baseline' : null, this.vAlignItemsStretch ? 'v-align-items-stretch' : null, this.vAlignSelfStart ? 'v-align-self-start' : null, this.vAlignSelfEnd ? 'v-align-self-end' : null, this.vAlignSelfCenter ? 'v-align-self-center' : null, this.vAlignSelfBaseline ? 'v-align-self-baseline' : null, this.vAlignSelfStretch ? 'v-align-self-stretch' : null, this.vAlignSelfAuto ? 'v-align-self-auto' : null, this.vJustifyContentStart ? 'v-justify-content-start' : null, this.vJustifyContentEnd ? 'v-justify-content-end' : null, this.vJustifyContentCenter ? 'v-justify-content-center' : null, this.vJustifyContentBetween ? 'v-justify-content-between' : null, this.vJustifyContentAround ? 'v-justify-content-around' : null, this.vJustifyContentEvenly ? 'v-justify-content-evenly' : null, this.vGap ? `v-flex v-gap-${this.vGap}` : null, // vGap="4" this.vColGap ? `v-col-gap-${this.vColGap}` : null, // vGap="4" this.vRowGap ? `v-row-gap-${this.vRowGap}` : null // vGap="4" ].join(' '); } /** * Sets property <code>display: flex</code>. <br> * This property is also a selector and can be used by itself on a flex element. */ get vFlex() { return this._vFlex; } set vFlex(value) { this._vFlex = coerceBooleanProperty(value); } /** * Sets property <code>display: inline-flex</code>. <br> * This property is also a selector and can be used by itself on a flex element. */ get vFlexInline() { return this._vFlexInline; } set vFlexInline(value) { this._vFlexInline = coerceBooleanProperty(value); } /** * Sets property <code>flex-direction: column</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexCol() { return this._vFlexCol; } set vFlexCol(value) { this._vFlexCol = coerceBooleanProperty(value); } /** * Sets property <code>flex-direction: column-reverse</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexColReverse() { return this._vFlexColReverse; } set vFlexColReverse(value) { this._vFlexColReverse = coerceBooleanProperty(value); } /** * Sets property <code>flex-direction: row</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexRow() { return this._vFlexRow; } set vFlexRow(value) { this._vFlexRow = coerceBooleanProperty(value); } /** * Sets property <code>flex-direction: row-reverse</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexRowReverse() { return this._vFlexRowReverse; } set vFlexRowReverse(value) { this._vFlexRowReverse = coerceBooleanProperty(value); } /** * Sets property <code>flex-wrap: wrap</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexWrap() { return this._vFlexWrap; } set vFlexWrap(value) { this._vFlexWrap = coerceBooleanProperty(value); } /** * Sets property <code>flex-wrap: wrap-reverse</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexWrapReverse() { return this._vFlexWrapReverse; } set vFlexWrapReverse(value) { this._vFlexWrapReverse = coerceBooleanProperty(value); } /** * Sets property <code>flex-wrap: no-wrap</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexNoWrap() { return this._vFlexNoWrap; } set vFlexNoWrap(value) { this._vFlexNoWrap = coerceBooleanProperty(value); } /** * Sets property <code>flex-basis: &lt;value&gt;</code>. <br> * Accepts a string that should be in the form of a percentage or CSS unit. <br /> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexBasis() { return this._vFlexBasis; } set vFlexBasis(value) { this._vFlexBasis = value; } get hostFlexBasis() { return this.vFlexBasis ? this.vFlexBasis : null; } /** * Sets property <code>flex-grow: 1</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexGrow() { return this._vFlexGrow; } set vFlexGrow(value) { this._vFlexGrow = coerceBooleanProperty(value); } /** * Sets property <code>flex-grow: 0</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexGrow0() { return this._vFlexGrow0; } set vFlexGrow0(value) { this._vFlexGrow0 = coerceBooleanProperty(value); } /** * Sets property <code>flex-shrink: 1</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexShrink() { return this._vFlexShrink; } set vFlexShrink(value) { this._vFlexShrink = coerceBooleanProperty(value); } /** * Sets property <code>flex-shrink: 0</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexShrink0() { return this._vFlexShrink0; } set vFlexShrink0(value) { this._vFlexShrink0 = coerceBooleanProperty(value); } /** * Sets property <code>align-content: center</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentCenter() { return this._vAlignContentCenter; } set vAlignContentCenter(value) { this._vAlignContentCenter = coerceBooleanProperty(value); } /** * Sets property <code>align-content: start</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentStart() { return this._vAlignContentStart; } set vAlignContentStart(value) { this._vAlignContentStart = coerceBooleanProperty(value); } /** * Sets property <code>align-content: end</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentEnd() { return this._vAlignContentEnd; } set vAlignContentEnd(value) { this._vAlignContentEnd = coerceBooleanProperty(value); } /** * Sets property <code>align-content: space-between</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentBetween() { return this._vAlignContentBetween; } set vAlignContentBetween(value) { this._vAlignContentBetween = coerceBooleanProperty(value); } /** * Sets property <code>align-content: space-around</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentAround() { return this._vAlignContentAround; } set vAlignContentAround(value) { this._vAlignContentAround = coerceBooleanProperty(value); } /** * Sets property <code>align-content: space-evenly</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentEvenly() { return this._vAlignContentEvenly; } set vAlignContentEvenly(value) { this._vAlignContentEvenly = coerceBooleanProperty(value); } /** * Sets property <code>align-content: center</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsCenter() { return this._vAlignItemsCenter; } set vAlignItemsCenter(value) { this._vAlignItemsCenter = coerceBooleanProperty(value); } /** * Sets property <code>align-content: start</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsStart() { return this._vAlignItemsStart; } set vAlignItemsStart(value) { this._vAlignItemsStart = coerceBooleanProperty(value); } /** * Sets property <code>align-content: end</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsEnd() { return this._vAlignItemsEnd; } set vAlignItemsEnd(value) { this._vAlignItemsEnd = coerceBooleanProperty(value); } /** * Sets property <code>align-items: baseline</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsBaseline() { return this._vAlignItemsBaseline; } set vAlignItemsBaseline(value) { this._vAlignItemsBaseline = coerceBooleanProperty(value); } /** * Sets property <code>align-items: stretch</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsStretch() { return this._vAlignItemsStretch; } set vAlignItemsStretch(value) { this._vAlignItemsStretch = coerceBooleanProperty(value); } /** * Sets property <code>align-self: center</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfCenter() { return this._vAlignSelfCenter; } set vAlignSelfCenter(value) { this._vAlignSelfCenter = coerceBooleanProperty(value); } /** * Sets property <code>align-self: start</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfStart() { return this._vAlignSelfStart; } set vAlignSelfStart(value) { this._vAlignSelfStart = coerceBooleanProperty(value); } /** * Sets property <code>align-self: end</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfEnd() { return this._vAlignSelfEnd; } set vAlignSelfEnd(value) { this._vAlignSelfEnd = coerceBooleanProperty(value); } /** * Sets property <code>align-self: baseline</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfBaseline() { return this._vAlignSelfBaseline; } set vAlignSelfBaseline(value) { this._vAlignSelfBaseline = coerceBooleanProperty(value); } /** * Sets property <code>align-self: stretch</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfStretch() { return this._vAlignSelfStretch; } set vAlignSelfStretch(value) { this._vAlignSelfStretch = coerceBooleanProperty(value); } /** * Sets property <code>align-self: auto</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfAuto() { return this._vAlignSelfAuto; } set vAlignSelfAuto(value) { this._vAlignSelfAuto = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: center</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentCenter() { return this._vJustifyContentCenter; } set vJustifyContentCenter(value) { this._vJustifyContentCenter = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: start</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentStart() { return this._vJustifyContentStart; } set vJustifyContentStart(value) { this._vJustifyContentStart = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: end</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentEnd() { return this._vJustifyContentEnd; } set vJustifyContentEnd(value) { this._vJustifyContentEnd = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: space-between</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentBetween() { return this._vJustifyContentBetween; } set vJustifyContentBetween(value) { this._vJustifyContentBetween = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: space-around</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentAround() { return this._vJustifyContentAround; } set vJustifyContentAround(value) { this._vJustifyContentAround = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: space-evenly</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentEvenly() { return this._vJustifyContentEvenly; } set vJustifyContentEvenly(value) { this._vJustifyContentEvenly = coerceBooleanProperty(value); } /** * Sets property <code>gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties. */ get vGap() { return this._vGap; } set vGap(value) { this._vGap = value; } /** * Sets property <code>column-gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties. */ get vColGap() { return this._vColGap; } set vColGap(value) { this._vColGap = value; } /** * Sets property <code>row-gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties. */ get vRowGap() { return this._vRowGap; } set vRowGap(value) { this._vRowGap = value; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlexDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FlexDirective, isStandalone: true, selector: "[vFlex], [vFlexInline], [vGap], [vFlexGrow], [vFlexGrow0], \n [vFlexShrink], [vFlexShrink0], [vFlexBasis], [vAlignSelfStart], [vAlignSelfEnd], \n [vAlignSelfCenter], [vAlignSelfStretch], [vAlignSelfAuto], [vAlignSelfBaseline],", inputs: { vFlex: "vFlex", vFlexInline: "vFlexInline", vFlexCol: "vFlexCol", vFlexColReverse: "vFlexColReverse", vFlexRow: "vFlexRow", vFlexRowReverse: "vFlexRowReverse", vFlexWrap: "vFlexWrap", vFlexWrapReverse: "vFlexWrapReverse", vFlexNoWrap: "vFlexNoWrap", vFlexBasis: "vFlexBasis", vFlexGrow: "vFlexGrow", vFlexGrow0: "vFlexGrow0", vFlexShrink: "vFlexShrink", vFlexShrink0: "vFlexShrink0", vAlignContentCenter: "vAlignContentCenter", vAlignContentStart: "vAlignContentStart", vAlignContentEnd: "vAlignContentEnd", vAlignContentBetween: "vAlignContentBetween", vAlignContentAround: "vAlignContentAround", vAlignContentEvenly: "vAlignContentEvenly", vAlignItemsCenter: "vAlignItemsCenter", vAlignItemsStart: "vAlignItemsStart", vAlignItemsEnd: "vAlignItemsEnd", vAlignItemsBaseline: "vAlignItemsBaseline", vAlignItemsStretch: "vAlignItemsStretch", vAlignSelfCenter: "vAlignSelfCenter", vAlignSelfStart: "vAlignSelfStart", vAlignSelfEnd: "vAlignSelfEnd", vAlignSelfBaseline: "vAlignSelfBaseline", vAlignSelfStretch: "vAlignSelfStretch", vAlignSelfAuto: "vAlignSelfAuto", vJustifyContentCenter: "vJustifyContentCenter", vJustifyContentStart: "vJustifyContentStart", vJustifyContentEnd: "vJustifyContentEnd", vJustifyContentBetween: "vJustifyContentBetween", vJustifyContentAround: "vJustifyContentAround", vJustifyContentEvenly: "vJustifyContentEvenly", vGap: "vGap", vColGap: "vColGap", vRowGap: "vRowGap" }, host: { properties: { "class": "this.hostClasses", "style.flex-basis": "this.hostFlexBasis" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlexDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: `[vFlex], [vFlexInline], [vGap], [vFlexGrow], [vFlexGrow0], [vFlexShrink], [vFlexShrink0], [vFlexBasis], [vAlignSelfStart], [vAlignSelfEnd], [vAlignSelfCenter], [vAlignSelfStretch], [vAlignSelfAuto], [vAlignSelfBaseline],` }] }], propDecorators: { hostClasses: [{ type: HostBinding, args: ['class'] }], vFlex: [{ type: Input }], vFlexInline: [{ type: Input }], vFlexCol: [{ type: Input }], vFlexColReverse: [{ type: Input }], vFlexRow: [{ type: Input }], vFlexRowReverse: [{ type: Input }], vFlexWrap: [{ type: Input }], vFlexWrapReverse: [{ type: Input }], vFlexNoWrap: [{ type: Input }], vFlexBasis: [{ type: Input }], hostFlexBasis: [{ type: HostBinding, args: ['style.flex-basis'] }], vFlexGrow: [{ type: Input }], vFlexGrow0: [{ type: Input }], vFlexShrink: [{ type: Input }], vFlexShrink0: [{ type: Input }], vAlignContentCenter: [{ type: Input }], vAlignContentStart: [{ type: Input }], vAlignContentEnd: [{ type: Input }], vAlignContentBetween: [{ type: Input }], vAlignContentAround: [{ type: Input }], vAlignContentEvenly: [{ type: Input }], vAlignItemsCenter: [{ type: Input }], vAlignItemsStart: [{ type: Input }], vAlignItemsEnd: [{ type: Input }], vAlignItemsBaseline: [{ type: Input }], vAlignItemsStretch: [{ type: Input }], vAlignSelfCenter: [{ type: Input }], vAlignSelfStart: [{ type: Input }], vAlignSelfEnd: [{ type: Input }], vAlignSelfBaseline: [{ type: Input }], vAlignSelfStretch: [{ type: Input }], vAlignSelfAuto: [{ type: Input }], vJustifyContentCenter: [{ type: Input }], vJustifyContentStart: [{ type: Input }], vJustifyContentEnd: [{ type: Input }], vJustifyContentBetween: [{ type: Input }], vJustifyContentAround: [{ type: Input }], vJustifyContentEvenly: [{ type: Input }], vGap: [{ type: Input }], vColGap: [{ type: Input }], vRowGap: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvZmxleC9mbGV4LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQUUscUJBQXFCLEVBQTZCLE1BQU0sdUJBQXVCLENBQUM7QUFDekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVM5RCxNQUFNLE9BQU8sYUFBYTtJQUN4QixJQUNJLFdBQVc7UUFDYixPQUFPO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEQsSUFB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ZUYsVUFBVTtzQkFEYixLQUFLO2dCQVNGLGFBQWE7c0JBRGhCLFdBQVc7dUJBQUMsa0JBQWtCO2dCQVUzQixTQUFTO3NCQURaLEtBQUs7Z0JBY0YsVUFBVTtzQkFEYixLQUFLO2dCQWNGLFdBQVc7c0JBRGQsS0FBSztnQkFjRixZQUFZO3NCQURmLEtBQUs7Z0JBY0YsbUJBQW1CO3NCQUR0QixLQUFLO2dCQWNGLGtCQUFrQjtzQkFEckIsS0FBSztnQkFjRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBY0Ysb0JBQW9CO3NCQUR2QixLQUFLO2dCQWNGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFjRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBY0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFjRixjQUFjO3NCQURqQixLQUFLO2dCQWNGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0YsZ0JBQWdCO3NCQURuQixLQUFLO2dCQWNGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBY0YsYUFBYTtzQkFEaEIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBY0YscUJBQXFCO3NCQUR4QixLQUFLO2dCQWNGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0Ysc0JBQXNCO3NCQUR6QixLQUFLO2dCQWNGLHFCQUFxQjtzQkFEeEIsS0FBSztnQkFjRixxQkFBcUI7c0JBRHhCLEtBQUs7Z0JBYUYsSUFBSTtzQkFEUCxLQUFLO2dCQWFGLE9BQU87c0JBRFYsS0FBSztnQkFhRixPQUFPO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5LCBCb29sZWFuSW5wdXQsIE51bWJlcklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdEJpbmRpbmcsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTcGFjaW5nUHJvcGVydGllcyB9IGZyb20gJy4uL25vdmEtbGliLmNvbnN0YW50cyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogYFt2RmxleF0sIFt2RmxleElubGluZV0sIFt2R2FwXSwgW3ZGbGV4R3Jvd10sIFt2RmxleEdyb3cwXSwgXG4gIFt2RmxleFNocmlua10sIFt2RmxleFNocmluazBdLCBbdkZsZXhCYXNpc10sIFt2QWxpZ25TZWxmU3RhcnRdLCBbdkFsaWduU2VsZkVuZF0sIFxuICBbdkFsaWduU2VsZkNlbnRlcl0sIFt2QWxpZ25TZWxmU3RyZXRjaF0sIFt2QWxpZ25TZWxmQXV0b10sIFt2QWxpZ25TZWxmQmFzZWxpbmVdLGBcbn0pXG5leHBvcnQgY2xhc3MgRmxleERpcmVjdGl2ZSB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy52RmxleCA/ICh0aGlzLnZGbGV4Q29sID8gJ3YtZmxleCcgOiAndi1mbGV4IHYtZmxleC1yb3cnKSA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4SW5saW5lID8gJ3YtZmxleC1pbmxpbmUnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhDb2wgPyAndi1mbGV4LWNvbCcgOiBudWxsLFxuICAgICAgdGhpcy52RmxleENvbFJldmVyc2UgPyAndi1mbGV4LWNvbC1yZXZlcnNlJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4Um93ID8gJ3YtZmxleC1yb3cnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhSb3dSZXZlcnNlID8gJ3YtZmxleC1yb3ctcmV2ZXJzZScgOiBudWxsLFxuICAgICAgdGhpcy52RmxleFdyYXAgPyAndi1mbGV4LXdyYXAnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhXcmFwUmV2ZXJzZSA/ICd2LWZsZXgtd3JhcC1yZXZlcnNlJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4Tm9XcmFwID8gJ3YtZmxleC1ub3dyYXAnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhHcm93ID8gJ3YtZmxleC1ncm93JyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4R3JvdzAgPyAndi1mbGV4LWdyb3ctMCcgOiBudWxsLFxuICAgICAgdGhpcy52RmxleFNocmluayA/ICd2LWZsZXgtc2hyaW5rJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4U2hyaW5rMCA/ICd2LWZsZXgtc2hyaW5rLTAnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduQ29udGVudENlbnRlciA/ICd2LWFsaWduLWNvbnRlbnQtY2VudGVyJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRTdGFydCA/ICd2LWFsaWduLWNvbnRlbnQtc3RhcnQnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduQ29udGVudEVuZCA/ICd2LWFsaWduLWNvbnRlbnQtZW5kJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRCZXR3ZWVuID8gJ3YtYWxpZ24tY29udGVudC1iZXR3ZWVuJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRBcm91bmQgPyAndi1hbGlnbi1jb250ZW50LWFyb3VuZCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25Db250ZW50RXZlbmx5ID8gJ3YtYWxpZ24tY29udGVudC1ldmVubHknIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduSXRlbXNTdGFydCA/ICd2LWFsaWduLWl0ZW1zLXN0YXJ0JyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkl0ZW1zRW5kID8gJ3YtYWxpZ24taXRlbXMtZW5kJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkl0ZW1zQ2VudGVyID8gJ3YtYWxpZ24taXRlbXMtY2VudGVyJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkl0ZW1zQmFzZWxpbmUgPyAndi1hbGlnbi1pdGVtcy1iYXNlbGluZScgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25JdGVtc1N0cmV0Y2ggPyAndi1hbGlnbi1pdGVtcy1zdHJldGNoJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZTdGFydCA/ICd2LWFsaWduLXNlbGYtc3RhcnQnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduU2VsZkVuZCA/ICd2LWFsaWduLXNlbGYtZW5kJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZDZW50ZXIgPyAndi1hbGlnbi1zZWxmLWNlbnRlcicgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmQmFzZWxpbmUgPyAndi1hbGlnbi1zZWxmLWJhc2VsaW5lJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZTdHJldGNoID8gJ3YtYWxpZ24tc2VsZi1zdHJldGNoJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZBdXRvID8gJ3YtYWxpZ24tc2VsZi1hdXRvJyA6IG51bGwsXG4gICAgICB0aGlzLnZKdXN0aWZ5Q29udGVudFN0YXJ0ID8gJ3YtanVzdGlmeS1jb250ZW50LXN0YXJ0JyA6IG51bGwsXG4gICAgICB0aGlzLnZKdXN0aWZ5Q29udGVudEVuZCA/ICd2LWp1c3RpZnktY29udGVudC1lbmQnIDogbnVsbCxcbiAgICAgIHRoaXMudkp1c3RpZnlDb250ZW50Q2VudGVyID8gJ3YtanVzdGlmeS1jb250ZW50LWNlbnRlcicgOiBudWxsLFxuICAgICAgdGhpcy52SnVzdGlmeUNvbnRlbnRCZXR3ZWVuID8gJ3YtanVzdGlmeS1jb250ZW50LWJldHdlZW4nIDogbnVsbCxcbiAgICAgIHRoaXMudkp1c3RpZnlDb250ZW50QXJvdW5kID8gJ3YtanVzdGlmeS1jb250ZW50LWFyb3VuZCcgOiBudWxsLFxuICAgICAgdGhpcy52SnVzdGlmeUNvbnRlbnRFdmVubHkgPyAndi1qdXN0aWZ5LWNvbnRlbnQtZXZlbmx5JyA6IG51bGwsXG4gICAgICB0aGlzLnZHYXAgPyBgdi1mbGV4IHYtZ2FwLSR7dGhpcy52R2FwfWAgOiBudWxsLCAvLyB2R2FwPVwiNFwiXG4gICAgICB0aGlzLnZDb2xHYXAgPyBgdi1jb2wtZ2FwLSR7dGhpcy52Q29sR2FwfWAgOiBudWxsLCAvLyB2R2FwPVwiNFwiXG4gICAgICB0aGlzLnZSb3dHYXAgPyBgdi1yb3ctZ2FwLSR7dGhpcy52Um93R2FwfWAgOiBudWxsIC8vIHZHYXA9XCI0XCJcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmRpc3BsYXk6IGZsZXg8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYWxzbyBhIHNlbGVjdG9yIGFuZCBjYW4gYmUgdXNlZCBieSBpdHNlbGYgb24gYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4O1xuICB9XG4gIHNldCB2RmxleCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXggPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5kaXNwbGF5OiBpbmxpbmUtZmxleDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiBhIGZsZXggZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleElubGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhJbmxpbmU7XG4gIH1cbiAgc2V0IHZGbGV4SW5saW5lKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleElubGluZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4SW5saW5lOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtZGlyZWN0aW9uOiBjb2x1bW48L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhDb2woKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4Q29sO1xuICB9XG4gIHNldCB2RmxleENvbCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhDb2wgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleENvbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhDb2xSZXZlcnNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleENvbFJldmVyc2U7XG4gIH1cbiAgc2V0IHZGbGV4Q29sUmV2ZXJzZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhDb2xSZXZlcnNlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhDb2xSZXZlcnNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtZGlyZWN0aW9uOiByb3c8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4Um93O1xuICB9XG4gIHNldCB2RmxleFJvdyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhSb3cgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFJvdzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhSb3dSZXZlcnNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleFJvd1JldmVyc2U7XG4gIH1cbiAgc2V0IHZGbGV4Um93UmV2ZXJzZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhSb3dSZXZlcnNlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhSb3dSZXZlcnNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtd3JhcDogd3JhcDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCBhbG9uZ3NpZGUgYSBGbGV4RGlyZWN0aXZlIHNlbGVjdG9yIChzZWUgc2VsZWN0b3JzIGFib3ZlKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleFdyYXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4V3JhcDtcbiAgfVxuICBzZXQgdkZsZXhXcmFwKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleFdyYXAgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFdyYXA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC13cmFwOiB3cmFwLXJldmVyc2U8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhXcmFwUmV2ZXJzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhXcmFwUmV2ZXJzZTtcbiAgfVxuICBzZXQgdkZsZXhXcmFwUmV2ZXJzZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhXcmFwUmV2ZXJzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4V3JhcFJldmVyc2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC13cmFwOiBuby13cmFwPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Tm9XcmFwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleE5vV3JhcDtcbiAgfVxuICBzZXQgdkZsZXhOb1dyYXAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Tm9XcmFwID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhOb1dyYXA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1iYXNpczogJmx0O3ZhbHVlJmd0OzwvY29kZT4uIDxicj5cbiAgICogQWNjZXB0cyBhIHN0cmluZyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiBhIHBlcmNlbnRhZ2Ugb3IgQ1NTIHVuaXQuIDxiciAvPlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsc28gYSBzZWxlY3RvciBhbmQgY2FuIGJlIHVzZWQgYnkgaXRzZWxmIG9uIHRoZSA8aT5jaGlsZDwvaT4gb2YgYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhCYXNpcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92RmxleEJhc2lzO1xuICB9XG4gIHNldCB2RmxleEJhc2lzKHZhbHVlKSB7XG4gICAgdGhpcy5fdkZsZXhCYXNpcyA9IHZhbHVlO1xuICB9XG4gIF92RmxleEJhc2lzOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnc3R5bGUuZmxleC1iYXNpcycpXG4gIGdldCBob3N0RmxleEJhc2lzKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnZGbGV4QmFzaXMgPyB0aGlzLnZGbGV4QmFzaXMgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1ncm93OiAxPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsc28gYSBzZWxlY3RvciBhbmQgY2FuIGJlIHVzZWQgYnkgaXRzZWxmIG9uIHRoZSA8aT5jaGlsZDwvaT4gb2YgYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhHcm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleEdyb3c7XG4gIH1cbiAgc2V0IHZGbGV4R3Jvdyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhHcm93ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhHcm93OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtZ3JvdzogMDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4R3JvdzAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4R3JvdzA7XG4gIH1cbiAgc2V0IHZGbGV4R3JvdzAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4R3JvdzAgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleEdyb3cwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtc2hyaW5rOiAxPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsc28gYSBzZWxlY3RvciBhbmQgY2FuIGJlIHVzZWQgYnkgaXRzZWxmIG9uIHRoZSA8aT5jaGlsZDwvaT4gb2YgYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhTaHJpbmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4U2hyaW5rO1xuICB9XG4gIHNldCB2RmxleFNocmluayh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhTaHJpbmsgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFNocmluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LXNocmluazogMDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4U2hyaW5rMCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhTaHJpbmswO1xuICB9XG4gIHNldCB2RmxleFNocmluazAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4U2hyaW5rMCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4U2hyaW5rMDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5hbGlnbi1jb250ZW50OiBjZW50ZXI8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkFsaWduQ29udGVudENlbnRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkFsaWduQ29udGVudENlbnRlcjtcbiAgfVxuICBzZXQgdkFsaWduQ29udGVudENlbnRlcih2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkFsaWduQ29udGVudENlbnRlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZBbGlnbkNvbnRlbnRDZW50ZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+YWxpZ24tY29udGVudDogc3RhcnQ8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkFsaWduQ29udGVudFN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92QWxpZ25Db250ZW50U3RhcnQ7XG4gIH1cbiAgc2V0IHZBbGlnbkNvbnRlbnRTdGFydCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkFsaWduQ29udGVudFN0YXJ0ID0gY29lcmNlQm9vbGVhbl