@uex/web-extensions
Version:
Uex extensions for Angular 6+ web projects
535 lines • 45.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/modules/template/template.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, HostListener, ContentChildren, ContentChild, QueryList, ViewChild, EventEmitter, Input } from "@angular/core";
import { ActivatedRoute, PRIMARY_OUTLET } from "@angular/router";
import * as _ from "lodash";
import { DeviceDetectorService } from "ngx-device-detector";
import { ConfigService } from "../../config.service";
import { ActionBarComponent } from "./components/action-bar.component";
import { FormBarComponent } from "./components/form-bar.component";
import { TemplateSize, TemplateTheme } from "./template.enum";
import { LayoutRouterService } from "../layout/services/router.service";
/** @type {?} */
const ROUTE_DATA_BREADCRUMB = "$title";
export class TemplateComponent {
/**
* @param {?} _route
* @param {?} _deviceService
* @param {?} _config
* @param {?} _layoutRouterService
* @param {?} elementRef
*/
constructor(_route, _deviceService, _config, _layoutRouterService, elementRef) {
this._route = _route;
this._deviceService = _deviceService;
this._config = _config;
this._layoutRouterService = _layoutRouterService;
this.elementRef = elementRef;
this.type = "default";
this.size = TemplateSize.RESPONSIVE;
this.onSizeChange = new EventEmitter();
this.onScroll = new EventEmitter();
this.breakPoints = [
"xs",
"sm",
"md",
"lg",
"xl"
];
this.sizes = {
width: 0,
height: 0,
header_height: 0,
offset_height: 0
};
this.scrollRef = {
top: 0,
left: 0
};
this.relative = false;
this._device_info = this._deviceService.getDeviceInfo();
}
/**
* @private
* @param {?} action_bars
* @return {?}
*/
set _actionBars(action_bars) {
setTimeout((/**
* @return {?}
*/
() => (this.actionBars = action_bars.toArray())), 0);
}
/**
* @private
* @param {?} form_bar
* @return {?}
*/
set _formBar(form_bar) {
setTimeout((/**
* @return {?}
*/
() => (this.formBar = form_bar)), 0);
}
/**
* @return {?}
*/
_onResize() {
this.resize();
}
/**
* @return {?}
*/
_onScroll() {
this.scrollRef = {
top: this._getScrollElement().scrollTop,
left: this._getScrollElement().scrollLeft
};
this.onScroll.emit(this.scrollRef);
}
/**
* @return {?}
*/
ngOnInit() {
this._layoutRouterService.registerTemplate(this);
}
/**
* @return {?}
*/
ngOnDestroy() {
this._layoutRouterService.unregisterTemplate();
}
/**
* @return {?}
*/
ngAfterViewInit() {
setTimeout((/**
* @return {?}
*/
() => {
if (!this.title) {
/** @type {?} */
const root = this._route.root;
this.title = this._getActiveRoute(root).snapshot.data[ROUTE_DATA_BREADCRUMB];
}
this.resize();
this._updateData();
}), 0);
}
/**
* @return {?}
*/
ngOnChanges() {
this._updateData();
}
/**
* @param {?} offset
* @param {?=} smooth
* @return {?}
*/
scrollTo(offset, smooth = false) {
if (this.hasScroll()) {
this._getScrollElement().scroll({
top: offset,
behavior: smooth ? "smooth" : "auto"
});
}
}
/**
* @param {?} anchor
* @param {?=} smooth
* @return {?}
*/
scrollToAnchor(anchor, smooth = false) {
if (this.hasScroll()) {
if (anchor.indexOf("#") !== 0) {
anchor = `#${anchor}`;
}
/** @type {?} */
const el = this.elementRef.nativeElement.querySelector(anchor);
if (!el) {
return;
}
this.scrollTo(((/** @type {?} */ (el))).offsetTop, smooth);
}
}
/**
* @param {?=} smooth
* @return {?}
*/
scrollToTop(smooth = false) {
if (this.hasScroll()) {
this._getScrollElement().scroll({
top: 0,
behavior: smooth ? "smooth" : "auto"
});
}
}
/**
* @param {?=} smooth
* @return {?}
*/
scrollToBottom(smooth = false) {
if (this.hasScroll()) {
this._getScrollElement().scroll({
top: this._getScrollElement().scrollHeight,
behavior: smooth ? "smooth" : "auto"
});
}
}
/**
* @return {?}
*/
resize() {
this._setBreakPoint();
this._setSizes();
}
/**
* @param {?} size
* @return {?}
*/
isBreakPoint(size) {
return this.breakPoint == size;
}
/**
* @param {?} size
* @return {?}
*/
isBreakPointMin(size) {
return (this.breakPoints.indexOf(size) <=
this.breakPoints.indexOf(this.breakPoint));
}
/**
* @param {?} size
* @return {?}
*/
isBreakPointMax(size) {
return (this.breakPoints.indexOf(size) >=
this.breakPoints.indexOf(this.breakPoint));
}
/**
* @param {?} path
* @return {?}
*/
getConfig(path) {
if (!this.type) {
this.type = "default";
}
if (this._config) {
/** @type {?} */
const template_type = this._config.template[this.type] ||
this._config.template["1"] ||
this._config.template.default;
if (!template_type)
return null;
switch (path) {
case "background.color":
return template_type.background.color;
case "background.image":
return template_type.background.image
? `url("${template_type.background.image}")`
: null;
default:
return _.get(template_type, path);
}
}
else {
return null;
}
}
/**
* @param {?} theme_type
* @return {?}
*/
isTheme(theme_type) {
return this.getConfig("theme") == TemplateTheme[theme_type];
}
/**
* @return {?}
*/
hasFormBar() {
// return this.has_form_bar;
return this.formBar && this.formBar.content ? true : false;
}
/**
* @return {?}
*/
hasActionBar() {
return this.actionBars && this.actionBars.length > 0;
}
/**
* @return {?}
*/
hasScroll() {
if (this._wrapper) {
/** @type {?} */
const el = this._getScrollElement(true);
// const wrapper = this._wrapper.nativeElement.childNodes[0];
/** @type {?} */
const wrapper = this._wrapper.nativeElement;
return wrapper.offsetHeight > el.offsetHeight;
}
return false;
}
/**
* @private
* @param {?=} use_body
* @return {?}
*/
_getScrollElement(use_body = false) {
/** @type {?} */
const is_safari = this._device_info.browser == "safari";
return this._config.layout.relative
? use_body || is_safari
? document.body
: document.documentElement
: this.elementRef.nativeElement;
}
/**
* @private
* @return {?}
*/
_setBreakPoint() {
/** @type {?} */
const width = document.body.clientWidth;
switch (true) {
case width < 576:
this.breakPoint = "xs";
break;
case width >= 576 && width < 768:
this.breakPoint = "sm";
break;
case width >= 768 && width < 992:
this.breakPoint = "md";
break;
case width >= 992 && width < 1200:
this.breakPoint = "lg";
break;
case width > 1200:
this.breakPoint = "xl";
break;
}
}
/**
* @private
* @return {?}
*/
_setSizes() {
setTimeout((/**
* @return {?}
*/
() => {
this.sizes.width = this._getScrollElement().clientWidth;
this.sizes.height = this._getScrollElement().offsetHeight;
this.sizes.header_height = this._header
? this._header.nativeElement.offsetHeight
: 0;
/** @type {?} */
let content_padding = 0;
if (this._content) {
/** @type {?} */
const content_styles = window.getComputedStyle(this._content.nativeElement);
/** @type {?} */
const content_padding_top = parseFloat(content_styles.getPropertyValue("padding-top"));
/** @type {?} */
const content_padding_bottom = parseFloat(content_styles.getPropertyValue("padding-bottom"));
content_padding = content_padding_top + content_padding_bottom;
}
/** @type {?} */
const offset = this.sizes.height - this.sizes.header_height;
this.sizes.offset_height = offset - content_padding;
this.onSizeChange.emit(this.sizes);
}), 100);
}
/**
* @private
* @return {?}
*/
_updateData() {
if (_.isUndefined(this.show_header)) {
/** @type {?} */
const show_header = this.getConfig("header");
this.show_header = _.isBoolean(show_header) ? show_header : true;
}
if (_.isUndefined(this.show_layout_header)) {
/** @type {?} */
const show_layout_header = this.getConfig("layout.header");
this.show_layout_header = _.isBoolean(show_layout_header)
? show_layout_header
: true;
}
if (_.isUndefined(this.show_layout_sidebar)) {
/** @type {?} */
const show_layout_sidebar = this.getConfig("layout.sidebar");
this.show_layout_sidebar = _.isBoolean(show_layout_sidebar)
? show_layout_sidebar
: true;
}
this._layoutRouterService.updateTemplate();
}
/**
* @private
* @param {?} route
* @return {?}
*/
_getActiveRoute(route) {
// Fet the child routes
/** @type {?} */
const children = route.children;
/** @type {?} */
let current;
// Return if there are no more children
if (children.length === 0) {
return route;
}
// Iterate over each children
for (const child of children) {
// Verify primary route
if (child.outlet !== PRIMARY_OUTLET) {
continue;
}
// Recursive
current = this._getActiveRoute(child);
}
return current;
}
}
TemplateComponent.decorators = [
{ type: Component, args: [{
selector: "uex-template",
template: "<div class=\"uex-template-bg\" [style.background-color]=\"getConfig('background.color')\" [style.background-image]=\"getConfig('background.image')\" *ngIf=\"!show_header\"></div>\r\n\r\n<div #wrapper class=\"uex-template-wrapper\">\r\n <div #header class=\"uex-template-header\" *ngIf=\"show_header\"\r\n\r\n [class.uex-template-header-theme-default]=\"isTheme('DEFAULT')\"\r\n [class.uex-template-header-theme-dark]=\"isTheme('DARK')\"\r\n [class.uex-template-header-theme-light]=\"isTheme('LIGHT')\"\r\n [class.uex-template-header-theme-blue]=\"isTheme('BLUE')\"\r\n\r\n [class.uex-template-header-with-form-bar]=\"hasFormBar()\"\r\n [class.uex-template-header-with-breadcrumbs]=\"breadcrumb?.visible\"\r\n\r\n [style.background-color]=\"getConfig('background.color')\"\r\n [style.background-image]=\"getConfig('background.image')\">\r\n <div class=\"row m-0\" [hidden]=\"!breadcrumb?.visible\">\r\n <div class=\"uex-template-breadcrumb col-12\">\r\n <uex-breadcrumb #breadcrumb></uex-breadcrumb>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row m-0\">\r\n <div class=\"uex-template-header-side col-12\" [class.col-sm-6]=\"hasActionBar()\" *ngIf=\"title || hasActionBar()\">\r\n <div class=\"uex-template-title\" [title]=\"title ? title : ''\" *ngIf=\"title\">\r\n <h1>{{title}}</h1>\r\n </div>\r\n\r\n <div class=\"uex-template-subtitle\" [title]=\"subtitle ? subtitle : ''\" *ngIf=\"subtitle\">\r\n <h2>{{subtitle}}</h2>\r\n </div>\r\n </div>\r\n\r\n <div class=\"uex-template-header-side col-12 col-sm-6\" *ngIf=\"hasActionBar()\">\r\n <div class=\"uex-template-action-bar align-items-end text-right col-12\" [class.align-self-start]=\"actionBar.is_top\" [class.align-self-end]=\"actionBar.is_bottom\" [ngClass]=\"actionBar.cssClass\" *ngFor=\"let actionBar of actionBars\">\r\n <ng-template [uex-portal]=\"actionBar.content\"></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row m-0\">\r\n <div class=\"uex-template-header-bottom col-12 p-0\" *ngIf=\"hasFormBar()\" [hidden]=\"formBar?.hidden\">\r\n <div class=\"uex-template-form-bar\">\r\n <ng-template [uex-portal]=\"formBar?.content\"></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div #content class=\"uex-template-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n",
host: {
class: "uex-template",
"[attr.title]": "null",
"[attr.subtitle]": "null"
}
}] }
];
/** @nocollapse */
TemplateComponent.ctorParameters = () => [
{ type: ActivatedRoute },
{ type: DeviceDetectorService },
{ type: ConfigService },
{ type: LayoutRouterService },
{ type: ElementRef }
];
TemplateComponent.propDecorators = {
_actionBars: [{ type: ContentChildren, args: [ActionBarComponent, { descendants: true },] }],
_formBar: [{ type: ContentChild, args: [FormBarComponent, { static: false },] }],
_wrapper: [{ type: ViewChild, args: ["wrapper", { static: true },] }],
_header: [{ type: ViewChild, args: ["header", { static: false },] }],
_content: [{ type: ViewChild, args: ["content", { static: true },] }],
title: [{ type: Input, args: ["title",] }],
subtitle: [{ type: Input, args: ["subtitle",] }],
type: [{ type: Input, args: ["type",] }],
show_header: [{ type: Input, args: ["show-header",] }],
show_layout_header: [{ type: Input, args: ["show-layout-header",] }],
show_layout_sidebar: [{ type: Input, args: ["show-layout-sidebar",] }],
size: [{ type: Input, args: ["size",] }],
_onResize: [{ type: HostListener, args: ["window:resize",] }],
_onScroll: [{ type: HostListener, args: ["scroll",] }]
};
if (false) {
/**
* @type {?}
* @private
*/
TemplateComponent.prototype._wrapper;
/**
* @type {?}
* @private
*/
TemplateComponent.prototype._header;
/**
* @type {?}
* @private
*/
TemplateComponent.prototype._content;
/** @type {?} */
TemplateComponent.prototype.title;
/** @type {?} */
TemplateComponent.prototype.subtitle;
/** @type {?} */
TemplateComponent.prototype.type;
/** @type {?} */
TemplateComponent.prototype.show_header;
/** @type {?} */
TemplateComponent.prototype.show_layout_header;
/** @type {?} */
TemplateComponent.prototype.show_layout_sidebar;
/** @type {?} */
TemplateComponent.prototype.size;
/** @type {?} */
TemplateComponent.prototype.formBar;
/** @type {?} */
TemplateComponent.prototype.actionBars;
/** @type {?} */
TemplateComponent.prototype.onSizeChange;
/** @type {?} */
TemplateComponent.prototype.onScroll;
/** @type {?} */
TemplateComponent.prototype.breakPoint;
/** @type {?} */
TemplateComponent.prototype.breakPoints;
/** @type {?} */
TemplateComponent.prototype.sizes;
/** @type {?} */
TemplateComponent.prototype.scrollRef;
/** @type {?} */
TemplateComponent.prototype.relative;
/**
* @type {?}
* @private
*/
TemplateComponent.prototype._device_info;
/**
* @type {?}
* @private
*/
TemplateComponent.prototype._route;
/**
* @type {?}
* @private
*/
TemplateComponent.prototype._deviceService;
/**
* @type {?}
* @private
*/
TemplateComponent.prototype._config;
/**
* @type {?}
* @private
*/
TemplateComponent.prototype._layoutRouterService;
/** @type {?} */
TemplateComponent.prototype.elementRef;
}
/**
* @record
*/
export function TemplateScrollRef() { }
if (false) {
/** @type {?} */
TemplateScrollRef.prototype.top;
/** @type {?} */
TemplateScrollRef.prototype.left;
}
/**
* @record
*/
export function TemplateSizes() { }
if (false) {
/** @type {?} */
TemplateSizes.prototype.width;
/** @type {?} */
TemplateSizes.prototype.height;
/** @type {?} */
TemplateSizes.prototype.header_height;
/** @type {?} */
TemplateSizes.prototype.offset_height;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVleC93ZWItZXh0ZW5zaW9ucy8iLCJzb3VyY2VzIjpbImxpYi9tb2R1bGVzL3RlbXBsYXRlL3RlbXBsYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxxQkFBcUIsRUFBYyxNQUFNLHFCQUFxQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztNQUVsRSxxQkFBcUIsR0FBRyxRQUFRO0FBV3RDLE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7O0lBVzVCLFlBQ1UsTUFBc0IsRUFDdEIsY0FBcUMsRUFDckMsT0FBc0IsRUFDdEIsb0JBQXlDLEVBQzFDLFVBQXNCO1FBSnJCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFDMUMsZUFBVSxH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Ozs7SUFDOUIsMkNBQTZDOzs7OztJQUM3QyxvQ0FBOEI7Ozs7O0lBQzlCLGlEQUFpRDs7SUFDakQsdUNBQTZCOzs7OztBQTRTakMsdUNBR0M7OztJQUZDLGdDQUFZOztJQUNaLGlDQUFhOzs7OztBQUdmLG1DQUtDOzs7SUFKQyw4QkFBYzs7SUFDZCwrQkFBZTs7SUFDZixzQ0FBc0I7O0lBQ3RCLHNDQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgQWZ0ZXJWaWV3SW5pdFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQUklNQVJZX09VVExFVCB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UsIERldmljZUluZm8gfSBmcm9tIFwibmd4LWRldmljZS1kZXRlY3RvclwiO1xyXG5cclxuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb25maWcuc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHsgQWN0aW9uQmFyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9hY3Rpb24tYmFyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBGb3JtQmFyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9mb3JtLWJhci5jb21wb25lbnRcIjtcclxuXHJcbmltcG9ydCB7IFRlbXBsYXRlU2l6ZSwgVGVtcGxhdGVUaGVtZSB9IGZyb20gXCIuL3RlbXBsYXRlLmVudW1cIjtcclxuaW1wb3J0IHsgTGF5b3V0Um91dGVyU2VydmljZSB9IGZyb20gXCIuLi9sYXlvdXQvc2VydmljZXMvcm91dGVyLnNlcnZpY2VcIjtcclxuXHJcbmNvbnN0IFJPVVRFX0RBVEFfQlJFQURDUlVNQiA9IFwiJHRpdGxlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJ1ZXgtdGVtcGxhdGVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6IFwidWV4LXRlbXBsYXRlXCIsXHJcbiAgICBcIlthdHRyLnRpdGxlXVwiOiBcIm51bGxcIixcclxuICAgIFwiW2F0dHIuc3VidGl0bGVdXCI6IFwibnVsbFwiXHJcbiAgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcclxuICBAQ29udGVudENoaWxkcmVuKEFjdGlvbkJhckNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxyXG4gIHByaXZhdGUgc2V0IF9hY3Rpb25CYXJzKGFjdGlvbl9iYXJzOiBRdWVyeUxpc3Q8QWN0aW9uQmFyQ29tcG9uZW50Pikge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5hY3Rpb25CYXJzID0gYWN0aW9uX2JhcnMudG9BcnJheSgpKSwgMCk7XHJcbiAgfVxyXG4gIEBDb250ZW50Q2hpbGQoRm9ybUJhckNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHByaXZhdGUgc2V0IF9mb3JtQmFyKFxyXG4gICAgZm9ybV9iYXI6IEZvcm1CYXJDb21wb25lbnRcclxuICApIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9ybUJhciA9IGZvcm1fYmFyKSwgMCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgX2RldmljZVNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NvbmZpZzogQ29uZmlnU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xheW91dFJvdXRlclNlcnZpY2U6IExheW91dFJvdXRlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZlxyXG4gICkge31cclxuXHJcbiAgQFZpZXdDaGlsZChcIndyYXBwZXJcIiwgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBfd3JhcHBlcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKFwiaGVhZGVyXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIF9oZWFkZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChcImNvbnRlbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBfY29udGVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KFwidGl0bGVcIikgdGl0bGU6IHN0cmluZztcclxuICBASW5wdXQoXCJzdWJ0aXRsZVwiKSBzdWJ0aXRsZTogc3RyaW5nO1xyXG4gIEBJbnB1dChcInR5cGVcIikgdHlwZSA9IFwiZGVmYXVsdFwiO1xyXG4gIEBJbnB1dChcInNob3ctaGVhZGVyXCIpIHNob3dfaGVhZGVyOiBib29sZWFuO1xyXG4gIEBJbnB1dChcInNob3ctbGF5b3V0LWhlYWRlclwiKSBzaG93X2xheW91dF9oZWFkZXI6IGJvb2xlYW47XHJcbiAgQElucHV0KFwic2hvdy1sYXlvdXQtc2lkZWJhclwiKSBzaG93X2xheW91dF9zaWRlYmFyOiBib29sZWFuO1xyXG4gIEBJbnB1dChcInNpemVcIikgc2l6ZTogVGVtcGxhdGVTaXplID0gVGVtcGxhdGVTaXplLlJFU1BPTlNJVkU7XHJcblxyXG4gIHB1YmxpYyBmb3JtQmFyOiBGb3JtQmFyQ29tcG9uZW50O1xyXG4gIHB1YmxpYyBhY3Rpb25CYXJzOiBBcnJheTxBY3Rpb25CYXJDb21wb25lbnQ+O1xyXG5cclxuICBwdWJsaWMgb25TaXplQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VGVtcGxhdGVTaXplcz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgcHVibGljIG9uU2Nyb2xsOiBFdmVudEVtaXR0ZXI8VGVtcGxhdGVTY3JvbGxSZWY+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBwdWJsaWMgYnJlYWtQb2ludDogVGVtcGxhdGVCcmVha1BvaW50O1xyXG4gIHB1YmxpYyBicmVha1BvaW50czogQXJyYXk8VGVtcGxhdGVCcmVha1BvaW50PiA9IFtcclxuICAgIFwieHNcIixcclxuICAgIFwic21cIixcclxuICAgIFwibWRcIixcclxuICAgIFwibGdcIixcclxuICAgIFwieGxcIlxyXG4gIF07XHJcblxyXG4gIHB1YmxpYyBzaXplczogVGVtcGxhdGVTaXplcyA9IHtcclxuICAgIHdpZHRoOiAwLFxyXG4gICAgaGVpZ2h0OiAwLFxyXG4gICAgaGVhZGVyX2hlaWdodDogMCxcclxuICAgIG9mZnNldF9oZWlnaHQ6IDBcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc2Nyb2xsUmVmOiBUZW1wbGF0ZVNjcm9sbFJlZiA9IHtcclxuICAgIHRvcDogMCxcclxuICAgIGxlZnQ6IDBcclxuICB9O1xyXG5cclxuICBwdWJsaWMgcmVsYXRpdmUgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfZGV2aWNlX2luZm86IERldmljZUluZm8gPSB0aGlzLl9kZXZpY2VTZXJ2aWNlLmdldERldmljZUluZm8oKTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIikgcHVibGljIF9vblJlc2l6ZSgpIHtcclxuICAgIHRoaXMucmVzaXplKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKFwic2Nyb2xsXCIpIHB1YmxpYyBfb25TY3JvbGwoKSB7XHJcbiAgICB0aGlzLnNjcm9sbFJlZiA9IHtcclxuICAgICAgdG9wOiB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuc2Nyb2xsVG9wLFxyXG4gICAgICBsZWZ0OiB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuc2Nyb2xsTGVmdFxyXG4gICAgfTtcclxuICAgIHRoaXMub25TY3JvbGwuZW1pdCh0aGlzLnNjcm9sbFJlZik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9sYXlvdXRSb3V0ZXJTZXJ2aWNlLnJlZ2lzdGVyVGVtcGxhdGUodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9sYXlvdXRSb3V0ZXJTZXJ2aWNlLnVucmVnaXN0ZXJUZW1wbGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMudGl0bGUpIHtcclxuICAgICAgICBjb25zdCByb290OiBBY3RpdmF0ZWRSb3V0ZSA9IHRoaXMuX3JvdXRlLnJvb3Q7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuX2dldEFjdGl2ZVJvdXRlKHJvb3QpLnNuYXBzaG90LmRhdGFbXHJcbiAgICAgICAgICBST1VURV9EQVRBX0JSRUFEQ1JVTUJcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZURhdGEoKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5fdXBkYXRlRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvKG9mZnNldDogbnVtYmVyLCBzbW9vdGg6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMuaGFzU2Nyb2xsKCkpIHtcclxuICAgICAgdGhpcy5fZ2V0U2Nyb2xsRWxlbWVudCgpLnNjcm9sbCh7XHJcbiAgICAgICAgdG9wOiBvZmZzZXQsXHJcbiAgICAgICAgYmVoYXZpb3I6IHNtb290aCA/IFwic21vb3RoXCIgOiBcImF1dG9cIlxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0FuY2hvcihhbmNob3I6IHN0cmluZywgc21vb3RoOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh0aGlzLmhhc1Njcm9sbCgpKSB7XHJcbiAgICAgIGlmIChhbmNob3IuaW5kZXhPZihcIiNcIikgIT09IDApIHtcclxuICAgICAgICBhbmNob3IgPSBgIyR7YW5jaG9yfWA7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGFuY2hvcik7XHJcbiAgICAgIGlmICghZWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zY3JvbGxUbygoPGFueT5lbCkub2Zmc2V0VG9wLCBzbW9vdGgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvVG9wKHNtb290aDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTY3JvbGwoKSkge1xyXG4gICAgICB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuc2Nyb2xsKHtcclxuICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgYmVoYXZpb3I6IHNtb290aCA/IFwic21vb3RoXCIgOiBcImF1dG9cIlxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0JvdHRvbShzbW9vdGg6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMuaGFzU2Nyb2xsKCkpIHtcclxuICAgICAgdGhpcy5fZ2V0U2Nyb2xsRWxlbWVudCgpLnNjcm9sbCh7XHJcbiAgICAgICAgdG9wOiB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuc2Nyb2xsSGVpZ2h0LFxyXG4gICAgICAgIGJlaGF2aW9yOiBzbW9vdGggPyBcInNtb290aFwiIDogXCJhdXRvXCJcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzaXplKCkge1xyXG4gICAgdGhpcy5fc2V0QnJlYWtQb2ludCgpO1xyXG4gICAgdGhpcy5fc2V0U2l6ZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0JyZWFrUG9pbnQoc2l6ZTogVGVtcGxhdGVCcmVha1BvaW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5icmVha1BvaW50ID09IHNpemU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNCcmVha1BvaW50TWluKHNpemU6IFRlbXBsYXRlQnJlYWtQb2ludCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5icmVha1BvaW50cy5pbmRleE9mKHNpemUpIDw9XHJcbiAgICAgIHRoaXMuYnJlYWtQb2ludHMuaW5kZXhPZih0aGlzLmJyZWFrUG9pbnQpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQnJlYWtQb2ludE1heChzaXplOiBUZW1wbGF0ZUJyZWFrUG9pbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuYnJlYWtQb2ludHMuaW5kZXhPZihzaXplKSA+PVxyXG4gICAgICB0aGlzLmJyZWFrUG9pbnRzLmluZGV4T2YodGhpcy5icmVha1BvaW50KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb25maWcocGF0aCk6IGFueSB7XHJcbiAgICBpZiAoIXRoaXMudHlwZSkge1xyXG4gICAgICB0aGlzLnR5cGUgPSBcImRlZmF1bHRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9jb25maWcpIHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVfdHlwZSA9XHJcbiAgICAgICAgdGhpcy5fY29uZmlnLnRlbXBsYXRlW3RoaXMudHlwZV0gfHxcclxuICAgICAgICB0aGlzLl9jb25maWcudGVtcGxhdGVbXCIxXCJdIHx8XHJcbiAgICAgICAgdGhpcy5fY29uZmlnLnRlbXBsYXRlLmRlZmF1bHQ7XHJcblxyXG4gICAgICBpZiAoIXRlbXBsYXRlX3R5cGUpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgc3dpdGNoIChwYXRoKSB7XHJcbiAgICAgICAgY2FzZSBcImJhY2tncm91bmQuY29sb3JcIjpcclxuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZV90eXBlLmJhY2tncm91bmQuY29sb3I7XHJcbiAgICAgICAgY2FzZSBcImJhY2tncm91bmQuaW1hZ2VcIjpcclxuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZV90eXBlLmJhY2tncm91bmQuaW1hZ2VcclxuICAgICAgICAgICAgPyBgdXJsKFwiJHt0ZW1wbGF0ZV90eXBlLmJhY2tncm91bmQuaW1hZ2V9XCIpYFxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJldHVybiBfLmdldCh0ZW1wbGF0ZV90eXBlLCBwYXRoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNUaGVtZSh0aGVtZV90eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldENvbmZpZyhcInRoZW1lXCIpID09IFRlbXBsYXRlVGhlbWVbdGhlbWVfdHlwZV07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFzRm9ybUJhcigpOiBib29sZWFuIHtcclxuICAgIC8vIHJldHVybiB0aGlzLmhhc19mb3JtX2JhcjtcclxuICAgIHJldHVybiB0aGlzLmZvcm1CYXIgJiYgdGhpcy5mb3JtQmFyLmNvbnRlbnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFzQWN0aW9uQmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uQmFycyAmJiB0aGlzLmFjdGlvbkJhcnMubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNTY3JvbGwoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fd3JhcHBlcikge1xyXG4gICAgICBjb25zdCBlbCA9IHRoaXMuX2dldFNjcm9sbEVsZW1lbnQodHJ1ZSk7XHJcbiAgICAgIC8vIGNvbnN0IHdyYXBwZXIgPSB0aGlzLl93cmFwcGVyLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlc1swXTtcclxuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuX3dyYXBwZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgcmV0dXJuIHdyYXBwZXIub2Zmc2V0SGVpZ2h0ID4gZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0U2Nyb2xsRWxlbWVudCh1c2VfYm9keTogYm9vbGVhbiA9IGZhbHNlKTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgaXNfc2FmYXJpID0gdGhpcy5fZGV2aWNlX2luZm8uYnJvd3NlciA9PSBcInNhZmFyaVwiO1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5sYXlvdXQucmVsYXRpdmVcclxuICAgICAgPyB1c2VfYm9keSB8fCBpc19zYWZhcmlcclxuICAgICAgICA/IGRvY3VtZW50LmJvZHlcclxuICAgICAgICA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxyXG4gICAgICA6IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0QnJlYWtQb2ludCgpIHtcclxuICAgIGNvbnN0IHdpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDtcclxuICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICBjYXNlIHdpZHRoIDwgNTc2OlxyXG4gICAgICAgIHRoaXMuYnJlYWtQb2ludCA9IFwieHNcIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSB3aWR0aCA+PSA1NzYgJiYgd2lkdGggPCA3Njg6XHJcbiAgICAgICAgdGhpcy5icmVha1BvaW50ID0gXCJzbVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHdpZHRoID49IDc2OCAmJiB3aWR0aCA8IDk5MjpcclxuICAgICAgICB0aGlzLmJyZWFrUG9pbnQgPSBcIm1kXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2Ugd2lkdGggPj0gOTkyICYmIHdpZHRoIDwgMTIwMDpcclxuICAgICAgICB0aGlzLmJyZWFrUG9pbnQgPSBcImxnXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2Ugd2lkdGggPiAxMjAwOlxyXG4gICAgICAgIHRoaXMuYnJlYWtQb2ludCA9IFwieGxcIjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldFNpemVzKCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2l6ZXMud2lkdGggPSB0aGlzLl9nZXRTY3JvbGxFbGVtZW50KCkuY2xpZW50V2lkdGg7XHJcbiAgICAgIHRoaXMuc2l6ZXMuaGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsRWxlbWVudCgpLm9mZnNldEhlaWdodDtcclxuICAgICAgdGhpcy5zaXplcy5oZWFkZXJfaGVpZ2h0ID0gdGhpcy5faGVhZGVyXHJcbiAgICAgICAgPyB0aGlzLl9oZWFkZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICA6IDA7XHJcbiAgICAgIGxldCBjb250ZW50X3BhZGRpbmcgPSAwO1xyXG4gICAgICBpZiAodGhpcy5fY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoXHJcbiAgICAgICAgICB0aGlzLl9jb250ZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfcGFkZGluZ190b3AgPSBwYXJzZUZsb2F0KFxyXG4gICAgICAgICAgY29udGVudF9zdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctdG9wXCIpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBjb250ZW50X3BhZGRpbmdfYm90dG9tID0gcGFyc2VGbG9hdChcclxuICAgICAgICAgIGNvbnRlbnRfc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nLWJvdHRvbVwiKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29udGVudF9wYWRkaW5nID0gY29udGVudF9wYWRkaW5nX3RvcCArIGNvbnRlbnRfcGFkZGluZ19ib3R0b207XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5zaXplcy5oZWlnaHQgLSB0aGlzLnNpemVzLmhlYWRlcl9oZWlnaHQ7XHJcbiAgICAgIHRoaXMuc2l6ZXMub2Zmc2V0X2hlaWdodCA9IG9mZnNldCAtIGNvbnRlbnRfcGFkZGluZztcclxuICAgICAgdGhpcy5vblNpemVDaGFuZ2UuZW1pdCh0aGlzLnNpemVzKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVEYXRhKCkge1xyXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5zaG93X2hlYWRlcikpIHtcclxuICAgICAgY29uc3Qgc2hvd19oZWFkZXIgPSB0aGlzLmdldENvbmZpZyhcImhlYWRlclwiKTtcclxuICAgICAgdGhpcy5zaG93X2hlYWRlciA9IF8uaXNCb29sZWFuKHNob3dfaGVhZGVyKSA/IHNob3dfaGVhZGVyIDogdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuc2hvd19sYXlvdXRfaGVhZGVyKSkge1xyXG4gICAgICBjb25zdCBzaG93X2xheW91dF9oZWFkZXIgPSB0aGlzLmdldENvbmZpZyhcImxheW91dC5oZWFkZXJcIik7XHJcbiAgICAgIHRoaXMuc2hvd19sYXlvdXRfaGVhZGVyID0gXy5pc0Jvb2xlYW4oc2hvd19sYXlvdXRfaGVhZGVyKVxyXG4gICAgICAgID8gc2hvd19sYXlvdXRfaGVhZGVyXHJcbiAgICAgICAgOiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5zaG93X2xheW91dF9zaWRlYmFyKSkge1xyXG4gICAgICBjb25zdCBzaG93X2xheW91dF9zaWRlYmFyID0gdGhpcy5nZXRDb25maWcoXCJsYXlvdXQuc2lkZWJhclwiKTtcclxuICAgICAgdGhpcy5zaG93X2xheW91dF9zaWRlYmFyID0gXy5pc0Jvb2xlYW4oc2hvd19sYXlvdXRfc2lkZWJhcilcclxuICAgICAgICA/IHNob3dfbGF5b3V0X3NpZGViYXJcclxuICAgICAgICA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbGF5b3V0Um91dGVyU2VydmljZS51cGRhdGVUZW1wbGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0QWN0aXZlUm91dGUocm91dGU6IEFjdGl2YXRlZFJvdXRlKTogQWN0aXZhdGVkUm91dGUge1xyXG4gICAgLy8gRmV0IHRoZSBjaGlsZCByb3V0ZXNcclxuICAgIGNvbnN0IGNoaWxkcmVuOiBBY3RpdmF0ZWRSb3V0ZVtdID0gcm91dGUuY2hpbGRyZW47XHJcbiAgICBsZXQgY3VycmVudDogQWN0aXZhdGVkUm91dGU7XHJcblxyXG4gICAgLy8gUmV0dXJuIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNoaWxkcmVuXHJcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiByb3V0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBjaGlsZHJlblxyXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICAvLyBWZXJpZnkgcHJpbWFyeSByb3V0ZVxyXG4gICAgICBpZiAoY2hpbGQub3V0bGV0ICE9PSBQUklNQVJZX09VVExFVCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSZWN1cnNpdmVcclxuICAgICAgY3VycmVudCA9IHRoaXMuX2dldEFjdGl2ZVJvdXRlKGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRlbXBsYXRlQnJlYWtQb2ludCA9IFwieHNcIiB8IFwic21cIiB8IFwibWRcIiB8IFwibGdcIiB8IFwieGxcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVTY3JvbGxSZWYge1xyXG4gIHRvcDogbnVtYmVyO1xyXG4gIGxlZnQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVNpemVzIHtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIGhlYWRlcl9oZWlnaHQ6IG51bWJlcjtcclxuICBvZmZzZXRfaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuIl19