tnx-shared 5.1.328 → 5.1.331

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2070,7 +2070,7 @@ export class CrudFormComponent extends ComponentBase {
2070
2070
  CrudFormComponent.decorators = [
2071
2071
  { type: Component, args: [{
2072
2072
  selector: 'crud-form',
2073
- template: "<div [class]=\"_styleClass\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input [placeholder]=\"control.placeholder\"\r\n [required]=\"control.validators && control.validators.required\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\r\n [(ngModel)]=\"data[control.field]\" [max]=\"control.max\" [min]=\"control.min\"\r\n [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'reference-text'\">\r\n <reference-textbox [control]=\"control\" [value]=\"data[control.field]\"></reference-textbox>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\r\n [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce *ngIf=\"!checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\r\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\r\n [readonly]=\"control.disabled\" [layout]=\"control.layout\" [maxFileSize]=\"control.maxFileSize\"\r\n [inTaiLieu]=\"control.inTaiLieu\" [inTaiLieuChung]=\"control.inTaiLieuChung\"\r\n [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\" (onSelected)=\"control.onSelected($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [readOnlyValues]=\"data[control.field + '_readOnly']\" [(ngModel)]=\"data[control.field]\"\r\n [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n <!-- <tn-checkbox [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></tn-checkbox> -->\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\" [readOnly]=\"control.readOnly\"\r\n [loaiVanBan]=\"control.loaiVanBan\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percent'\">\r\n <div>\r\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onSlideEnd)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-slider>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table class=\"new-table scr-table table-control\" [value]=\"data[control.field]\"\r\n [columns]=\"control.headerTemplate\" [responsive]=\"true\" [scrollable]=\"false\"\r\n [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 5%\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n style=\"text-align: center;\" [style.width]=\"subControl.width\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\" [style.width]=\"control.widthFunctionColumn\"\r\n class=\"table-function column-function\">\r\n <div class=\"cell-header-function\"><span>Ch\u1EE9c n\u0103ng</span></div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td class=\"stt\" style=\"text-align: center; vertical-align: inherit\">\r\n <span>\r\n {{ri + 1}}\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\"\r\n [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\r\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"control.showFunction\" style=\"text-align: center\"\r\n class=\"column-function text-center\">\r\n <div *ngIf=\"!control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-save\" [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-pencil\" [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton\r\n class=\"p-button-text p-button-danger p-button-rounded\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n </div>\r\n <div *ngIf=\"control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: _modelData[control.field][ri], rowIndex: ri, path: path, control: control}\">\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\r\n <ng-container *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\">\r\n </ng-container>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span *ngIf=\"control.showDialog\" style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\" [ngTemplateOutletContext]=\"{\r\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #templateCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>",
2073
+ template: "<div [class]=\"_styleClass\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input [placeholder]=\"control.placeholder\"\r\n [required]=\"control.validators && control.validators.required\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\r\n [(ngModel)]=\"data[control.field]\" [max]=\"control.max\" [min]=\"control.min\"\r\n [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'reference-text'\">\r\n <reference-textbox [control]=\"control\" [value]=\"data[control.field]\"></reference-textbox>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\r\n [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce *ngIf=\"!checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\r\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\r\n [readonly]=\"control.disabled\" [layout]=\"control.layout\" [maxFileSize]=\"control.maxFileSize\"\r\n [inTaiLieu]=\"control.inTaiLieu\" [inTaiLieuChung]=\"control.inTaiLieuChung\"\r\n [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\" (onSelected)=\"control.onSelected($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [readOnlyValues]=\"data[control.field + '_readOnly']\" [(ngModel)]=\"data[control.field]\"\r\n [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n <!-- <tn-checkbox [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></tn-checkbox> -->\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\" [readOnly]=\"control.readOnly\"\r\n [loaiVanBan]=\"control.loaiVanBan\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percent'\">\r\n <div>\r\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onSlideEnd)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-slider>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table class=\"new-table scr-table table-control\" [value]=\"data[control.field]\"\r\n [columns]=\"control.headerTemplate\" [responsive]=\"true\" [scrollable]=\"false\"\r\n [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template pTemplate=\"colgroup\">\r\n <colgroup>\r\n <col *ngIf=\"control.showNumber\" style=\"width: 5%\" />\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <col [style.width]=\"subControl.width\" />\r\n </ng-container>\r\n <col *ngIf=\"control.enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"control.showFunction\" [style.width]=\"control.widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\" class=\"table-function column-function\">\r\n <div class=\"cell-header-function\"><span>Ch\u1EE9c n\u0103ng</span></div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td *ngIf=\"control.showNumber\" class=\"stt\"\r\n style=\"text-align: center; vertical-align: inherit\">\r\n <span>\r\n {{ri + 1}}\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\"\r\n [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\r\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"control.showFunction\" style=\"text-align: center\"\r\n class=\"column-function text-center\">\r\n <div *ngIf=\"!control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-save\" [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-pencil\" [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton\r\n class=\"p-button-text p-button-danger p-button-rounded\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n </div>\r\n <div *ngIf=\"control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: _modelData[control.field][ri], rowIndex: ri, path: path, control: control}\">\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\r\n <ng-container *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\">\r\n </ng-container>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span *ngIf=\"control.showDialog\" style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\" [ngTemplateOutletContext]=\"{\r\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #templateCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>",
2074
2074
  providers: [ComponentContextService],
2075
2075
  styles: [".label-only{font-weight:700;margin-bottom:1em}div.label{position:relative}div.label .star-required{color:red;padding-left:.2em;padding-top:.3em;position:absolute}div.type-container.not-show-in-box-holder{padding:0}.--table-schema-footer{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;color:#495057;display:flex;font-weight:600;padding:.5em}.show-in-box{border:1px solid #ced4da;border-radius:5px}.not-show-in-box{padding:0}.view-mode div.label{padding-bottom:3px}.view-mode div.label label{font-size:.85em;font-weight:700}.view-mode>span:not(:empty){display:inline-block;padding:5px 0;width:100%}.view-mode.type-table div.label+div{padding:5px 0}td>.view-mode{display:inline-block;padding:.25rem .5rem}td>.view-mode .view-mode{padding:0}.crud-form-control div[role=checkbox-alone]{margin-top:24px}.crud-form-control div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control .label+div[role=checkbox-alone]{margin-top:11px}.crud-form-control.type-table div[role=checkbox-alone]{margin-top:6px;text-align:center}.crud-form-control.type-table div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control.type-table div[role=checkbox-alone].align-left{text-align:left}.crud-form-control.type-title{border-bottom:1px solid #cfcfcf;color:#025ba7;font-size:1.2rem;font-weight:700;margin-bottom:5px;padding:5px;text-transform:uppercase}.crud-form-control.type-title>.label{margin-bottom:0}.control-description{color:#6c757d;font-size:.8rem;margin-bottom:5px;margin-left:10px}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}::ng-deep .crud-form-control .tn-check-box-list{margin-top:5px}::ng-deep .crud-form-control>div.label{font-size:.9em;height:1.15em;margin-bottom:5px}::ng-deep .crud-form-control>div.label+*{width:100%}::ng-deep .crud-form-control>.error-container .error-item{-webkit-animation:shrink .1s;animation:shrink .1s;min-height:20px;overflow:visible;padding-top:5px}::ng-deep .crud-form-control>.error-container .error-item .error-content{-webkit-animation:fadeIn .1s;animation:fadeIn .1s;color:red;display:flex;font-size:.9em;position:relative}::ng-deep .crud-form-control>.error-container .error-item .error-content i{display:flex;font-size:.9em;padding-top:1px}::ng-deep .crud-form-control>.error-container .error-item .error-content span{display:flex;padding-left:5px}::ng-deep .crud-form-control.no-label>div.label{display:none}::ng-deep .crud-form-control.error .p-dropdown,::ng-deep .crud-form-control.error .p-inputtext,::ng-deep .crud-form-control.error .p-multiselect,::ng-deep .crud-form-control.error .tn-dropdown,::ng-deep .crud-form-control.error input,::ng-deep .crud-form-control.error select,::ng-deep .crud-form-control.error textarea{border-color:#ff5722!important}::ng-deep .crud-form-control.error .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error .p-inputtext:enabled:focus,::ng-deep .crud-form-control.error .tn-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 0 .2rem #ffc4b3}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-multiselect,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .tn-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) input,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) select,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) textarea{border-color:#ced4da!important}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown.tn-dropdown.p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa}@-webkit-keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@-webkit-keyframes shrink{0%{height:0}to{height:20px}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}::ng-deep crud-form .crud-form-container{padding:.5rem .5rem 0}::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control),::ng-deep crud-form base-congviec-form crud-form>.crud-form-container{padding:0}:host ::ng-deep .tox-tinymce{border:none;border-top:1px solid #ccc;overflow:unset}:host ::ng-deep .tox-tinymce .tox-editor-container{overflow:unset}:host ::ng-deep .tox-tinymce .tox-toolbar{border:1px solid #ccc;border-bottom:none}:host ::ng-deep .tox-tinymce .tox-edit-area{border:1px solid #ccc}:host ::ng-deep .tox-tinymce .tox-edit-area iframe{box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}:host ::ng-deep .tox-tinymce .tox-menubar{border:1px solid #ccc}:host ::ng-deep .tox .tox-edit-area.tinymce-focus{border:1px solid #66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 3px 0 #66afe9;transition:box-shadow .3s,border-color .3s;transition-delay:0s,0s;transition-duration:.3s,.3s;transition-property:box-shadow,border-color;transition-timing-function:ease,ease}:host ::ng-deep .rq .tox .tox-edit-area{border-left-color:#ff4c46}.no-value{font-size:.8em}:host ::ng-deep .table-schema-paging{display:block;margin-bottom:40px}"]
2076
2076
  },] }
@@ -2318,4 +2318,4 @@ export class ControlTreeNode {
2318
2318
  }
2319
2319
  }
2320
2320
  }
