ngx-foldable
Version:
Angular library to help you build dual-screen experiences for foldable or dual-screen devices
169 lines • 18.3 kB
JavaScript
import { Directive, Host, HostBinding, Input } from '@angular/core';
import { ScreenSpanning } from './screen-spanning';
import { ReadingDirection, SplitLayoutMode, WindowOrder, } from './split-layout.directive';
import * as i0 from "@angular/core";
import * as i1 from "./screen-context";
import * as i2 from "./split-layout.directive";
/**
* Look 'ma, CSS-in-JS with Angular! ಠ_ಠ
*
* @ignore
*/
const layoutStyles = {
[SplitLayoutMode.Flex]: {
[ScreenSpanning.DualHorizontal]: [
{ flex: '0 0 env(viewport-segment-width 0 0)' },
{ flex: '0 0 env(viewport-segment-width 1 0)' },
],
[ScreenSpanning.DualVertical]: [
{ flex: '0 0 env(viewport-segment-height 0 0)' },
{ flex: '0 0 env(viewport-segment-height 0 1)' },
],
},
[SplitLayoutMode.Grid]: {
[ScreenSpanning.DualHorizontal]: [
{ gridArea: 'segment0' },
{ gridArea: 'segment1' },
],
[ScreenSpanning.DualVertical]: [
{
gridArea: 'segment0',
height: 'env(viewport-segment-height 0 0)'
},
{
gridArea: 'segment1',
height: 'env(viewport-segment-height 0 1)'
},
],
},
[SplitLayoutMode.Absolute]: {
[ScreenSpanning.DualHorizontal]: [
{
position: 'absolute',
left: 0,
width: 'env(viewport-segment-right 0 0)',
},
{
position: 'absolute',
left: 'env(viewport-segment-left 1 0)',
right: 0,
},
],
[ScreenSpanning.DualVertical]: [
{
position: 'absolute',
top: 0,
width: '100%',
maxHeight: 'env(viewport-segment-height 0 0)',
},
{
position: 'absolute',
top: 'env(viewport-segment-top 0 1)',
width: '100%',
maxHeight: 'env(viewport-segment-height 0 1)',
},
],
},
};
/**
* This directive is used to set specify on which window segment the container
* should be placed on multi screen devices.
*
* When used on a single screen device, no layout change (CSS) is added.
* Only devices with up to two screen are currently supported, meaning that the
* window segment value must be either 0 or 1.
*
* This directive can only be used within a {@link SplitLayoutDirective}.
* If {@link SplitLayoutMode} is set to `absolute`, you can assign multiple
* container element to the same window segment.
*
* Note that if you have set the read direction to Right-To-Left mode (`rtl`)
* in CSS, the first segment will be the rightmost one.
*
* If the {@link WindowOrder} option is set to {@link WindowOrder.Reverse},
* the window segments order will be reversed in horizontal spanning mode.
*
* @example
* <div fdSplitLayout="grid">
* <section fdWindow="0">Will be displayed on first screen</section>
* <section fdWindow="1">Will be displayed on second screen (if available)</section>
* </div>
*/
export class WindowDirective {
constructor(screenContext, splitLayout) {
this.screenContext = screenContext;
this.splitLayout = splitLayout;
this.segment = -1;
this.layoutStyle = {};
this.screenContextSubscription = null;
this.screenContextSubscription = this.screenContext
.asObservable()
.subscribe(() => this.updateStyle());
}
/** @ignore */
get style() {
return this.layoutStyle;
}
/**
* Sets the target window segment to display this container on when multi
* screen is detected.
*
* @param segment The target window segment, must be 0 or 1.
*/
set fdWindow(segment) {
segment = typeof segment === 'string' ? parseInt(segment, 10) : segment;
if (segment !== this.segment) {
this.segment = segment;
this.updateStyle();
}
}
/** @ignore */
ngOnDestroy() {
if (this.screenContextSubscription !== null) {
this.screenContextSubscription.unsubscribe();
}
}
updateStyle() {
if (this.segment === -1) {
return;
}
const isMultiScreen = this.screenContext.isMultiScreen;
const spanning = this.screenContext.screenSpanning;
if (isMultiScreen && spanning !== ScreenSpanning.None) {
if (this.segment < 0 || this.segment > 1) {
throw new Error('Segment index must be 0 or 1');
}
const mode = this.splitLayout.layoutMode;
const order = this.splitLayout.windowOrder;
const direction = this.splitLayout.readingDirection;
// Swap segments for vertical span and RTL mode or
// horizontal span and reverse window order
const swap = (spanning === ScreenSpanning.DualHorizontal &&
mode !== SplitLayoutMode.Grid &&
direction === ReadingDirection.RightToLeft) ||
(spanning === ScreenSpanning.DualVertical &&
order === WindowOrder.Reverse);
const segment = swap ? 1 - this.segment : this.segment;
this.layoutStyle = layoutStyles[mode][spanning][segment];
}
else {
this.layoutStyle = {};
}
}
}
WindowDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: WindowDirective, deps: [{ token: i1.ScreenContext }, { token: i2.SplitLayoutDirective, host: true }], target: i0.ɵɵFactoryTarget.Directive });
WindowDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.1", type: WindowDirective, selector: "[fdWindow]", inputs: { fdWindow: "fdWindow" }, host: { properties: { "style": "this.style" } }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: WindowDirective, decorators: [{
type: Directive,
args: [{
selector: '[fdWindow]',
}]
}], ctorParameters: function () { return [{ type: i1.ScreenContext }, { type: i2.SplitLayoutDirective, decorators: [{
type: Host
}] }]; }, propDecorators: { style: [{
type: HostBinding,
args: ['style']
}], fdWindow: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi9zcmMvY29yZS93aW5kb3cuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFJL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsZUFBZSxFQUNmLFdBQVcsR0FDWixNQUFNLDBCQUEwQixDQUFDOzs7O0FBRWxDOzs7O0dBSUc7QUFDSCxNQUFNLFlBQVksR0FBRztJQUNuQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUMvQixFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRTtZQUMvQyxFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRTtTQUNoRDtRQUNELENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzdCLEVBQUUsSUFBSSxFQUFFLHNDQUFzQyxFQUFFO1lBQ2hELEVBQUUsSUFBSSxFQUFFLHNDQUFzQyxFQUFFO1NBQ2pEO0tBQ0Y7SUFDRCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUMvQixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7WUFDeEIsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO1NBQ3pCO1FBQ0QsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDN0I7Z0JBQ0UsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLE1BQU0sRUFBRSxrQ0FBa0M7YUFDM0M7WUFDRDtnQkFDRSxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsTUFBTSxFQUFFLGtDQUFr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Q0FBQyxnQkFBZ0IsQ0FBQztZQUNwRCxrREFBa0Q7WUFDbEQsMkNBQTJDO1lBQzNDLE1BQU0sSUFBSSxHQUNSLENBQUMsUUFBUSxLQUFLLGNBQWMsQ0FBQyxjQUFjO2dCQUN6QyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUk7Z0JBQzdCLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7Z0JBQzdDLENBQUMsUUFBUSxLQUFLLGNBQWMsQ0FBQyxZQUFZO29CQUN2QyxLQUFLLEtBQUssV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRW5DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUQ7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQzs7NEdBeEVVLGVBQWU7Z0dBQWYsZUFBZTsyRkFBZixlQUFlO2tCQUgzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO2lCQUN2Qjs7MEJBNkJJLElBQUk7NENBckJILEtBQUs7c0JBRFIsV0FBVzt1QkFBQyxPQUFPO2dCQVloQixRQUFRO3NCQURYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3QsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2NyZWVuQ29udGV4dCB9IGZyb20gJy4vc2NyZWVuLWNvbnRleHQnO1xuaW1wb3J0IHsgU2NyZWVuU3Bhbm5pbmcgfSBmcm9tICcuL3NjcmVlbi1zcGFubmluZyc7XG5pbXBvcnQge1xuICBSZWFkaW5nRGlyZWN0aW9uLFxuICBTcGxpdExheW91dERpcmVjdGl2ZSxcbiAgU3BsaXRMYXlvdXRNb2RlLFxuICBXaW5kb3dPcmRlcixcbn0gZnJvbSAnLi9zcGxpdC1sYXlvdXQuZGlyZWN0aXZlJztcblxuLyoqXG4gKiBMb29rICdtYSwgQ1NTLWluLUpTIHdpdGggQW5ndWxhciEg4LKgX+CyoFxuICpcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgbGF5b3V0U3R5bGVzID0ge1xuICBbU3BsaXRMYXlvdXRNb2RlLkZsZXhdOiB7XG4gICAgW1NjcmVlblNwYW5uaW5nLkR1YWxIb3Jpem9udGFsXTogW1xuICAgICAgeyBmbGV4OiAnMCAwIGVudih2aWV3cG9ydC1zZWdtZW50LXdpZHRoIDAgMCknIH0sXG4gICAgICB7IGZsZXg6ICcwIDAgZW52KHZpZXdwb3J0LXNlZ21lbnQtd2lkdGggMSAwKScgfSxcbiAgICBdLFxuICAgIFtTY3JlZW5TcGFubmluZy5EdWFsVmVydGljYWxdOiBbXG4gICAgICB7IGZsZXg6ICcwIDAgZW52KHZpZXdwb3J0LXNlZ21lbnQtaGVpZ2h0IDAgMCknIH0sXG4gICAgICB7IGZsZXg6ICcwIDAgZW52KHZpZXdwb3J0LXNlZ21lbnQtaGVpZ2h0IDAgMSknIH0sXG4gICAgXSxcbiAgfSxcbiAgW1NwbGl0TGF5b3V0TW9kZS5HcmlkXToge1xuICAgIFtTY3JlZW5TcGFubmluZy5EdWFsSG9yaXpvbnRhbF06IFtcbiAgICAgIHsgZ3JpZEFyZWE6ICdzZWdtZW50MCcgfSxcbiAgICAgIHsgZ3JpZEFyZWE6ICdzZWdtZW50MScgfSxcbiAgICBdLFxuICAgIFtTY3JlZW5TcGFubmluZy5EdWFsVmVydGljYWxdOiBbXG4gICAgICB7XG4gICAgICAgIGdyaWRBcmVhOiAnc2VnbWVudDAnLFxuICAgICAgICBoZWlnaHQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1oZWlnaHQgMCAwKSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGdyaWRBcmVhOiAnc2VnbWVudDEnLFxuICAgICAgICBoZWlnaHQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1oZWlnaHQgMCAxKSdcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgW1NwbGl0TGF5b3V0TW9kZS5BYnNvbHV0ZV06IHtcbiAgICBbU2NyZWVuU3Bhbm5pbmcuRHVhbEhvcml6b250YWxdOiBbXG4gICAgICB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogJ2Vudih2aWV3cG9ydC1zZWdtZW50LXJpZ2h0IDAgMCknLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIGxlZnQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1sZWZ0IDEgMCknLFxuICAgICAgICByaWdodDogMCxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbU2NyZWVuU3Bhbm5pbmcuRHVhbFZlcnRpY2FsXTogW1xuICAgICAge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBtYXhIZWlnaHQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1oZWlnaHQgMCAwKScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAnZW52KHZpZXdwb3J0LXNlZ21lbnQtdG9wIDAgMSknLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBtYXhIZWlnaHQ6ICdlbnYodmlld3BvcnQtc2VnbWVudC1oZWlnaHQgMCAxKScsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIGlzIHVzZWQgdG8gc2V0IHNwZWNpZnkgb24gd2hpY2ggd2luZG93IHNlZ21lbnQgdGhlIGNvbnRhaW5lclxuICogc2hvdWxkIGJlIHBsYWNlZCBvbiBtdWx0aSBzY3JlZW4gZGV2aWNlcy5cbiAqXG4gKiBXaGVuIHVzZWQgb24gYSBzaW5nbGUgc2NyZWVuIGRldmljZSwgbm8gbGF5b3V0IGNoYW5nZSAoQ1NTKSBpcyBhZGRlZC5cbiAqIE9ubHkgZGV2aWNlcyB3aXRoIHVwIHRvIHR3byBzY3JlZW4gYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQsIG1lYW5pbmcgdGhhdCB0aGVcbiAqIHdpbmRvdyBzZWdtZW50IHZhbHVlIG11c3QgYmUgZWl0aGVyIDAgb3IgMS5cbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBjYW4gb25seSBiZSB1c2VkIHdpdGhpbiBhIHtAbGluayBTcGxpdExheW91dERpcmVjdGl2ZX0uXG4gKiBJZiB7QGxpbmsgU3BsaXRMYXlvdXRNb2RlfSBpcyBzZXQgdG8gYGFic29sdXRlYCwgeW91IGNhbiBhc3NpZ24gbXVsdGlwbGVcbiAqIGNvbnRhaW5lciBlbGVtZW50IHRvIHRoZSBzYW1lIHdpbmRvdyBzZWdtZW50LlxuICpcbiAqIE5vdGUgdGhhdCBpZiB5b3UgaGF2ZSBzZXQgdGhlIHJlYWQgZGlyZWN0aW9uIHRvIFJpZ2h0LVRvLUxlZnQgbW9kZSAoYHJ0bGApXG4gKiBpbiBDU1MsIHRoZSBmaXJzdCBzZWdtZW50IHdpbGwgYmUgdGhlIHJpZ2h0bW9zdCBvbmUuXG4gKlxuICogSWYgdGhlIHtAbGluayBXaW5kb3dPcmRlcn0gb3B0aW9uIGlzIHNldCB0byB7QGxpbmsgV2luZG93T3JkZXIuUmV2ZXJzZX0sXG4gKiB0aGUgd2luZG93IHNlZ21lbnRzIG9yZGVyIHdpbGwgYmUgcmV2ZXJzZWQgaW4gaG9yaXpvbnRhbCBzcGFubmluZyBtb2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGZkU3BsaXRMYXlvdXQ9XCJncmlkXCI+XG4gKiAgICAgICAgICAgICAgPHNlY3Rpb24gZmRXaW5kb3c9XCIwXCI+V2lsbCBiZSBkaXNwbGF5ZWQgb24gZmlyc3Qgc2NyZWVuPC9zZWN0aW9uPlxuICogICAgICAgICAgICAgIDxzZWN0aW9uIGZkV2luZG93PVwiMVwiPldpbGwgYmUgZGlzcGxheWVkIG9uIHNlY29uZCBzY3JlZW4gKGlmIGF2YWlsYWJsZSk8L3NlY3Rpb24+XG4gKiA8L2Rpdj5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZkV2luZG93XScsXG59KVxuZXhwb3J0IGNsYXNzIFdpbmRvd0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc2VnbWVudCA9IC0xO1xuICBwcml2YXRlIGxheW91dFN0eWxlOiBTYWZlU3R5bGUgPSB7fTtcbiAgcHJpdmF0ZSBzY3JlZW5Db250ZXh0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICAvKiogQGlnbm9yZSAqL1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlJylcbiAgZ2V0IHN0eWxlKCk6IFNhZmVTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0U3R5bGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdGFyZ2V0IHdpbmRvdyBzZWdtZW50IHRvIGRpc3BsYXkgdGhpcyBjb250YWluZXIgb24gd2hlbiBtdWx0aVxuICAgKiBzY3JlZW4gaXMgZGV0ZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWdtZW50IFRoZSB0YXJnZXQgd2luZG93IHNlZ21lbnQsIG11c3QgYmUgMCBvciAxLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGZkV2luZG93KHNlZ21lbnQ6IG51bWJlciB8IHN0cmluZykge1xuICAgIHNlZ21lbnQgPSB0eXBlb2Ygc2VnbWVudCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzZWdtZW50LCAxMCkgOiBzZWdtZW50O1xuICAgIGlmIChzZWdtZW50ICE9PSB0aGlzLnNlZ21lbnQpIHtcbiAgICAgIHRoaXMuc2VnbWVudCA9IHNlZ21lbnQ7XG4gICAgICB0aGlzLnVwZGF0ZVN0eWxlKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY3JlZW5Db250ZXh0OiBTY3JlZW5Db250ZXh0LFxuICAgIEBIb3N0KCkgcHJpdmF0ZSBzcGxpdExheW91dDogU3BsaXRMYXlvdXREaXJlY3RpdmVcbiAgKSB7XG4gICAgdGhpcy5zY3JlZW5Db250ZXh0U3Vic2NyaXB0aW9uID0gdGhpcy5zY3JlZW5Db250ZXh0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTdHlsZSgpKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnNjcmVlbkNvbnRleHRTdWJzY3JpcHRpb24gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2NyZWVuQ29udGV4dFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3R5bGUoKSB7XG4gICAgaWYgKHRoaXMuc2VnbWVudCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc011bHRpU2NyZWVuID0gdGhpcy5zY3JlZW5Db250ZXh0LmlzTXVsdGlTY3JlZW47XG4gICAgY29uc3Qgc3Bhbm5pbmcgPSB0aGlzLnNjcmVlbkNvbnRleHQuc2NyZWVuU3Bhbm5pbmc7XG5cbiAgICBpZiAoaXNNdWx0aVNjcmVlbiAmJiBzcGFubmluZyAhPT0gU2NyZWVuU3Bhbm5pbmcuTm9uZSkge1xuICAgICAgaWYgKHRoaXMuc2VnbWVudCA8IDAgfHwgdGhpcy5zZWdtZW50ID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlZ21lbnQgaW5kZXggbXVzdCBiZSAwIG9yIDEnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuc3BsaXRMYXlvdXQubGF5b3V0TW9kZTtcbiAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zcGxpdExheW91dC53aW5kb3dPcmRlcjtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuc3BsaXRMYXlvdXQucmVhZGluZ0RpcmVjdGlvbjtcbiAgICAgIC8vIFN3YXAgc2VnbWVudHMgZm9yIHZlcnRpY2FsIHNwYW4gYW5kIFJUTCBtb2RlIG9yXG4gICAgICAvLyBob3Jpem9udGFsIHNwYW4gYW5kIHJldmVyc2Ugd2luZG93IG9yZGVyXG4gICAgICBjb25zdCBzd2FwID1cbiAgICAgICAgKHNwYW5uaW5nID09PSBTY3JlZW5TcGFubmluZy5EdWFsSG9yaXpvbnRhbCAmJlxuICAgICAgICAgIG1vZGUgIT09IFNwbGl0TGF5b3V0TW9kZS5HcmlkICYmXG4gICAgICAgICAgZGlyZWN0aW9uID09PSBSZWFkaW5nRGlyZWN0aW9uLlJpZ2h0VG9MZWZ0KSB8fFxuICAgICAgICAoc3Bhbm5pbmcgPT09IFNjcmVlblNwYW5uaW5nLkR1YWxWZXJ0aWNhbCAmJlxuICAgICAgICAgIG9yZGVyID09PSBXaW5kb3dPcmRlci5SZXZlcnNlKTtcblxuICAgICAgY29uc3Qgc2VnbWVudCA9IHN3YXAgPyAxIC0gdGhpcy5zZWdtZW50IDogdGhpcy5zZWdtZW50O1xuICAgICAgdGhpcy5sYXlvdXRTdHlsZSA9IGxheW91dFN0eWxlc1ttb2RlXVtzcGFubmluZ11bc2VnbWVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGF5b3V0U3R5bGUgPSB7fTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==