2321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLCtCQUErQixFQUMvQixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsOEJBQThCLEVBQzlCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQixlQUFlLEVBQ2YsZUFBZSxFQUNm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UyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFjLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRixZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBGb3JtU3RhdGUsIEtleUZsYXNoU2hvdyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcclxuaW1wb3J0IHtcclxuICAgIEFkZHJlc3NDb250cm9sU2NoZW1hLFxyXG4gICAgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSxcclxuICAgIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBCdXR0b25Db250cm9sU2NoZW1hLFxyXG4gICAgQ2hlY2tib3hDb250cm9sU2NoZW1hLFxyXG4gICAgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSxcclxuICAgIENvQ2F1VG9DaHVjQ29udHJvbFNjaGVtYSxcclxuICAgIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIENvbG9yQ29udHJvbFNjaGVtYSxcclxuICAgIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIENvbHVtblNjaGVtYUJhc2UsXHJcbiAgICBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb250YWluZXJTY2hlbWEsXHJcbiAgICBDcnVkRm9ybVNldHRpbmcsXHJcbiAgICBDcnVkTGlzdFNldHRpbmcsXHJcbiAgICBDdXN0b21Db250cm9sU2NoZW1hLFxyXG4gICAgRGF0ZVRpbWVDb250cm9sU2NoZW1hLFxyXG4gICAgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBEcm9wZG93bkNvbnRyb2xTY2hlbWEsXHJcbiAgICBFZGl0b3JDb250cm9sU2NoZW1hLFxyXG4gICAgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEV2ZW50RGF0YSxcclxuICAgIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hLFxyXG4gICAgRmlsZVVwbG9hZE1vZGUsXHJcbiAgICBGb3JtQ29udHJvbEJhc2UsXHJcbiAgICBGb3JtQ29udHJvbEJhc2VXaXRoU2VydmljZSxcclxuICAgIEZvcm1TY2hlbWFCYXNlLFxyXG4gICAgS2V5RnVuY3Rpb25SZWxvYWQsXHJcbiAgICBLZXlWYWx1ZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBMYWJlbFNjaGVtYSxcclxuICAgIE1hc2tDb250cm9sU2NoZW1hLFxyXG4gICAgTnVtYmVyUmFuZ2VDb250cm9sU2NoZW1hLFxyXG4gICAgT3BlcmF0b3IsXHJcbiAgICBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgUGVyY2VudENvbnRyb2xTY2hlbWEsXHJcbiAgICBQb3B1cFNpemUsXHJcbiAgICBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLFxyXG4gICAgUmVmZXJlbmNlVGV4dENvbnRyb2xTY2hlbWEsXHJcbiAgICBTcGFuQ29udHJvbFNjaGVtYSxcclxuICAgIFN3aXRjaENvbnRyb2xTY2hlbWEsXHJcbiAgICBUYWJsZVNjaGVtYSxcclxuICAgIFRlbXBsYXRlQ29udHJvbFNjaGVtYSxcclxuICAgIFRleHRBbGlnbixcclxuICAgIFRleHRBcmVhQ29udHJvbFNjaGVtYSxcclxuICAgIFRleHRDb250cm9sU2NoZW1hLFxyXG4gICAgVGl0bGVTY2hlbWEsXHJcbiAgICBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIFZhbkJhblBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBXcmFwUGlja2VyQ29udHJvbFNjaGVtYVxyXG59IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb25zdC9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktcGlja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXN0ZXJEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21hc3Rlci1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERyb3Bkb3duU2VydmljZSB9IGZyb20gJy4uLy4uL2Ryb3Bkb3duL3NlcnZpY2VzL2Ryb3Bkb3duLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBiYXNlVHJpbmhLeSwgZ2V0UmVnZXhSZXN1bHQsIGdldFN0cmluZ0Rpc3BsYXlWYWx1ZSwgbG9vcEN1cnNvckZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcclxuaW1wb3J0IHtcclxuICAgIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yLFxyXG4gICAgQ2hlY2tEdXBsaWNhdGVWYWxpZGF0b3IsXHJcbiAgICBDb21wYXJlVmFsaWRhdG9yLFxyXG4gICAgRGF0ZUNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBFbWFpbFZhbGlkYXRvcixcclxuICAgIE51bWJlckNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBOdW1iZXJPbmx5VmFsaWRhdG9yLFxyXG4gICAgUGhvbmVOdW1iZXJWYWxpZGF0b3IsXHJcbiAgICBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcixcclxuICAgIFJlcXVpcmVkVmFsaWRhdG9yLFxyXG4gICAgU2FtZVZhbHVlVmFsaWRhdG9yXHJcbn0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Jhc2UvdmFsaWRhdG9ycyc7XHJcbmltcG9ydCB7IGlzQXJyYXksIGlzTGl0ZXJhbE9iamVjdCwgbWVyZ2VKU09OLCBtZXJnZUpTT05PbGQgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvZW52aXJvbm1lbnQtc2NoZW1hJztcclxuaW1wb3J0IHsgQ29tQ3R4Q29uc3RhbnRzIH0gZnJvbSAnLi8uLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi8uLi8uLi8uLi9tb2RlbHMvZ3JpZC1pbmZvJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcblxyXG4vLyBmaXggZm9yIGJ1aWxkIHByb2RcclxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcclxuXHJcbmRlY2xhcmUgdmFyIHRpbnltY2U6IGFueTtcclxuXHJcbmNvbnN0IG9wZXJhdG9yQ29udHJhc3QgPSB7XHJcbiAgICBbT3BlcmF0b3IuZ3JlYXRlcl06IE9wZXJhdG9yLmxvd2VyLFxyXG4gICAgW09wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5sb3dlclRoYW5FcXVhbCxcclxuICAgIFtPcGVyYXRvci5sb3dlcl06IE9wZXJhdG9yLmdyZWF0ZXIsXHJcbiAgICBbT3BlcmF0b3IubG93ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY3J1ZC1mb3JtJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jcnVkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtDb21wb25lbnRDb250ZXh0U2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENydWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICAgIEBWaWV3Q2hpbGQoJ2Zvcm1FbGVtZW50JykgZm9ybUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdjb250ZXh0TWVudScsIHsgc3RhdGljOiBmYWxzZSB9KSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlQ29uZ1ZpZWNGb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCB0ZW1wbGF0ZUNvbmdWaWVjRm9ybSh2YWx1ZTogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVzW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dCgpIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcclxuICAgIEBJbnB1dCgpIGNvbnRleHQ6IENvbXBvbmVudENvbnRleHRTZXJ2aWNlO1xyXG5cclxuICAgIEBJbnB1dCgpIGZpbGVzVXBsb2FkZWQgPSBbXTtcclxuICAgIEBJbnB1dCgpIGlzVmlld01vZGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVLZXlwcmVzc0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVDYWNoaW5nID0gZmFsc2U7XHJcbiAgICBfc3R5bGVDbGFzcyA9ICdwLWZsdWlkIGNydWQtZm9ybS1jb250YWluZXInO1xyXG4gICAgQElucHV0KCkgc2V0IHN0eWxlQ2xhc3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZUNsYXNzICs9IGAgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBmb3JtSWQgPSAnJztcclxuICAgIEBJbnB1dCgpIGZvcm1DbGFzcyA9ICcnO1xyXG4gICAgQElucHV0KCkgYXV0b0ZvY3VzID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHRyYXBGb2N1cyA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgc2V0IGRhdGEodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY2FuUHJpbnQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5fbWluaW1pemVkRGF0YSAhPSB2YWx1ZSAmJiBpc0xpdGVyYWxPYmplY3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YSA9IG1lcmdlSlNPTih0aGlzLl9tb2RlbERhdGEsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5jbGVhbigpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKHRoaXMuX21vZGVsRGF0YSwgdGhpcy5mb3JtQ29udHJvbHMpO1xyXG4gICAgICAgICAgICB0aGlzLl9yb290Tm9kZS5zZXRDcnVkRm9ybSh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdtb2RlbENoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZWQuZW1pdChldmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZERhdGFFZGl0T2xkICYmIHRoaXMubG9hZGVkRGF0YUVkaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FuUHJpbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb2RlbERhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnbW9kZWxDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgQElucHV0KCkgZm9ybVN0YXRlOiBGb3JtU3RhdGUgPSBGb3JtU3RhdGUuRURJVDtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25Gb3JtUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWxsQ29udHJvbFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BZnRlclRyaW5oS3kgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBfcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIF9taW5pbWl6ZWREYXRhOiBhbnk7XHJcbiAgICBfbW9kZWxEYXRhOiBhbnkgPSB7fTtcclxuICAgIF91bnN1YnNjcmliZUFsbCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIF9pblZhbGlkRm9ybSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIERvYyB0dSBjYXUgaGluaCB0aGFtIHNvIGhlIHRob25nXHJcbiAgICBsaW1pdFNpemUgPSAwO1xyXG4gICAgZm9ybUNvbnRyb2xzOiBhbnkgPSBbXTtcclxuICAgIGZ1bmNDaGVja1VuaXF1ZUZpZWxkOiBhbnkgPSB7fTtcclxuICAgIGJlZm9yZURhdGE6IGFueSA9IHt9O1xyXG4gICAgZmlyc3REaXZIb2xkZXI6IGFueTtcclxuICAgIGNhY2hlZFZhbHVlcyA9IHt9O1xyXG4gICAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfSA9IHt9O1xyXG4gICAgX3ByZWZpeEN1c3RvbUhlYWRlciA9ICdjdXN0b21IZWFkZXJfJztcclxuICAgIGNvbmdWaWVjU2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nO1xyXG5cclxuICAgIGxvYWRlZERhdGFFZGl0T2xkID0gZmFsc2U7XHJcbiAgICBsb2FkZWREYXRhRWRpdCA9IGZhbHNlO1xyXG4gICAgY2FuUHJpbnQgPSBmYWxzZTtcclxuXHJcbiAgICB0YWJsZUZvcm1TaG93ID0gZmFsc2U7XHJcbiAgICB0YWJsZUZvcm1UaXRsZTogc3RyaW5nO1xyXG4gICAgdGFibGVGb3JtUG9wdXBTaXplID0gbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiAxMTAwLCBoZWlnaHQ6IDY1MCB9KTtcclxuICAgIHRhYmxlRm9ybURhdGE6IGFueSA9IHt9O1xyXG4gICAgdGFibGVGb3JtQ3VycmVudFJvdzogbnVtYmVyO1xyXG4gICAgdGFibGVGb3JtU2NoZW1hOiBGb3JtU2NoZW1hQmFzZVtdID0gW107XHJcbiAgICB0YWJsZUZvcm1DdXJyZW50SW5mbzogYW55ID0ge307XHJcblxyXG4gICAgYnV0dG9uQ29udGV4dHM6IE1lbnVJdGVtW10gPSBbXTtcclxuICAgIHJvd0RhdGFDdXJyZW50OiBhbnkgPSB7fTtcclxuICAgIGNvbnRyb2xOZWVkQ2hlY2tSZWFkeTogRm9ybVNjaGVtYUJhc2VbXSA9IFtdO1xyXG4gICAgcmVhZHlTdGF0dXM6IGFueSA9IHt9O1xyXG4gICAgZmllbGRQYXJlbnRGaWVsZCA9ICdwYXJlbnRGaWVsZCc7XHJcbiAgICB3YWl0UmVhZHlBbmRQcmludFRpbWVvdXQ6IGFueTtcclxuICAgIHB1YmxpYyBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2U7XHJcbiAgICBwdWJsaWMgX21hc3RlckRhdGFTZXJ2aWNlOiBNYXN0ZXJEYXRhU2VydmljZTtcclxuICAgIHB1YmxpYyBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIHB1YmxpYyBfY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfZHJvcGRvd25TZXJ2aWNlOiBEcm9wZG93blNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICBwdWJsaWMgX2VudGl0eVBpY2tlclNlcnZpY2U6IEVudGl0eVBpY2tlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnOiBNb2R1bGVDb25maWdTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTm90aWZpZXJTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChNYXN0ZXJEYXRhU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVXNlclNlcnZpY2UpO1xyXG5cclxuICAgICAgICAvLyBHZXQgQ29uZmlndXJhdGlvblN5c3RlbVxyXG4gICAgICAgIHRoaXMuX21hc3RlckRhdGFTZXJ2aWNlLmdldENvbmZpZ0J5Q29kZSgnU2l6ZU9mRmlsZScpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGltaXRTaXplID0gTnVtYmVyKHJlc3BvbnNlKSAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaGlkZGVuVHJpbmhLeSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICBuZXcgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAncHJpbnRGaWxlSWQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRmlsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICBoaWRkZW5DaGVjazogKG1vZGVsLCBjdXJyZW50Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW1vZGVsLnByaW50RmlsZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRMb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoVmlld01vZGUocmVhZG9ubHlWaWV3ID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuaXNWaWV3TW9kZSA9IHJlYWRvbmx5VmlldztcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKGNvbnRyb2wsIHRoaXMuaXNWaWV3TW9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZCgpIHtcclxuICAgICAgICB0aGlzLmluaXRMb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYW4oKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhbk1vZGVsKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGVhbk1vZGVsKG1vZGVsKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gJ19zdGF0dXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxba2V5XVtzXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICdfZXJyb3JzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBpbiBtb2RlbFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsW2tleV1bc10gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFuTW9kZWwobW9kZWxba2V5XSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheShtb2RlbCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFuTW9kZWwoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNaW5pbWl6ZURhdGEobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBpZiAobW9kZWwuX2Ryb3Bkb3dudmFsdWUgIT0gbnVsbCAmJiBtb2RlbC5fZHJvcGRvd252YWx1ZSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFttb2RlbC5fZHJvcGRvd252YWx1ZV0gfHwgbW9kZWxbJ3ZhbHVlJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEobW9kZWxba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuZ2V0TWluaW1pemVEYXRhKGl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZm9ybVJlYWR5JyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybVJlYWR5LmVtaXQoZm9ybUV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNjaGVtYSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSB0aGlzLmFwcGx5Q2FjaGVkVmFsdWVzKCk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdmb3JtUmVhZHknLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNjaGVtYSgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3Rvcihjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGjhu7FjIGhp4buHbiBzYXUgY8O5bmcga2hpIHThuqV0IGPhuqMgbW9kZWwgxJHDoyBpbml0IHhvbmdcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGEuaWQpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE11bHRpUm93KGNvbnRyb2wsIGFkZE1vcmUsIF9wYXJlbnRQYXRoLCAnaW5pdCcpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKGl0ZW0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoICsgJ1snICsgaSArICddJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPT0gbnVsbCB8fCAhaXNMaXRlcmFsT2JqZWN0KHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAvLyBpZiAoIXBhcmVudE1vZGVsLmhhc093blByb3BlcnR5KGNvbnRyb2wuZmllbGQpICYmIGNvbnRyb2wuZmllbGQgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICAvLyAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBjb250cm9sLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAvLyAgICAgLy8gfVxyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29udHJvbERlZmF1bHRWYWx1ZUZyb21FeHRlcm5hbCgpIHtcclxuICAgICAgICAvLyBjb25zdCBzY2hlbWFEeW5hbWljcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICAgICAgLy8gaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDdXN0b21Db250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIC8vICAgICAmJiB0aGlzLmNoZWNrSXNEeW5hbWljQ29udHJvbChjb250cm9sKVxyXG4gICAgICAgICAgICAvLyApIHtcclxuICAgICAgICAgICAgLy8gICAgIHNjaGVtYUR5bmFtaWNzLnB1c2goY29udHJvbCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVOG6oW0gdGjhu51pIGsgcmVuZGVyIGx1w7RuIHTDqm4gY8O0bmcgdmnhu4djIHRyb25nIGZvcm0gaW5pdCwgdsOsIMSRYW5nIGsga2nhu4NtIHNvw6F0IGRjIGtoaSBuw6BvIHThuqV0IGPhuqMgY29udHJvbCByZWFkeVxyXG4gICAgICAgIC8vIHNjaGVtYUR5bmFtaWNzLmZvckVhY2goc2NoZW1hID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5yZW5kZXJUZW5Db25nVmllYyh0aGlzLl9tb2RlbERhdGEsIHNjaGVtYSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbCwgY29udHJvbCwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgY29udHJvbC5maWVsZCk7XHJcblxyXG4gICAgICAgIGxldCBfcGFyZW50UGF0aCA9IGNvbnRyb2wuZmllbGQ7XHJcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZE1vcmUgPSBjb250cm9sLmluaXRSb3dDb3VudCAtIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGFkZE1vcmUgPiAwICYmICFwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKGl0ZW0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoICsgJ1snICsgaSArICddJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPT0gbnVsbCB8fCAhaXNMaXRlcmFsT2JqZWN0KHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5oYXNPd25Qcm9wZXJ0eShjb250cm9sLmZpZWxkKSAmJiBjb250cm9sLmZpZWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBjb250cm9sLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbC5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbFswXS52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgZmllbGQpIHtcclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zb3VyY2UpIHBhcmVudE1vZGVsLl9zb3VyY2UgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fc3RhdHVzKSBwYXJlbnRNb2RlbC5fc3RhdHVzID0ge307XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fZXJyb3JzKSBwYXJlbnRNb2RlbC5fZXJyb3JzID0ge307XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1c1tmaWVsZF0pIHBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdID0ge307XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fZXJyb3JzW2ZpZWxkXSkgcGFyZW50TW9kZWwuX2Vycm9yc1tmaWVsZF0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb250cm9sU2NoZW1hKHNjaGVtYTogRm9ybVNjaGVtYUJhc2UsIHBhcmVudElkPykge1xyXG4gICAgICAgIGlmIChzY2hlbWEuZGlzYWJsZWQgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc1ZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEubGFiZWwgJiYgIXNjaGVtYS5mdWxsTGFiZWwpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmZ1bGxMYWJlbCA9IHNjaGVtYS5sYWJlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYVxyXG4gICAgICAgICAgICB8fCBzY2hlbWEgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzY2hlbWEuc2hvd0xhYmVsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghc2NoZW1hLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEuZmllbGQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZCkge1xyXG4gICAgICAgICAgICBsZXQga2V5ID0gc2NoZW1hLmZpZWxkO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT0gbnVsbCkga2V5ID0gcGFyZW50SWQgKyAnLicgKyBrZXk7XHJcbiAgICAgICAgICAgIHNjaGVtYS51bmlxdWVGaWVsZCA9IGtleTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbHNba2V5XSA9IHNjaGVtYTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYVsnY29udHJvbFR5cGUnXSA9IHRoaXMuZ2V0Q29udHJvbFR5cGUoc2NoZW1hKTtcclxuICAgICAgICBzY2hlbWFbJ2RhdGFUeXBlJ10gPSB0aGlzLmdldFZpZXdNb2RlRGF0YVR5cGUoc2NoZW1hKTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLnNob3dTYXZlKSBidXR0b25Db3VudCsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIGJ1dHRvbkNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5zaG93RGVsZXRlKSBidXR0b25Db3VudCsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wucm93QnV0dG9ucykgYnV0dG9uQ291bnQrKztcclxuICAgICAgICAgICAgICAgIC8vIDIuMzU3IGzDoCBjaGnhu4F1IHLhu5luZyBj4bunYSBt4buXaSBidXR0b24sIDEgbMOgIHBhZGRpbmcgdHLDoWkgcGjhuqNpIDAuNXJlbVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSAyLjM1NyAqIGJ1dHRvbkNvdW50ICsgMTtcclxuICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDYpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLndpZHRoRnVuY3Rpb25Db2x1bW4gPSBgNi4zcmVtYDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbiA9IGAke3dpZHRofXJlbWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHN1YkNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXSA9IGNvbnRyb2wudW5pcXVlRmllbGQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIHNjaGVtYS51bmlxdWVGaWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEucmV0dXJuVHlwZSA9ICdvYmplY3QnO1xyXG4gICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEuZmlyZUNhbGxCYWNrSW5zaWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEubG9hZE9uSW5pdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpKSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEuZmlsdGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdXNlclBpY2tlckNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgdXNlclBpY2tlckNvbnRyb2xTY2hlbWEucmV0dXJuVHlwZSA9ICdvYmplY3QnO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJDb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF0gPSBjb250cm9sLnVuaXF1ZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbFNjaGVtYShzdWJDb250cm9sLCBjb250cm9sLnVuaXF1ZUZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZUNvbnRyb2xTY2hlbWEgPSA8QXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZUNvbnRyb2xTY2hlbWEucmV0dXJuVHlwZSA9ICdvYmplY3QnO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZmlyZUNhbGxCYWNrSW5zaWRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEN1c3RvbUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tJc1Rhc2tDb250cm9sKHNjaGVtYSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZ1ZpZWNTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25nVmllY1NldHRpbmcuaXNXb3JrZmxvd1RyZWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgbG9vcEN1cnNvckZ1bmN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFJlZ2V4UmVzdWx0KHNjaGVtYS5kYXRhLl9fdGVtcGxhdGVUYXNrTmFtZSwgUmVnZXhTcGxpdEZpZWxkQnlJdGVtLCBleGVjUmVzdWx0ID0+IGV4ZWNSZXN1bHRbMV0pLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hQ2hpbGQgPSB0aGlzLnNldHRpbmcuc2NoZW1hLmZpbmQocSA9PiBxLmZpZWxkID09IGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUNoaWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZU9uQ2hhbmdlRXZlbnQoc2NoZW1hQ2hpbGQsIChldnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVGVuQ29uZ1ZpZWMoZXZ0LnJvb3RNb2RlbCwgc2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRpc2FibGVDb250cm9sU2NoZW1hKHNjaGVtYTogRm9ybVNjaGVtYUJhc2UsIGRpc2FibGVkID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICghc2NoZW1hLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGRpc2FibGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29udHJvbFNjaGVtYShzdWJDb250cm9sLCBkaXNhYmxlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja0lzVGFza0NvbnRyb2woc2NoZW1hKSB7XHJcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5maWVsZCA9PSBGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXHJcbiAgICAgICAgICAgICYmIHNjaGVtYS5kYXRhXHJcbiAgICAgICAgICAgICYmIHNjaGVtYS5kYXRhLl9fdGVtcGxhdGVUYXNrTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJUZW5Db25nVmllYyhtb2RlbDogYW55LCBzY2hlbWE6IEN1c3RvbUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICBsZXQgdGVtcGxhdGVUZXh0ID0gc2NoZW1hLmRhdGEuX190ZW1wbGF0ZVRhc2tOYW1lO1xyXG4gICAgICAgIHNjaGVtYS5kYXRhLmZpZWxkUGFyZW50Rm9yVGFza3MuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlVGV4dCA9IHRlbXBsYXRlVGV4dC5yZXBsYWNlKGB7e2l0ZW0uJHtmaWVsZH19fWAsIGdldFN0cmluZ0Rpc3BsYXlWYWx1ZShtb2RlbFtmaWVsZF0pKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzY2hlbWEuZGF0YS50ZW5Db25nVmllYyA9IHRlbXBsYXRlVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzY2hlbWE6IGFueSkge1xyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duKGRyb3Bkb3duQ29udHJvbFNjaGVtYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8QXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgbGV0IHRtcEZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSkge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykgPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gYXdhaXQgZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0bXBGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlRmllbGQgPSBmaWx0ZXIuc291cmNlRmllbGQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gc291cmNlRmllbGQpO1xyXG4gICAgICAgICAgICBpZiAoIWZpbHRlci5zdWJGaWVsZFxyXG4gICAgICAgICAgICAgICAgJiYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSB8fCBzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLnN1YkZpZWxkID0gc2NoZW1hLnZhbHVlRmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBtYXJrZWRDb250cm9sID0ge307XHJcbiAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGRyb3Bkb3duQ29udHJvbFNjaGVtYSwgdG1wRmlsdGVycywgbWFya2VkQ29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGNoaWxkRHJvcGRvd246IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsIHRtcEZpbHRlcnM6IEZpbHRlcltdLCBtYXJrZWRDb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHRtcEZpbHRlcnMgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0bXBGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5mb3JtQ29udHJvbHNbc291cmNlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudERyb3Bkb3duICYmICFtYXJrZWRDb250cm9sW3NvdXJjZUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkRHJvcGRvd25bS2V5RnVuY3Rpb25SZWxvYWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXSA9IChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5lZWRHZXREYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uYWxsb3dMb2FkRGF0YVdoZW5QYXJlbnROdWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LmV2ZW50VHlwZSA9PSAnYWRqdXN0VmFsdWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudmFsdWUgPT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudC52YWx1ZSA9PSAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBldmVudC52YWx1ZS5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LnJlc2V0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkR2V0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkR2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fY3J1ZFNlcnZpY2UuZ2V0RmlsdGVyRnJvbVRlbXBsYXRlKHRtcEZpbHRlcnMsIGV2ZW50LnBhcmVudE1vZGVsLCBldmVudC5yb290TW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIShwYXJlbnREcm9wZG93biBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJlbnREcm9wZG93bi5fY29tcG9uZW50ICYmIHBhcmVudERyb3Bkb3duLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YShmaWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50ICYmIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LmdldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVPbkNoYW5nZUV2ZW50KHBhcmVudERyb3Bkb3duLCAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93biwgZmlsdGVyLmZpbHRlcnMsIG1hcmtlZENvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkTW9yZU9uQ2hhbmdlRXZlbnQoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBuZXdPbkNoYW5nZSkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkVHJpZ2dlckxvYWRDaGlsZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9sZFRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdG1wRmllbGRPbGRPbkNoYW5nZSA9ICdvbGRPbkNoYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbC5vbkNoYW5nZWQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gb2xkT25DaGFuZ2U7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZChldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbGRPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRFdmVudCA9IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9sZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEuY29ycmVjdG9ycykgc2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCFzY2hlbWEudmFsaWRhdG9ycykgc2NoZW1hLnZhbGlkYXRvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5yZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBSZXF1aXJlZFZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCBzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRTY2hlbWEgPSAoPFRleHRDb250cm9sU2NoZW1hPnNjaGVtYSk7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ251bWJlcicgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdhbW91bnQnKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgTnVtYmVyT25seVZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5JyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5aW50Jykge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2VtYWlsJykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IEVtYWlsVmFsaWRhdG9yKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGV4dFNjaGVtYS5jb3JyZWN0b3JzKSB0ZXh0U2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBHbWFpbENvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBMb3dlckNvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ3Bob25lJyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2ZheCcpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBQaG9uZU51bWJlclZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCB0ZXh0U2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3RvcihzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVTY2hlbWEgPSAoPERhdGVUaW1lQ29udHJvbFNjaGVtYT5zY2hlbWEpO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yIHx8IHZhbGlkYXRvciBpbnN0YW5jZW9mIENvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KHZhbGlkYXRvciwgZGF0ZVRpbWVTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYSwgdmFsaWRhdG9yLmdldER1cGxpY2F0ZUZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpLCB2YWxpZGF0b3IuZ2V0RGVmYXVsdEZpbHRlcnMoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFJlcXVpcmVkRmllbGRzKCksIHZhbGlkYXRvci5nZXRNZXNzYWdlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTYW1lVmFsdWVWYWxpZGF0b3JzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFNhbWVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KFxyXG4gICAgICAgIHZhbGlkYXRvcjogRGF0ZUNvbXBhcmVWYWxpZGF0b3IgfCBOdW1iZXJDb21wYXJlVmFsaWRhdG9yIHwgQ29tcGFyZVZhbGlkYXRvcixcclxuICAgICAgICBzY2hlbWE6IERhdGVUaW1lQ29udHJvbFNjaGVtYSB8IFRleHRDb250cm9sU2NoZW1hIHwgTWFza0NvbnRyb2xTY2hlbWFcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGNvbXBhcmVVbmlxdWVGaWVsZCA9IHZhbGlkYXRvci5jb21wYXJlVW5pcXVlRmllbGQ7XHJcbiAgICAgICAgaWYgKHNjaGVtYS51bmlxdWVGaWVsZCA9PSBjb21wYXJlVW5pcXVlRmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3JDb21wYXJlID0gdmFsaWRhdG9yLmdldE9wZXJhdG9yQ29tcGFyZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBzY2hlbWFDb21wYXJlID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbY29tcGFyZVVuaXF1ZUZpZWxkXSk7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWFDb21wYXJlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnNvbWUocCA9PiBwIGluc3RhbmNlb2YgQ29tcGFyZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHAuY29tcGFyZVVuaXF1ZUZpZWxkID09IHNjaGVtYS51bmlxdWVGaWVsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRGF0ZUNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IERhdGVDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIE51bWJlckNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IE51bWJlckNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nLCBkZWZhdWx0RmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0RHVwbGljYXRlRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UsIGRlZmF1bHRGaWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICBfdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFJlcXVpcmVkRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNhbWVWYWx1ZVZhbGlkYXRvcnMoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFNhbWVGaWVsZHMoKSkpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdmFsaWRhdG9yID0gbmV3IFNhbWVWYWx1ZVZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0RGF0YURlZmF1bHQoKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nRGF0YURlZmF1bHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5ERUZBVUxUX0RBVEEpO1xyXG4gICAgICAgIGNvbnN0IGdldFNldHRpbmdEYXRhRGVmYXVsdCA9IHRoaXMuX21vZHVsZUNvbmZpZy5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5zZXR0aW5nRGF0YURlZmF1bHQ7XHJcbiAgICAgICAgaWYgKHN0cmluZ0RhdGFEZWZhdWx0ICYmICh0aGlzLl9tb2RlbERhdGEgJiYgIXRoaXMuX21vZGVsRGF0YS5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPERyb3Bkb3duQ29udHJvbFNjaGVtYT5pdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSAoY29udHJvbC5maWVsZCArIChjb250cm9sLnZhbHVlRmllbGQgPT0gJ2lkJyA/ICcnIDogY29udHJvbC52YWx1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YUNhY2hlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRTZXR0aW5nRGF0YURlZmF1bHQpIHsgLy8gbOG6pXkgY+G6pXUgaMOsbmggZmllbGQgbWFwUGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE1hcEdldENhY2hlID0gZ2V0U2V0dGluZ0RhdGFEZWZhdWx0W2NvbnRyb2wuZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRNYXBHZXRDYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGZpZWxkTWFwR2V0Q2FjaGUgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVbKDxGb3JtU2NoZW1hQmFzZT5pdGVtKS5maWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVsoPEZvcm1TY2hlbWFCYXNlPml0ZW0pLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5mdW5jdGlvbi5tb2RpZnlEYXRhQWZ0ZXJHZXRDYWNoZSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5Q2FjaGVkVmFsdWVzKCkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKTtcclxuICAgICAgICB0aGlzLnNldENhY2hlZFZhbHVlVG9Nb2RlbCh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q2FjaGVkVmFsdWVUb01vZGVsKG1vZGVsLCB1bmlxdWVLZXlDb250cm9sPywgcGF0aD8pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZCAhPSAnX2Vycm9ycycgJiYgZmllbGQgIT0gJ19zdGF0dXMnICYmIGZpZWxkICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlVuaXF1ZUtleUNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlS2V5Q29udHJvbCAhPSBudWxsICYmIHVuaXF1ZUtleUNvbnRyb2wgIT09ICcnKSBzdWJVbmlxdWVLZXlDb250cm9sID0gdW5pcXVlS2V5Q29udHJvbCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJVbmlxdWVLZXlDb250cm9sID0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbHNbc3ViVW5pcXVlS2V5Q29udHJvbF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlBhdGg7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGggIT09ICcnKSBzdWJQYXRoID0gcGF0aCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJQYXRoID0gZmllbGQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBtb2RlbFtmaWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN1Yk1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKGl0ZW0sIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGggKyAnWycgKyBpbmRleCArICddJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNMaXRlcmFsT2JqZWN0KHN1Yk1vZGVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHN1Yk1vZGVsLCBzdWJVbmlxdWVLZXlDb250cm9sLCBzdWJQYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wuZW5hYmxlQ2FjaGluZyAmJiB0aGlzLmNhY2hlZFZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzdWJQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsW2ZpZWxkXSA9IHRoaXMuY2FjaGVkVmFsdWVzW3N1YlBhdGhdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmIChjYWNoZWRWYWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY2FjaGVkVmFsdWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXMgPSBlbGVtZW50LnZhbHVlcztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVDYWNoZVZhbHVlc1RvU3RvcmFnZSgpIHtcclxuICAgICAgICBsZXQgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmICghY2FjaGVkVmFsdWVzKSBjYWNoZWRWYWx1ZXMgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNhY2hlZFZhbHVlc1tpXTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlcyA9IHRoaXMuY2FjaGVkVmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoTmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogdGhpcy5jYWNoZWRWYWx1ZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVkVmFsdWVzJywgSlNPTi5zdHJpbmdpZnkoY2FjaGVkVmFsdWVzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlckNoYW5nZShmaWVsZFBhdGgpIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgbnVsbCwgJ3RyaWdnZXInLCBjdXJyZW50Tm9kZS5wYXJlbnRNb2RlbCwgY3VycmVudE5vZGUucGFyZW50TW9kZWxQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvRm9jdXMgJiYgIXRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSwgODAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElzTG9hZGVkRGF0YUVkaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0T2xkID0gdGhpcy5sb2FkZWREYXRhRWRpdDtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRyb2xUeXBlKGNvbnRyb2w6IGFueSkge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGl0bGVTY2hlbWEpIHJldHVybiAndGl0bGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTGFiZWxTY2hlbWEpIHJldHVybiAnbGFiZWwnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3BhbkNvbnRyb2xTY2hlbWEpIHJldHVybiAnc3BhbkNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHJldHVybiAnbWFzayc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnbnVtYmVycmFuZ2UnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dENvbnRyb2wgPSA8VGV4dENvbnRyb2xTY2hlbWE+Y29udHJvbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xyXG4gICAgICAgICAgICAgICAgfHwgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdwaG9uZSdcclxuICAgICAgICAgICAgICAgIHx8IHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdmYXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdwaG9uZU9yZmF4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFJlZmVyZW5jZVRleHRDb250cm9sU2NoZW1hKSByZXR1cm4gJ3JlZmVyZW5jZS10ZXh0JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRlbXBsYXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZW1wbGF0ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWVyYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkcm9wZG93bic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2VkaXRvcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbnRyb2xTY2hlbWEpIHJldHVybiAndGV4dGFyZWEnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgV3JhcFBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb21tb24tcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUGjhuqNpIMSR4buDIGTDsm5nIGTGsOG7m2kg4bufIGLDqm4gdHLDqm4gVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgdsOsIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUtcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXItcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVudGl0eVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZW50aXR5LXBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnb3JnYW5pemF0aW9uLXBpY2tlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29jYXV0b2NodWMtcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb0NhdVRvQ2h1Y0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYSkgcmV0dXJuICdzd2l0Y2gnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEpIHJldHVybiAnY2hlY2tib3hsaXN0JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdyYWRpb2J1dHRvbmxpc3QnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnc2VydmljZUZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvclBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSByZXR1cm4gJ3RhYmxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkgcmV0dXJuICdjb250YWluZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQnV0dG9uQ29udHJvbFNjaGVtYSkgcmV0dXJuICdidXR0b24nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd2YW5iYW4nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29uZ1ZpZWNQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2Nvbmd2aWVjJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFBlcmNlbnRDb250cm9sU2NoZW1hKSByZXR1cm4gJ3BlcmNlbnQnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sdW1uU2NoZW1hQmFzZSkgcmV0dXJuICdjb2x1bW4nO1xyXG4gICAgICAgIHJldHVybiAnY3VzdG9tJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Vmlld01vZGVEYXRhVHlwZShjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYSkgcmV0dXJuICd0aXRsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdtYXNrJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVDb250cm9sID0gPERhdGVUaW1lQ29udHJvbFNjaGVtYT5jb250cm9sO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZUNvbnRyb2wuc2hvd1RpbWUpIHJldHVybiAnZGF0ZXRpbWUnO1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RhdGUnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVkaXRvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnaHRtbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd1c2VyJztcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja2JveENvbnRyb2xTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja0JveExpc3RDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnaGFzRGF0YVNvdXJjZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wubW9kZSA9PSBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlU2VydmljZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZmlsZU1hbmFnZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWEpIHJldHVybiAnYWRkcmVzcyc7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgJiYgKGNvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xyXG4gICAgICAgICAgICAgICAgfHwgY29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXlpbnQnKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ21vbmV5JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JQaWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yQ29udHJvbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkgcmV0dXJuICd0YWJsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBLZXlWYWx1ZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXBwLWtleS12YWx1ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb250YWluZXInO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybShzZXRWYWxpZGF0ZUZvcm0gPSB0cnVlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgaWYgKHNldFZhbGlkYXRlRm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pblZhbGlkRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwodGhpcy5fcm9vdE5vZGUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5WYWxpZEZvcm0pIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVNb2RlbChjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2YgY3VycmVudE5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICBpZiAoIWNoaWxkTm9kZS5jb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLmNoaWxkTm9kZXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkTm9kZS5jb250cm9sWydfaGlkZGVuJ10pIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNoaWxkTm9kZSwgdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luVmFsaWRGb3JtID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZU1vZGVsKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybUNvbnRyb2woZmllbGRQYXRoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkUGF0aCk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xOb2RlKSB7XHJcbiAgICAgICAgICAgIGlmICghYXdhaXQgdGhpcy52YWxpZGF0ZShjb250cm9sTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVDaGFuZ2VEcm9wZG93bihjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGV2ZW50PywgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pIHtcclxuICAgICAgICBpZiAoY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09ICdoaWRlJykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIGV2ZW50LCAnY2hhbmdlJywgcGFyZW50TW9kZWwsIHBhcmVudFBhdGgsIHNvdXJjZU5vZGUsIGJ1YmJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBldmVudCwgZXZlbnRUeXBlLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDEkOG7gyBuZ3V5w6puIGjDoG0gZOG6oW5nIGFycm93IGZ1bmN0aW9uIHbDrCBjw7MgMSBz4buRIGZvcm0ga2jDoWMgZ+G7jWlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UgPSBhc3luYyAoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBldmVudD8sIGV2ZW50VHlwZT8sIHBhcmVudE1vZGVsPywgcGFyZW50UGF0aD8sIHNvdXJjZU5vZGU/LCBidWJibGU/KSA9PiB7XHJcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgLy8gcm93IGluIHRhYmxlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBwYXJlbnRNb2RlbCA9IHBhcmVudE5vZGUubW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gdmFsaWRhdGUgdmFsdWVcclxuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlKGN1cnJlbnROb2RlKTtcclxuXHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcclxuICAgICAgICAgICAgc291cmNlTm9kZTogc291cmNlTm9kZSB8fCBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlLFxyXG4gICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25DaGFuZ2VkKGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnROb2RlLnBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLnBhcmVudE5vZGUgIT0gcGFyZW50Tm9kZS5yb290Tm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UocGFyZW50Tm9kZS5jb250cm9sLCBldmVudCwgZXZlbnRUeXBlLCBwYXJlbnROb2RlLnBhcmVudE5vZGUubW9kZWwsIHBhcmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbFBhdGgsIHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nICYmIGNvbnRyb2wuZW5hYmxlQ2FjaGluZykge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVDb250cm9sVmFsdWUoY29udHJvbCwgdmFsdWUsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChldmVudERhdGEpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IGtoaSBkcm9wZG93biDEkWnhu4F1IGNo4buJbmggdmFsdWUgdOG7qyByYXcgdmFsdWUgZOG6oW5nIGd1aWQgfCBpbnQgfCAuLi4gPT4gb2JqZWN0IGtp4buDdSB7dmFsdWU6IGd1aWQgfCBpbnQgfCAuLi4sIC4uLiBbMSBz4buRIHRyxrDhu51uZyBraMOhY119XHJcbiAgICAgKiBAcGFyYW0gY29udHJvbFxyXG4gICAgICogQHBhcmFtIHBhcmVudFBhdGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUFkanVzdFZhbHVlRHJvcGRvd25FdmVudChjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdhZGp1c3RWYWx1ZScsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkanVzdGVkVmFsdWUoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkQ29tcGxldGUoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlV2l0aFNlcnZpY2UsIHBhcmVudFBhdGgsIGRhdGFTb3VyY2UpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkZWQoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hLCBwYXJlbnRQYXRoLCBkYXRhRnJvbURyb3Bkb3duOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlOiAnZGF0YVNvdXJjZUxvYWRlZCcsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgPyBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgOiBkYXRhRnJvbURyb3Bkb3duLmRhdGFTb3VyY2VcclxuICAgICAgICB9KTtcclxuICAgICAgICBldmVudERhdGFbJ2VsbSddID0gZGF0YUZyb21Ecm9wZG93bi5lbG07XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN0YXRlID09IEZvcm1TdGF0ZS5BRERcclxuICAgICAgICAgICAgJiYgY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICYmIGV2ZW50RGF0YS5kYXRhLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdIHx8ICF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gW2V2ZW50RGF0YS5kYXRhWzBdW2NvbnRyb2wudmFsdWVGaWVsZF1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gPSBldmVudERhdGEuZGF0YVswXVtjb250cm9sLnZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5jYWxsYmFja0RhdGFGaW5pc2goZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlUmVhZHlDb250cm9sUGlja2VyKGNvbnRyb2w6IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgfCBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSB8IENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2wsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdyZWFkeScsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25SZWFkeSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vblJlYWR5KGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVDb250cm9sUmVhZHlFdmVudChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm9uQ29udHJvbFJlYWR5LmVtaXQoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsRGF0YVtLZXlGbGFzaFNob3ddKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRQYXRoKSB7IC8vIMSQb+G6oW4gY29kZSB0cm9uZyBibG9jayBpZiBuw6B5IGNoxrBhIGNodeG6qW4sIHThuqFtIHRo4budaSBjb2RlIHRo4bq/IMSR4bq/biBraGkgZ+G6t3AgY2FzZSBuw6B5IHRow6wgeGVtIGzhuqFpIHNhdVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXR1c1tgJHtwYXJlbnRQYXRofS4ke2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXR1c1tgJHtjb250cm9sLmZpZWxkfWBdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2FuUHJpbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tDYW5QcmludCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10gJiYgdGhpcy5jYW5QcmludCkge1xyXG4gICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHdhaXRSZWFkeUFuZFByaW50KCkge1xyXG4gICAgICAgIGNvbnN0IHJlYWR5QWxsID0gdGhpcy5jaGVja1JlYWR5QWxsKCk7XHJcbiAgICAgICAgaWYgKHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWFkeUFsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd107XHJcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl9wcmludFBkZkJ5U2NoZW1hKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSwgdGhpcy5fbWluaW1pemVkRGF0YSwgdGhpcy5zZXR0aW5nLnNjaGVtYSlcclxuICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlcywgJycsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnVOG6oW8gZmlsZSB0aMOgbmggY8O0bmcnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhLnByaW50RmlsZUlkID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuY2xvbmVPYmplY3QodGhpcy5fbWluaW1pemVkRGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlV2FpdEJveCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmdldENvbmZpZygpLmVudmlyb25tZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VUcmluaEt5KGVudmlyb25tZW50LCB0aGlzLnNldHRpbmcsIHRoaXMuX21vZGVsRGF0YSwgcmVzLmRhdGEsIHRoaXMuX25vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQWZ0ZXJUcmluaEt5LmVtaXQoKTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50KCk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TW9kZWxUYWJsZVNjaGVtYUJ5Q2hpbGRTY2hlbWEoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbFRhYmxlID0gdGhpcy5mb3JtQ29udHJvbHNbY29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2xUYWJsZS5maWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja1JlYWR5QWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5oaWRkZW4gfHwgIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcGFyZW50RmllbGQgPSBjb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF07XHJcbiAgICAgICAgICAgIC8vIE7hur91IGzDoCBmaWVsZCB0cm9uZyB0YWJsZSBzY2hlbWFcclxuICAgICAgICAgICAgaWYgKHBhcmVudEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJNb2RlbEN1bmdMZXZlbCA9IHRoaXMuZ2V0TW9kZWxUYWJsZVNjaGVtYUJ5Q2hpbGRTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyTW9kZWxDdW5nTGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyck1vZGVsQ3VuZ0xldmVsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkeVN0YXR1c1tgJHtwYXJlbnRGaWVsZH1bJHtpfV0uJHtjb250cm9sLmZpZWxkfWBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucmVhZHlTdGF0dXNbYCR7Y29udHJvbC5maWVsZH1gXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZU1vZGVsRnJvbUV4dGVybmFsID0gKCkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gUGjhuqNpIMSR4buDIGFycm93IGZ1bmN0aW9uIHbDrCBjw7MgZXhwb3J0IHJhIGNobyBt4buZdCBz4buRIHRlbXBsYXRlIHPhu60gZOG7pW5nXHJcbiAgICBmaXJlTW9kZWxDaGFuZ2VkID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZS5lbWl0KHRoaXMuX21pbmltaXplZERhdGEpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQnV0dG9uQ2xpY2soY29udHJvbDogQnV0dG9uQ29udHJvbFNjaGVtYSwgZXZlbnQsIHBhcmVudFBhdGgpIHtcclxuICAgICAgICBpZiAoY29udHJvbC5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2xpY2sobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2NsaWNrJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgbGV0IHJlID0gY3VycmVudE5vZGUudmFsdWU7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5jb3JyZWN0b3JzICYmIGNvbnRyb2wuY29ycmVjdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb3JyZWN0b3IgPSBjb250cm9sLmNvcnJlY3RvcnNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdhdXRvQ29ycmVjdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZSA9IGNvcnJlY3Rvci5jb3JyZWN0KGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRydWUgbMOgIHRo4buPYSBtw6NuLCBmYWxzZSBsw6Aga2jDtG5nIHRo4buPYSBtw6NuICjhu54gY+G6pXAgaGnhu4duIHThuqFpIGNo4bupIGNoxrBhIGtp4buDbSB0cmEgY+G6pXAgY29uKVxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZShjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gY3VycmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbC5fZXJyb3JzW2N1cnJlbnROb2RlLmZpZWxkXTtcclxuICAgICAgICAgICAgaWYgKCFlcnJvcnMpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBlcnJvcnMuc3BsaWNlKDAsIGVycm9ycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWxpZGF0b3JzICYmIGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbnRyb2wudmFsaWRhdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3ZhbGlkYXRlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdmFsaWRhdG9yLnZhbGlkYXRlKGV2ZW50RGF0YSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSB2YWxpZGF0b3IuZ2V0RXJyb3IoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuaW5kZXhPZihlcnIpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIF9zZXRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSB7XHJcbiAgICAvLyAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xyXG4gICAgLy8gICAgIGlmIChub2RlID09IG51bGwpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdUcsaw4budbmcgZOG7ryBsaeG7h3Uga2jDtG5nIHThu5NuIHThuqFpJyk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY29uc3QgZXJyb3JzID0gbm9kZS5wYXJlbnROb2RlLm1vZGVsLl9lcnJvcnNbbm9kZS5maWVsZF07XHJcbiAgICAvLyAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHNldEVycm9yKGZpZWxkOiBzdHJpbmcgfCBzdHJpbmdbXSwgZXJyb3I6IHN0cmluZykge1xyXG4gICAgLy8gICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSlcclxuICAgIC8vICAgICAgICAgZmllbGQuZm9yRWFjaChpdGVtID0+IHRoaXMuX3NldEVycm9yKGl0ZW0sIGVycm9yKSk7XHJcbiAgICAvLyAgICAgZWxzZVxyXG4gICAgLy8gICAgICAgICB0aGlzLl9zZXRFcnJvcihmaWVsZCwgZXJyb3IpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHByaXZhdGUgY2FjaGVDb250cm9sVmFsdWUoY29udHJvbCwgdmFsdWUsIHBhcmVudFBhdGgpIHtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmVuYWJsZUNhY2hpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXNbcGFyZW50UGF0aCArICcuJyArIGNvbnRyb2wuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudEJ5VHlwZSh0ZW1wbGF0ZU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghdGhpcy50ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXSkge1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdID0gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLmNoaWxkcmVuLCB0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SXRlbUluQXJyYXlCeVZhbHVlKGFycmF5LCB2LCBjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdW5jR2V0TGFiZWwgPSBjb250cm9sLmZ1bmNHZXRMYWJlbDtcclxuICAgICAgICBpZiAoZnVuY0dldExhYmVsID09IG51bGwpIHtcclxuICAgICAgICAgICAgZnVuY0dldExhYmVsID0gaXRlbSA9PiBpdGVtW2NvbnRyb2wuZGlzcGxheUZpZWxkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgQXJyYXkgJiYgYXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgdkFyciA9IHY7XHJcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2KSkge1xyXG4gICAgICAgICAgICAgICAgdkFyciA9IHYudG9TdHJpbmcoKS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodkFyci5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBhcnJheS5maW5kKHggPT4geFtjb250cm9sLnZhbHVlRmllbGRdID09IHYpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY0dldExhYmVsKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZBcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5LmZpbHRlcihwID0+IHZBcnIuc29tZShxID0+IHEgPT0gcFtjb250cm9sLnZhbHVlRmllbGRdKSlcclxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gZnVuY0dldExhYmVsKGl0ZW0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJdGVtSW5BcnJheUJ5VGV4dFZhbHVlKGFycmF5LCB2KSB7XHJcbiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGFycmF5IGluc3RhbmNlb2YgQXJyYXlcclxuICAgICAgICAgICAgJiYgYXJyYXkubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gdi5qb2luKCc7ICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFkZHJlc3NEaXNwbGF5VGV4dChzZWxlY3RlZFZhbHVlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldExhYmVsQ2xhc3MoY29udHJvbCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBgbGFiZWwtY29udHJvbGA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuaW5kZXhMYWJlbCkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyBoYXZlSW5kZXgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9WaWV3KGVsZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZWxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaDE6IGFueSA9IGVsZS5jbG9zZXN0KCdkaXZbaWQkPVxcJy1ob2xkZXJcXCddJyk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaDEgJiYgaDEucHJldmlvdXNTaWJsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaDEgPSBoMS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGgxLnRhZ05hbWUgPT09ICdESVYnKSBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaDEgJiYgaDEuc2Nyb2xsSW50b1ZpZXcpIGgxLnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIFNldCBGb2N1cyBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAgICovXHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c0ZpcnN0Q29udHJvbCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBkaXZzID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGl2LmNydWQtZm9ybS1jb250cm9sJyk7XHJcbiAgICAgICAgaWYgKGRpdnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdERpdkhvbGRlciA9IGRpdjtcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSB0aGlzLmZpcnN0RGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Om5vdChbdHlwZT1maWxlXSk6bm90KFt0eXBlPWhpZGRlbl0pJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnYm9keScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYGRpdi5lcnJvcmA7XHJcbiAgICAgICAgY29uc3QgZGl2SG9sZGVyID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICAgICAgaWYgKGRpdkhvbGRlcikge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZmlyc3RDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCdib2R5JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGVwcmVjYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbnltY2UtZm9jdXMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcmV2ZW50Qmx1cihldmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyYXBGb2N1cykge1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgfHwgdGFyZ2V0LnRhZ05hbWUgPT0gJ0ZPUk0nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlkLmVuZHNXaXRoKCctaG9sZGVyJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHRoaXMuZmlyc3REaXZIb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q29udHJvbCA9IHRhcmdldC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCA9PSBldmVudC50YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1Zpc2libGUoZWxlbSkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcclxuICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHN0eWxlLnZpc2liaWxpdHkgIT09ICd2aXNpYmxlJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICgrc3R5bGUub3BhY2l0eSA8IDAuMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbS5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICArIGVsZW0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgICsgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXHJcbiAgICAgICAgICAgID09PSAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxlbUNlbnRlciA9IHtcclxuICAgICAgICAgICAgeDogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgZWxlbS5vZmZzZXRXaWR0aCAvIDIsXHJcbiAgICAgICAgICAgIHk6IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZWxlbS5vZmZzZXRIZWlnaHQgLyAyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHBvaW50Q29udGFpbmVyID0gPGFueT4oXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZWxlbUNlbnRlci54LCBlbGVtQ2VudGVyLnkpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAocG9pbnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvaW50Q29udGFpbmVyID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxyXG4gICAgICAgICAgICB9IHdoaWxlICgocG9pbnRDb250YWluZXIgPSBwb2ludENvbnRhaW5lci5wYXJlbnROb2RlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlUm93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dEZWxldGVDb25maXJtKCkudGhlbihhc3luYyBycyA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcnMpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgICAgICBjb25zdCB0b0RlbGV0ZVJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XHJcblxyXG4gICAgICAgICAgICBsZXQgdG9EZWxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0b0RlbGV0ZSA9IGNvbnRyb2wub25EZWxldGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdkZWxldGluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodG9EZWxldGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5yZWluaXRDaGlsZE5vZGVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAndGFibGVDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uRGVsZXRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0b0RlbGV0ZVJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdkZWxldGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZGROZXdSb3coY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPywgZGlzYWJsZU9wZW5EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnNob3dFZGl0ICYmICFkaXNhYmxlT3BlbkRpYWxvZykge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFRow6ptIG3hu5tpICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtQ3VycmVudFJvdyA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgICAgIHRhYmxlUGF0aCxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG9BZGQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IGNvbnRyb2wub25BZGRpbmcobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICdhZGRpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ3RhYmxlQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZE11bHRpUm93KGNvbnRyb2wsIGxlbmd0aCwgdGFibGVQYXRoLCBldmVudFR5cGU/KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmFkZE5ld1Jvdyhjb250cm9sLCB0YWJsZVBhdGgsIGV2ZW50VHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZVNhdmVkVGFibGVSb3coZGF0YSkge1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLmNvbnRyb2w7XHJcbiAgICAgICAgY29uc3QgdGFibGVQYXRoID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby50YWJsZVBhdGg7XHJcbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby5ldmVudFR5cGU7XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPiAtMSkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWxbdGhpcy50YWJsZUZvcm1DdXJyZW50Um93XSA9IHsgLi4udGFibGVOb2RlLm1vZGVsW3RoaXMudGFibGVGb3JtQ3VycmVudFJvd10sIC4uLmRhdGEgfTtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZU5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0YWJsZVBhdGggKyAnWycgKyBpbmRleCArICddJztcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChkYXRhLCBzdWJDb250cm9sLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHRvQWRkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9BZGQgPSBjb250cm9sLm9uQWRkaW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAnYWRkaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUucmVpbml0Q2hpbGROb2RlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ3RhYmxlQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2F2ZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uU2F2ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vblNhdmUobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3NhdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFPhu61hICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtU2NoZW1hID0gY29udHJvbC5yb3dUZW1wbGF0ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSBpbmRleDtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgdG9EZWxldGVSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtRGF0YSA9IHRvRGVsZXRlUm93Tm9kZS52YWx1ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIGluZGV4XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVSb3dPcmRlcmVkKGNvbnRyb2w6IFRhYmxlU2NoZW1hLCBldnQsIGV2ZW50VHlwZT8sIHBhcmVudE1vZGVsPywgcGFyZW50UGF0aD8sIHNvdXJjZU5vZGU/LCBidWJibGU/KSB7XHJcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgLy8gcm93IGluIHRhYmxlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBwYXJlbnRNb2RlbCA9IHBhcmVudE5vZGUubW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlb3JkZXJlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVvcmRlcmVkKGV2ZW50RGF0YSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0NvbnRleHRNZW51KGV2dCwgcm93RGF0YSwgY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLnJvd0RhdGFDdXJyZW50ID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gYXdhaXQgY29udHJvbC5yb3dCdXR0b25zKHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghdGhpcy5idXR0b25Db250ZXh0cyB8fCB0aGlzLmJ1dHRvbkNvbnRleHRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hvd0NvbnRleHRNZW51KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldnQpO1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWVzc2FnZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uTWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbk1lc3NhZ2UobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ21lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUYWJsZUZ1bmN0aW9uQ29sdW1uV2lkdGgoY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICBsZXQgbmUgPSA1MDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RGVsZXRlKSBuZSArPSAzMDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkgbmUgKz0gMzA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd1NhdmUpIG5lICs9IDMwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnJvd0J1dHRvbnMpIG5lICs9IDMwO1xyXG4gICAgICAgIHJldHVybiBuZSArICdweCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE1hc2tCeVR5cGUobWFza1R5cGUpIHtcclxuICAgICAgICBpZiAobWFza1R5cGUgPT0gJ2RlY2ltYWwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnZG90X3NlcGFyYXRvci41JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRleHRBbGlnbih0ZXh0QWxpZ246IG51bWJlcikge1xyXG4gICAgICAgIHN3aXRjaCAodGV4dEFsaWduKSB7XHJcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLkNlbnRlcjpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnY2VudGVyJztcclxuICAgICAgICAgICAgY2FzZSBUZXh0QWxpZ24uTGVmdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XHJcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLlJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdyaWdodCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrRGlzYWJsZWQoZGF0YTogYW55LCBjb250cm9sOiBGb3JtQ29udHJvbEJhc2UpIHtcclxuICAgICAgICByZXR1cm4gZGF0YS5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmRpc2FibGVkID09PSB0cnVlIHx8IChkYXRhLl9zdGF0dXNbY29udHJvbC5maWVsZF0uZGlzYWJsZWQgPT09IHVuZGVmaW5lZCAmJiBjb250cm9sLmRpc2FibGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0hpZGRlbihjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIHBhcmVudE1vZGVsOiBhbnksIHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHBhdGggJiYgY29udHJvbFsnbm9kZXMnXSkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNvbnRyb2xbJ25vZGVzJ11bcGF0aF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2xbJ19oaWRkZW4nXSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB8fCAocGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5oaWRkZW4gPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgJiYgKGNvbnRyb2wuaGlkZGVuXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKGNvbnRyb2wuaGlkZGVuQ2hlY2sgJiYgY29udHJvbC5oaWRkZW5DaGVjayh0aGlzLl9taW5pbWl6ZWREYXRhLCBjdXJyZW50Tm9kZSkpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgY29udHJvbFsnX2hpZGRlbiddID0gISFyZXN1bHQ7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZXh0VGQoY29udHJvbCwgZGF0YSwgaW5kZXgsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wsXHJcbiAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IGAke3RhYmxlUGF0aH1bJHtpbmRleH1dYCxcclxuICAgICAgICAgICAgcGF0aDogYCR7dGFibGVQYXRofVske2luZGV4fV0uJHtjb250cm9sLmZpZWxkfWAsXHJcbiAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXHJcbiAgICAgICAgICAgIG1kV2lkdGg6IDEyXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNNb2JpbGVPclRhYmxldCgpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKVxyXG4gICAgICAgICAgICB8fCB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNUYWJsZXQoKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2FjaGVWYWx1ZXNUb1N0b3JhZ2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNldHRpbmdzKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hT2xkZXN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX09MREVTVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFOZXdlc3QoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVXRVNULCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJsZVNjaGVtYU5leHQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVYVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFQcmV2KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX1BSRVYsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoKGV2dCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250cm9sRGF0YVNvdXJjZShjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIGlmIChkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGRhdGEuX3NvdXJjZVtjb250cm9sLmZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbC5kYXRhU291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBjb250cm9sLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlclJlbG9hZChmaWVsZDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmJpbmRpbmdGaWx0ZXJzICYmIGNvbnRyb2wuYmluZGluZ0ZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGNvbnRyb2wuYmluZGluZ0ZpbHRlcnNbMF0uZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiBwYXJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgc291cmNlRXZlbnQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBwYXJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnY2hhbmdlJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShwYXJlbnROb2RlKTtcclxuICAgICAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgICAgIHBhcmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sW0tleUZ1bmN0aW9uUmVsb2FkXSkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbFtLZXlGdW5jdGlvblJlbG9hZF0oZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb250cm9sLl9jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLl9jb21wb25lbnQuZ2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuX2NvbXBvbmVudC5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgbW9kZWxQYXRoOiBzdHJpbmc7XHJcbiAgICBzY2hlbWFQYXRoOiBzdHJpbmc7XHJcbiAgICBmaWVsZDogc3RyaW5nO1xyXG4gICAgcGFyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIGNoaWxkTm9kZXM6IENvbnRyb2xUcmVlTm9kZVtdID0gW107XHJcbiAgICBjb250cm9sOiBGb3JtQ29udHJvbEJhc2U7XHJcbiAgICBmb3JtQ29udHJvbHM7XHJcbiAgICBrZXlzUGx1czogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIF9jcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBhbnk7XHJcbiAgICBwcml2YXRlIGhhc1NjaGVtYSA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IobW9kZWw6IGFueSwgc2NoZW1hczogW10sIGZpZWxkPywgcGFyZW50Tm9kZT86IENvbnRyb2xUcmVlTm9kZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG1vZGVsO1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xzID0gc2NoZW1hcztcclxuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5tb2RlbFBhdGggIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFBhdGggPSBwYXJlbnROb2RlLm1vZGVsUGF0aCArICdbJyArIGZpZWxkICsgJ10nO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IHBhcmVudE5vZGUuc2NoZW1hUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1NjaGVtYSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFBhdGggPSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IGZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlID0gcGFyZW50Tm9kZS5yb290Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkO1xyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbCA9IHNjaGVtYXNbdGhpcy5zY2hlbWFQYXRoXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xbJ25vZGVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xbJ25vZGVzJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXVt0aGlzLm1vZGVsUGF0aF0gPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYXNbdGhpcy5zY2hlbWFQYXRoXTtcclxuICAgICAgICBsZXQga2V5c1BsdXMgPSBbXTtcclxuICAgICAgICBpZiAoc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLmNvbnRyb2xzLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzUGx1cyA9IHNjaGVtYS5yb3dUZW1wbGF0ZS5maWx0ZXIocSA9PiBxLmZpZWxkKS5tYXAocSA9PiBxLmZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYVBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gT2JqZWN0LmtleXMoc2NoZW1hcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5rZXlzUGx1cyA9IGtleXNQbHVzO1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXMobW9kZWwsIHNjaGVtYXMsIGtleXNQbHVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVpbml0Q2hpbGROb2RlcygpIHtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXModGhpcy5kYXRhLCB0aGlzLmZvcm1Db250cm9scywgdGhpcy5rZXlzUGx1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q2hpbGROb2Rlcyhtb2RlbDogYW55LCBzY2hlbWFzOiBbXSwga2V5c1BsdXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYWxsS2V5ID0gbmV3IFNldChbLi4ua2V5c1BsdXMsIC4uLk9iamVjdC5rZXlzKG1vZGVsKV0pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBhbGxLZXkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJyAmJiBrZXkgIT0gS2V5Rmxhc2hTaG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZShtb2RlbFtrZXldLCBzY2hlbWFzLCBrZXksIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVEaWNbY2hpbGROb2RlLmZpZWxkXSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKGl0ZW0sIHNjaGVtYXMsIGksIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnROb2RlID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2RlRGljW2NoaWxkTm9kZS5maWVsZF0gPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGlsZE5vZGUoZmllbGQpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZURpY1tmaWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3J1ZEZvcm0oY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5fY3J1ZEZvcm0gPSBjcnVkRm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50TW9kZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5tb2RlbDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50TW9kZWxQYXRoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWxQYXRoO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRDb250cm9sKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbW9kZWwodmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF0gPSB2YWw7XHJcbiAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXTtcclxuICAgICAgICBlbHNlIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZhbHVlKHZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdID0gdmFsO1xyXG4gICAgICAgIGVsc2UgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRIaWRkZW4oZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XHJcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGYsIGhpZGRlbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRIaWRkZW5GaWVsZChmaWVsZCwgaGlkZGVuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRIaWRkZW5GaWVsZChmaWVsZDogc3RyaW5nLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignLicpID4gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5nZXROb2RlQnlQYXRoKGAke3RoaXMubW9kZWxQYXRofS4ke2ZpZWxkfWApO1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZC5zcGxpdCgnLicpLnBvcCgpO1xyXG4gICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZS5kYXRhLl9zdGF0dXNbbGFzdEZpZWxkXS5oaWRkZW4gPSBoaWRkZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuX3N0YXR1c1tmaWVsZF0uaGlkZGVuID0gaGlkZGVuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5UGF0aChtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChtb2RlbFBhdGggPT0gbnVsbCB8fCBtb2RlbFBhdGggPT09ICcnKSByZXR1cm4gdGhpcy5yb290Tm9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5UcmVlKHRoaXMucm9vdE5vZGUsIG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5U2NoZW1hUGF0aChzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAoc2NoZW1hUGF0aCA9PSBudWxsIHx8IHNjaGVtYVBhdGggPT09ICcnKSByZXR1cm4gdGhpcy5yb290Tm9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kU2NoZW1hSW5UcmVlKHRoaXMucm9vdE5vZGUsIHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaW5kSW5UcmVlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgbW9kZWxQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAobm9kZS5tb2RlbFBhdGggIT0gbnVsbCAmJiBub2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpID09IG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gbm9kZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLm1vZGVsUGF0aCAhPSBudWxsICYmIG1vZGVsUGF0aC5zdGFydHNXaXRoKGNoaWxkTm9kZS5tb2RlbFBhdGgudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZEluVHJlZShjaGlsZE5vZGUsIG1vZGVsUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlKSByZXR1cm4gcmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaW5kU2NoZW1hSW5UcmVlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgc2NoZW1hUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hUGF0aCAhPSBudWxsICYmIG5vZGUuc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpID09IHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5zY2hlbWFQYXRoICE9IG51bGwgJiYgc2NoZW1hUGF0aC5zdGFydHNXaXRoKGNoaWxkTm9kZS5zY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSB0aGlzLmZpbmRTY2hlbWFJblRyZWUoY2hpbGROb2RlLCBzY2hlbWFQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUpIHJldHVybiByZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RGF0YVNvdXJjZVRhYmxlU2NoZW1hKHBhdGg6IHN0cmluZywgZGF0YVNvdXJjZTogYW55W10pIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgocGF0aCk7XHJcbiAgICAgICAgaWYgKCF0YWJsZU5vZGUubW9kZWwpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0YWJsZU5vZGUubW9kZWwubGVuZ3RoID4gZGF0YVNvdXJjZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsID0gdGFibGVOb2RlLm1vZGVsLnNwbGljZShkYXRhU291cmNlLmxlbmd0aCwgZGF0YVNvdXJjZS5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlTm9kZS5tb2RlbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBtZXJnZUpTT05PbGQodGFibGVOb2RlLm1vZGVsW2ldLCBkYXRhU291cmNlW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSB0YWJsZU5vZGUubW9kZWwubGVuZ3RoOyBpIDwgZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybS5hZGROZXdSb3coPFRhYmxlU2NoZW1hPnRhYmxlTm9kZS5jb250cm9sLCBwYXRoLCBudWxsLCB0cnVlKTtcclxuICAgICAgICAgICAgbWVyZ2VKU09OT2xkKHRhYmxlTm9kZS5tb2RlbFtpXSwgZGF0YVNvdXJjZVtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
2321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLCtCQUErQixFQUMvQixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsOEJBQThCLEVBQzlCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQixlQUFlLEVBQ2YsZUFBZSxFQUNm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UyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFjLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRixZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBGb3JtU3RhdGUsIEtleUZsYXNoU2hvdyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcclxuaW1wb3J0IHtcclxuICAgIEFkZHJlc3NDb250cm9sU2NoZW1hLFxyXG4gICAgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSxcclxuICAgIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBCdXR0b25Db250cm9sU2NoZW1hLFxyXG4gICAgQ2hlY2tib3hDb250cm9sU2NoZW1hLFxyXG4gICAgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSxcclxuICAgIENvQ2F1VG9DaHVjQ29udHJvbFNjaGVtYSxcclxuICAgIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIENvbG9yQ29udHJvbFNjaGVtYSxcclxuICAgIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIENvbHVtblNjaGVtYUJhc2UsXHJcbiAgICBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb250YWluZXJTY2hlbWEsXHJcbiAgICBDcnVkRm9ybVNldHRpbmcsXHJcbiAgICBDcnVkTGlzdFNldHRpbmcsXHJcbiAgICBDdXN0b21Db250cm9sU2NoZW1hLFxyXG4gICAgRGF0ZVRpbWVDb250cm9sU2NoZW1hLFxyXG4gICAgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBEcm9wZG93bkNvbnRyb2xTY2hlbWEsXHJcbiAgICBFZGl0b3JDb250cm9sU2NoZW1hLFxyXG4gICAgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEV2ZW50RGF0YSxcclxuICAgIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hLFxyXG4gICAgRmlsZVVwbG9hZE1vZGUsXHJcbiAgICBGb3JtQ29udHJvbEJhc2UsXHJcbiAgICBGb3JtQ29udHJvbEJhc2VXaXRoU2VydmljZSxcclxuICAgIEZvcm1TY2hlbWFCYXNlLFxyXG4gICAgS2V5RnVuY3Rpb25SZWxvYWQsXHJcbiAgICBLZXlWYWx1ZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBMYWJlbFNjaGVtYSxcclxuICAgIE1hc2tDb250cm9sU2NoZW1hLFxyXG4gICAgTnVtYmVyUmFuZ2VDb250cm9sU2NoZW1hLFxyXG4gICAgT3BlcmF0b3IsXHJcbiAgICBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgUGVyY2VudENvbnRyb2xTY2hlbWEsXHJcbiAgICBQb3B1cFNpemUsXHJcbiAgICBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLFxyXG4gICAgUmVmZXJlbmNlVGV4dENvbnRyb2xTY2hlbWEsXHJcbiAgICBTcGFuQ29udHJvbFNjaGVtYSxcclxuICAgIFN3aXRjaENvbnRyb2xTY2hlbWEsXHJcbiAgICBUYWJsZVNjaGVtYSxcclxuICAgIFRlbXBsYXRlQ29udHJvbFNjaGVtYSxcclxuICAgIFRleHRBbGlnbixcclxuICAgIFRleHRBcmVhQ29udHJvbFNjaGVtYSxcclxuICAgIFRleHRDb250cm9sU2NoZW1hLFxyXG4gICAgVGl0bGVTY2hlbWEsXHJcbiAgICBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIFZhbkJhblBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBXcmFwUGlja2VyQ29udHJvbFNjaGVtYVxyXG59IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb25zdC9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktcGlja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXN0ZXJEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21hc3Rlci1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERyb3Bkb3duU2VydmljZSB9IGZyb20gJy4uLy4uL2Ryb3Bkb3duL3NlcnZpY2VzL2Ryb3Bkb3duLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBiYXNlVHJpbmhLeSwgZ2V0UmVnZXhSZXN1bHQsIGdldFN0cmluZ0Rpc3BsYXlWYWx1ZSwgbG9vcEN1cnNvckZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcclxuaW1wb3J0IHtcclxuICAgIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yLFxyXG4gICAgQ2hlY2tEdXBsaWNhdGVWYWxpZGF0b3IsXHJcbiAgICBDb21wYXJlVmFsaWRhdG9yLFxyXG4gICAgRGF0ZUNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBFbWFpbFZhbGlkYXRvcixcclxuICAgIE51bWJlckNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBOdW1iZXJPbmx5VmFsaWRhdG9yLFxyXG4gICAgUGhvbmVOdW1iZXJWYWxpZGF0b3IsXHJcbiAgICBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcixcclxuICAgIFJlcXVpcmVkVmFsaWRhdG9yLFxyXG4gICAgU2FtZVZhbHVlVmFsaWRhdG9yXHJcbn0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Jhc2UvdmFsaWRhdG9ycyc7XHJcbmltcG9ydCB7IGlzQXJyYXksIGlzTGl0ZXJhbE9iamVjdCwgbWVyZ2VKU09OLCBtZXJnZUpTT05PbGQgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvZW52aXJvbm1lbnQtc2NoZW1hJztcclxuaW1wb3J0IHsgQ29tQ3R4Q29uc3RhbnRzIH0gZnJvbSAnLi8uLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi8uLi8uLi8uLi9tb2RlbHMvZ3JpZC1pbmZvJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcblxyXG4vLyBmaXggZm9yIGJ1aWxkIHByb2RcclxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcclxuXHJcbmRlY2xhcmUgdmFyIHRpbnltY2U6IGFueTtcclxuXHJcbmNvbnN0IG9wZXJhdG9yQ29udHJhc3QgPSB7XHJcbiAgICBbT3BlcmF0b3IuZ3JlYXRlcl06IE9wZXJhdG9yLmxvd2VyLFxyXG4gICAgW09wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5sb3dlclRoYW5FcXVhbCxcclxuICAgIFtPcGVyYXRvci5sb3dlcl06IE9wZXJhdG9yLmdyZWF0ZXIsXHJcbiAgICBbT3BlcmF0b3IubG93ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY3J1ZC1mb3JtJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jcnVkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtDb21wb25lbnRDb250ZXh0U2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENydWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICAgIEBWaWV3Q2hpbGQoJ2Zvcm1FbGVtZW50JykgZm9ybUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdjb250ZXh0TWVudScsIHsgc3RhdGljOiBmYWxzZSB9KSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlQ29uZ1ZpZWNGb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCB0ZW1wbGF0ZUNvbmdWaWVjRm9ybSh2YWx1ZTogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVzW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dCgpIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcclxuICAgIEBJbnB1dCgpIGNvbnRleHQ6IENvbXBvbmVudENvbnRleHRTZXJ2aWNlO1xyXG5cclxuICAgIEBJbnB1dCgpIGZpbGVzVXBsb2FkZWQgPSBbXTtcclxuICAgIEBJbnB1dCgpIGlzVmlld01vZGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVLZXlwcmVzc0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVDYWNoaW5nID0gZmFsc2U7XHJcbiAgICBfc3R5bGVDbGFzcyA9ICdwLWZsdWlkIGNydWQtZm9ybS1jb250YWluZXInO1xyXG4gICAgQElucHV0KCkgc2V0IHN0eWxlQ2xhc3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZUNsYXNzICs9IGAgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBmb3JtSWQgPSAnJztcclxuICAgIEBJbnB1dCgpIGZvcm1DbGFzcyA9ICcnO1xyXG4gICAgQElucHV0KCkgYXV0b0ZvY3VzID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHRyYXBGb2N1cyA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgc2V0IGRhdGEodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY2FuUHJpbnQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5fbWluaW1pemVkRGF0YSAhPSB2YWx1ZSAmJiBpc0xpdGVyYWxPYmplY3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YSA9IG1lcmdlSlNPTih0aGlzLl9tb2RlbERhdGEsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5jbGVhbigpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKHRoaXMuX21vZGVsRGF0YSwgdGhpcy5mb3JtQ29udHJvbHMpO1xyXG4gICAgICAgICAgICB0aGlzLl9yb290Tm9kZS5zZXRDcnVkRm9ybSh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdtb2RlbENoYW5nZWQnLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZWQuZW1pdChldmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZERhdGFFZGl0T2xkICYmIHRoaXMubG9hZGVkRGF0YUVkaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FuUHJpbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb2RlbERhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnbW9kZWxDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgQElucHV0KCkgZm9ybVN0YXRlOiBGb3JtU3RhdGUgPSBGb3JtU3RhdGUuRURJVDtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25Gb3JtUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWxsQ29udHJvbFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BZnRlclRyaW5oS3kgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBfcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIF9taW5pbWl6ZWREYXRhOiBhbnk7XHJcbiAgICBfbW9kZWxEYXRhOiBhbnkgPSB7fTtcclxuICAgIF91bnN1YnNjcmliZUFsbCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIF9pblZhbGlkRm9ybSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIERvYyB0dSBjYXUgaGluaCB0aGFtIHNvIGhlIHRob25nXHJcbiAgICBsaW1pdFNpemUgPSAwO1xyXG4gICAgZm9ybUNvbnRyb2xzOiBhbnkgPSBbXTtcclxuICAgIGZ1bmNDaGVja1VuaXF1ZUZpZWxkOiBhbnkgPSB7fTtcclxuICAgIGJlZm9yZURhdGE6IGFueSA9IHt9O1xyXG4gICAgZmlyc3REaXZIb2xkZXI6IGFueTtcclxuICAgIGNhY2hlZFZhbHVlcyA9IHt9O1xyXG4gICAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfSA9IHt9O1xyXG4gICAgX3ByZWZpeEN1c3RvbUhlYWRlciA9ICdjdXN0b21IZWFkZXJfJztcclxuICAgIGNvbmdWaWVjU2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nO1xyXG5cclxuICAgIGxvYWRlZERhdGFFZGl0T2xkID0gZmFsc2U7XHJcbiAgICBsb2FkZWREYXRhRWRpdCA9IGZhbHNlO1xyXG4gICAgY2FuUHJpbnQgPSBmYWxzZTtcclxuXHJcbiAgICB0YWJsZUZvcm1TaG93ID0gZmFsc2U7XHJcbiAgICB0YWJsZUZvcm1UaXRsZTogc3RyaW5nO1xyXG4gICAgdGFibGVGb3JtUG9wdXBTaXplID0gbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiAxMTAwLCBoZWlnaHQ6IDY1MCB9KTtcclxuICAgIHRhYmxlRm9ybURhdGE6IGFueSA9IHt9O1xyXG4gICAgdGFibGVGb3JtQ3VycmVudFJvdzogbnVtYmVyO1xyXG4gICAgdGFibGVGb3JtU2NoZW1hOiBGb3JtU2NoZW1hQmFzZVtdID0gW107XHJcbiAgICB0YWJsZUZvcm1DdXJyZW50SW5mbzogYW55ID0ge307XHJcblxyXG4gICAgYnV0dG9uQ29udGV4dHM6IE1lbnVJdGVtW10gPSBbXTtcclxuICAgIHJvd0RhdGFDdXJyZW50OiBhbnkgPSB7fTtcclxuICAgIGNvbnRyb2xOZWVkQ2hlY2tSZWFkeTogRm9ybVNjaGVtYUJhc2VbXSA9IFtdO1xyXG4gICAgcmVhZHlTdGF0dXM6IGFueSA9IHt9O1xyXG4gICAgZmllbGRQYXJlbnRGaWVsZCA9ICdwYXJlbnRGaWVsZCc7XHJcbiAgICB3YWl0UmVhZHlBbmRQcmludFRpbWVvdXQ6IGFueTtcclxuICAgIHB1YmxpYyBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2U7XHJcbiAgICBwdWJsaWMgX21hc3RlckRhdGFTZXJ2aWNlOiBNYXN0ZXJEYXRhU2VydmljZTtcclxuICAgIHB1YmxpYyBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIHB1YmxpYyBfY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfZHJvcGRvd25TZXJ2aWNlOiBEcm9wZG93blNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICBwdWJsaWMgX2VudGl0eVBpY2tlclNlcnZpY2U6IEVudGl0eVBpY2tlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnOiBNb2R1bGVDb25maWdTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTm90aWZpZXJTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChNYXN0ZXJEYXRhU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVXNlclNlcnZpY2UpO1xyXG5cclxuICAgICAgICAvLyBHZXQgQ29uZmlndXJhdGlvblN5c3RlbVxyXG4gICAgICAgIHRoaXMuX21hc3RlckRhdGFTZXJ2aWNlLmdldENvbmZpZ0J5Q29kZSgnU2l6ZU9mRmlsZScpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGltaXRTaXplID0gTnVtYmVyKHJlc3BvbnNlKSAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaGlkZGVuVHJpbmhLeSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICBuZXcgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAncHJpbnRGaWxlSWQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRmlsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICBoaWRkZW5DaGVjazogKG1vZGVsLCBjdXJyZW50Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW1vZGVsLnByaW50RmlsZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRMb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoVmlld01vZGUocmVhZG9ubHlWaWV3ID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuaXNWaWV3TW9kZSA9IHJlYWRvbmx5VmlldztcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKGNvbnRyb2wsIHRoaXMuaXNWaWV3TW9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZCgpIHtcclxuICAgICAgICB0aGlzLmluaXRMb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYW4oKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhbk1vZGVsKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGVhbk1vZGVsKG1vZGVsKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gJ19zdGF0dXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxba2V5XVtzXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICdfZXJyb3JzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBpbiBtb2RlbFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsW2tleV1bc10gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFuTW9kZWwobW9kZWxba2V5XSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheShtb2RlbCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFuTW9kZWwoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNaW5pbWl6ZURhdGEobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBpZiAobW9kZWwuX2Ryb3Bkb3dudmFsdWUgIT0gbnVsbCAmJiBtb2RlbC5fZHJvcGRvd252YWx1ZSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFttb2RlbC5fZHJvcGRvd252YWx1ZV0gfHwgbW9kZWxbJ3ZhbHVlJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEobW9kZWxba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuZ2V0TWluaW1pemVEYXRhKGl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZm9ybVJlYWR5JyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybVJlYWR5LmVtaXQoZm9ybUV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNjaGVtYSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSB0aGlzLmFwcGx5Q2FjaGVkVmFsdWVzKCk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdmb3JtUmVhZHknLFxyXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNjaGVtYSgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3Rvcihjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGjhu7FjIGhp4buHbiBzYXUgY8O5bmcga2hpIHThuqV0IGPhuqMgbW9kZWwgxJHDoyBpbml0IHhvbmdcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGEuaWQpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE11bHRpUm93KGNvbnRyb2wsIGFkZE1vcmUsIF9wYXJlbnRQYXRoLCAnaW5pdCcpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKGl0ZW0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoICsgJ1snICsgaSArICddJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPT0gbnVsbCB8fCAhaXNMaXRlcmFsT2JqZWN0KHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAvLyBpZiAoIXBhcmVudE1vZGVsLmhhc093blByb3BlcnR5KGNvbnRyb2wuZmllbGQpICYmIGNvbnRyb2wuZmllbGQgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICAvLyAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBjb250cm9sLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAvLyAgICAgLy8gfVxyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29udHJvbERlZmF1bHRWYWx1ZUZyb21FeHRlcm5hbCgpIHtcclxuICAgICAgICAvLyBjb25zdCBzY2hlbWFEeW5hbWljcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICAgICAgLy8gaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDdXN0b21Db250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIC8vICAgICAmJiB0aGlzLmNoZWNrSXNEeW5hbWljQ29udHJvbChjb250cm9sKVxyXG4gICAgICAgICAgICAvLyApIHtcclxuICAgICAgICAgICAgLy8gICAgIHNjaGVtYUR5bmFtaWNzLnB1c2goY29udHJvbCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVOG6oW0gdGjhu51pIGsgcmVuZGVyIGx1w7RuIHTDqm4gY8O0bmcgdmnhu4djIHRyb25nIGZvcm0gaW5pdCwgdsOsIMSRYW5nIGsga2nhu4NtIHNvw6F0IGRjIGtoaSBuw6BvIHThuqV0IGPhuqMgY29udHJvbCByZWFkeVxyXG4gICAgICAgIC8vIHNjaGVtYUR5bmFtaWNzLmZvckVhY2goc2NoZW1hID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5yZW5kZXJUZW5Db25nVmllYyh0aGlzLl9tb2RlbERhdGEsIHNjaGVtYSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbCwgY29udHJvbCwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgY29udHJvbC5maWVsZCk7XHJcblxyXG4gICAgICAgIGxldCBfcGFyZW50UGF0aCA9IGNvbnRyb2wuZmllbGQ7XHJcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZE1vcmUgPSBjb250cm9sLmluaXRSb3dDb3VudCAtIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGFkZE1vcmUgPiAwICYmICFwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKGl0ZW0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoICsgJ1snICsgaSArICddJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPT0gbnVsbCB8fCAhaXNMaXRlcmFsT2JqZWN0KHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5oYXNPd25Qcm9wZXJ0eShjb250cm9sLmZpZWxkKSAmJiBjb250cm9sLmZpZWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBjb250cm9sLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbC5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbFswXS52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgZmllbGQpIHtcclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zb3VyY2UpIHBhcmVudE1vZGVsLl9zb3VyY2UgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fc3RhdHVzKSBwYXJlbnRNb2RlbC5fc3RhdHVzID0ge307XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fZXJyb3JzKSBwYXJlbnRNb2RlbC5fZXJyb3JzID0ge307XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1c1tmaWVsZF0pIHBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdID0ge307XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fZXJyb3JzW2ZpZWxkXSkgcGFyZW50TW9kZWwuX2Vycm9yc1tmaWVsZF0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb250cm9sU2NoZW1hKHNjaGVtYTogRm9ybVNjaGVtYUJhc2UsIHBhcmVudElkPykge1xyXG4gICAgICAgIGlmIChzY2hlbWEuZGlzYWJsZWQgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc1ZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEubGFiZWwgJiYgIXNjaGVtYS5mdWxsTGFiZWwpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmZ1bGxMYWJlbCA9IHNjaGVtYS5sYWJlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYVxyXG4gICAgICAgICAgICB8fCBzY2hlbWEgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzY2hlbWEuc2hvd0xhYmVsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghc2NoZW1hLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEuZmllbGQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZCkge1xyXG4gICAgICAgICAgICBsZXQga2V5ID0gc2NoZW1hLmZpZWxkO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT0gbnVsbCkga2V5ID0gcGFyZW50SWQgKyAnLicgKyBrZXk7XHJcbiAgICAgICAgICAgIHNjaGVtYS51bmlxdWVGaWVsZCA9IGtleTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbHNba2V5XSA9IHNjaGVtYTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYVsnY29udHJvbFR5cGUnXSA9IHRoaXMuZ2V0Q29udHJvbFR5cGUoc2NoZW1hKTtcclxuICAgICAgICBzY2hlbWFbJ2RhdGFUeXBlJ10gPSB0aGlzLmdldFZpZXdNb2RlRGF0YVR5cGUoc2NoZW1hKTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLnNob3dTYXZlKSBidXR0b25Db3VudCsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIGJ1dHRvbkNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5zaG93RGVsZXRlKSBidXR0b25Db3VudCsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wucm93QnV0dG9ucykgYnV0dG9uQ291bnQrKztcclxuICAgICAgICAgICAgICAgIC8vIDIuMzU3IGzDoCBjaGnhu4F1IHLhu5luZyBj4bunYSBt4buXaSBidXR0b24sIDEgbMOgIHBhZGRpbmcgdHLDoWkgcGjhuqNpIDAuNXJlbVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSAyLjM1NyAqIGJ1dHRvbkNvdW50ICsgMTtcclxuICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDYpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLndpZHRoRnVuY3Rpb25Db2x1bW4gPSBgNi4zcmVtYDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbiA9IGAke3dpZHRofXJlbWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHN1YkNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXSA9IGNvbnRyb2wudW5pcXVlRmllbGQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIHNjaGVtYS51bmlxdWVGaWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEucmV0dXJuVHlwZSA9ICdvYmplY3QnO1xyXG4gICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEuZmlyZUNhbGxCYWNrSW5zaWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEubG9hZE9uSW5pdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpKSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEuZmlsdGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdXNlclBpY2tlckNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgdXNlclBpY2tlckNvbnRyb2xTY2hlbWEucmV0dXJuVHlwZSA9ICdvYmplY3QnO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJDb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF0gPSBjb250cm9sLnVuaXF1ZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbFNjaGVtYShzdWJDb250cm9sLCBjb250cm9sLnVuaXF1ZUZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZUNvbnRyb2xTY2hlbWEgPSA8QXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZUNvbnRyb2xTY2hlbWEucmV0dXJuVHlwZSA9ICdvYmplY3QnO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZmlyZUNhbGxCYWNrSW5zaWRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEN1c3RvbUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tJc1Rhc2tDb250cm9sKHNjaGVtYSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZ1ZpZWNTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25nVmllY1NldHRpbmcuaXNXb3JrZmxvd1RyZWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgbG9vcEN1cnNvckZ1bmN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFJlZ2V4UmVzdWx0KHNjaGVtYS5kYXRhLl9fdGVtcGxhdGVUYXNrTmFtZSwgUmVnZXhTcGxpdEZpZWxkQnlJdGVtLCBleGVjUmVzdWx0ID0+IGV4ZWNSZXN1bHRbMV0pLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hQ2hpbGQgPSB0aGlzLnNldHRpbmcuc2NoZW1hLmZpbmQocSA9PiBxLmZpZWxkID09IGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUNoaWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZU9uQ2hhbmdlRXZlbnQoc2NoZW1hQ2hpbGQsIChldnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVGVuQ29uZ1ZpZWMoZXZ0LnJvb3RNb2RlbCwgc2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRpc2FibGVDb250cm9sU2NoZW1hKHNjaGVtYTogRm9ybVNjaGVtYUJhc2UsIGRpc2FibGVkID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICghc2NoZW1hLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGRpc2FibGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29udHJvbFNjaGVtYShzdWJDb250cm9sLCBkaXNhYmxlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja0lzVGFza0NvbnRyb2woc2NoZW1hKSB7XHJcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5maWVsZCA9PSBGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXHJcbiAgICAgICAgICAgICYmIHNjaGVtYS5kYXRhXHJcbiAgICAgICAgICAgICYmIHNjaGVtYS5kYXRhLl9fdGVtcGxhdGVUYXNrTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJUZW5Db25nVmllYyhtb2RlbDogYW55LCBzY2hlbWE6IEN1c3RvbUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICBsZXQgdGVtcGxhdGVUZXh0ID0gc2NoZW1hLmRhdGEuX190ZW1wbGF0ZVRhc2tOYW1lO1xyXG4gICAgICAgIHNjaGVtYS5kYXRhLmZpZWxkUGFyZW50Rm9yVGFza3MuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlVGV4dCA9IHRlbXBsYXRlVGV4dC5yZXBsYWNlKGB7e2l0ZW0uJHtmaWVsZH19fWAsIGdldFN0cmluZ0Rpc3BsYXlWYWx1ZShtb2RlbFtmaWVsZF0pKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzY2hlbWEuZGF0YS50ZW5Db25nVmllYyA9IHRlbXBsYXRlVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzY2hlbWE6IGFueSkge1xyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duKGRyb3Bkb3duQ29udHJvbFNjaGVtYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8QXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgbGV0IHRtcEZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSkge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykgPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0bXBGaWx0ZXJzID0gYXdhaXQgZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0bXBGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlRmllbGQgPSBmaWx0ZXIuc291cmNlRmllbGQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gc291cmNlRmllbGQpO1xyXG4gICAgICAgICAgICBpZiAoIWZpbHRlci5zdWJGaWVsZFxyXG4gICAgICAgICAgICAgICAgJiYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSB8fCBzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLnN1YkZpZWxkID0gc2NoZW1hLnZhbHVlRmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBtYXJrZWRDb250cm9sID0ge307XHJcbiAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGRyb3Bkb3duQ29udHJvbFNjaGVtYSwgdG1wRmlsdGVycywgbWFya2VkQ29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGNoaWxkRHJvcGRvd246IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsIHRtcEZpbHRlcnM6IEZpbHRlcltdLCBtYXJrZWRDb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHRtcEZpbHRlcnMgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0bXBGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5mb3JtQ29udHJvbHNbc291cmNlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudERyb3Bkb3duICYmICFtYXJrZWRDb250cm9sW3NvdXJjZUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkRHJvcGRvd25bS2V5RnVuY3Rpb25SZWxvYWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXSA9IChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5lZWRHZXREYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uYWxsb3dMb2FkRGF0YVdoZW5QYXJlbnROdWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LmV2ZW50VHlwZSA9PSAnYWRqdXN0VmFsdWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudmFsdWUgPT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudC52YWx1ZSA9PSAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBldmVudC52YWx1ZS5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LnJlc2V0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkR2V0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkR2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fY3J1ZFNlcnZpY2UuZ2V0RmlsdGVyRnJvbVRlbXBsYXRlKHRtcEZpbHRlcnMsIGV2ZW50LnBhcmVudE1vZGVsLCBldmVudC5yb290TW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIShwYXJlbnREcm9wZG93biBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJlbnREcm9wZG93bi5fY29tcG9uZW50ICYmIHBhcmVudERyb3Bkb3duLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YShmaWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50ICYmIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LmdldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVPbkNoYW5nZUV2ZW50KHBhcmVudERyb3Bkb3duLCAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93biwgZmlsdGVyLmZpbHRlcnMsIG1hcmtlZENvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkTW9yZU9uQ2hhbmdlRXZlbnQoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBuZXdPbkNoYW5nZSkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkVHJpZ2dlckxvYWRDaGlsZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9sZFRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdG1wRmllbGRPbGRPbkNoYW5nZSA9ICdvbGRPbkNoYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbC5vbkNoYW5nZWQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gb2xkT25DaGFuZ2U7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZChldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbGRPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRFdmVudCA9IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9sZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEuY29ycmVjdG9ycykgc2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCFzY2hlbWEudmFsaWRhdG9ycykgc2NoZW1hLnZhbGlkYXRvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5yZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBSZXF1aXJlZFZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCBzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRTY2hlbWEgPSAoPFRleHRDb250cm9sU2NoZW1hPnNjaGVtYSk7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ251bWJlcicgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdhbW91bnQnKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgTnVtYmVyT25seVZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5JyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5aW50Jykge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2VtYWlsJykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IEVtYWlsVmFsaWRhdG9yKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGV4dFNjaGVtYS5jb3JyZWN0b3JzKSB0ZXh0U2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBHbWFpbENvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBMb3dlckNvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ3Bob25lJyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2ZheCcpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBQaG9uZU51bWJlclZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCB0ZXh0U2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3RvcihzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVTY2hlbWEgPSAoPERhdGVUaW1lQ29udHJvbFNjaGVtYT5zY2hlbWEpO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yIHx8IHZhbGlkYXRvciBpbnN0YW5jZW9mIENvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KHZhbGlkYXRvciwgZGF0ZVRpbWVTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYSwgdmFsaWRhdG9yLmdldER1cGxpY2F0ZUZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpLCB2YWxpZGF0b3IuZ2V0RGVmYXVsdEZpbHRlcnMoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFJlcXVpcmVkRmllbGRzKCksIHZhbGlkYXRvci5nZXRNZXNzYWdlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTYW1lVmFsdWVWYWxpZGF0b3JzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFNhbWVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KFxyXG4gICAgICAgIHZhbGlkYXRvcjogRGF0ZUNvbXBhcmVWYWxpZGF0b3IgfCBOdW1iZXJDb21wYXJlVmFsaWRhdG9yIHwgQ29tcGFyZVZhbGlkYXRvcixcclxuICAgICAgICBzY2hlbWE6IERhdGVUaW1lQ29udHJvbFNjaGVtYSB8IFRleHRDb250cm9sU2NoZW1hIHwgTWFza0NvbnRyb2xTY2hlbWFcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGNvbXBhcmVVbmlxdWVGaWVsZCA9IHZhbGlkYXRvci5jb21wYXJlVW5pcXVlRmllbGQ7XHJcbiAgICAgICAgaWYgKHNjaGVtYS51bmlxdWVGaWVsZCA9PSBjb21wYXJlVW5pcXVlRmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3JDb21wYXJlID0gdmFsaWRhdG9yLmdldE9wZXJhdG9yQ29tcGFyZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBzY2hlbWFDb21wYXJlID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbY29tcGFyZVVuaXF1ZUZpZWxkXSk7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWFDb21wYXJlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnNvbWUocCA9PiBwIGluc3RhbmNlb2YgQ29tcGFyZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHAuY29tcGFyZVVuaXF1ZUZpZWxkID09IHNjaGVtYS51bmlxdWVGaWVsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRGF0ZUNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IERhdGVDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIE51bWJlckNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IE51bWJlckNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nLCBkZWZhdWx0RmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0RHVwbGljYXRlRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UsIGRlZmF1bHRGaWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICBfdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFJlcXVpcmVkRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNhbWVWYWx1ZVZhbGlkYXRvcnMoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFNhbWVGaWVsZHMoKSkpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdmFsaWRhdG9yID0gbmV3IFNhbWVWYWx1ZVZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0RGF0YURlZmF1bHQoKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nRGF0YURlZmF1bHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5ERUZBVUxUX0RBVEEpO1xyXG4gICAgICAgIGNvbnN0IGdldFNldHRpbmdEYXRhRGVmYXVsdCA9IHRoaXMuX21vZHVsZUNvbmZpZy5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5zZXR0aW5nRGF0YURlZmF1bHQ7XHJcbiAgICAgICAgaWYgKHN0cmluZ0RhdGFEZWZhdWx0ICYmICh0aGlzLl9tb2RlbERhdGEgJiYgIXRoaXMuX21vZGVsRGF0YS5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPERyb3Bkb3duQ29udHJvbFNjaGVtYT5pdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSAoY29udHJvbC5maWVsZCArIChjb250cm9sLnZhbHVlRmllbGQgPT0gJ2lkJyA/ICcnIDogY29udHJvbC52YWx1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YUNhY2hlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRTZXR0aW5nRGF0YURlZmF1bHQpIHsgLy8gbOG6pXkgY+G6pXUgaMOsbmggZmllbGQgbWFwUGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE1hcEdldENhY2hlID0gZ2V0U2V0dGluZ0RhdGFEZWZhdWx0W2NvbnRyb2wuZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRNYXBHZXRDYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGZpZWxkTWFwR2V0Q2FjaGUgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVbKDxGb3JtU2NoZW1hQmFzZT5pdGVtKS5maWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVsoPEZvcm1TY2hlbWFCYXNlPml0ZW0pLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5mdW5jdGlvbi5tb2RpZnlEYXRhQWZ0ZXJHZXRDYWNoZSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5Q2FjaGVkVmFsdWVzKCkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKTtcclxuICAgICAgICB0aGlzLnNldENhY2hlZFZhbHVlVG9Nb2RlbCh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q2FjaGVkVmFsdWVUb01vZGVsKG1vZGVsLCB1bmlxdWVLZXlDb250cm9sPywgcGF0aD8pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZCAhPSAnX2Vycm9ycycgJiYgZmllbGQgIT0gJ19zdGF0dXMnICYmIGZpZWxkICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlVuaXF1ZUtleUNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlS2V5Q29udHJvbCAhPSBudWxsICYmIHVuaXF1ZUtleUNvbnRyb2wgIT09ICcnKSBzdWJVbmlxdWVLZXlDb250cm9sID0gdW5pcXVlS2V5Q29udHJvbCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJVbmlxdWVLZXlDb250cm9sID0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbHNbc3ViVW5pcXVlS2V5Q29udHJvbF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlBhdGg7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGggIT09ICcnKSBzdWJQYXRoID0gcGF0aCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJQYXRoID0gZmllbGQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBtb2RlbFtmaWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN1Yk1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKGl0ZW0sIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGggKyAnWycgKyBpbmRleCArICddJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNMaXRlcmFsT2JqZWN0KHN1Yk1vZGVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHN1Yk1vZGVsLCBzdWJVbmlxdWVLZXlDb250cm9sLCBzdWJQYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wuZW5hYmxlQ2FjaGluZyAmJiB0aGlzLmNhY2hlZFZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzdWJQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsW2ZpZWxkXSA9IHRoaXMuY2FjaGVkVmFsdWVzW3N1YlBhdGhdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmIChjYWNoZWRWYWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY2FjaGVkVmFsdWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXMgPSBlbGVtZW50LnZhbHVlcztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVDYWNoZVZhbHVlc1RvU3RvcmFnZSgpIHtcclxuICAgICAgICBsZXQgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmICghY2FjaGVkVmFsdWVzKSBjYWNoZWRWYWx1ZXMgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNhY2hlZFZhbHVlc1tpXTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlcyA9IHRoaXMuY2FjaGVkVmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoTmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogdGhpcy5jYWNoZWRWYWx1ZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVkVmFsdWVzJywgSlNPTi5zdHJpbmdpZnkoY2FjaGVkVmFsdWVzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlckNoYW5nZShmaWVsZFBhdGgpIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgbnVsbCwgJ3RyaWdnZXInLCBjdXJyZW50Tm9kZS5wYXJlbnRNb2RlbCwgY3VycmVudE5vZGUucGFyZW50TW9kZWxQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvRm9jdXMgJiYgIXRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSwgODAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElzTG9hZGVkRGF0YUVkaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0T2xkID0gdGhpcy5sb2FkZWREYXRhRWRpdDtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRyb2xUeXBlKGNvbnRyb2w6IGFueSkge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGl0bGVTY2hlbWEpIHJldHVybiAndGl0bGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTGFiZWxTY2hlbWEpIHJldHVybiAnbGFiZWwnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3BhbkNvbnRyb2xTY2hlbWEpIHJldHVybiAnc3BhbkNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHJldHVybiAnbWFzayc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnbnVtYmVycmFuZ2UnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dENvbnRyb2wgPSA8VGV4dENvbnRyb2xTY2hlbWE+Y29udHJvbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xyXG4gICAgICAgICAgICAgICAgfHwgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdwaG9uZSdcclxuICAgICAgICAgICAgICAgIHx8IHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdmYXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdwaG9uZU9yZmF4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFJlZmVyZW5jZVRleHRDb250cm9sU2NoZW1hKSByZXR1cm4gJ3JlZmVyZW5jZS10ZXh0JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRlbXBsYXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZW1wbGF0ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWVyYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkcm9wZG93bic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2VkaXRvcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbnRyb2xTY2hlbWEpIHJldHVybiAndGV4dGFyZWEnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgV3JhcFBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb21tb24tcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUGjhuqNpIMSR4buDIGTDsm5nIGTGsOG7m2kg4bufIGLDqm4gdHLDqm4gVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgdsOsIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUtcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXItcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVudGl0eVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZW50aXR5LXBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnb3JnYW5pemF0aW9uLXBpY2tlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29jYXV0b2NodWMtcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb0NhdVRvQ2h1Y0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYSkgcmV0dXJuICdzd2l0Y2gnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEpIHJldHVybiAnY2hlY2tib3hsaXN0JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdyYWRpb2J1dHRvbmxpc3QnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnc2VydmljZUZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvclBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSByZXR1cm4gJ3RhYmxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkgcmV0dXJuICdjb250YWluZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQnV0dG9uQ29udHJvbFNjaGVtYSkgcmV0dXJuICdidXR0b24nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd2YW5iYW4nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29uZ1ZpZWNQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2Nvbmd2aWVjJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFBlcmNlbnRDb250cm9sU2NoZW1hKSByZXR1cm4gJ3BlcmNlbnQnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sdW1uU2NoZW1hQmFzZSkgcmV0dXJuICdjb2x1bW4nO1xyXG4gICAgICAgIHJldHVybiAnY3VzdG9tJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Vmlld01vZGVEYXRhVHlwZShjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYSkgcmV0dXJuICd0aXRsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdtYXNrJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVDb250cm9sID0gPERhdGVUaW1lQ29udHJvbFNjaGVtYT5jb250cm9sO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZUNvbnRyb2wuc2hvd1RpbWUpIHJldHVybiAnZGF0ZXRpbWUnO1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RhdGUnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVkaXRvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnaHRtbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd1c2VyJztcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja2JveENvbnRyb2xTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja0JveExpc3RDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnaGFzRGF0YVNvdXJjZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wubW9kZSA9PSBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlU2VydmljZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZmlsZU1hbmFnZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWEpIHJldHVybiAnYWRkcmVzcyc7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgJiYgKGNvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xyXG4gICAgICAgICAgICAgICAgfHwgY29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXlpbnQnKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ21vbmV5JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JQaWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yQ29udHJvbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkgcmV0dXJuICd0YWJsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBLZXlWYWx1ZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXBwLWtleS12YWx1ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb250YWluZXInO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybShzZXRWYWxpZGF0ZUZvcm0gPSB0cnVlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgaWYgKHNldFZhbGlkYXRlRm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pblZhbGlkRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwodGhpcy5fcm9vdE5vZGUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5WYWxpZEZvcm0pIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVNb2RlbChjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2YgY3VycmVudE5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICBpZiAoIWNoaWxkTm9kZS5jb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLmNoaWxkTm9kZXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkTm9kZS5jb250cm9sWydfaGlkZGVuJ10pIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNoaWxkTm9kZSwgdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luVmFsaWRGb3JtID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZU1vZGVsKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybUNvbnRyb2woZmllbGRQYXRoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkUGF0aCk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xOb2RlKSB7XHJcbiAgICAgICAgICAgIGlmICghYXdhaXQgdGhpcy52YWxpZGF0ZShjb250cm9sTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVDaGFuZ2VEcm9wZG93bihjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGV2ZW50PywgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pIHtcclxuICAgICAgICBpZiAoY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09ICdoaWRlJykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIGV2ZW50LCAnY2hhbmdlJywgcGFyZW50TW9kZWwsIHBhcmVudFBhdGgsIHNvdXJjZU5vZGUsIGJ1YmJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBldmVudCwgZXZlbnRUeXBlLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDEkOG7gyBuZ3V5w6puIGjDoG0gZOG6oW5nIGFycm93IGZ1bmN0aW9uIHbDrCBjw7MgMSBz4buRIGZvcm0ga2jDoWMgZ+G7jWlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UgPSBhc3luYyAoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBldmVudD8sIGV2ZW50VHlwZT8sIHBhcmVudE1vZGVsPywgcGFyZW50UGF0aD8sIHNvdXJjZU5vZGU/LCBidWJibGU/KSA9PiB7XHJcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgLy8gcm93IGluIHRhYmxlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBwYXJlbnRNb2RlbCA9IHBhcmVudE5vZGUubW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gdmFsaWRhdGUgdmFsdWVcclxuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlKGN1cnJlbnROb2RlKTtcclxuXHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcclxuICAgICAgICAgICAgc291cmNlTm9kZTogc291cmNlTm9kZSB8fCBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlLFxyXG4gICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25DaGFuZ2VkKGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnROb2RlLnBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLnBhcmVudE5vZGUgIT0gcGFyZW50Tm9kZS5yb290Tm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UocGFyZW50Tm9kZS5jb250cm9sLCBldmVudCwgZXZlbnRUeXBlLCBwYXJlbnROb2RlLnBhcmVudE5vZGUubW9kZWwsIHBhcmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbFBhdGgsIHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nICYmIGNvbnRyb2wuZW5hYmxlQ2FjaGluZykge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVDb250cm9sVmFsdWUoY29udHJvbCwgdmFsdWUsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChldmVudERhdGEpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IGtoaSBkcm9wZG93biDEkWnhu4F1IGNo4buJbmggdmFsdWUgdOG7qyByYXcgdmFsdWUgZOG6oW5nIGd1aWQgfCBpbnQgfCAuLi4gPT4gb2JqZWN0IGtp4buDdSB7dmFsdWU6IGd1aWQgfCBpbnQgfCAuLi4sIC4uLiBbMSBz4buRIHRyxrDhu51uZyBraMOhY119XHJcbiAgICAgKiBAcGFyYW0gY29udHJvbFxyXG4gICAgICogQHBhcmFtIHBhcmVudFBhdGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUFkanVzdFZhbHVlRHJvcGRvd25FdmVudChjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdhZGp1c3RWYWx1ZScsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkanVzdGVkVmFsdWUoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkQ29tcGxldGUoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlV2l0aFNlcnZpY2UsIHBhcmVudFBhdGgsIGRhdGFTb3VyY2UpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkZWQoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hLCBwYXJlbnRQYXRoLCBkYXRhRnJvbURyb3Bkb3duOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlOiAnZGF0YVNvdXJjZUxvYWRlZCcsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgPyBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgOiBkYXRhRnJvbURyb3Bkb3duLmRhdGFTb3VyY2VcclxuICAgICAgICB9KTtcclxuICAgICAgICBldmVudERhdGFbJ2VsbSddID0gZGF0YUZyb21Ecm9wZG93bi5lbG07XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN0YXRlID09IEZvcm1TdGF0ZS5BRERcclxuICAgICAgICAgICAgJiYgY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICYmIGV2ZW50RGF0YS5kYXRhLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdIHx8ICF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gW2V2ZW50RGF0YS5kYXRhWzBdW2NvbnRyb2wudmFsdWVGaWVsZF1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gPSBldmVudERhdGEuZGF0YVswXVtjb250cm9sLnZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5jYWxsYmFja0RhdGFGaW5pc2goZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlUmVhZHlDb250cm9sUGlja2VyKGNvbnRyb2w6IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgfCBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSB8IENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2wsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdyZWFkeScsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25SZWFkeSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vblJlYWR5KGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVDb250cm9sUmVhZHlFdmVudChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm9uQ29udHJvbFJlYWR5LmVtaXQoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsRGF0YVtLZXlGbGFzaFNob3ddKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRQYXRoKSB7IC8vIMSQb+G6oW4gY29kZSB0cm9uZyBibG9jayBpZiBuw6B5IGNoxrBhIGNodeG6qW4sIHThuqFtIHRo4budaSBjb2RlIHRo4bq/IMSR4bq/biBraGkgZ+G6t3AgY2FzZSBuw6B5IHRow6wgeGVtIGzhuqFpIHNhdVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXR1c1tgJHtwYXJlbnRQYXRofS4ke2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXR1c1tgJHtjb250cm9sLmZpZWxkfWBdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2FuUHJpbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tDYW5QcmludCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10gJiYgdGhpcy5jYW5QcmludCkge1xyXG4gICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHdhaXRSZWFkeUFuZFByaW50KCkge1xyXG4gICAgICAgIGNvbnN0IHJlYWR5QWxsID0gdGhpcy5jaGVja1JlYWR5QWxsKCk7XHJcbiAgICAgICAgaWYgKHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWFkeUFsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd107XHJcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl9wcmludFBkZkJ5U2NoZW1hKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSwgdGhpcy5fbWluaW1pemVkRGF0YSwgdGhpcy5zZXR0aW5nLnNjaGVtYSlcclxuICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlcywgJycsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnVOG6oW8gZmlsZSB0aMOgbmggY8O0bmcnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhLnByaW50RmlsZUlkID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuY2xvbmVPYmplY3QodGhpcy5fbWluaW1pemVkRGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlV2FpdEJveCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmdldENvbmZpZygpLmVudmlyb25tZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VUcmluaEt5KGVudmlyb25tZW50LCB0aGlzLnNldHRpbmcsIHRoaXMuX21vZGVsRGF0YSwgcmVzLmRhdGEsIHRoaXMuX25vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQWZ0ZXJUcmluaEt5LmVtaXQoKTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50KCk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TW9kZWxUYWJsZVNjaGVtYUJ5Q2hpbGRTY2hlbWEoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbFRhYmxlID0gdGhpcy5mb3JtQ29udHJvbHNbY29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2xUYWJsZS5maWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja1JlYWR5QWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5oaWRkZW4gfHwgIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcGFyZW50RmllbGQgPSBjb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF07XHJcbiAgICAgICAgICAgIC8vIE7hur91IGzDoCBmaWVsZCB0cm9uZyB0YWJsZSBzY2hlbWFcclxuICAgICAgICAgICAgaWYgKHBhcmVudEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJNb2RlbEN1bmdMZXZlbCA9IHRoaXMuZ2V0TW9kZWxUYWJsZVNjaGVtYUJ5Q2hpbGRTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyTW9kZWxDdW5nTGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyck1vZGVsQ3VuZ0xldmVsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkeVN0YXR1c1tgJHtwYXJlbnRGaWVsZH1bJHtpfV0uJHtjb250cm9sLmZpZWxkfWBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucmVhZHlTdGF0dXNbYCR7Y29udHJvbC5maWVsZH1gXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZU1vZGVsRnJvbUV4dGVybmFsID0gKCkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gUGjhuqNpIMSR4buDIGFycm93IGZ1bmN0aW9uIHbDrCBjw7MgZXhwb3J0IHJhIGNobyBt4buZdCBz4buRIHRlbXBsYXRlIHPhu60gZOG7pW5nXHJcbiAgICBmaXJlTW9kZWxDaGFuZ2VkID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZS5lbWl0KHRoaXMuX21pbmltaXplZERhdGEpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQnV0dG9uQ2xpY2soY29udHJvbDogQnV0dG9uQ29udHJvbFNjaGVtYSwgZXZlbnQsIHBhcmVudFBhdGgpIHtcclxuICAgICAgICBpZiAoY29udHJvbC5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2xpY2sobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2NsaWNrJyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgbGV0IHJlID0gY3VycmVudE5vZGUudmFsdWU7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5jb3JyZWN0b3JzICYmIGNvbnRyb2wuY29ycmVjdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb3JyZWN0b3IgPSBjb250cm9sLmNvcnJlY3RvcnNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdhdXRvQ29ycmVjdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZSA9IGNvcnJlY3Rvci5jb3JyZWN0KGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRydWUgbMOgIHRo4buPYSBtw6NuLCBmYWxzZSBsw6Aga2jDtG5nIHRo4buPYSBtw6NuICjhu54gY+G6pXAgaGnhu4duIHThuqFpIGNo4bupIGNoxrBhIGtp4buDbSB0cmEgY+G6pXAgY29uKVxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZShjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gY3VycmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbC5fZXJyb3JzW2N1cnJlbnROb2RlLmZpZWxkXTtcclxuICAgICAgICAgICAgaWYgKCFlcnJvcnMpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBlcnJvcnMuc3BsaWNlKDAsIGVycm9ycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWxpZGF0b3JzICYmIGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbnRyb2wudmFsaWRhdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3ZhbGlkYXRlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdmFsaWRhdG9yLnZhbGlkYXRlKGV2ZW50RGF0YSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSB2YWxpZGF0b3IuZ2V0RXJyb3IoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuaW5kZXhPZihlcnIpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIF9zZXRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSB7XHJcbiAgICAvLyAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xyXG4gICAgLy8gICAgIGlmIChub2RlID09IG51bGwpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdUcsaw4budbmcgZOG7ryBsaeG7h3Uga2jDtG5nIHThu5NuIHThuqFpJyk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY29uc3QgZXJyb3JzID0gbm9kZS5wYXJlbnROb2RlLm1vZGVsLl9lcnJvcnNbbm9kZS5maWVsZF07XHJcbiAgICAvLyAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHNldEVycm9yKGZpZWxkOiBzdHJpbmcgfCBzdHJpbmdbXSwgZXJyb3I6IHN0cmluZykge1xyXG4gICAgLy8gICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSlcclxuICAgIC8vICAgICAgICAgZmllbGQuZm9yRWFjaChpdGVtID0+IHRoaXMuX3NldEVycm9yKGl0ZW0sIGVycm9yKSk7XHJcbiAgICAvLyAgICAgZWxzZVxyXG4gICAgLy8gICAgICAgICB0aGlzLl9zZXRFcnJvcihmaWVsZCwgZXJyb3IpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHByaXZhdGUgY2FjaGVDb250cm9sVmFsdWUoY29udHJvbCwgdmFsdWUsIHBhcmVudFBhdGgpIHtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmVuYWJsZUNhY2hpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXNbcGFyZW50UGF0aCArICcuJyArIGNvbnRyb2wuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudEJ5VHlwZSh0ZW1wbGF0ZU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghdGhpcy50ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXSkge1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdID0gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLmNoaWxkcmVuLCB0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SXRlbUluQXJyYXlCeVZhbHVlKGFycmF5LCB2LCBjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdW5jR2V0TGFiZWwgPSBjb250cm9sLmZ1bmNHZXRMYWJlbDtcclxuICAgICAgICBpZiAoZnVuY0dldExhYmVsID09IG51bGwpIHtcclxuICAgICAgICAgICAgZnVuY0dldExhYmVsID0gaXRlbSA9PiBpdGVtW2NvbnRyb2wuZGlzcGxheUZpZWxkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgQXJyYXkgJiYgYXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgdkFyciA9IHY7XHJcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2KSkge1xyXG4gICAgICAgICAgICAgICAgdkFyciA9IHYudG9TdHJpbmcoKS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodkFyci5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBhcnJheS5maW5kKHggPT4geFtjb250cm9sLnZhbHVlRmllbGRdID09IHYpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY0dldExhYmVsKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZBcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5LmZpbHRlcihwID0+IHZBcnIuc29tZShxID0+IHEgPT0gcFtjb250cm9sLnZhbHVlRmllbGRdKSlcclxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gZnVuY0dldExhYmVsKGl0ZW0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJdGVtSW5BcnJheUJ5VGV4dFZhbHVlKGFycmF5LCB2KSB7XHJcbiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGFycmF5IGluc3RhbmNlb2YgQXJyYXlcclxuICAgICAgICAgICAgJiYgYXJyYXkubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gdi5qb2luKCc7ICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFkZHJlc3NEaXNwbGF5VGV4dChzZWxlY3RlZFZhbHVlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldExhYmVsQ2xhc3MoY29udHJvbCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBgbGFiZWwtY29udHJvbGA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuaW5kZXhMYWJlbCkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyBoYXZlSW5kZXgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9WaWV3KGVsZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZWxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaDE6IGFueSA9IGVsZS5jbG9zZXN0KCdkaXZbaWQkPVxcJy1ob2xkZXJcXCddJyk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaDEgJiYgaDEucHJldmlvdXNTaWJsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaDEgPSBoMS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGgxLnRhZ05hbWUgPT09ICdESVYnKSBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaDEgJiYgaDEuc2Nyb2xsSW50b1ZpZXcpIGgxLnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIFNldCBGb2N1cyBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAgICovXHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c0ZpcnN0Q29udHJvbCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBkaXZzID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGl2LmNydWQtZm9ybS1jb250cm9sJyk7XHJcbiAgICAgICAgaWYgKGRpdnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdERpdkhvbGRlciA9IGRpdjtcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSB0aGlzLmZpcnN0RGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Om5vdChbdHlwZT1maWxlXSk6bm90KFt0eXBlPWhpZGRlbl0pJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnYm9keScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYGRpdi5lcnJvcmA7XHJcbiAgICAgICAgY29uc3QgZGl2SG9sZGVyID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICAgICAgaWYgKGRpdkhvbGRlcikge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZmlyc3RDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCdib2R5JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGVwcmVjYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbnltY2UtZm9jdXMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcmV2ZW50Qmx1cihldmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyYXBGb2N1cykge1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgfHwgdGFyZ2V0LnRhZ05hbWUgPT0gJ0ZPUk0nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlkLmVuZHNXaXRoKCctaG9sZGVyJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHRoaXMuZmlyc3REaXZIb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q29udHJvbCA9IHRhcmdldC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCA9PSBldmVudC50YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1Zpc2libGUoZWxlbSkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcclxuICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHN0eWxlLnZpc2liaWxpdHkgIT09ICd2aXNpYmxlJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICgrc3R5bGUub3BhY2l0eSA8IDAuMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbS5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICArIGVsZW0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgICsgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXHJcbiAgICAgICAgICAgID09PSAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxlbUNlbnRlciA9IHtcclxuICAgICAgICAgICAgeDogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgZWxlbS5vZmZzZXRXaWR0aCAvIDIsXHJcbiAgICAgICAgICAgIHk6IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZWxlbS5vZmZzZXRIZWlnaHQgLyAyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHBvaW50Q29udGFpbmVyID0gPGFueT4oXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZWxlbUNlbnRlci54LCBlbGVtQ2VudGVyLnkpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAocG9pbnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvaW50Q29udGFpbmVyID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxyXG4gICAgICAgICAgICB9IHdoaWxlICgocG9pbnRDb250YWluZXIgPSBwb2ludENvbnRhaW5lci5wYXJlbnROb2RlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlUm93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dEZWxldGVDb25maXJtKCkudGhlbihhc3luYyBycyA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcnMpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgICAgICBjb25zdCB0b0RlbGV0ZVJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XHJcblxyXG4gICAgICAgICAgICBsZXQgdG9EZWxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0b0RlbGV0ZSA9IGNvbnRyb2wub25EZWxldGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdkZWxldGluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodG9EZWxldGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5yZWluaXRDaGlsZE5vZGVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAndGFibGVDaGFuZ2VkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uRGVsZXRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0b0RlbGV0ZVJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdkZWxldGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZGROZXdSb3coY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPywgZGlzYWJsZU9wZW5EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnNob3dFZGl0ICYmICFkaXNhYmxlT3BlbkRpYWxvZykge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFRow6ptIG3hu5tpICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtQ3VycmVudFJvdyA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgICAgIHRhYmxlUGF0aCxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG9BZGQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IGNvbnRyb2wub25BZGRpbmcobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8ICdhZGRpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ3RhYmxlQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZE11bHRpUm93KGNvbnRyb2wsIGxlbmd0aCwgdGFibGVQYXRoLCBldmVudFR5cGU/KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmFkZE5ld1Jvdyhjb250cm9sLCB0YWJsZVBhdGgsIGV2ZW50VHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZVNhdmVkVGFibGVSb3coZGF0YSkge1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLmNvbnRyb2w7XHJcbiAgICAgICAgY29uc3QgdGFibGVQYXRoID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby50YWJsZVBhdGg7XHJcbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby5ldmVudFR5cGU7XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPiAtMSkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWxbdGhpcy50YWJsZUZvcm1DdXJyZW50Um93XSA9IHsgLi4udGFibGVOb2RlLm1vZGVsW3RoaXMudGFibGVGb3JtQ3VycmVudFJvd10sIC4uLmRhdGEgfTtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZU5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0YWJsZVBhdGggKyAnWycgKyBpbmRleCArICddJztcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChkYXRhLCBzdWJDb250cm9sLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHRvQWRkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9BZGQgPSBjb250cm9sLm9uQWRkaW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCAnYWRkaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUucmVpbml0Q2hpbGROb2RlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ3RhYmxlQ2hhbmdlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgJ2FkZGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2F2ZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uU2F2ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vblNhdmUobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3NhdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFPhu61hICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtU2NoZW1hID0gY29udHJvbC5yb3dUZW1wbGF0ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSBpbmRleDtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgdG9EZWxldGVSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtRGF0YSA9IHRvRGVsZXRlUm93Tm9kZS52YWx1ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIGluZGV4XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVSb3dPcmRlcmVkKGNvbnRyb2w6IFRhYmxlU2NoZW1hLCBldnQsIGV2ZW50VHlwZT8sIHBhcmVudE1vZGVsPywgcGFyZW50UGF0aD8sIHNvdXJjZU5vZGU/LCBidWJibGU/KSB7XHJcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgLy8gcm93IGluIHRhYmxlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBwYXJlbnRNb2RlbCA9IHBhcmVudE5vZGUubW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlb3JkZXJlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVvcmRlcmVkKGV2ZW50RGF0YSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0NvbnRleHRNZW51KGV2dCwgcm93RGF0YSwgY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLnJvd0RhdGFDdXJyZW50ID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gYXdhaXQgY29udHJvbC5yb3dCdXR0b25zKHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghdGhpcy5idXR0b25Db250ZXh0cyB8fCB0aGlzLmJ1dHRvbkNvbnRleHRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hvd0NvbnRleHRNZW51KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldnQpO1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWVzc2FnZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uTWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbk1lc3NhZ2UobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ21lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUYWJsZUZ1bmN0aW9uQ29sdW1uV2lkdGgoY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICBsZXQgbmUgPSA1MDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RGVsZXRlKSBuZSArPSAzMDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkgbmUgKz0gMzA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd1NhdmUpIG5lICs9IDMwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnJvd0J1dHRvbnMpIG5lICs9IDMwO1xyXG4gICAgICAgIHJldHVybiBuZSArICdweCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE1hc2tCeVR5cGUobWFza1R5cGUpIHtcclxuICAgICAgICBpZiAobWFza1R5cGUgPT0gJ2RlY2ltYWwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnZG90X3NlcGFyYXRvci41JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRleHRBbGlnbih0ZXh0QWxpZ246IG51bWJlcikge1xyXG4gICAgICAgIHN3aXRjaCAodGV4dEFsaWduKSB7XHJcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLkNlbnRlcjpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnY2VudGVyJztcclxuICAgICAgICAgICAgY2FzZSBUZXh0QWxpZ24uTGVmdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XHJcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLlJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdyaWdodCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrRGlzYWJsZWQoZGF0YTogYW55LCBjb250cm9sOiBGb3JtQ29udHJvbEJhc2UpIHtcclxuICAgICAgICByZXR1cm4gZGF0YS5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmRpc2FibGVkID09PSB0cnVlIHx8IChkYXRhLl9zdGF0dXNbY29udHJvbC5maWVsZF0uZGlzYWJsZWQgPT09IHVuZGVmaW5lZCAmJiBjb250cm9sLmRpc2FibGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0hpZGRlbihjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIHBhcmVudE1vZGVsOiBhbnksIHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHBhdGggJiYgY29udHJvbFsnbm9kZXMnXSkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNvbnRyb2xbJ25vZGVzJ11bcGF0aF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2xbJ19oaWRkZW4nXSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB8fCAocGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5oaWRkZW4gPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgJiYgKGNvbnRyb2wuaGlkZGVuXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKGNvbnRyb2wuaGlkZGVuQ2hlY2sgJiYgY29udHJvbC5oaWRkZW5DaGVjayh0aGlzLl9taW5pbWl6ZWREYXRhLCBjdXJyZW50Tm9kZSkpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgY29udHJvbFsnX2hpZGRlbiddID0gISFyZXN1bHQ7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZXh0VGQoY29udHJvbCwgZGF0YSwgaW5kZXgsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wsXHJcbiAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IGAke3RhYmxlUGF0aH1bJHtpbmRleH1dYCxcclxuICAgICAgICAgICAgcGF0aDogYCR7dGFibGVQYXRofVske2luZGV4fV0uJHtjb250cm9sLmZpZWxkfWAsXHJcbiAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXHJcbiAgICAgICAgICAgIG1kV2lkdGg6IDEyXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNNb2JpbGVPclRhYmxldCgpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKVxyXG4gICAgICAgICAgICB8fCB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNUYWJsZXQoKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2FjaGVWYWx1ZXNUb1N0b3JhZ2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNldHRpbmdzKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hT2xkZXN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX09MREVTVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFOZXdlc3QoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVXRVNULCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJsZVNjaGVtYU5leHQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVYVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFQcmV2KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX1BSRVYsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoKGV2dCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250cm9sRGF0YVNvdXJjZShjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIGlmIChkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGRhdGEuX3NvdXJjZVtjb250cm9sLmZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbC5kYXRhU291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBjb250cm9sLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlclJlbG9hZChmaWVsZDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmJpbmRpbmdGaWx0ZXJzICYmIGNvbnRyb2wuYmluZGluZ0ZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGNvbnRyb2wuYmluZGluZ0ZpbHRlcnNbMF0uZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiBwYXJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgc291cmNlRXZlbnQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBwYXJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnY2hhbmdlJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShwYXJlbnROb2RlKTtcclxuICAgICAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgICAgIHBhcmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sW0tleUZ1bmN0aW9uUmVsb2FkXSkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbFtLZXlGdW5jdGlvblJlbG9hZF0oZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb250cm9sLl9jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLl9jb21wb25lbnQuZ2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuX2NvbXBvbmVudC5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgbW9kZWxQYXRoOiBzdHJpbmc7XHJcbiAgICBzY2hlbWFQYXRoOiBzdHJpbmc7XHJcbiAgICBmaWVsZDogc3RyaW5nO1xyXG4gICAgcGFyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIGNoaWxkTm9kZXM6IENvbnRyb2xUcmVlTm9kZVtdID0gW107XHJcbiAgICBjb250cm9sOiBGb3JtQ29udHJvbEJhc2U7XHJcbiAgICBmb3JtQ29udHJvbHM7XHJcbiAgICBrZXlzUGx1czogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIF9jcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBhbnk7XHJcbiAgICBwcml2YXRlIGhhc1NjaGVtYSA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IobW9kZWw6IGFueSwgc2NoZW1hczogW10sIGZpZWxkPywgcGFyZW50Tm9kZT86IENvbnRyb2xUcmVlTm9kZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG1vZGVsO1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xzID0gc2NoZW1hcztcclxuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5tb2RlbFBhdGggIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoICsgJy4nICsgZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFBhdGggPSBwYXJlbnROb2RlLm1vZGVsUGF0aCArICdbJyArIGZpZWxkICsgJ10nO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IHBhcmVudE5vZGUuc2NoZW1hUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1NjaGVtYSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFBhdGggPSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IGZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlID0gcGFyZW50Tm9kZS5yb290Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkO1xyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbCA9IHNjaGVtYXNbdGhpcy5zY2hlbWFQYXRoXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xbJ25vZGVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xbJ25vZGVzJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXVt0aGlzLm1vZGVsUGF0aF0gPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYXNbdGhpcy5zY2hlbWFQYXRoXTtcclxuICAgICAgICBsZXQga2V5c1BsdXMgPSBbXTtcclxuICAgICAgICBpZiAoc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLmNvbnRyb2xzLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzUGx1cyA9IHNjaGVtYS5yb3dUZW1wbGF0ZS5maWx0ZXIocSA9PiBxLmZpZWxkKS5tYXAocSA9PiBxLmZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYVBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gT2JqZWN0LmtleXMoc2NoZW1hcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5rZXlzUGx1cyA9IGtleXNQbHVzO1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXMobW9kZWwsIHNjaGVtYXMsIGtleXNQbHVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVpbml0Q2hpbGROb2RlcygpIHtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXModGhpcy5kYXRhLCB0aGlzLmZvcm1Db250cm9scywgdGhpcy5rZXlzUGx1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q2hpbGROb2Rlcyhtb2RlbDogYW55LCBzY2hlbWFzOiBbXSwga2V5c1BsdXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYWxsS2V5ID0gbmV3IFNldChbLi4ua2V5c1BsdXMsIC4uLk9iamVjdC5rZXlzKG1vZGVsKV0pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBhbGxLZXkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJyAmJiBrZXkgIT0gS2V5Rmxhc2hTaG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZShtb2RlbFtrZXldLCBzY2hlbWFzLCBrZXksIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVEaWNbY2hpbGROb2RlLmZpZWxkXSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKGl0ZW0sIHNjaGVtYXMsIGksIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnROb2RlID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2RlRGljW2NoaWxkTm9kZS5maWVsZF0gPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGlsZE5vZGUoZmllbGQpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZURpY1tmaWVsZF07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3J1ZEZvcm0oY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5fY3J1ZEZvcm0gPSBjcnVkRm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50TW9kZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5tb2RlbDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50TW9kZWxQYXRoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWxQYXRoO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRDb250cm9sKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbW9kZWwodmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF0gPSB2YWw7XHJcbiAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXTtcclxuICAgICAgICBlbHNlIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZhbHVlKHZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdID0gdmFsO1xyXG4gICAgICAgIGVsc2UgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRIaWRkZW4oZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XHJcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGYsIGhpZGRlbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRIaWRkZW5GaWVsZChmaWVsZCwgaGlkZGVuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRIaWRkZW5GaWVsZChmaWVsZDogc3RyaW5nLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignLicpID4gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5nZXROb2RlQnlQYXRoKGAke3RoaXMubW9kZWxQYXRofS4ke2ZpZWxkfWApO1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZC5zcGxpdCgnLicpLnBvcCgpO1xyXG4gICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZS5kYXRhLl9zdGF0dXNbbGFzdEZpZWxkXS5oaWRkZW4gPSBoaWRkZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuX3N0YXR1c1tmaWVsZF0uaGlkZGVuID0gaGlkZGVuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5UGF0aChtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChtb2RlbFBhdGggPT0gbnVsbCB8fCBtb2RlbFBhdGggPT09ICcnKSByZXR1cm4gdGhpcy5yb290Tm9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5UcmVlKHRoaXMucm9vdE5vZGUsIG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5U2NoZW1hUGF0aChzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAoc2NoZW1hUGF0aCA9PSBudWxsIHx8IHNjaGVtYVBhdGggPT09ICcnKSByZXR1cm4gdGhpcy5yb290Tm9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kU2NoZW1hSW5UcmVlKHRoaXMucm9vdE5vZGUsIHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaW5kSW5UcmVlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgbW9kZWxQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAobm9kZS5tb2RlbFBhdGggIT0gbnVsbCAmJiBub2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpID09IG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gbm9kZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLm1vZGVsUGF0aCAhPSBudWxsICYmIG1vZGVsUGF0aC5zdGFydHNXaXRoKGNoaWxkTm9kZS5tb2RlbFBhdGgudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZEluVHJlZShjaGlsZE5vZGUsIG1vZGVsUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlKSByZXR1cm4gcmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaW5kU2NoZW1hSW5UcmVlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgc2NoZW1hUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hUGF0aCAhPSBudWxsICYmIG5vZGUuc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpID09IHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5zY2hlbWFQYXRoICE9IG51bGwgJiYgc2NoZW1hUGF0aC5zdGFydHNXaXRoKGNoaWxkTm9kZS5zY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSB0aGlzLmZpbmRTY2hlbWFJblRyZWUoY2hpbGROb2RlLCBzY2hlbWFQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUpIHJldHVybiByZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RGF0YVNvdXJjZVRhYmxlU2NoZW1hKHBhdGg6IHN0cmluZywgZGF0YVNvdXJjZTogYW55W10pIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgocGF0aCk7XHJcbiAgICAgICAgaWYgKCF0YWJsZU5vZGUubW9kZWwpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0YWJsZU5vZGUubW9kZWwubGVuZ3RoID4gZGF0YVNvdXJjZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsID0gdGFibGVOb2RlLm1vZGVsLnNwbGljZShkYXRhU291cmNlLmxlbmd0aCwgZGF0YVNvdXJjZS5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlTm9kZS5tb2RlbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBtZXJnZUpTT05PbGQodGFibGVOb2RlLm1vZGVsW2ldLCBkYXRhU291cmNlW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSB0YWJsZU5vZGUubW9kZWwubGVuZ3RoOyBpIDwgZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybS5hZGROZXdSb3coPFRhYmxlU2NoZW1hPnRhYmxlTm9kZS5jb250cm9sLCBwYXRoLCBudWxsLCB0cnVlKTtcclxuICAgICAgICAgICAgbWVyZ2VKU09OT2xkKHRhYmxlTm9kZS5tb2RlbFtpXSwgZGF0YVNvdXJjZVtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==