@libs-ui/components-datetime-picker 0.2.195 → 0.2.197
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.
|
@@ -1260,7 +1260,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
|
|
|
1260
1260
|
return;
|
|
1261
1261
|
}
|
|
1262
1262
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1263
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, isStandalone: true, selector: "libs_ui-components-datetime-picker-custom_ranges-calendar", inputs: { quickRangesArray: { classPropertyName: "quickRangesArray", publicName: "quickRangesArray", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, isSingle: { classPropertyName: "isSingle", publicName: "isSingle", isSignal: true, isRequired: false, transformFunction: null }, showDropdownsSelect: { classPropertyName: "showDropdownsSelect", publicName: "showDropdownsSelect", isSignal: true, isRequired: false, transformFunction: null }, hasTimePicker: { classPropertyName: "hasTimePicker", publicName: "hasTimePicker", isSignal: true, isRequired: false, transformFunction: null }, flagMouse: { classPropertyName: "flagMouse", publicName: "flagMouse", isSignal: true, isRequired: false, transformFunction: null }, dateOptions: { classPropertyName: "dateOptions", publicName: "dateOptions", isSignal: true, isRequired: false, transformFunction: null }, autoApply: { classPropertyName: "autoApply", publicName: "autoApply", isSignal: true, isRequired: false, transformFunction: null }, hasSecondPicker: { classPropertyName: "hasSecondPicker", publicName: "hasSecondPicker", isSignal: true, isRequired: false, transformFunction: null }, showRangeLabelOnInput: { classPropertyName: "showRangeLabelOnInput", publicName: "showRangeLabelOnInput", isSignal: true, isRequired: false, transformFunction: null }, startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, listYearHiddenInputSearch: { classPropertyName: "listYearHiddenInputSearch", publicName: "listYearHiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange", outChangStageFlagMouse: "outChangStageFlagMouse", outPickerDate: "outPickerDate", outCancel: "outCancel", outUpdateWidth: "outUpdateWidth", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "pickerContainer", first: true, predicate: ["pickerContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"libs-ui-component-custom_ranges-calendar test-class\">\n <div class=\"relative flex\">\n <div class=\"libs-ui-component-custom_ranges-calendar\"\n [class.right]=\"isSingle()\"\n [class.left]=\"!isSingle()\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables(); as calendarVariables) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables.left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[130px]',position:{ mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().left()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyFromSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [listHiddenInputSearch]=\"true\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'month')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[110px]',position:{mode:'center',distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listLeftYearConfig()\"\n [listKeySelected]=\"listKeyFromSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"leftYearHttpDetailConfig()\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'year')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n\n <div class=\"w-1/4 flex items-center relative\">\n @if (!calendarVariables.left().minDate || (calendarVariables.left().minDate?.isBefore(calendarVariables.left().calendar && calendarVariables.left().calendar?.firstDay))) {\n <div (click)=\"handlerClickPrev(sideEnum.left)\">\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n @if ((!calendarVariables.left().maxDate || calendarVariables.left().maxDate?.isAfter(calendarVariables.left().calendar && calendarVariables.left().calendar?.lastDay)) && isSingle()) {\n <div (click)=\"handlerClickNext(sideEnum.left)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables.left().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class.today]=\"calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.[col]\"\n (click)=\"handlerPickerDate($event, sideEnum.left, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.left, row, col)\">\n <span\n class=\"libs-ui-font-h5r\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center column items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().lefthour()\"\n (outInputEvent)=\"handlerInputEvent($event, 'lefthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'hour')\"\n (outChange)=\"handlerChangeTimeValue($event, 'lefthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'lefthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().leftminute()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'minute')\"\n (outInputEvent)=\"handlerInputEvent($event, 'leftminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'leftminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'leftminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (!isSingle()) {\n <div class=\"libs-ui-component-custom_ranges-calendar right ml-[24px]\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables()) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables().left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[130px]',position:{mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().right()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyToSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'month')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[ calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [zIndex]=\"zIndex() + 1\"\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[110px]', position:{mode:'center', distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listRightYearConfig()\"\n [listKeySelected]=\"listKeyToSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"rightYearHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'year')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n <div class=\"w-1/4 flex items-center relative\">\n @if (listKeyFromSelected().year && listKeyToSelected().year && !(((listKeyFromSelected().year +1) === listKeyToSelected().year) && (listKeyFromSelected().month === 12) && listKeyToSelected().month === 1)&& (listKeyFromSelected().year < listKeyToSelected().year) || listKeyFromSelected().month && listKeyToSelected().month && ((listKeyFromSelected().month + 1) < +listKeyToSelected().month)) {\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\"\n (click)=\"handlerClickPrev(sideEnum.right)\">\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n }\n @if (listKeyFromSelected().month && listKeyToSelected().month && (listKeyFromSelected().month > listKeyToSelected().month) && listKeyFromSelected().year && listKeyToSelected().year && (listKeyFromSelected().year === listKeyToSelected().year )) {\n <div\n class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\">\n </div>\n }\n @if (!calendarVariables().right().maxDate || (calendarVariables().right().maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay))) {\n <div (click)=\"handlerClickNext(sideEnum.right)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables().right().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"calendarVariables().right().calendar && calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables().right().calendar &&calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\"\n (click)=\"handlerPickerDate($event, sideEnum.right, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.right, row, col)\">\n <span>{{ calendarVariables().right().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().righthour()\"\n (outChange)=\"handlerChangeTimeValue($event, 'righthour')\"\n (outInputEvent)=\"handlerInputEvent($event,'righthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'righthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'righthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().rightminute()\"\n (outInputEvent)=\"handlerInputEvent($event,'rightminute')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'rightminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'rightminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'rightminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n <div>\n <div class=\"flex w-full\">\n @if (!isSingle() && hasTimePicker()) {\n <div class=\"mt-[8px] libs-ui-font-h7r text-[#ff5454] h-[14px]\">\n @if (timePickerError()) {\n <span>{{ 'i18n_date_compare_start_end_message_error' | translate }}</span>\n }\n </div>\n }\n </div>\n @if (!quickRangesArray().length || !isSingle()) {\n <div class=\" flex w-full pt-[16px] justify-between\">\n <div class=\"flex items-center\">\n @if (!isSingle()) {\n @if (!endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n @if (endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ endDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"flex\">\n <libs_ui-components-buttons-button class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button label=\"i18n_select\"\n (outClick)=\"handlerClickApply($event)\" />\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown{display:flex;align-items:center}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar table{border-collapse:inherit;border-spacing:0 2px}.libs-ui-component-custom_ranges-calendar th,.libs-ui-component-custom_ranges-calendar td{padding:0;text-align:center;min-width:32px}.libs-ui-component-custom_ranges-calendar th span,.libs-ui-component-custom_ranges-calendar td span{pointer-events:none}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:before{font-size:20px}.libs-ui-component-custom_ranges-calendar td,.libs-ui-component-custom_ranges-calendar th{cursor:pointer;height:2em;width:2em}.libs-ui-component-custom_ranges-calendar td.available:hover,.libs-ui-component-custom_ranges-calendar th.available:hover{background-color:#f8f5fe;border-color:transparent;border-radius:8px;color:inherit;background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms}.libs-ui-component-custom_ranges-calendar td{margin:.25em 0;background-color:#fff;transition:background-color .2s ease;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms;color:#071631!important}.libs-ui-component-custom_ranges-calendar td:hover{color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.off,.libs-ui-component-custom_ranges-calendar td.off.in-range,.libs-ui-component-custom_ranges-calendar td.off.start-date,.libs-ui-component-custom_ranges-calendar td.off.end-date{background-color:#fff;border-color:transparent;color:#cdd0d6!important}.libs-ui-component-custom_ranges-calendar td.focus-off{background-color:#f8f5fe!important}.libs-ui-component-custom_ranges-calendar td.in-range{background-color:#f8f5fe;border-color:transparent;border-radius:0;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today{position:relative;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today:after{position:absolute;content:\"\";width:2px;height:2px;background-color:#8e61ee;left:49%;bottom:5px}.libs-ui-component-custom_ranges-calendar td.active{transition:background .3s ease-out;background:#0000001a}.libs-ui-component-custom_ranges-calendar td.active.today:after{position:absolute;content:\"\";background-color:#fff}.libs-ui-component-custom_ranges-calendar td.active.start-date{border-radius:8px 0 0 8px}.libs-ui-component-custom_ranges-calendar td.active.end-date{border-radius:0 8px 8px 0}.libs-ui-component-custom_ranges-calendar td.active.full-date{border-radius:8px}.libs-ui-component-custom_ranges-calendar td.active,.libs-ui-component-custom_ranges-calendar td.active:hover{background-color:#8e61ee;border-color:transparent;color:#fff!important}.libs-ui-component-custom_ranges-calendar th.month{width:auto}.libs-ui-component-custom_ranges-calendar td.disabled,.libs-ui-component-custom_ranges-calendar option.disabled{color:#999!important;cursor:not-allowed;text-decoration:line-through;background-color:#f4f5f7}.libs-ui-component-custom_ranges-calendar .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right}.libs-ui-component-custom_ranges-calendar th.month>div{position:relative;display:inline-block}@media (min-width: 564px){.libs-ui-component-custom_ranges{width:auto}}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1263
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, isStandalone: true, selector: "libs_ui-components-datetime-picker-custom_ranges-calendar", inputs: { quickRangesArray: { classPropertyName: "quickRangesArray", publicName: "quickRangesArray", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, isSingle: { classPropertyName: "isSingle", publicName: "isSingle", isSignal: true, isRequired: false, transformFunction: null }, showDropdownsSelect: { classPropertyName: "showDropdownsSelect", publicName: "showDropdownsSelect", isSignal: true, isRequired: false, transformFunction: null }, hasTimePicker: { classPropertyName: "hasTimePicker", publicName: "hasTimePicker", isSignal: true, isRequired: false, transformFunction: null }, flagMouse: { classPropertyName: "flagMouse", publicName: "flagMouse", isSignal: true, isRequired: false, transformFunction: null }, dateOptions: { classPropertyName: "dateOptions", publicName: "dateOptions", isSignal: true, isRequired: false, transformFunction: null }, autoApply: { classPropertyName: "autoApply", publicName: "autoApply", isSignal: true, isRequired: false, transformFunction: null }, hasSecondPicker: { classPropertyName: "hasSecondPicker", publicName: "hasSecondPicker", isSignal: true, isRequired: false, transformFunction: null }, showRangeLabelOnInput: { classPropertyName: "showRangeLabelOnInput", publicName: "showRangeLabelOnInput", isSignal: true, isRequired: false, transformFunction: null }, startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, listYearHiddenInputSearch: { classPropertyName: "listYearHiddenInputSearch", publicName: "listYearHiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange", outChangStageFlagMouse: "outChangStageFlagMouse", outPickerDate: "outPickerDate", outCancel: "outCancel", outUpdateWidth: "outUpdateWidth", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "pickerContainer", first: true, predicate: ["pickerContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"libs-ui-component-custom_ranges-calendar test-class\">\n <div class=\"relative flex\">\n <div class=\"libs-ui-component-custom_ranges-calendar\"\n [class.right]=\"isSingle()\"\n [class.left]=\"!isSingle()\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables(); as calendarVariables) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables.left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[130px]',position:{ mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().left()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyFromSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [listHiddenInputSearch]=\"true\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'month')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[110px]',position:{mode:'center',distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listLeftYearConfig()\"\n [listKeySelected]=\"listKeyFromSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"leftYearHttpDetailConfig()\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'year')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n\n <div class=\"w-1/4 flex items-center relative\">\n @if (!calendarVariables.left().minDate || (calendarVariables.left().minDate?.isBefore(calendarVariables.left().calendar && calendarVariables.left().calendar?.firstDay))) {\n <div (click)=\"handlerClickPrev(sideEnum.left)\">\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n @if ((!calendarVariables.left().maxDate || calendarVariables.left().maxDate?.isAfter(calendarVariables.left().calendar && calendarVariables.left().calendar?.lastDay)) && isSingle()) {\n <div (click)=\"handlerClickNext(sideEnum.left)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables.left().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class.today]=\"calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.[col]\"\n (click)=\"handlerPickerDate($event, sideEnum.left, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.left, row, col)\">\n <span\n class=\"libs-ui-font-h5r\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center column items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().lefthour()\"\n (outInputEvent)=\"handlerInputEvent($event, 'lefthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'hour')\"\n (outChange)=\"handlerChangeTimeValue($event, 'lefthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'lefthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().leftminute()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'minute')\"\n (outInputEvent)=\"handlerInputEvent($event, 'leftminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'leftminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'leftminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (!isSingle()) {\n <div class=\"libs-ui-component-custom_ranges-calendar right ml-[24px]\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables()) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables().left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[130px]',position:{mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().right()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyToSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'month')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[ calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [zIndex]=\"zIndex() + 1\"\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[110px]', position:{mode:'center', distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listRightYearConfig()\"\n [listKeySelected]=\"listKeyToSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"rightYearHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'year')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n <div class=\"w-1/4 flex items-center relative\">\n @if (listKeyFromSelected().year && listKeyToSelected().year && !(((listKeyFromSelected().year +1) === listKeyToSelected().year) && (listKeyFromSelected().month === 12) && listKeyToSelected().month === 1)&& (listKeyFromSelected().year < listKeyToSelected().year) || listKeyFromSelected().month && listKeyToSelected().month && ((listKeyFromSelected().month + 1) < +listKeyToSelected().month)) {\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\"\n (click)=\"handlerClickPrev(sideEnum.right)\">\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n }\n @if (listKeyFromSelected().month && listKeyToSelected().month && (listKeyFromSelected().month > listKeyToSelected().month) && listKeyFromSelected().year && listKeyToSelected().year && (listKeyFromSelected().year === listKeyToSelected().year )) {\n <div\n class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\">\n </div>\n }\n @if (!calendarVariables().right().maxDate || (calendarVariables().right().maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay))) {\n <div (click)=\"handlerClickNext(sideEnum.right)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables().right().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"calendarVariables().right().calendar && calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables().right().calendar &&calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\"\n (click)=\"handlerPickerDate($event, sideEnum.right, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.right, row, col)\">\n <span>{{ calendarVariables().right().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().righthour()\"\n (outChange)=\"handlerChangeTimeValue($event, 'righthour')\"\n (outInputEvent)=\"handlerInputEvent($event,'righthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'righthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'righthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().rightminute()\"\n (outInputEvent)=\"handlerInputEvent($event,'rightminute')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'rightminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'rightminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'rightminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n <div>\n <div class=\"flex w-full\">\n @if (!isSingle() && hasTimePicker()) {\n <div class=\"mt-[8px] libs-ui-font-h7r text-[#ff5454] h-[14px]\">\n @if (timePickerError()) {\n <span>{{ 'i18n_date_compare_start_end_message_error' | translate }}</span>\n }\n </div>\n }\n </div>\n @if (!quickRangesArray().length || !isSingle()) {\n <div class=\" flex w-full pt-[16px] justify-between\">\n <div class=\"flex items-center\">\n @if (!isSingle()) {\n @if (!endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n @if (endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ endDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"flex\">\n <libs_ui-components-buttons-button class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button label=\"i18n_select\"\n (outClick)=\"handlerClickApply($event)\" />\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown{display:flex;align-items:center}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar table{border-collapse:inherit;border-spacing:0 2px}.libs-ui-component-custom_ranges-calendar th,.libs-ui-component-custom_ranges-calendar td{padding:0;text-align:center;min-width:32px}.libs-ui-component-custom_ranges-calendar th span,.libs-ui-component-custom_ranges-calendar td span{pointer-events:none}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:before{font-size:20px}.libs-ui-component-custom_ranges-calendar td,.libs-ui-component-custom_ranges-calendar th{cursor:pointer;height:2em;width:2em}.libs-ui-component-custom_ranges-calendar td.available:hover,.libs-ui-component-custom_ranges-calendar th.available:hover{background-color:#f8f5fe;border-color:transparent;border-radius:8px;color:inherit;background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms}.libs-ui-component-custom_ranges-calendar td{margin:.25em 0;background-color:#fff;transition:background-color .2s ease;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms;color:#071631!important}.libs-ui-component-custom_ranges-calendar td:hover{color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.off,.libs-ui-component-custom_ranges-calendar td.off.in-range,.libs-ui-component-custom_ranges-calendar td.off.start-date,.libs-ui-component-custom_ranges-calendar td.off.end-date{background-color:#fff;border-color:transparent;color:#cdd0d6!important}.libs-ui-component-custom_ranges-calendar td.focus-off{background-color:#f8f5fe!important}.libs-ui-component-custom_ranges-calendar td.in-range{background-color:#f8f5fe;border-color:transparent;border-radius:0;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today{position:relative;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today:after{position:absolute;content:\"\";width:2px;height:2px;background-color:#8e61ee;left:49%;bottom:5px}.libs-ui-component-custom_ranges-calendar td.active{transition:background .3s ease-out;background:#0000001a}.libs-ui-component-custom_ranges-calendar td.active.today:after{position:absolute;content:\"\";background-color:#fff}.libs-ui-component-custom_ranges-calendar td.active.start-date{border-radius:8px 0 0 8px}.libs-ui-component-custom_ranges-calendar td.active.end-date{border-radius:0 8px 8px 0}.libs-ui-component-custom_ranges-calendar td.active.full-date{border-radius:8px}.libs-ui-component-custom_ranges-calendar td.active,.libs-ui-component-custom_ranges-calendar td.active:hover{background-color:#8e61ee;border-color:transparent;color:#fff!important}.libs-ui-component-custom_ranges-calendar th.month{width:auto}.libs-ui-component-custom_ranges-calendar td.disabled,.libs-ui-component-custom_ranges-calendar option.disabled{color:#999!important;cursor:not-allowed;text-decoration:line-through;background-color:#f4f5f7}.libs-ui-component-custom_ranges-calendar .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right}.libs-ui-component-custom_ranges-calendar th.month>div{position:relative;display:inline-block}@media (min-width: 564px){.libs-ui-component-custom_ranges{width:auto}}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1264
1264
|
}
|
|
1265
1265
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, decorators: [{
|
|
1266
1266
|
type: Component,
|
|
@@ -1271,4 +1271,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1271
1271
|
LibsUiComponentsButtonsButtonComponent
|
|
1272
1272
|
], template: "<div class=\"libs-ui-component-custom_ranges-calendar test-class\">\n <div class=\"relative flex\">\n <div class=\"libs-ui-component-custom_ranges-calendar\"\n [class.right]=\"isSingle()\"\n [class.left]=\"!isSingle()\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables(); as calendarVariables) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables.left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[130px]',position:{ mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().left()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyFromSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [listHiddenInputSearch]=\"true\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'month')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[110px]',position:{mode:'center',distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listLeftYearConfig()\"\n [listKeySelected]=\"listKeyFromSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"leftYearHttpDetailConfig()\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'year')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n\n <div class=\"w-1/4 flex items-center relative\">\n @if (!calendarVariables.left().minDate || (calendarVariables.left().minDate?.isBefore(calendarVariables.left().calendar && calendarVariables.left().calendar?.firstDay))) {\n <div (click)=\"handlerClickPrev(sideEnum.left)\">\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n @if ((!calendarVariables.left().maxDate || calendarVariables.left().maxDate?.isAfter(calendarVariables.left().calendar && calendarVariables.left().calendar?.lastDay)) && isSingle()) {\n <div (click)=\"handlerClickNext(sideEnum.left)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables.left().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class.today]=\"calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.[col]\"\n (click)=\"handlerPickerDate($event, sideEnum.left, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.left, row, col)\">\n <span\n class=\"libs-ui-font-h5r\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center column items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().lefthour()\"\n (outInputEvent)=\"handlerInputEvent($event, 'lefthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'hour')\"\n (outChange)=\"handlerChangeTimeValue($event, 'lefthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'lefthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().leftminute()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'minute')\"\n (outInputEvent)=\"handlerInputEvent($event, 'leftminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'leftminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'leftminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (!isSingle()) {\n <div class=\"libs-ui-component-custom_ranges-calendar right ml-[24px]\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables()) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables().left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[130px]',position:{mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().right()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyToSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'month')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[ calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [zIndex]=\"zIndex() + 1\"\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[110px]', position:{mode:'center', distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listRightYearConfig()\"\n [listKeySelected]=\"listKeyToSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"rightYearHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'year')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n <div class=\"w-1/4 flex items-center relative\">\n @if (listKeyFromSelected().year && listKeyToSelected().year && !(((listKeyFromSelected().year +1) === listKeyToSelected().year) && (listKeyFromSelected().month === 12) && listKeyToSelected().month === 1)&& (listKeyFromSelected().year < listKeyToSelected().year) || listKeyFromSelected().month && listKeyToSelected().month && ((listKeyFromSelected().month + 1) < +listKeyToSelected().month)) {\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\"\n (click)=\"handlerClickPrev(sideEnum.right)\">\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n }\n @if (listKeyFromSelected().month && listKeyToSelected().month && (listKeyFromSelected().month > listKeyToSelected().month) && listKeyFromSelected().year && listKeyToSelected().year && (listKeyFromSelected().year === listKeyToSelected().year )) {\n <div\n class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\">\n </div>\n }\n @if (!calendarVariables().right().maxDate || (calendarVariables().right().maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay))) {\n <div (click)=\"handlerClickNext(sideEnum.right)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i\n class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables().right().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"calendarVariables().right().calendar && calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables().right().calendar &&calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\"\n (click)=\"handlerPickerDate($event, sideEnum.right, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.right, row, col)\">\n <span>{{ calendarVariables().right().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().righthour()\"\n (outChange)=\"handlerChangeTimeValue($event, 'righthour')\"\n (outInputEvent)=\"handlerInputEvent($event,'righthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'righthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'righthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().rightminute()\"\n (outInputEvent)=\"handlerInputEvent($event,'rightminute')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'rightminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'rightminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'rightminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n <div>\n <div class=\"flex w-full\">\n @if (!isSingle() && hasTimePicker()) {\n <div class=\"mt-[8px] libs-ui-font-h7r text-[#ff5454] h-[14px]\">\n @if (timePickerError()) {\n <span>{{ 'i18n_date_compare_start_end_message_error' | translate }}</span>\n }\n </div>\n }\n </div>\n @if (!quickRangesArray().length || !isSingle()) {\n <div class=\" flex w-full pt-[16px] justify-between\">\n <div class=\"flex items-center\">\n @if (!isSingle()) {\n @if (!endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n @if (endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ endDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"flex\">\n <libs_ui-components-buttons-button class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button label=\"i18n_select\"\n (outClick)=\"handlerClickApply($event)\" />\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown{display:flex;align-items:center}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar table{border-collapse:inherit;border-spacing:0 2px}.libs-ui-component-custom_ranges-calendar th,.libs-ui-component-custom_ranges-calendar td{padding:0;text-align:center;min-width:32px}.libs-ui-component-custom_ranges-calendar th span,.libs-ui-component-custom_ranges-calendar td span{pointer-events:none}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:before{font-size:20px}.libs-ui-component-custom_ranges-calendar td,.libs-ui-component-custom_ranges-calendar th{cursor:pointer;height:2em;width:2em}.libs-ui-component-custom_ranges-calendar td.available:hover,.libs-ui-component-custom_ranges-calendar th.available:hover{background-color:#f8f5fe;border-color:transparent;border-radius:8px;color:inherit;background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms}.libs-ui-component-custom_ranges-calendar td{margin:.25em 0;background-color:#fff;transition:background-color .2s ease;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms;color:#071631!important}.libs-ui-component-custom_ranges-calendar td:hover{color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.off,.libs-ui-component-custom_ranges-calendar td.off.in-range,.libs-ui-component-custom_ranges-calendar td.off.start-date,.libs-ui-component-custom_ranges-calendar td.off.end-date{background-color:#fff;border-color:transparent;color:#cdd0d6!important}.libs-ui-component-custom_ranges-calendar td.focus-off{background-color:#f8f5fe!important}.libs-ui-component-custom_ranges-calendar td.in-range{background-color:#f8f5fe;border-color:transparent;border-radius:0;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today{position:relative;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today:after{position:absolute;content:\"\";width:2px;height:2px;background-color:#8e61ee;left:49%;bottom:5px}.libs-ui-component-custom_ranges-calendar td.active{transition:background .3s ease-out;background:#0000001a}.libs-ui-component-custom_ranges-calendar td.active.today:after{position:absolute;content:\"\";background-color:#fff}.libs-ui-component-custom_ranges-calendar td.active.start-date{border-radius:8px 0 0 8px}.libs-ui-component-custom_ranges-calendar td.active.end-date{border-radius:0 8px 8px 0}.libs-ui-component-custom_ranges-calendar td.active.full-date{border-radius:8px}.libs-ui-component-custom_ranges-calendar td.active,.libs-ui-component-custom_ranges-calendar td.active:hover{background-color:#8e61ee;border-color:transparent;color:#fff!important}.libs-ui-component-custom_ranges-calendar th.month{width:auto}.libs-ui-component-custom_ranges-calendar td.disabled,.libs-ui-component-custom_ranges-calendar option.disabled{color:#999!important;cursor:not-allowed;text-decoration:line-through;background-color:#f4f5f7}.libs-ui-component-custom_ranges-calendar .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right}.libs-ui-component-custom_ranges-calendar th.month>div{position:relative;display:inline-block}@media (min-width: 564px){.libs-ui-component-custom_ranges{width:auto}}\n"] }]
|
|
1273
1273
|
}], ctorParameters: () => [] });
|
|
1274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RhdGV0aW1lL3BpY2tlci9zcmMvY3VzdG9tLXJhbmdlcy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZGF0ZXRpbWUvcGlja2VyL3NyYy9jdXN0b20tcmFuZ2VzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ2hNLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBaUQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQWtELG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFLeEksT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqSSxPQUFPLEVB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RSxFQUFFLENBQUM7WUFDZCxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPO0lBQ1QsQ0FBQzt3R0E5N0NVLDJEQUEyRDs0RkFBM0QsMkRBQTJELHd0RkN0Q3hFLHNnMUJBa2FBLDRvSURsWUksZUFBZSw0RkFDZixpQ0FBaUMsbTBEQUNqQyxvQ0FBb0Msb2dEQUNwQyxzQ0FBc0M7OzRGQUc3QiwyREFBMkQ7a0JBZHZFLFNBQVM7K0JBRUUsMkRBQTJELGNBR3pELElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxlQUFlO3dCQUNmLGlDQUFpQzt3QkFDakMsb0NBQW9DO3dCQUNwQyxzQ0FBc0M7cUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cIjtcbmltcG9ydCB7IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd25cIjtcbmltcG9ydCB7IElGb2N1c0FuZEJsdXJFdmVudCwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dFwiO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtbGlzdFwiO1xuaW1wb3J0IHsgSUZsYWdNb3VzZSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXJcIjtcbmltcG9ydCB7IElFdmVudCB9IGZyb20gXCJAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzXCI7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcgfSBmcm9tIFwiQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0XCI7XG5pbXBvcnQgeyBnZXREYXlqcywgaXNFbXB0eSwgc2V0IH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCBpc29XZWVrIGZyb20gJ2RheWpzL3BsdWdpbi9pc29XZWVrJztcbmltcG9ydCB7IGdldE1vbnRoc0RldGFpbEJ5SWQsIGdldE1vbnRoc0xpc3RDb25maWcsIGdldFllYXJzRGV0YWlsQnlJZCwgZ2V0WWVhcnNMaXN0Q29uZmlnIH0gZnJvbSBcIi4uLy4uL2RlZmluZXMvY2FsZW5kYXIuZGVmaW5lXCI7XG5pbXBvcnQgeyBERUZBVUxUX01BWF9ZRUFSLCBERUZBVUxUX01JTl9ZRUFSIH0gZnJvbSBcIi4uLy4uL2RlZmluZXMvY29tbW9uLWRhdGUuZGVmaW5lXCI7XG5pbXBvcnQgeyBkZWZhdWx0TG9jYWxlQ29uZmlnLCBnZXREYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9kZWZpbmVzL2RhdGUtb3B0aW9ucy5kZWZpbmVcIjtcbmltcG9ydCB7IElFbWl0RGF0ZUNhbGVuZGFyIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvY2FsZW5kYXItZW1pdC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDYWxlbmRhciwgSUNhbGVuZGFyVmFyaWFibGVzLCBJRGF0ZVJhbmdlLCBJU3BsaXRQaWNrZXJEYXRlLCBTaWRlRW51bSB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2NhbGVuZGFyLXZhcmlhYmxlcy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDYWxlbmRhckZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IExvY2FsaXphdGlvbkNvbmZpZyB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BpY2tlci5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDaGVja1RpbWVwaWNrZXJTZWxlY3RlZCwgSVNlbGVjdGVkT2xkLCBJVGltZXBpY2tlckl0ZW1WYWx1ZSwgSVRpbWVwaWNrZXJWYXJpYWJsZXMsIElUaW1lcGlja2VyVmFyaWFibGVzU2lkZSB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3RpbWUtdmFyaWFibGVzLmludGVyZmFjZVwiO1xuZGF5anMuZXh0ZW5kKGlzb1dlZWspO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZGF0ZXRpbWUtcGlja2VyLWN1c3RvbV9yYW5nZXMtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0RhdGV0aW1lUGlja2VyQ3VzdG9tUmFuZ2VzQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lkZUVudW0gPSBTaWRlRW51bTtcbiAgcHJvdGVjdGVkIGNhbGVuZGFyVmFyaWFibGVzID0gc2lnbmFsPElDYWxlbmRhclZhcmlhYmxlcz4oeyBsZWZ0OiBzaWduYWwoe30pLCByaWdodDogc2lnbmFsKHt9KSB9KTtcbiAgcHJvdGVjdGVkIHRpbWVwaWNrZXJWYXJpYWJsZXMgPSBzaWduYWw8SVRpbWVwaWNrZXJWYXJpYWJsZXM+KHsgbGVmdDogc2lnbmFsKHsgc2VsZWN0ZWRIb3VyOiAwLCBzZWxlY3RlZE1pbnV0ZTogMCB9KSwgcmlnaHQ6IHNpZ25hbCh7IHNlbGVjdGVkSG91cjogMjMsIHNlbGVjdGVkTWludXRlOiA1OSB9KSB9KTtcbiAgcHJvdGVjdGVkIGRpc2FibGVNb250aCA9IHNpZ25hbDx7IGxlZnQ6IFdyaXRhYmxlU2lnbmFsPEFycmF5PGFueT4+LCByaWdodDogV3JpdGFibGVTaWduYWw8QXJyYXk8YW55Pj4gfT4oeyBsZWZ0OiBzaWduYWwoW10pLCByaWdodDogc2lnbmFsKFtdKSB9KTtcbiAgcHJvdGVjdGVkIHRvZGF5ID0gc2lnbmFsPGRheWpzLkRheWpzPihkYXlqcygpKTtcbiAgcHJvdGVjdGVkIGxpc3RLZXlGcm9tU2VsZWN0ZWQgPSBzaWduYWw8eyBtb250aDogYW55LCB5ZWFyOiBhbnkgfT4oeyBtb250aDogdW5kZWZpbmVkLCB5ZWFyOiB1bmRlZmluZWQgfSk7XG4gIHByb3RlY3RlZCBsaXN0S2V5VG9TZWxlY3RlZCA9IHNpZ25hbDx7IG1vbnRoOiBhbnksIHllYXI6IGFueSB9Pih7IG1vbnRoOiB1bmRlZmluZWQsIHllYXI6IHVuZGVmaW5lZCB9KTtcbiAgcHJvdGVjdGVkIGNoZWNrU2hvd0xpc3REcm9wZG93biA9IHNpZ25hbDx7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfT4oe30pO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRRdWlja1JhbmdlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgbGVmdENhbGVuZGFyID0gc2lnbmFsPHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXIsIG1vbnRoPzogZGF5anMuRGF5anMgfT4oe30pO1xuICBwcm90ZWN0ZWQgcmlnaHRDYWxlbmRhciA9IHNpZ25hbDx7IGNhbGVuZGFyPzogSUNhbGVuZGFyLCBtb250aD86IGRheWpzLkRheWpzIH0+KHt9KTtcblxuICBwcm90ZWN0ZWQgbGlzdE1vbnRoc0NvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBtb250aEh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPihnZXRNb250aHNEZXRhaWxCeUlkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdExlZnRZZWFyQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxpc3RSaWdodFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGlzdFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGVmdFllYXJIdHRwRGV0YWlsQ29uZmlnID0gc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHJpZ2h0WWVhckh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCB0aW1lUGlja2VyRXJyb3IgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWUoeyBzZWxlY3RlZEhvdXI6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCksIHNlbGVjdGVkTWludXRlOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkgfSkpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lKHsgc2VsZWN0ZWRIb3VyOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSwgc2VsZWN0ZWRNaW51dGU6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkgfSkpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnRJbnB1dEhvdXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5sZWZ0LCAnaG91cicpKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0SW5wdXRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5sZWZ0LCAnbWludXRlJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0SW5wdXRIb3VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoU2lkZUVudW0ucmlnaHQsICdob3VyJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0SW5wdXRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5yaWdodCwgJ21pbnV0ZScpKTtcbiAgcHJvdGVjdGVkIHRpbWVwaWNrZXJWYWx1ZUl0ZW0gPSBzaWduYWw8SVRpbWVwaWNrZXJJdGVtVmFsdWU+KHsgbGVmdGhvdXI6IHNpZ25hbCgwKSwgbGVmdG1pbnV0ZTogc2lnbmFsKDApLCByaWdodGhvdXI6IHNpZ25hbCgwKSwgcmlnaHRtaW51dGU6IHNpZ25hbCgwKSB9KTtcblxuICBwcml2YXRlIGZ1bmN0aW9uQ29udHJvbHMgPSBuZXcgTWFwPHN0cmluZywgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQgfCBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcHJpdmF0ZSBwaWNraW5nRGF0ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaXNTaG93biA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbm93SG92ZXJlZERhdGUgPSBzaWduYWw8ZGF5anMuRGF5anMgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSB0aW1lUGlja2VySW5jcmVtZW50ID0gc2lnbmFsPG51bWJlcj4oMSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRMYWJlbCA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUga2V5Q29kZUJhY2tzcGFjZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgY2hlY2tCYWNrc3BhY2VGb2N1cyA9IHNpZ25hbDxJVGltZXBpY2tlckl0ZW1WYWx1ZT4oeyBsZWZ0aG91cjogc2lnbmFsKDEpLCBsZWZ0bWludXRlOiBzaWduYWwoMSksIHJpZ2h0aG91cjogc2lnbmFsKDEpLCByaWdodG1pbnV0ZTogc2lnbmFsKDEpIH0pO1xuICBwcml2YXRlIGlzWmVybyA9IHNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9sZERhdGUgPSBzaWduYWw8SVNlbGVjdGVkT2xkPih7IHN0YXJ0OiBkYXlqcygwKSwgZW5kOiBkYXlqcygwKSB9KTtcbiAgcHJpdmF0ZSBpc1NlbGVjdGVkRGF0YSA9IHNpZ25hbDxJQ2hlY2tUaW1lcGlja2VyU2VsZWN0ZWQ+KHsgbGVmdG1vbnRoOiBmYWxzZSwgbGVmdHllYXI6IGZhbHNlLCByaWdodG1vbnRoOiBmYWxzZSwgcmlnaHR5ZWFyOiBmYWxzZSB9KTtcbiAgcHJpdmF0ZSBzcGxpdFBpY2tlckRhdGUgPSBzaWduYWw8SVNwbGl0UGlja2VyRGF0ZT4oeyBzdGFydDogc2lnbmFsKHsgbW9udGg6IDAsIHllYXI6IDAsIGRheTogMCwgaG91cjogMCwgbWludXRlOiAwIH0pLCBlbmQ6IHNpZ25hbCh7IG1vbnRoOiAwLCB5ZWFyOiAwLCBkYXk6IDAsIGhvdXI6IDIzLCBtaW51dGU6IDU5IH0pIH0pO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSBxdWlja1Jhbmdlc0FycmF5ID0gaW5wdXQ8QXJyYXk8SURhdGVSYW5nZT4+KFtdKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXI+KDEyMDAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDEyMDAgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc1NpbmdsZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0Ryb3Bkb3duc1NlbGVjdCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBoYXNUaW1lUGlja2VyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZSA9IGlucHV0PElGbGFnTW91c2U+KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGRhdGVPcHRpb25zID0gaW5wdXQ8TG9jYWxpemF0aW9uQ29uZmlnPih7IC4uLmRlZmF1bHRMb2NhbGVDb25maWcoKSwgLi4uZ2V0RGF0ZU9wdGlvbnMoKSB9KTtcbiAgcmVhZG9ubHkgYXV0b0FwcGx5ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBoYXNTZWNvbmRQaWNrZXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dSYW5nZUxhYmVsT25JbnB1dCA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcmVhZG9ubHkgc3RhcnREYXRlID0gbW9kZWw8ZGF5anMuRGF5anMgfCB1bmRlZmluZWQ+KGRheWpzKCkuc3RhcnRPZignZGF5JykpO1xuICByZWFkb25seSBlbmREYXRlID0gbW9kZWw8ZGF5anMuRGF5anMgfCB1bmRlZmluZWQ+KGRheWpzKCkuZW5kT2YoJ2RheScpKTtcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IGlucHV0PGRheWpzLkRheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBkYXlqcy5EYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IHRyYW5zZm9ybTogdGhpcy50cmFuc2Zvcm1NaW5NYXhEYXRlLmJpbmQodGhpcykgfSk7XG4gIHJlYWRvbmx5IG1heERhdGUgPSBpbnB1dDxkYXlqcy5EYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZCwgZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyB0cmFuc2Zvcm06IHRoaXMudHJhbnNmb3JtTWluTWF4RGF0ZS5iaW5kKHRoaXMpIH0pO1xuICByZWFkb25seSBsaXN0WWVhckhpZGRlbklucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gdHJ1ZSB9KTtcbiAgLyoqIE9VVFBVVCAqL1xuICByZWFkb25seSBvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIC8vIHJlYWRvbmx5IG91dFN0YXJ0RGF0ZUNoYW5nZWQgPSBvdXRwdXQ8eyBzdGFydERhdGU6IGRheWpzLkRheWpzIHwgdW5kZWZpbmVkIH0+KCk7XG4gIC8vIHJlYWRvbmx5IG91dEVuZERhdGVDaGFuZ2VkID0gb3V0cHV0PHsgZW5kRGF0ZTogZGF5anMuRGF5anMgfCB1bmRlZmluZWQgfT4oKTtcbiAgcmVhZG9ubHkgb3V0UGlja2VyRGF0ZSA9IG91dHB1dDxJRW1pdERhdGVDYWxlbmRhcj4oKTtcbiAgLy8gcmVhZG9ubHkgb3V0UmFuZ2VDbGlja2VkOiBFdmVudEVtaXR0ZXI8SVJhbmdlc0NsaWNrZWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICByZWFkb25seSBvdXRDYW5jZWwgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRVcGRhdGVXaWR0aCA9IG91dHB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUNhbGVuZGFyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgLyoqIElOSkVDVElPTiAqL1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICByZWFkb25seSBwaWNrZXJDb250YWluZXIgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3BpY2tlckNvbnRhaW5lcicpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGlzdE1vbnRoc0NvbmZpZy5zZXQoZ2V0TW9udGhzTGlzdENvbmZpZyh0aGlzLnRyYW5zbGF0ZSkpO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG9sZFN0YXJ0ID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKTtcbiAgICAgIGNvbnN0IG9sZEVuZCA9IHRoaXMuZW5kRGF0ZSgpPy5jbG9uZSgpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLm9sZERhdGUuc2V0KHsgc3RhcnQ6IG9sZFN0YXJ0LCBlbmQ6IG9sZEVuZCB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKTtcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5lbmREYXRlKCk/LmNsb25lKCk7XG5cbiAgICB0aGlzLnNwbGl0UGlja2VyRGF0ZS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50LnN0YXJ0LnVwZGF0ZShzaWRlQ3VycmVudCA9PiB7XG4gICAgICAgIHNpZGVDdXJyZW50LmRheSA9IChzdGFydERhdGUgPz8gZGF5anMoKS5zdGFydE9mKCdkYXknKSkuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgY3VycmVudC5lbmQudXBkYXRlKHNpZGVDdXJyZW50ID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnQuZGF5ID0gKGVuZERhdGUgPz8gZGF5anMoKS5lbmRPZignZGF5JykpLmRhdGUoKTtcblxuICAgICAgICByZXR1cm4gc2lkZUN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gICAgfVxuICAgIGlmIChzdGFydERhdGUgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgfVxuXG4gICAgaWYgKGVuZERhdGUgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShlbmREYXRlKTtcbiAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5yaWdodCk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRDb25maWdZZWFyKFNpZGVFbnVtLmxlZnQpO1xuICAgIHRoaXMuYnVpbGRDb25maWdZZWFyKFNpZGVFbnVtLnJpZ2h0LCBzdGFydERhdGU/LnllYXIoKSk7XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLmxlZnQpO1xuICAgIGlmICgoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KT8ueWVhcigpID8/IERFRkFVTFRfTUFYX1lFQVIpIDwgKHN0YXJ0RGF0ZT8ueWVhcigpIHx8IDApKSB7XG4gICAgICB0aGlzLmhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKHsga2V5OiBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy55ZWFyKCkgYXMgdW5rbm93biBhcyBzdHJpbmcgfSwgU2lkZUVudW0ubGVmdCArICd5ZWFyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzU2luZ2xlKCkpIHtcbiAgICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ucmlnaHQpO1xuICAgICAgaWYgKChnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy55ZWFyKCkgPz8gREVGQVVMVF9NQVhfWUVBUikgPCAoZW5kRGF0ZT8ueWVhcigpIHx8IDApKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oeyBrZXk6IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LnllYXIoKSBhcyB1bmtub3duIGFzIHN0cmluZyB9LCBTaWRlRW51bS5yaWdodCArICd5ZWFyJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGhpcy5yZW5kZXJSYW5nZXMoKTtcbiAgICB0aGlzLmZvcm1hdE1vbnRoWWVhcigpO1xuICAgIHRoaXMub3V0VXBkYXRlV2lkdGguZW1pdCgxKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0uc2V0KHtcbiAgICAgIGxlZnRob3VyOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdCgpLnNlbGVjdGVkSG91ciksXG4gICAgICByaWdodGhvdXI6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5yaWdodCgpLnNlbGVjdGVkSG91ciksXG4gICAgICBsZWZ0bWludXRlOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdCgpLnNlbGVjdGVkTWludXRlKSxcbiAgICAgIHJpZ2h0bWludXRlOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkucmlnaHQoKS5zZWxlY3RlZE1pbnV0ZSlcbiAgICB9KTtcblxuICAgIC8vIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHsgYnVpbGREZWZhdWx0UmFuZ2U6IHRoaXMuYnVpbGREZWZhdWx0UmFuZ2UuYmluZCh0aGlzKSwgYXBwbHlUb1NlbGVjdDogdGhpcy5hcHBseVRvU2VsZWN0LmJpbmQodGhpcykgfSlcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb25maWdZZWFyKHNpZGU6IFNpZGVFbnVtLCBzdGFydFllYXI/OiBudW1iZXIsKSB7XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpIGFzIGRheWpzLkRheWpzO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcztcblxuICAgIGNvbnN0IGxpc3RMZWZ0WWVhciA9IFtdO1xuICAgIGNvbnN0IGxpc3RSaWdodFllYXIgPSBbXTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBjb25zdCBzdGFydCA9IG1heERhdGU/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSO1xuICAgICAgY29uc3QgZW5kID0gbWluRGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUlOX1lFQVI7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgICAgbGlzdExlZnRZZWFyLnB1c2goe1xuICAgICAgICAgIGlkOiBpLFxuICAgICAgICAgIGxhYmVsOiBgJHtpfWBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RMZWZ0WWVhckNvbmZpZy5zZXQoZ2V0WWVhcnNMaXN0Q29uZmlnKGxpc3RMZWZ0WWVhcikpO1xuICAgICAgdGhpcy5sZWZ0WWVhckh0dHBEZXRhaWxDb25maWcuc2V0KGdldFllYXJzRGV0YWlsQnlJZChsaXN0TGVmdFllYXIpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gbWF4RGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUFYX1lFQVI7XG4gICAgY29uc3QgZW5kID0gc3RhcnRZZWFyID8/IG1pbkRhdGU/LnllYXIoKSA/PyBkYXlqcygpLnllYXIoKTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgIGxpc3RSaWdodFllYXIucHVzaCh7XG4gICAgICAgIGlkOiBpLFxuICAgICAgICBsYWJlbDogYCR7aX1gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RSaWdodFllYXJDb25maWcuc2V0KGdldFllYXJzTGlzdENvbmZpZyhsaXN0UmlnaHRZZWFyKSk7XG4gICAgdGhpcy5yaWdodFllYXJIdHRwRGV0YWlsQ29uZmlnLnNldChnZXRZZWFyc0RldGFpbEJ5SWQobGlzdFJpZ2h0WWVhcikpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoZmxhZ01vdXNlOiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoZmxhZ01vdXNlKVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGFydEVuZERhdGUoZGF0ZTogZGF5anMuRGF5anMpIHtcbiAgICBpZiAoKHRoaXMuZW5kRGF0ZSgpIHx8IGRhdGUuaXNCZWZvcmUodGhpcy5zdGFydERhdGUoKSwgJ2RheScpKSkge1xuICAgICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgIGRhdGUgPSB0aGlzLmdldERhdGVXaXRoVGltZShkYXRlLCBTaWRlRW51bS5sZWZ0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlKGRhdGUuY2xvbmUoKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmVuZERhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpICYmIGRhdGUuaXNCZWZvcmUodGhpcy5zdGFydERhdGUoKSkpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZSh0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIGRhdGUgPSB0aGlzLmdldERhdGVXaXRoVGltZShkYXRlLCBTaWRlRW51bS5yaWdodCk7XG4gICAgfVxuICAgIGlmICghZGF0ZS5pc0JlZm9yZSh0aGlzLnN0YXJ0RGF0ZSgpLCAnZGF5JykpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShkYXRlLmNsb25lKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdXRvQXBwbHkoKSkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVTZWxlY3RlZExhYmVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTZWxlY3RlZExhYmVsKCkge1xuICAgIHRoaXMudXBkYXRlRWxlbWVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNb250aFllYXIoKSB7XG4gICAgY29uc3QgbW9udGggPSAodGhpcy5jYWxlbmRhclZhcmlhYmxlcygpLmxlZnQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50TW9udGggPz8gMCkgKyAxO1xuICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gbW9udGg7XG4gICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRZZWFyO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5pc1NpbmdsZSgpKSB7XG4gICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnNldCh7IGxlZnRtb250aDogdHJ1ZSwgbGVmdHllYXI6IHRydWUsIHJpZ2h0bW9udGg6IHRydWUsIHJpZ2h0eWVhcjogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmlnaHRNb250aCA9ICh0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50TW9udGggPz8gMCkgKyAxO1xuICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IHJpZ2h0TW9udGg7XG4gICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50WWVhcjtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5pc1NlbGVjdGVkRGF0YS5zZXQoeyBsZWZ0bW9udGg6IHRydWUsIGxlZnR5ZWFyOiB0cnVlLCByaWdodG1vbnRoOiB0cnVlLCByaWdodHllYXI6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXJ0RGF0ZShzdGFydERhdGU6IGRheWpzLkRheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KGRheWpzKHN0YXJ0RGF0ZSwgdGhpcy5kYXRlT3B0aW9ucygpLmZvcm1hdCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHN0YXJ0RGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMucGlja2luZ0RhdGUuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KGRheWpzKHN0YXJ0RGF0ZSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnBpY2tpbmdEYXRlLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldCh0aGlzLnN0YXJ0RGF0ZSgpPy5zdGFydE9mKCdkYXknKSk7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG5cbiAgICBpZiAodGhpcy5taW5EYXRlKCkgJiYgdGhpcy5zdGFydERhdGUoKT8uaXNCZWZvcmUodGhpcy5taW5EYXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoKHRoaXMubWluRGF0ZSgpIGFzIGRheWpzLkRheWpzKT8uY2xvbmUoKSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heERhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5pc0FmdGVyKHRoaXMubWF4RGF0ZSgpKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KCh0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcykuY2xvbmUoKSk7XG4gICAgICB0aGlzLnNldFN0YXJ0RGF0ZUluVGltZVBpY2tlcigpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNTaG93bigpKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB9XG4gICAgLy8gdGhpcy5vdXRTdGFydERhdGVDaGFuZ2VkLmVtaXQoeyBzdGFydERhdGU6IHRoaXMuc3RhcnREYXRlKCkgfSk7XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCkge1xuICAgIGlmICghdGhpcy5oYXNUaW1lUGlja2VyKCkgfHwgIXRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydERhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudC5taW51dGUoTWF0aC5yb3VuZChjdXJyZW50Lm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpICogdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldEVuZERhdGUoZW5kRGF0ZTogZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuZERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KGRheWpzKGVuZERhdGUsIHRoaXMuZGF0ZU9wdGlvbnMoKS5mb3JtYXQpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmREYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldChkYXlqcyhlbmREYXRlKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5lbmREYXRlKCkgfHwgIXRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnBpY2tpbmdEYXRlLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuZW5kRGF0ZSgpPy5hZGQoMSwgJ2QnKS5zdGFydE9mKCdkYXknKS5zdWJ0cmFjdCgxLCAnc2Vjb25kJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNUaW1lUGlja2VyKCkgJiYgdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQubWludXRlKE1hdGgucm91bmQoY3VycmVudC5taW51dGUoKSAvIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmREYXRlKCk/LmlzQmVmb3JlKHRoaXMuc3RhcnREYXRlKCkpKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhEYXRlKCkgJiYgdGhpcy5lbmREYXRlKCk/LmlzQWZ0ZXIodGhpcy5tYXhEYXRlKCkpKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KCh0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcyk/LmNsb25lKCkpO1xuICAgIH1cbiAgICAvLyB0aGlzLm91dEVuZERhdGVDaGFuZ2VkLmVtaXQoeyBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSB9KTtcbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVySG92ZXJEYXRlKGV2ZW50OiBFdmVudCwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbGVmdENhbERhdGUgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuICAgIGNvbnN0IHJpZ2h0Q2FsRGF0ZSA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCF0aGlzLnBpY2tpbmdEYXRlIHx8ICFyaWdodENhbERhdGUgfHwgIWxlZnRDYWxEYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubm93SG92ZXJlZERhdGUuc2V0KHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyBsZWZ0Q2FsRGF0ZSA6IHJpZ2h0Q2FsRGF0ZSk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5sZWZ0KTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgfVxuICBwcml2YXRlIGdldERpc2FibGUodHlwZTogJ2xlZnQnIHwgJ3JpZ2h0Jykge1xuICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLm1pbkRhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCkgYXMgZGF5anMuRGF5anM7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQuc2V0KFtdKTtcblxuICAgICAgaWYgKG1pbkRhdGU/LnllYXIoKSA9PT0gdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IChtaW5EYXRlPy5tb250aCgpICsgMSk7IGkrKykge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkubGVmdC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZT8ueWVhcigpID09PSB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXhEYXRlPy5tb250aCgpICsgMjsgaSA8IDEzOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC5zZXQoW10pO1xuICAgIGlmIChtaW5EYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IChtaW5EYXRlPy5tb250aCgpICsgMSk7IGkrKykge1xuICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLnJpZ2h0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXhEYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gbWF4RGF0ZT8ubW9udGgoKSArIDI7IGkgPCAxMzsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkucmlnaHQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucHVzaChpKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKChOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikgPT09IE51bWJlcih0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpOyBpKyspIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tQcmV2KHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uc3VidHJhY3QoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5tb250aCgpID8/IDApICsgMTtcbiAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy55ZWFyKCk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja05leHQoc2lkZTogU2lkZUVudW0pIHtcbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoPy55ZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoKSAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA9PT0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSB7XG4gICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclBpY2tlckRhdGUoZXZlbnQ6IGFueSwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldD8udGFnTmFtZSA9PT0gJ1REJykge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2F2YWlsYWJsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQucGFyZW50RWxlbWVudCAmJiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYXZhaWxhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlLnNldCh0aGlzLmRhdGVPcHRpb25zKCkuY3VzdG9tUmFuZ2VMYWJlbCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5jYWxlbmRhcj8uW3Jvd11bY29sXSA6IHRoaXMucmlnaHRDYWxlbmRhcigpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnRbc2lkZSA9PT0gU2lkZUVudW0ubGVmdCA/ICdzdGFydCcgOiAnZW5kJ10udXBkYXRlKHNpZGVDdXJyZW50ID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnQuZGF5ID0gZGF0ZS5kYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHNpZGVDdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlU3RhcnRFbmREYXRlKGRhdGUpO1xuXG4gICAgaWYgKHRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLnNldEVuZERhdGUodGhpcy5zdGFydERhdGUoKSk7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcblxuICAgICAgaWYgKHRoaXMuYXV0b0FwcGx5KCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2xpY2tBcHBseSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIGlmICh0aGlzLmF1dG9BcHBseSgpICYmIHRoaXMuc3RhcnREYXRlKCkgJiYgdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlckNsaWNrQXBwbHkoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQXBwbHkoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyB0aGlzLnZhbGlkYXRlKCk7XG4gICAgLy8gaWYgKCF0aGlzLnZhbGlkYXRlKCkpIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnNldFRpbWVJbnB1dChTaWRlRW51bS5sZWZ0KTtcbiAgICAgIHRoaXMuc2V0VGltZUlucHV0KFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy5jYWxjdWxhdGVTZWxlY3RlZExhYmVsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZExhYmVsKCkpIHtcbiAgICAgIHRoaXMub3V0UGlja2VyRGF0ZS5lbWl0KHsgZGlzcGxheUxhYmVsOiB0aGlzLnNlbGVjdGVkTGFiZWwoKSwgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpLCBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSwgZGV0YWlsRGF0ZVBpY2tlcjogdGhpcy5zcGxpdFBpY2tlckRhdGUoKSB9KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0NhbmNlbChldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF5anMoMCkpO1xuICAgIHRoaXMuZW5kRGF0ZS5zZXQoZGF5anMoMCkpO1xuICAgIHRoaXMub3V0Q2FuY2VsLmVtaXQoJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5zZXQodHlwZSwgZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCwgdHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoe1xuICAgICAgaXNNb3VzZUVudGVyOiBmYWxzZSxcbiAgICAgIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlLFxuICAgICAgaXNDb250YWluZXJIYXNTY3JvbGw6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ubGVmdH1tb250aGA6XG4gICAgICBjYXNlIGAke1NpZGVFbnVtLnJpZ2h0fW1vbnRoYDpcbiAgICAgICAgdGhpcy51cGRhdGVNb250aFNlbGVjdChldmVudCwgdHlwZSk7XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ubGVmdH15ZWFyYDpcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ucmlnaHR9eWVhcmA6XG4gICAgICAgIHRoaXMudXBkYXRlWWVhclNlbGVjdChldmVudCwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLnNwbGl0UGlja2VyRGF0ZS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBpZiAodHlwZSA9PT0gYCR7U2lkZUVudW0ubGVmdH1tb250aGAgfHwgdHlwZSA9PT0gYCR7U2lkZUVudW0ubGVmdH15ZWFyYCkge1xuICAgICAgICBjdXJyZW50LnN0YXJ0LnVwZGF0ZShzdGFydCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9bW9udGhgKSB7XG4gICAgICAgICAgICBzdGFydC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlID09PSBgJHtTaWRlRW51bS5sZWZ0fXllYXJgKSB7XG4gICAgICAgICAgICBzdGFydC55ZWFyID0gZXZlbnQua2V5IGFzIG51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RhcnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LmVuZC51cGRhdGUoZW5kID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLnJpZ2h0fW1vbnRoYCkge1xuICAgICAgICAgIGVuZC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLnJpZ2h0fXllYXJgKSB7XG4gICAgICAgICAgZW5kLnllYXIgPSBldmVudC5rZXkgYXMgbnVtYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTW9udGhTZWxlY3QoZXZlbnQ6IElFbWl0U2VsZWN0S2V5LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaWRlID0gdHlwZS5pbmNsdWRlcyhTaWRlRW51bS5sZWZ0KSA/IFNpZGVFbnVtLmxlZnQgOiBTaWRlRW51bS5yaWdodDtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkuZHJvcGRvd25zPy4oKT8uY3VycmVudFllYXIgfHwgZGF5anMoKS55ZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBOdW1iZXIoZXZlbnQua2V5KSAtIDE7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZERhdGEoKS5sZWZ0bW9udGgpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5sZWZ0bW9udGggPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSBldmVudC5rZXk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA+PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICYmIChOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikgPT09IE51bWJlcih0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpKSB7XG4gICAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA8PSAxMSkge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcihldmVudC5rZXkpICsgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlcihldmVudC5rZXkpID09PSAxMikge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IDE7XG4gICAgICAgICAgICBjdXJyZW50LnllYXIgKz0gMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkucmlnaHRtb250aCkge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnJpZ2h0bW9udGggPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuXG4gICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuICAgIHRoaXMubW9udGhPclllYXJDaGFuZ2VkKG1vbnRoLCB5ZWFyLCBzaWRlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVllYXJTZWxlY3QoZXZlbnQ6IElFbWl0U2VsZWN0S2V5LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaWRlID0gdHlwZS5pbmNsdWRlcyhTaWRlRW51bS5sZWZ0KSA/IFNpZGVFbnVtLmxlZnQgOiBTaWRlRW51bS5yaWdodDtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkRGF0YSgpPy5sZWZ0eWVhcikge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmxlZnR5ZWFyID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgnbGVmdCcpO1xuICAgICAgICAvLyB0aGlzLlNldExpc3RZZWFyUmlnaHQodGhpcy5saXN0Vmlld0tleVNlbGVjdGVkWWVhciBhcyBudW1iZXIpO1xuICAgICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldCh0eXBlKSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlbW92ZUxpc3QoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnllYXIgPSBldmVudC5rZXk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA+PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpIHtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgPD0gMTEpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICsgMTtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RGlzYWJsZSgnbGVmdCcpO1xuICAgICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ucmlnaHQsIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgYXMgbnVtYmVyKTtcbiAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkucmlnaHR5ZWFyKSB7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZERhdGEudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucmlnaHR5ZWFyID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA+PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgPD0gMTEpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICsgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID09PSAxMikge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICBsZXQgbW9udGggPSBkYXlqcygpLm1vbnRoKCk7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQgJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIHtcbiAgICAgIG1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSAtIDE7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0ICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSB7XG4gICAgICBtb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgLSAxO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gTnVtYmVyKGV2ZW50LmtleSk7XG5cbiAgICB0aGlzLm1vbnRoT3JZZWFyQ2hhbmdlZChtb250aCwgeWVhciwgc2lkZSk7XG5cbiAgfVxuICBwcml2YXRlIG1vbnRoT3JZZWFyQ2hhbmdlZChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgY29uc3QgaXNMZWZ0ID0gc2lkZSA9PT0gU2lkZUVudW0ubGVmdDtcbiAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5taW5EYXRlKCkgYXMgZGF5anMuRGF5anM7XG4gICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSgpIGFzIGRheWpzLkRheWpzO1xuXG4gICAgaWYgKG1pbkRhdGUgJiYgKHllYXIgPCBtaW5EYXRlPy55ZWFyKCkgfHwgKHllYXIgPT09IG1pbkRhdGU/LnllYXIoKSAmJiBtb250aCA8IG1pbkRhdGU/Lm1vbnRoKCkpKSkge1xuICAgICAgbW9udGggPSBtaW5EYXRlPy5tb250aCgpO1xuICAgICAgeWVhciA9IG1pbkRhdGU/LnllYXIoKTtcbiAgICB9XG5cbiAgICBpZiAobWF4RGF0ZSAmJiAoeWVhciA+IG1heERhdGU/LnllYXIoKSB8fCAoeWVhciA9PT0gbWF4RGF0ZT8ueWVhcigpICYmIG1vbnRoID4gbWF4RGF0ZT8ubW9udGgoKSkpKSB7XG4gICAgICBtb250aCA9IG1heERhdGU/Lm1vbnRoKCk7XG4gICAgICB5ZWFyID0gbWF4RGF0ZT8ueWVhcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3Bkb3ducyA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpLmRyb3Bkb3ducztcblxuICAgIGlmIChkcm9wZG93bnM/LigpKSB7XG4gICAgICBkcm9wZG93bnMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmN1cnJlbnRZZWFyID0geWVhcjtcbiAgICAgICAgY3VycmVudC5jdXJyZW50TW9udGggPSBtb250aDtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pXG5cbiAgICB9XG4gICAgaWYgKGlzTGVmdCAmJiB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoKSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgaWYgKG1vbnRoID09PSAxMikge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmNsb25lKCkuYWRkKDEsICdtb250aCcpO1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcklucHV0RXZlbnQoZXZlbnQ6IElFdmVudCwgdHlwZTogYGxlZnRob3VyYCB8IGBsZWZ0bWludXRlYCB8IGByaWdodGhvdXJgIHwgYHJpZ2h0bWludXRlYCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlICE9PSA4KSB7XG4gICAgICBldmVudC5rZXlDb2RlICYmIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMua2V5Q29kZUJhY2tzcGFjZS5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5rZXlDb2RlQmFja3NwYWNlLnNldCh0cnVlKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbGVmdG1pbnV0ZSc6XG4gICAgICAgIGlmIChpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzKClbdHlwZV0oKSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoY3VycmVudFt0eXBlXSgpICsgMSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoMSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KGAke1NpZGVFbnVtLmxlZnR9aG91cmApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlnaHRtaW51dGUnOlxuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpKSkge1xuICAgICAgICAgIGlmICh0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMoKVt0eXBlXSgpID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldChjdXJyZW50W3R5cGVdKCkgKyAxKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldCgxKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQoYCR7U2lkZUVudW0ucmlnaHR9aG91cmApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoZXZlbnQ6IElGb2N1c0FuZEJsdXJFdmVudCwgdHlwZTogYGxlZnRob3VyYCB8IGBsZWZ0bWludXRlYCB8IGByaWdodGhvdXJgIHwgYHJpZ2h0bWludXRlYCkge1xuICAgIGlmIChldmVudC5uYW1lID09PSAnZm9jdXMnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50SW5wdXQgPSBldmVudC5ldmVudCBhcyBJRXZlbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRJbnB1dC50YXJnZXQ7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2xlZnRob3VyJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5zZWxlY3RlZEhvdXIgPSAhaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkgOiAwO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSA9PT0gMCkgfHwgaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LmxlZnRob3VyLnNldCgwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gJzAwJztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSl9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlnaHRob3VyJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkucmlnaHQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkgOiAwO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpKSB7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQucmlnaHRob3VyLnNldCgwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gJzAwJztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnRtaW51dGUnOlxuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSA6IDA7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LmxlZnRtaW51dGUuc2V0KDApO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSAnMDAnO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyaWdodG1pbnV0ZSc6XG4gICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpLnJpZ2h0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPyB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpIDogMDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkpIHtcbiAgICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5yaWdodG1pbnV0ZS5zZXQoMCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9ICcwMCc7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSl9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVRpbWVWYWx1ZShldmVudDogc3RyaW5nIHwgbnVtYmVyLCB0eXBlOiBgbGVmdGhvdXJgIHwgYGxlZnRtaW51dGVgIHwgYHJpZ2h0aG91cmAgfCBgcmlnaHRtaW51dGVgKSB7XG4gICAgdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KGV2ZW50IGFzIG51bWJlcik7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lkZSA9IHR5cGUuaW5jbHVkZXMoU2lkZUVudW0ubGVmdCkgPyBTaWRlRW51bS5sZWZ0IDogU2lkZUVudW0ucmlnaHQ7XG4gICAgY29uc3QgYXR0ciA9IHR5cGUuaW5jbHVkZXMoJ2hvdXInKSA/ICdob3VyJyA6ICdtaW51dGUnO1xuXG4gICAgdGhpcy5zcGxpdFBpY2tlckRhdGUudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudFtzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gJ3N0YXJ0JyA6ICdlbmQnXS51cGRhdGUoc2lkZUN1cnJlbnQgPT4ge1xuICAgICAgICBzaWRlQ3VycmVudFthdHRyXSA9IGV2ZW50IGFzIG51bWJlcjtcblxuICAgICAgICByZXR1cm4gc2lkZUN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgaWYgKCh0eXBlICE9PSAnbGVmdGhvdXInICYmIHR5cGUgIT09ICdyaWdodGhvdXInKSB8fCBldmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzWmVyby5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgoYCR7ZXZlbnR9YC5sZW5ndGggPT09IDIpIHx8IChOdW1iZXIoZXZlbnQpID4gMikgfHwgKE51bWJlcihldmVudCkgPD0gMiAmJiBOdW1iZXIoZXZlbnQpID4gMCAmJiB0aGlzLmlzWmVybygpKSB8fCAodGhpcy5pc1plcm8oKSAmJiAhdGhpcy5rZXlDb2RlQmFja3NwYWNlKCkpKSB7XG4gICAgICB0aGlzLmlzWmVyby5zZXQoZmFsc2UpO1xuICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQodHlwZSA9PT0gJ2xlZnRob3VyJyA/IGAke1NpZGVFbnVtLmxlZnR9bWludXRlYCA6IGAke1NpZGVFbnVtLnJpZ2h0fW1pbnV0ZWApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyKGV2ZW50KSA9PT0gMCAmJiAhdGhpcy5rZXlDb2RlQmFja3NwYWNlKCkpIHtcbiAgICAgIHRoaXMuaXNaZXJvLnNldCh0cnVlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2hvd0xpc3REcm9wZG93bihldmVudDogYm9vbGVhbiwgdHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGVja1Nob3dMaXN0RHJvcGRvd24udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50W3R5cGVdID0gZXZlbnQ7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnZlcnRJdGVtTW9udGggPSAoaXRlbTogYW55KSA9PiB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHNldChpdGVtLCAnbGFiZWxEaXNwbGF5JywgdGhpcy50cmFuc2xhdGUuaW5zdGFudChpdGVtLmxhYmVsIHx8ICcgJywgeyB5ZWFyOiAnJyB9KSk7XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydEl0ZW1ZZWFyID0gKGl0ZW06IGFueSkgPT4ge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpdGVtLmxhYmVsRGlzcGxheSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2kxOG5feWVhcl9wYXJhbScsIHsgeWVhcjogaXRlbS5sYWJlbCB9KTtcblxuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb250aHNJblZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoICYmIHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoICYmXG4gICAgICAgICgodGhpcy5sZWZ0Q2FsZW5kYXIoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykpIHx8ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpKSlcbiAgICAgICAgJiYgKHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgfHwgdGhpcy5lbmREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpID09PSB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykpXG4gICAgICApIHsgcmV0dXJuOyB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5lbmREYXRlKCk/Lm1vbnRoKCkgIT09IHRoaXMuc3RhcnREYXRlKCk/Lm1vbnRoKCkgfHwgdGhpcy5lbmREYXRlKCk/LnllYXIoKSAhPT0gdGhpcy5zdGFydERhdGUoKT8ueWVhcigpKSB7XG4gICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLmVuZERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKT8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpICYmIHRoaXMubGVmdENhbGVuZGFyKCkubW9udGggJiYgdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGggJiYgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgIT09IHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpICYmIHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5mb3JtYXQoJ1lZWVktTU0nKSAhPT0gdGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdZWVlZLU1NJykpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCk/LmRhdGUoMik7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpPy5kYXRlKDIpPy5hZGQoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRpbWVJbnB1dChzaWRlOiBTaWRlRW51bSkge1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkSG91cn1gKTtcbiAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkTWludXRlfWApO1xuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKTtcblxuICAgICAgc3RhcnQgPSBzdGFydD8uaG91cihob3VyKTtcbiAgICAgIHN0YXJ0ID0gc3RhcnQ/Lm1pbnV0ZShtaW51dGUpO1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoc3RhcnQpO1xuICAgICAgaWYgKHRoaXMuaXNTaW5nbGUoKSkge1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kRGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gc3RhcnQ/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmIHRoaXMuZW5kRGF0ZSgpPy5pc0JlZm9yZShzdGFydCkpIHtcbiAgICAgICAgdGhpcy5zZXRFbmREYXRlKHN0YXJ0Py5jbG9uZSgpKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5lbmREYXRlKCkgJiYgc3RhcnQgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDbG9uZSA9IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKHN0YXJ0LCBTaWRlRW51bS5yaWdodCk7XG5cbiAgICAgICAgaWYgKHN0YXJ0Q2xvbmUuaXNCZWZvcmUoc3RhcnQpKSB7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbU2lkZUVudW0ucmlnaHRdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gaG91cjtcbiAgICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRNaW51dGUgPSBtaW51dGU7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICBsZXQgZW5kID0gdGhpcy5lbmREYXRlKCk/LmNsb25lKCk7XG5cbiAgICAgIGVuZCA9IGVuZD8uaG91cihob3VyKTtcbiAgICAgIGVuZCA9IGVuZD8ubWludXRlKG1pbnV0ZSk7XG4gICAgICB0aGlzLnNldEVuZERhdGUoZW5kKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJzKCkge1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5yaWdodCk7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDYWxlbmRhcihzaWRlOiBTaWRlRW51bSkgeyAvLyBzaWRlIGVudW1cbiAgICBjb25zdCBtYWluQ2FsZW5kYXI6IHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXIsIG1vbnRoPzogZGF5anMuRGF5anMgfSA9IChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSA/IHRoaXMubGVmdENhbGVuZGFyKCkgOiB0aGlzLnJpZ2h0Q2FsZW5kYXIoKTtcblxuICAgIGlmICghbWFpbkNhbGVuZGFyLm1vbnRoIHx8ICh0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9udGggPSBtYWluQ2FsZW5kYXIubW9udGgubW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbWFpbkNhbGVuZGFyLm1vbnRoLnllYXIoKTtcbiAgICBjb25zdCBob3VyID0gbWFpbkNhbGVuZGFyLm1vbnRoLmhvdXIoKTtcbiAgICBjb25zdCBtaW51dGUgPSBtYWluQ2FsZW5kYXIubW9udGgubWludXRlKCk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFpbkNhbGVuZGFyLm1vbnRoLnNlY29uZCgpO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgpKS5kYXlzSW5Nb250aCgpO1xuICAgIGNvbnN0IGZpcnN0RGF5ID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgsIDEpKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgsIGRheXNJbk1vbnRoKSk7XG4gICAgY29uc3QgbGFzdE1vbnRoID0gZGF5anMoZmlyc3REYXkpLnN1YnRyYWN0KDEsICdtb250aCcpLm1vbnRoKCk7XG4gICAgY29uc3QgbGFzdFllYXIgPSBkYXlqcyhmaXJzdERheSkuc3VidHJhY3QoMSwgJ21vbnRoJykueWVhcigpO1xuICAgIGNvbnN0IGRheXNJbkxhc3RNb250aCA9IGRheWpzKG5ldyBEYXRlKGxhc3RZZWFyLCBsYXN0TW9udGgpKS5kYXlzSW5Nb250aCgpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGZpcnN0RGF5LmRheSgpO1xuICAgIGNvbnN0IGNhbGVuZGFyOiBJQ2FsZW5kYXIgPSB7fTtcblxuICAgIGNhbGVuZGFyLmZpcnN0RGF5ID0gZmlyc3REYXk7XG4gICAgY2FsZW5kYXIubGFzdERheSA9IGxhc3REYXk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgIGNhbGVuZGFyW2ldID0gW107XG4gICAgfVxuICAgIGxldCBzdGFydERheSA9IGRheXNJbkxhc3RNb250aCAtIGRheU9mV2VlayArICh0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPz8gMSkgKyAxO1xuXG4gICAgaWYgKHN0YXJ0RGF5ID4gZGF5c0luTGFzdE1vbnRoKSB7XG4gICAgICBzdGFydERheSAtPSA3O1xuICAgIH1cbiAgICBpZiAoZGF5T2ZXZWVrID09PSB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkpIHtcbiAgICAgIHN0YXJ0RGF5ID0gZGF5c0luTGFzdE1vbnRoIC0gNjtcbiAgICB9XG4gICAgbGV0IGN1ckRhdGUgPSBkYXlqcyhuZXcgRGF0ZShsYXN0WWVhciwgbGFzdE1vbnRoLCBzdGFydERheSwgMTIsIG1pbnV0ZSwgc2Vjb25kKSk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgY29sID0gMCwgcm93ID0gMDsgaSA8IDQyOyBpKyssIGNvbCsrLCBjdXJEYXRlID0gZGF5anMoY3VyRGF0ZSkuYWRkKDI0LCAnaG91cicpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgY29sICUgNyA9PT0gMCkge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IGN1ckRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgY3VyRGF0ZSA9IGN1ckRhdGUuaG91cigxMik7XG5cbiAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLm1pbkRhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgIGlmIChtaW5EYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gbWluRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQmVmb3JlKG1pbkRhdGUpICYmIHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0gPSBtaW5EYXRlPy5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgaWYgKG1heERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBtYXhEYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNBZnRlcihtYXhEYXRlKSAmJiBzaWRlID09PSAncmlnaHQnKSB7XG4gICAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IG1heERhdGU/LmNsb25lKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCkge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1pbkRhdGUgPSBzaWRlID09PSAnbGVmdCcgPyAodGhpcy5taW5EYXRlKCkgYXMgZGF5anMuRGF5anMpIDogdGhpcy5zdGFydERhdGUoKTtcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCkgYXMgZGF5anMuRGF5anM7XG5cbiAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0uc2V0KHtcbiAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgIHllYXI6IHllYXIsXG4gICAgICBob3VyOiBob3VyLFxuICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICBzZWNvbmQ6IHNlY29uZCxcbiAgICAgIGRheXNJbk1vbnRoOiBkYXlzSW5Nb250aCxcbiAgICAgIGZpcnN0RGF5OiBmaXJzdERheSxcbiAgICAgIGxhc3REYXk6IGxhc3REYXksXG4gICAgICBsYXN0TW9udGg6IGxhc3RNb250aCxcbiAgICAgIGxhc3RZZWFyOiBsYXN0WWVhcixcbiAgICAgIGRheXNJbkxhc3RNb250aDogZGF5c0luTGFzdE1vbnRoLFxuICAgICAgZGF5T2ZXZWVrOiBkYXlPZldlZWssXG4gICAgICBjYWxSb3dzOiBzaWduYWwoQXJyYXkuZnJvbShBcnJheSg2KS5rZXlzKCkpKSxcbiAgICAgIGNhbENvbHM6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSkpLFxuICAgICAgY2xhc3Nlczoge30sXG4gICAgICBtaW5EYXRlOiBtaW5EYXRlLFxuICAgICAgbWF4RGF0ZTogbWF4RGF0ZSxcbiAgICAgIGNhbGVuZGFyOiBjYWxlbmRhcixcbiAgICAgIGRyb3Bkb3duczogc2lnbmFsKHt9KVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNob3dEcm9wZG93bnNTZWxlY3QoKSkge1xuICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gY2FsZW5kYXJbMV1bMV0ueWVhcigpO1xuICAgICAgY29uc3QgbWF4WWVhciA9IG1heERhdGU/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSO1xuICAgICAgY29uc3QgbWluWWVhciA9IG1pbkRhdGU/LnllYXIoKSA/PyBERUZBVUxUX01JTl9ZRUFSO1xuICAgICAgY29uc3QgaW5NaW5ZZWFyID0gY3VycmVudFllYXIgPT09IG1pblllYXI7XG4gICAgICBjb25zdCBpbk1heFllYXIgPSBjdXJyZW50WWVhciA9PT0gbWF4WWVhcjtcbiAgICAgIGNvbnN0IHllYXJzID0gW107XG5cbiAgICAgIGZvciAobGV0IHkgPSBtaW5ZZWFyOyB5IDw9IG1heFllYXI7IHkrKykge1xuICAgICAgICB5ZWFycy5wdXNoKHkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkuZHJvcGRvd25zPy5zZXQoe1xuICAgICAgICBjdXJyZW50TW9udGg6IGN1cnJlbnRNb250aCxcbiAgICAgICAgY3VycmVudFllYXI6IGN1cnJlbnRZZWFyLFxuICAgICAgICBtYXhZZWFyOiBtYXhZZWFyLFxuICAgICAgICBtaW5ZZWFyOiBtaW5ZZWFyLFxuICAgICAgICBpbk1pblllYXI6IGluTWluWWVhcixcbiAgICAgICAgaW5NYXhZZWFyOiBpbk1heFllYXIsXG4gICAgICAgIG1vbnRoQXJyYXlzOiBzaWduYWwoQXJyYXkuZnJvbShBcnJheSgxMikua2V5cygpKSksXG4gICAgICAgIHllYXJBcnJheXM6IHNpZ25hbCh5ZWFycylcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkQ2VsbHMoY2FsZW5kYXIsIHNpZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENlbGxzKGNhbGVuZGFyOiBJQ2FsZW5kYXIsIHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgNjsgcm93KyspIHtcbiAgICAgIGNvbnN0IGNsYXNzbGVzcyA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpO1xuXG4gICAgICBpZiAoY2xhc3NsZXNzLmNsYXNzZXMpIHtcbiAgICAgICAgY2xhc3NsZXNzLmNsYXNzZXNbcm93XSA9IHt9O1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNzsgY29sKyspIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlKCkgYXMgZGF5anMuRGF5anM7XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgICAgY29uc3Qgbm93SG92ZXJlZERhdGUgPSB0aGlzLm5vd0hvdmVyZWREYXRlKCk7XG5cbiAgICAgICAgaWYgKGNhbGVuZGFyW3Jvd11bY29sXS5pc1NhbWUobmV3IERhdGUoKSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCd0b2RheScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0uaXNvV2Vla2RheSgpID4gNSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnd2Vla2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0ubW9udGgoKSAhPT0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRGF0ZSgpICYmIGNhbGVuZGFyW3Jvd11bY29sXS5pc0JlZm9yZSh0aGlzLm1pbkRhdGUoKSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkubWF4RGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNBZnRlcih0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5tYXhEYXRlLCAnZGF5JykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ29mZicsICdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBzdGFydERhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnLCAnc3RhcnQtZGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmREYXRlICE9PSBudWxsICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gZW5kRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScsICdlbmQtZGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBzdGFydERhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmICghZW5kRGF0ZSB8fCBlbmREYXRlICE9PSBudWxsICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gZW5kRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnLCAnZnVsbC1kYXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUgJiYgKChub3dIb3ZlcmVkRGF0ZSAhPT0gbnVsbCAmJiB0aGlzLnBpY2tpbmdEYXRlKCkpIHx8IGVuZERhdGUgIT09IG51bGwpICYmIChjYWxlbmRhcltyb3ddW2NvbF0gPiBzdGFydERhdGUgJiYgKGNhbGVuZGFyW3Jvd11bY29sXSA8IGVuZERhdGUgfHwgKG5vd0hvdmVyZWREYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXSA8IG5vd0hvdmVyZWREYXRlICYmIHRoaXMucGlja2luZ0RhdGUoKSkpKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCghY2xhc3Nlcy5maW5kKGVsID0+IGVsID09PSAnb2ZmJykgPyAnaW4tcmFuZ2UnIDogJ2ZvY3VzLW9mZicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjbmFtZSA9ICcnLCBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNuYW1lICs9IGNsYXNzZXNbaV0gKyAnICc7XG5cbiAgICAgICAgICBpZiAoY2xhc3Nlc1tpXSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgIGNuYW1lICs9ICdhdmFpbGFibGUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYXNzbGVzcy5jbGFzc2VzKSB7XG4gICAgICAgICAgY2xhc3NsZXNzLmNsYXNzZXNbcm93XVtjb2xdID0gY25hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJUaW1lUGlja2VyKHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgbGV0IHNlbGVjdGVkOiBkYXlqcy5EYXlqcyA9IGRheWpzKCksIG1pbkRhdGU7XG4gICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuZW5kRGF0ZSgpO1xuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgc3RhcnREYXRlKSB7XG4gICAgICBzZWxlY3RlZCA9IHN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgbWluRGF0ZSA9IHRoaXMubWF4RGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQgJiYgZW5kRGF0ZSkge1xuICAgICAgc2VsZWN0ZWQgPSBlbmREYXRlLmNsb25lKCk7XG4gICAgICBtaW5EYXRlID0gdGhpcy5zdGFydERhdGUoKTtcbiAgICB9XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0ICYmICFlbmREYXRlKSB7XG4gICAgICBpZiAoIXN0YXJ0RGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWxlY3RlZCA9IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKHN0YXJ0RGF0ZSwgU2lkZUVudW0ucmlnaHQpO1xuICAgICAgaWYgKHNlbGVjdGVkLmlzQmVmb3JlKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBzdGFydERhdGUuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIG1pbkRhdGUgPSBzdGFydERhdGU7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gMDtcbiAgICBjb25zdCBlbmQgPSAyMztcblxuICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnNldCh7XG4gICAgICBob3VyczogW10sXG4gICAgICBtaW51dGVzOiBbXSxcbiAgICAgIG1pbnV0ZXNMYWJlbDogW10sXG4gICAgICBzZWNvbmRzOiBbXSxcbiAgICAgIHNlY29uZHNMYWJlbDogW10sXG4gICAgICBkaXNhYmxlZEhvdXJzOiBbXSxcbiAgICAgIGRpc2FibGVkTWludXRlczogW10sXG4gICAgICBkaXNhYmxlZFNlY29uZHM6IFtdLFxuICAgICAgc2VsZWN0ZWRIb3VyOiAwLFxuICAgICAgc2VsZWN0ZWRNaW51dGU6IDAsXG4gICAgICBzZWxlY3RlZFNlY29uZDogMCxcbiAgICB9KTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGNvbnN0IGlfaW5fMjQgPSBpO1xuXG4gICAgICBjb25zdCB0aW1lID0gc2VsZWN0ZWQuY2xvbmUoKS5ob3VyKGlfaW5fMjQpO1xuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUubWludXRlKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLm1pbnV0ZSgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5ob3Vycz8ucHVzaChpKTtcbiAgICAgICAgaWYgKGlfaW5fMjQgPT09IHNlbGVjdGVkLmhvdXIoKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkSG91ciA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNhYmxlZEhvdXJzPy5wdXNoKGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2MDsgaSArPSB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkge1xuICAgICAgY29uc3QgcGFkZGVkID0gaSA8IDEwID8gJzAnICsgaSA6IGAke2l9YDtcbiAgICAgIGNvbnN0IHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLm1pbnV0ZShpKTtcblxuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUuc2Vjb25kKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLnNlY29uZCgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5taW51dGVzPy5wdXNoKGkpO1xuICAgICAgICBjdXJyZW50Lm1pbnV0ZXNMYWJlbD8ucHVzaChwYWRkZWQpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQubWludXRlKCkgPT09IGkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5zZWxlY3RlZE1pbnV0ZSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNhYmxlZE1pbnV0ZXM/LnB1c2goaSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVsZW1lbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWwuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGFydERhdGUoKSAmJiB0aGlzLmVuZERhdGUoKSkge1xuICAgICAgLy8gaWYgd2UgdXNlIHJhbmdlcyBhbmQgc2hvdWxkIHNob3cgcmFuZ2UgbGFiZWwgb24gaW5wdXRcbiAgICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGggJiYgdGhpcy5zaG93UmFuZ2VMYWJlbE9uSW5wdXQoKSAmJiB0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpICYmIHRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsICE9PSB0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbC5zZXQodGhpcy5zZWxlY3RlZFF1aWNrUmFuZ2UoKSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZExhYmVsLnNldChgJHt0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKX0ke3RoaXMuZGF0ZU9wdGlvbnMoKS5zZXBhcmF0b3J9JHt0aGlzLmVuZERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaWV3KCkge1xuICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLmxlZnQpO1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRlV2l0aFRpbWUoZGF0ZTogZGF5anMuRGF5anMsIHNpZGU6IFNpZGVFbnVtKTogZGF5anMuRGF5anMge1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkSG91cn1gLCAxMCk7XG4gICAgY29uc3QgbWludXRlID0gcGFyc2VJbnQoYCR7dGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0oKS5zZWxlY3RlZE1pbnV0ZX1gLCAxMCk7XG4gICAgY29uc3Qgc2Vjb25kID0gdGhpcy5oYXNTZWNvbmRQaWNrZXIoKSAmJiAhaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkU2Vjb25kKSA/IHBhcnNlSW50KGAke3RoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRTZWNvbmR9YCwgMTApIDogMDtcblxuICAgIHJldHVybiBkYXRlLmNsb25lKCkuaG91cihob3VyKS5taW51dGUobWludXRlKS5zZWNvbmQoc2Vjb25kKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtTWluTWF4RGF0ZSh2YWx1ZTogZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBkYXlqcy5EYXlqcyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoZGF5anMuaXNEYXlqcyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXlqcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZWREaXNwbGF5VGltZShzaWRlOiBJVGltZXBpY2tlclZhcmlhYmxlc1NpZGUpIHtcbiAgICBsZXQgc3RySG91cnM6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHNpZGUuc2VsZWN0ZWRIb3VyO1xuICAgIGxldCBzdHJNaW51dGU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHNpZGUuc2VsZWN0ZWRNaW51dGU7XG5cbiAgICBpZiAoKHNpZGUuc2VsZWN0ZWRIb3VyIHx8IDApIDwgMTApIHtcbiAgICAgIHN0ckhvdXJzID0gYDAke3NpZGUuc2VsZWN0ZWRIb3VyID8/IDB9YDtcbiAgICB9XG5cbiAgICBpZiAoKHNpZGUuc2VsZWN0ZWRNaW51dGUgfHwgMCkgPCAxMCkge1xuICAgICAgc3RyTWludXRlID0gYDAke3NpZGUuc2VsZWN0ZWRNaW51dGUgPz8gMH1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtzdHJIb3Vyc306JHtzdHJNaW51dGV9YDtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZWREaXNwbGF5VGltZUlucHV0KHNpZGU6IFNpZGVFbnVtLCB0aW1lVHlwZTogJ2hvdXInIHwgJ21pbnV0ZScpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZVR5cGUgPT09ICdob3VyJyA/IChzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSA6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpKSA6IChzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpIDogdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSk7XG5cbiAgICBpZiAoIXRpbWUpIHtcbiAgICAgIHJldHVybiAnMDAnO1xuICAgIH1cbiAgICBpZiAodGltZSA8IDEwKSB7XG4gICAgICByZXR1cm4gYDAke3RpbWV9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXIgdGVzdC1jbGFzc1wiPlxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyXCJcbiAgICAgIFtjbGFzcy5yaWdodF09XCJpc1NpbmdsZSgpXCJcbiAgICAgIFtjbGFzcy5sZWZ0XT1cIiFpc1NpbmdsZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1bNHB4XSBiZy1bI2ZmZmZmZl1cIj5cbiAgICAgICAgQGlmIChjYWxlbmRhclZhcmlhYmxlcygpOyBhcyBjYWxlbmRhclZhcmlhYmxlcykge1xuICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiN1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbnRoXCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKHNob3dEcm9wZG93bnNTZWxlY3QoKSAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuZHJvcGRvd25zPy4oKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIWZsZXggbWItWzEwcHhdIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTMvNCBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbXItWzhweF0nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpICsgMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie3dpZHRoQnlQYXJlbnQ6ZmFsc2UsaWdub3JlQXJyb3c6dHJ1ZSxwYWRkaW5nTGVmdEl0ZW06IHRydWUsIGNsYXNzSW5jbHVkZTogJyF3LVsxMzBweF0nLHBvc2l0aW9uOnsgbW9kZTonY2VudGVyJyxkaXN0YW5jZTowfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleXNEaXNhYmxlXT1cImRpc2FibGVNb250aCgpLmxlZnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1Nb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdE1vbnRoc0NvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJtb250aEh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnbW9udGgnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnbW9udGgnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg0bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8ubW9udGgoKSA/PyAtMV0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsxM3B4XSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucm90YXRlXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93biBbbGlzdE1heEl0ZW1TaG93XT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInt3aWR0aEJ5UGFyZW50OmZhbHNlLGlnbm9yZUFycm93OnRydWUscGFkZGluZ0xlZnRJdGVtOiB0cnVlLGNsYXNzSW5jbHVkZTogJyF3LVsxMTBweF0nLHBvc2l0aW9uOnttb2RlOidjZW50ZXInLGRpc3RhbmNlOjB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtWWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJsaXN0WWVhckhpZGRlbklucHV0U2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RMZWZ0WWVhckNvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJsZWZ0WWVhckh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ3llYXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICd5ZWFyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ3llYXInXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoXCIgWVlZWVwiKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnJvdGF0ZV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS80IGZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWluRGF0ZSB8fCAoY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1pbkRhdGU/LmlzQmVmb3JlKGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LmZpcnN0RGF5KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiaGFuZGxlckNsaWNrUHJldihzaWRlRW51bS5sZWZ0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBhYnNvbHV0ZSBsZWZ0LTAgdG9wLVstM3B4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCByb3RhdGUtWzE4MGRlZ10gdGV4dC1bIzZhNzM4M10gY3Vyc29yLXBvaW50ZXIgbGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoKCFjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWF4RGF0ZSB8fCBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWF4RGF0ZT8uaXNBZnRlcihjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5sYXN0RGF5KSkgJiYgaXNTaW5nbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVyQ2xpY2tOZXh0KHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1sLVsxMnB4XSBhYnNvbHV0ZSByaWdodC0wIHRvcC1bLTNweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgdGV4dC1bIzZhNzM4M10gY3Vyc29yLXBvaW50ZXIgbGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAaWYgKCFzaG93RHJvcGRvd25zU2VsZWN0KCkgfHwgIWNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5kcm9wZG93bnMpIHtcbiAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8ubW9udGgoKSA/PyAtMV0gfX1cbiAgICAgICAgICAgICAgICAgICAge3sgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/LmZvcm1hdChcIiBZWVlZXCIpIH19XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwid2Vlay1kYXlzXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoZGF5b2Z3ZWVrIG9mIGRhdGVPcHRpb25zKCkuZGF5c09mV2VlazsgdHJhY2sgZGF5b2Z3ZWVrKSB7XG4gICAgICAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg2bSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+e3sgZGF5b2Z3ZWVrIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiZHJwLWFuaW1hdGVcIj5cbiAgICAgICAgICAgICAgQGZvciAocm93IG9mIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxSb3dzPy4oKTsgdHJhY2sgcm93KSB7XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaC1bMzJweF1cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzPy5bcm93XT8uY2xhc3NMaXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbENvbHM/LigpOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cImNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpID09PSB0b2RheSgpLmRhdGUoKSAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ubW9udGgoKSA9PT0gdG9kYXkoKS5tb250aCgpICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy55ZWFyKCkgPT09IHRvZGF5KCkueWVhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNsYXNzZXM/Lltyb3ddPy5bY29sXVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJQaWNrZXJEYXRlKCRldmVudCwgc2lkZUVudW0ubGVmdCwgcm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVySG92ZXJEYXRlKCRldmVudCwgc2lkZUVudW0ubGVmdCwgcm93LCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiPnt7IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGNvbHVtbiBpdGVtcy1jZW50ZXIgcHQtWzEycHhdXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtWzRweF0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2U2ZThlZF1dPVwiIXRpbWVQaWNrZXJFcnJvcigpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2ZmNTQ1NF1dPVwidGltZVBpY2tlckVycm9yKClcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU9XCIhdy1bMzBweF0gIXAtMCAhYm9yZGVyLW5vbmUgIXRleHQtY2VudGVyIGxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiMjNcIlxuICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKVwiXG4gICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCAnbGVmdGhvdXInKVwiXG4gICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnaG91cicpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAnbGVmdGhvdXInKVwiXG4gICAgICAgICAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXJUaW1lKCRldmVudCwgJ2xlZnRob3VyJylcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oM3MgdGV4dC1bIzMzMzMzM11cIj46PC9zcGFuPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZT1cIiF3LVszMHB4XSAhcC0wICFib3JkZXItbm9uZSAhdGV4dC1jZW50ZXIgIWxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNTlcIlxuICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpXCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoIWlzU2luZ2xlKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyIHJpZ2h0IG1sLVsyNHB4XVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1bNHB4XSBiZy1bI2ZmZmZmZl1cIj5cbiAgICAgICAgICBAaWYgKGNhbGVuZGFyVmFyaWFibGVzKCkpIHtcbiAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiN1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibW9udGhcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93RHJvcGRvd25zU2VsZWN0KCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5sZWZ0KCkuZHJvcGRvd25zPy4oKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIhZmxleCBtYi1bMTBweF0gdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0zLzQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbXItWzhweF0nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie3dpZHRoQnlQYXJlbnQ6ZmFsc2UsaWdub3JlQXJyb3c6dHJ1ZSxwYWRkaW5nTGVmdEl0ZW06IHRydWUsY2xhc3NJbmNsdWRlOiAnIXctWzEzMHB4XScscG9zaXRpb246e21vZGU6J2NlbnRlcicsZGlzdGFuY2U6MH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlzRGlzYWJsZV09XCJkaXNhYmxlTW9udGgoKS5yaWdodCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1Nb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdE1vbnRoc0NvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwibGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cIm1vbnRoSHR0cERldGFpbENvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDRtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpICsgMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7d2lkdGhCeVBhcmVudDpmYWxzZSxpZ25vcmVBcnJvdzp0cnVlLHBhZGRpbmdMZWZ0SXRlbTogdHJ1ZSwgY2xhc3NJbmNsdWRlOiAnIXctWzExMHB4XScsICBwb3NpdGlvbjp7bW9kZTonY2VudGVyJywgZGlzdGFuY2U6MH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1ZZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwibGlzdFllYXJIaWRkZW5JbnB1dFNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RSaWdodFllYXJDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlUb1NlbGVjdGVkKCkueWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cInJpZ2h0WWVhckh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICd5ZWFyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTaG93TGlzdCk9XCJoYW5kbGVyU2hvd0xpc3REcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ3llYXInKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICd5ZWFyJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoXCJZWVlZXCIpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ3llYXInXSA/ICc5MGRlZyc6JzI3MGRlZydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvNCBmbGV4IGl0ZW1zLWNlbnRlciByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAhKCgobGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgICsxKSA9PT0gbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSAmJiAobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID09PSAxMikgJiYgbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCA9PT0gMSkmJiAobGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgPCBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpIHx8IGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiBsaXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoICYmICgobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICsgMSkgPCArbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYWJzb2x1dGUgbGVmdC0wIHRvcC1bLTNweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbGlja1ByZXYoc2lkZUVudW0ucmlnaHQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHJvdGF0ZS1bMTgwZGVnXSB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggJiYgbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCAmJiAobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID4gbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCkgJiYgbGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgJiYgbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyICYmIChsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA9PT0gbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyICkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLVsjZmZmZmZmXSB3LVsyMXB4XSBoLVsyMXB4XSBjdXJzb3Itbm9uZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVs1MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5tYXhEYXRlIHx8IChjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkubWF4RGF0ZT8uaXNBZnRlcihjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5sYXN0RGF5KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVyQ2xpY2tOZXh0KHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1sLVsxMnB4XSBhYnNvbHV0ZSByaWdodC0wIHRvcC1bLTNweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWyM2YTczODNdIGN1cnNvci1wb2ludGVyIGxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFzaG93RHJvcGRvd25zU2VsZWN0KCkgfHwgICFjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuZHJvcGRvd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8ubW9udGgoKSA/PyAtMV0gfX1cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KFwiWVlZWVwiKSB9fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwid2Vlay1kYXlzXCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChkYXlvZndlZWsgb2YgZGF0ZU9wdGlvbnMoKS5kYXlzT2ZXZWVrOyB0cmFjayBkYXlvZndlZWspIHtcbiAgICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg2bSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPnt7IGRheW9md2VlayB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgQGZvciAocm93IG9mIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxSb3dzPy4oKTsgdHJhY2sgcm93KSB7XG4gICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJoLVszMnB4XVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3Nlcz8uW3Jvd10/LmNsYXNzTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbENvbHM/LigpOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3Nlcz8uW3Jvd10/Lltjb2xdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSA9PT0gdG9kYXkoKS5kYXRlKCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/Lm1vbnRoKCkgPT09IHRvZGF5KCkubW9udGgoKSAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiZjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ueWVhcigpID09PSB0b2RheSgpLnllYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclBpY2tlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5yaWdodCwgcm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJIb3ZlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5yaWdodCwgcm93LCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcHQtWzEycHhdXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcm91bmRlZC1bNHB4XSBib3JkZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNlNmU4ZWRdXT1cIiF0aW1lUGlja2VyRXJyb3IoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2ZmNTQ1NF1dPVwidGltZVBpY2tlckVycm9yKClcIj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlPVwiIXctWzMwcHhdICFwLTAgIWJvcmRlci1ub25lICF0ZXh0LWNlbnRlciAhbGlicy11aS1mb250LWg0cyAhdGV4dC1bIzA3MTYzMV1cIlxuICAgICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJpbnRcIlxuICAgICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjIzXCJcbiAgICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFtmb2N1c1RpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAncmlnaHRob3VyJylcIlxuICAgICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCdyaWdodGhvdXInKVwiXG4gICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgJ3JpZ2h0aG91cicpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyVGltZSgkZXZlbnQsICdyaWdodGhvdXInKVwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDNzIHRleHQtWyMzMzMzMzNdXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlPVwiIXctWzMwcHhdICFwLTAgIWJvcmRlci1ub25lICF0ZXh0LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRzICF0ZXh0LVsjMDcxNjMxXVwiXG4gICAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW2VtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNTlcIlxuICAgICAgICAgICAgICAgICAgW21pblZhbHVlTnVtYmVyXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiMlwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKClcIlxuICAgICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCdyaWdodG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICA8L2Rpdj5cbiAgPGRpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgIEBpZiAoIWlzU2luZ2xlKCkgJiYgaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC1bOHB4XSBsaWJzLXVpLWZvbnQtaDdyIHRleHQtWyNmZjU0NTRdIGgtWzE0cHhdXCI+XG4gICAgICAgICAgQGlmICh0aW1lUGlja2VyRXJyb3IoKSkge1xuICAgICAgICAgICAgPHNwYW4+e3sgJ2kxOG5fZGF0ZV9jb21wYXJlX3N0YXJ0X2VuZF9tZXNzYWdlX2Vycm9yJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAoIXF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGggfHwgIWlzU2luZ2xlKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCIgZmxleCB3LWZ1bGwgcHQtWzE2cHhdIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICBAaWYgKCFpc1NpbmdsZSgpKSB7XG4gICAgICAgICAgICBAaWYgKCFlbmREYXRlKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtWyNjZGQwZDZdIGxpYnMtdWktZm9udC1oNnJcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBjb21wdXRlZERpc3BsYXlUaW1lTGVmdCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmaHlwaGVuO1xuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7IGNvbXB1dGVkRGlzcGxheVRpbWVSaWdodCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGVuZERhdGUoKSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bI2NkZDBkNl0gbGlicy11aS1mb250LWg2clwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7IGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICZoeXBoZW47XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgZW5kRGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7IGNvbXB1dGVkRGlzcGxheVRpbWVSaWdodCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gY2xhc3M9XCJtci1bMTJweF1cIlxuICAgICAgICAgICAgbGFiZWw9XCJpMThuX2NhbmNlbFwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uLXRoaXJkXCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tDYW5jZWwoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBsYWJlbD1cImkxOG5fc2VsZWN0XCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tBcHBseSgkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
1274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RhdGV0aW1lL3BpY2tlci9zcmMvY3VzdG9tLXJhbmdlcy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZGF0ZXRpbWUvcGlja2VyL3NyYy9jdXN0b20tcmFuZ2VzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ2hNLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBaUQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQWtELG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFLeEksT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqSSxPQUFPLEVB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RSxFQUFFLENBQUM7WUFDZCxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPO0lBQ1QsQ0FBQzt3R0E5N0NVLDJEQUEyRDs0RkFBM0QsMkRBQTJELHd0RkN0Q3hFLHNnMUJBa2FBLDRvSURsWUksZUFBZSw0RkFDZixpQ0FBaUMsaTFEQUNqQyxvQ0FBb0Msb2dEQUNwQyxzQ0FBc0M7OzRGQUc3QiwyREFBMkQ7a0JBZHZFLFNBQVM7K0JBRUUsMkRBQTJELGNBR3pELElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxlQUFlO3dCQUNmLGlDQUFpQzt3QkFDakMsb0NBQW9DO3dCQUNwQyxzQ0FBc0M7cUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cIjtcbmltcG9ydCB7IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd25cIjtcbmltcG9ydCB7IElGb2N1c0FuZEJsdXJFdmVudCwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dFwiO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtbGlzdFwiO1xuaW1wb3J0IHsgSUZsYWdNb3VzZSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXJcIjtcbmltcG9ydCB7IElFdmVudCB9IGZyb20gXCJAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzXCI7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcgfSBmcm9tIFwiQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0XCI7XG5pbXBvcnQgeyBnZXREYXlqcywgaXNFbXB0eSwgc2V0IH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCBpc29XZWVrIGZyb20gJ2RheWpzL3BsdWdpbi9pc29XZWVrJztcbmltcG9ydCB7IGdldE1vbnRoc0RldGFpbEJ5SWQsIGdldE1vbnRoc0xpc3RDb25maWcsIGdldFllYXJzRGV0YWlsQnlJZCwgZ2V0WWVhcnNMaXN0Q29uZmlnIH0gZnJvbSBcIi4uLy4uL2RlZmluZXMvY2FsZW5kYXIuZGVmaW5lXCI7XG5pbXBvcnQgeyBERUZBVUxUX01BWF9ZRUFSLCBERUZBVUxUX01JTl9ZRUFSIH0gZnJvbSBcIi4uLy4uL2RlZmluZXMvY29tbW9uLWRhdGUuZGVmaW5lXCI7XG5pbXBvcnQgeyBkZWZhdWx0TG9jYWxlQ29uZmlnLCBnZXREYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9kZWZpbmVzL2RhdGUtb3B0aW9ucy5kZWZpbmVcIjtcbmltcG9ydCB7IElFbWl0RGF0ZUNhbGVuZGFyIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvY2FsZW5kYXItZW1pdC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDYWxlbmRhciwgSUNhbGVuZGFyVmFyaWFibGVzLCBJRGF0ZVJhbmdlLCBJU3BsaXRQaWNrZXJEYXRlLCBTaWRlRW51bSB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2NhbGVuZGFyLXZhcmlhYmxlcy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDYWxlbmRhckZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IExvY2FsaXphdGlvbkNvbmZpZyB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BpY2tlci5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDaGVja1RpbWVwaWNrZXJTZWxlY3RlZCwgSVNlbGVjdGVkT2xkLCBJVGltZXBpY2tlckl0ZW1WYWx1ZSwgSVRpbWVwaWNrZXJWYXJpYWJsZXMsIElUaW1lcGlja2VyVmFyaWFibGVzU2lkZSB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3RpbWUtdmFyaWFibGVzLmludGVyZmFjZVwiO1xuZGF5anMuZXh0ZW5kKGlzb1dlZWspO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZGF0ZXRpbWUtcGlja2VyLWN1c3RvbV9yYW5nZXMtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0RhdGV0aW1lUGlja2VyQ3VzdG9tUmFuZ2VzQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lkZUVudW0gPSBTaWRlRW51bTtcbiAgcHJvdGVjdGVkIGNhbGVuZGFyVmFyaWFibGVzID0gc2lnbmFsPElDYWxlbmRhclZhcmlhYmxlcz4oeyBsZWZ0OiBzaWduYWwoe30pLCByaWdodDogc2lnbmFsKHt9KSB9KTtcbiAgcHJvdGVjdGVkIHRpbWVwaWNrZXJWYXJpYWJsZXMgPSBzaWduYWw8SVRpbWVwaWNrZXJWYXJpYWJsZXM+KHsgbGVmdDogc2lnbmFsKHsgc2VsZWN0ZWRIb3VyOiAwLCBzZWxlY3RlZE1pbnV0ZTogMCB9KSwgcmlnaHQ6IHNpZ25hbCh7IHNlbGVjdGVkSG91cjogMjMsIHNlbGVjdGVkTWludXRlOiA1OSB9KSB9KTtcbiAgcHJvdGVjdGVkIGRpc2FibGVNb250aCA9IHNpZ25hbDx7IGxlZnQ6IFdyaXRhYmxlU2lnbmFsPEFycmF5PGFueT4+LCByaWdodDogV3JpdGFibGVTaWduYWw8QXJyYXk8YW55Pj4gfT4oeyBsZWZ0OiBzaWduYWwoW10pLCByaWdodDogc2lnbmFsKFtdKSB9KTtcbiAgcHJvdGVjdGVkIHRvZGF5ID0gc2lnbmFsPGRheWpzLkRheWpzPihkYXlqcygpKTtcbiAgcHJvdGVjdGVkIGxpc3RLZXlGcm9tU2VsZWN0ZWQgPSBzaWduYWw8eyBtb250aDogYW55LCB5ZWFyOiBhbnkgfT4oeyBtb250aDogdW5kZWZpbmVkLCB5ZWFyOiB1bmRlZmluZWQgfSk7XG4gIHByb3RlY3RlZCBsaXN0S2V5VG9TZWxlY3RlZCA9IHNpZ25hbDx7IG1vbnRoOiBhbnksIHllYXI6IGFueSB9Pih7IG1vbnRoOiB1bmRlZmluZWQsIHllYXI6IHVuZGVmaW5lZCB9KTtcbiAgcHJvdGVjdGVkIGNoZWNrU2hvd0xpc3REcm9wZG93biA9IHNpZ25hbDx7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfT4oe30pO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRRdWlja1JhbmdlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgbGVmdENhbGVuZGFyID0gc2lnbmFsPHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXIsIG1vbnRoPzogZGF5anMuRGF5anMgfT4oe30pO1xuICBwcm90ZWN0ZWQgcmlnaHRDYWxlbmRhciA9IHNpZ25hbDx7IGNhbGVuZGFyPzogSUNhbGVuZGFyLCBtb250aD86IGRheWpzLkRheWpzIH0+KHt9KTtcblxuICBwcm90ZWN0ZWQgbGlzdE1vbnRoc0NvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBtb250aEh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPihnZXRNb250aHNEZXRhaWxCeUlkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdExlZnRZZWFyQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxpc3RSaWdodFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGlzdFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGVmdFllYXJIdHRwRGV0YWlsQ29uZmlnID0gc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHJpZ2h0WWVhckh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCB0aW1lUGlja2VyRXJyb3IgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWUoeyBzZWxlY3RlZEhvdXI6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCksIHNlbGVjdGVkTWludXRlOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkgfSkpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lKHsgc2VsZWN0ZWRIb3VyOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSwgc2VsZWN0ZWRNaW51dGU6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkgfSkpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnRJbnB1dEhvdXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5sZWZ0LCAnaG91cicpKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0SW5wdXRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5sZWZ0LCAnbWludXRlJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0SW5wdXRIb3VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoU2lkZUVudW0ucmlnaHQsICdob3VyJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0SW5wdXRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5yaWdodCwgJ21pbnV0ZScpKTtcbiAgcHJvdGVjdGVkIHRpbWVwaWNrZXJWYWx1ZUl0ZW0gPSBzaWduYWw8SVRpbWVwaWNrZXJJdGVtVmFsdWU+KHsgbGVmdGhvdXI6IHNpZ25hbCgwKSwgbGVmdG1pbnV0ZTogc2lnbmFsKDApLCByaWdodGhvdXI6IHNpZ25hbCgwKSwgcmlnaHRtaW51dGU6IHNpZ25hbCgwKSB9KTtcblxuICBwcml2YXRlIGZ1bmN0aW9uQ29udHJvbHMgPSBuZXcgTWFwPHN0cmluZywgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQgfCBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcHJpdmF0ZSBwaWNraW5nRGF0ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaXNTaG93biA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbm93SG92ZXJlZERhdGUgPSBzaWduYWw8ZGF5anMuRGF5anMgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSB0aW1lUGlja2VySW5jcmVtZW50ID0gc2lnbmFsPG51bWJlcj4oMSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRMYWJlbCA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUga2V5Q29kZUJhY2tzcGFjZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgY2hlY2tCYWNrc3BhY2VGb2N1cyA9IHNpZ25hbDxJVGltZXBpY2tlckl0ZW1WYWx1ZT4oeyBsZWZ0aG91cjogc2lnbmFsKDEpLCBsZWZ0bWludXRlOiBzaWduYWwoMSksIHJpZ2h0aG91cjogc2lnbmFsKDEpLCByaWdodG1pbnV0ZTogc2lnbmFsKDEpIH0pO1xuICBwcml2YXRlIGlzWmVybyA9IHNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9sZERhdGUgPSBzaWduYWw8SVNlbGVjdGVkT2xkPih7IHN0YXJ0OiBkYXlqcygwKSwgZW5kOiBkYXlqcygwKSB9KTtcbiAgcHJpdmF0ZSBpc1NlbGVjdGVkRGF0YSA9IHNpZ25hbDxJQ2hlY2tUaW1lcGlja2VyU2VsZWN0ZWQ+KHsgbGVmdG1vbnRoOiBmYWxzZSwgbGVmdHllYXI6IGZhbHNlLCByaWdodG1vbnRoOiBmYWxzZSwgcmlnaHR5ZWFyOiBmYWxzZSB9KTtcbiAgcHJpdmF0ZSBzcGxpdFBpY2tlckRhdGUgPSBzaWduYWw8SVNwbGl0UGlja2VyRGF0ZT4oeyBzdGFydDogc2lnbmFsKHsgbW9udGg6IDAsIHllYXI6IDAsIGRheTogMCwgaG91cjogMCwgbWludXRlOiAwIH0pLCBlbmQ6IHNpZ25hbCh7IG1vbnRoOiAwLCB5ZWFyOiAwLCBkYXk6IDAsIGhvdXI6IDIzLCBtaW51dGU6IDU5IH0pIH0pO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSBxdWlja1Jhbmdlc0FycmF5ID0gaW5wdXQ8QXJyYXk8SURhdGVSYW5nZT4+KFtdKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXI+KDEyMDAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDEyMDAgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc1NpbmdsZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0Ryb3Bkb3duc1NlbGVjdCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBoYXNUaW1lUGlja2VyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZSA9IGlucHV0PElGbGFnTW91c2U+KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGRhdGVPcHRpb25zID0gaW5wdXQ8TG9jYWxpemF0aW9uQ29uZmlnPih7IC4uLmRlZmF1bHRMb2NhbGVDb25maWcoKSwgLi4uZ2V0RGF0ZU9wdGlvbnMoKSB9KTtcbiAgcmVhZG9ubHkgYXV0b0FwcGx5ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBoYXNTZWNvbmRQaWNrZXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dSYW5nZUxhYmVsT25JbnB1dCA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcmVhZG9ubHkgc3RhcnREYXRlID0gbW9kZWw8ZGF5anMuRGF5anMgfCB1bmRlZmluZWQ+KGRheWpzKCkuc3RhcnRPZignZGF5JykpO1xuICByZWFkb25seSBlbmREYXRlID0gbW9kZWw8ZGF5anMuRGF5anMgfCB1bmRlZmluZWQ+KGRheWpzKCkuZW5kT2YoJ2RheScpKTtcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IGlucHV0PGRheWpzLkRheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBkYXlqcy5EYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IHRyYW5zZm9ybTogdGhpcy50cmFuc2Zvcm1NaW5NYXhEYXRlLmJpbmQodGhpcykgfSk7XG4gIHJlYWRvbmx5IG1heERhdGUgPSBpbnB1dDxkYXlqcy5EYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZCwgZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyB0cmFuc2Zvcm06IHRoaXMudHJhbnNmb3JtTWluTWF4RGF0ZS5iaW5kKHRoaXMpIH0pO1xuICByZWFkb25seSBsaXN0WWVhckhpZGRlbklucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gdHJ1ZSB9KTtcbiAgLyoqIE9VVFBVVCAqL1xuICByZWFkb25seSBvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIC8vIHJlYWRvbmx5IG91dFN0YXJ0RGF0ZUNoYW5nZWQgPSBvdXRwdXQ8eyBzdGFydERhdGU6IGRheWpzLkRheWpzIHwgdW5kZWZpbmVkIH0+KCk7XG4gIC8vIHJlYWRvbmx5IG91dEVuZERhdGVDaGFuZ2VkID0gb3V0cHV0PHsgZW5kRGF0ZTogZGF5anMuRGF5anMgfCB1bmRlZmluZWQgfT4oKTtcbiAgcmVhZG9ubHkgb3V0UGlja2VyRGF0ZSA9IG91dHB1dDxJRW1pdERhdGVDYWxlbmRhcj4oKTtcbiAgLy8gcmVhZG9ubHkgb3V0UmFuZ2VDbGlja2VkOiBFdmVudEVtaXR0ZXI8SVJhbmdlc0NsaWNrZWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICByZWFkb25seSBvdXRDYW5jZWwgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRVcGRhdGVXaWR0aCA9IG91dHB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUNhbGVuZGFyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgLyoqIElOSkVDVElPTiAqL1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICByZWFkb25seSBwaWNrZXJDb250YWluZXIgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3BpY2tlckNvbnRhaW5lcicpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGlzdE1vbnRoc0NvbmZpZy5zZXQoZ2V0TW9udGhzTGlzdENvbmZpZyh0aGlzLnRyYW5zbGF0ZSkpO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG9sZFN0YXJ0ID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKTtcbiAgICAgIGNvbnN0IG9sZEVuZCA9IHRoaXMuZW5kRGF0ZSgpPy5jbG9uZSgpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLm9sZERhdGUuc2V0KHsgc3RhcnQ6IG9sZFN0YXJ0LCBlbmQ6IG9sZEVuZCB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKTtcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5lbmREYXRlKCk/LmNsb25lKCk7XG5cbiAgICB0aGlzLnNwbGl0UGlja2VyRGF0ZS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50LnN0YXJ0LnVwZGF0ZShzaWRlQ3VycmVudCA9PiB7XG4gICAgICAgIHNpZGVDdXJyZW50LmRheSA9IChzdGFydERhdGUgPz8gZGF5anMoKS5zdGFydE9mKCdkYXknKSkuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgY3VycmVudC5lbmQudXBkYXRlKHNpZGVDdXJyZW50ID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnQuZGF5ID0gKGVuZERhdGUgPz8gZGF5anMoKS5lbmRPZignZGF5JykpLmRhdGUoKTtcblxuICAgICAgICByZXR1cm4gc2lkZUN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gICAgfVxuICAgIGlmIChzdGFydERhdGUgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgfVxuXG4gICAgaWYgKGVuZERhdGUgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShlbmREYXRlKTtcbiAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5yaWdodCk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRDb25maWdZZWFyKFNpZGVFbnVtLmxlZnQpO1xuICAgIHRoaXMuYnVpbGRDb25maWdZZWFyKFNpZGVFbnVtLnJpZ2h0LCBzdGFydERhdGU/LnllYXIoKSk7XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLmxlZnQpO1xuICAgIGlmICgoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KT8ueWVhcigpID8/IERFRkFVTFRfTUFYX1lFQVIpIDwgKHN0YXJ0RGF0ZT8ueWVhcigpIHx8IDApKSB7XG4gICAgICB0aGlzLmhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKHsga2V5OiBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy55ZWFyKCkgYXMgdW5rbm93biBhcyBzdHJpbmcgfSwgU2lkZUVudW0ubGVmdCArICd5ZWFyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzU2luZ2xlKCkpIHtcbiAgICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ucmlnaHQpO1xuICAgICAgaWYgKChnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy55ZWFyKCkgPz8gREVGQVVMVF9NQVhfWUVBUikgPCAoZW5kRGF0ZT8ueWVhcigpIHx8IDApKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oeyBrZXk6IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LnllYXIoKSBhcyB1bmtub3duIGFzIHN0cmluZyB9LCBTaWRlRW51bS5yaWdodCArICd5ZWFyJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGhpcy5yZW5kZXJSYW5nZXMoKTtcbiAgICB0aGlzLmZvcm1hdE1vbnRoWWVhcigpO1xuICAgIHRoaXMub3V0VXBkYXRlV2lkdGguZW1pdCgxKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0uc2V0KHtcbiAgICAgIGxlZnRob3VyOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdCgpLnNlbGVjdGVkSG91ciksXG4gICAgICByaWdodGhvdXI6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5yaWdodCgpLnNlbGVjdGVkSG91ciksXG4gICAgICBsZWZ0bWludXRlOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdCgpLnNlbGVjdGVkTWludXRlKSxcbiAgICAgIHJpZ2h0bWludXRlOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkucmlnaHQoKS5zZWxlY3RlZE1pbnV0ZSlcbiAgICB9KTtcblxuICAgIC8vIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHsgYnVpbGREZWZhdWx0UmFuZ2U6IHRoaXMuYnVpbGREZWZhdWx0UmFuZ2UuYmluZCh0aGlzKSwgYXBwbHlUb1NlbGVjdDogdGhpcy5hcHBseVRvU2VsZWN0LmJpbmQodGhpcykgfSlcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb25maWdZZWFyKHNpZGU6IFNpZGVFbnVtLCBzdGFydFllYXI/OiBudW1iZXIsKSB7XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpIGFzIGRheWpzLkRheWpzO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcztcblxuICAgIGNvbnN0IGxpc3RMZWZ0WWVhciA9IFtdO1xuICAgIGNvbnN0IGxpc3RSaWdodFllYXIgPSBbXTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBjb25zdCBzdGFydCA9IG1heERhdGU/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSO1xuICAgICAgY29uc3QgZW5kID0gbWluRGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUlOX1lFQVI7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgICAgbGlzdExlZnRZZWFyLnB1c2goe1xuICAgICAgICAgIGlkOiBpLFxuICAgICAgICAgIGxhYmVsOiBgJHtpfWBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RMZWZ0WWVhckNvbmZpZy5zZXQoZ2V0WWVhcnNMaXN0Q29uZmlnKGxpc3RMZWZ0WWVhcikpO1xuICAgICAgdGhpcy5sZWZ0WWVhckh0dHBEZXRhaWxDb25maWcuc2V0KGdldFllYXJzRGV0YWlsQnlJZChsaXN0TGVmdFllYXIpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gbWF4RGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUFYX1lFQVI7XG4gICAgY29uc3QgZW5kID0gc3RhcnRZZWFyID8/IG1pbkRhdGU/LnllYXIoKSA/PyBkYXlqcygpLnllYXIoKTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgIGxpc3RSaWdodFllYXIucHVzaCh7XG4gICAgICAgIGlkOiBpLFxuICAgICAgICBsYWJlbDogYCR7aX1gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RSaWdodFllYXJDb25maWcuc2V0KGdldFllYXJzTGlzdENvbmZpZyhsaXN0UmlnaHRZZWFyKSk7XG4gICAgdGhpcy5yaWdodFllYXJIdHRwRGV0YWlsQ29uZmlnLnNldChnZXRZZWFyc0RldGFpbEJ5SWQobGlzdFJpZ2h0WWVhcikpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoZmxhZ01vdXNlOiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoZmxhZ01vdXNlKVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGFydEVuZERhdGUoZGF0ZTogZGF5anMuRGF5anMpIHtcbiAgICBpZiAoKHRoaXMuZW5kRGF0ZSgpIHx8IGRhdGUuaXNCZWZvcmUodGhpcy5zdGFydERhdGUoKSwgJ2RheScpKSkge1xuICAgICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgIGRhdGUgPSB0aGlzLmdldERhdGVXaXRoVGltZShkYXRlLCBTaWRlRW51bS5sZWZ0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlKGRhdGUuY2xvbmUoKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmVuZERhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpICYmIGRhdGUuaXNCZWZvcmUodGhpcy5zdGFydERhdGUoKSkpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZSh0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIGRhdGUgPSB0aGlzLmdldERhdGVXaXRoVGltZShkYXRlLCBTaWRlRW51bS5yaWdodCk7XG4gICAgfVxuICAgIGlmICghZGF0ZS5pc0JlZm9yZSh0aGlzLnN0YXJ0RGF0ZSgpLCAnZGF5JykpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShkYXRlLmNsb25lKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdXRvQXBwbHkoKSkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVTZWxlY3RlZExhYmVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTZWxlY3RlZExhYmVsKCkge1xuICAgIHRoaXMudXBkYXRlRWxlbWVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNb250aFllYXIoKSB7XG4gICAgY29uc3QgbW9udGggPSAodGhpcy5jYWxlbmRhclZhcmlhYmxlcygpLmxlZnQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50TW9udGggPz8gMCkgKyAxO1xuICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gbW9udGg7XG4gICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRZZWFyO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5pc1NpbmdsZSgpKSB7XG4gICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnNldCh7IGxlZnRtb250aDogdHJ1ZSwgbGVmdHllYXI6IHRydWUsIHJpZ2h0bW9udGg6IHRydWUsIHJpZ2h0eWVhcjogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmlnaHRNb250aCA9ICh0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50TW9udGggPz8gMCkgKyAxO1xuICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IHJpZ2h0TW9udGg7XG4gICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50WWVhcjtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5pc1NlbGVjdGVkRGF0YS5zZXQoeyBsZWZ0bW9udGg6IHRydWUsIGxlZnR5ZWFyOiB0cnVlLCByaWdodG1vbnRoOiB0cnVlLCByaWdodHllYXI6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXJ0RGF0ZShzdGFydERhdGU6IGRheWpzLkRheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KGRheWpzKHN0YXJ0RGF0ZSwgdGhpcy5kYXRlT3B0aW9ucygpLmZvcm1hdCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHN0YXJ0RGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMucGlja2luZ0RhdGUuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KGRheWpzKHN0YXJ0RGF0ZSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnBpY2tpbmdEYXRlLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldCh0aGlzLnN0YXJ0RGF0ZSgpPy5zdGFydE9mKCdkYXknKSk7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG5cbiAgICBpZiAodGhpcy5taW5EYXRlKCkgJiYgdGhpcy5zdGFydERhdGUoKT8uaXNCZWZvcmUodGhpcy5taW5EYXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoKHRoaXMubWluRGF0ZSgpIGFzIGRheWpzLkRheWpzKT8uY2xvbmUoKSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heERhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5pc0FmdGVyKHRoaXMubWF4RGF0ZSgpKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KCh0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcykuY2xvbmUoKSk7XG4gICAgICB0aGlzLnNldFN0YXJ0RGF0ZUluVGltZVBpY2tlcigpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNTaG93bigpKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB9XG4gICAgLy8gdGhpcy5vdXRTdGFydERhdGVDaGFuZ2VkLmVtaXQoeyBzdGFydERhdGU6IHRoaXMuc3RhcnREYXRlKCkgfSk7XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCkge1xuICAgIGlmICghdGhpcy5oYXNUaW1lUGlja2VyKCkgfHwgIXRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydERhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudC5taW51dGUoTWF0aC5yb3VuZChjdXJyZW50Lm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpICogdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldEVuZERhdGUoZW5kRGF0ZTogZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuZERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KGRheWpzKGVuZERhdGUsIHRoaXMuZGF0ZU9wdGlvbnMoKS5mb3JtYXQpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmREYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldChkYXlqcyhlbmREYXRlKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5lbmREYXRlKCkgfHwgIXRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnBpY2tpbmdEYXRlLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuZW5kRGF0ZSgpPy5hZGQoMSwgJ2QnKS5zdGFydE9mKCdkYXknKS5zdWJ0cmFjdCgxLCAnc2Vjb25kJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNUaW1lUGlja2VyKCkgJiYgdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQubWludXRlKE1hdGgucm91bmQoY3VycmVudC5taW51dGUoKSAvIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmREYXRlKCk/LmlzQmVmb3JlKHRoaXMuc3RhcnREYXRlKCkpKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhEYXRlKCkgJiYgdGhpcy5lbmREYXRlKCk/LmlzQWZ0ZXIodGhpcy5tYXhEYXRlKCkpKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KCh0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcyk/LmNsb25lKCkpO1xuICAgIH1cbiAgICAvLyB0aGlzLm91dEVuZERhdGVDaGFuZ2VkLmVtaXQoeyBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSB9KTtcbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVySG92ZXJEYXRlKGV2ZW50OiBFdmVudCwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbGVmdENhbERhdGUgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuICAgIGNvbnN0IHJpZ2h0Q2FsRGF0ZSA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCF0aGlzLnBpY2tpbmdEYXRlIHx8ICFyaWdodENhbERhdGUgfHwgIWxlZnRDYWxEYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubm93SG92ZXJlZERhdGUuc2V0KHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyBsZWZ0Q2FsRGF0ZSA6IHJpZ2h0Q2FsRGF0ZSk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5sZWZ0KTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgfVxuICBwcml2YXRlIGdldERpc2FibGUodHlwZTogJ2xlZnQnIHwgJ3JpZ2h0Jykge1xuICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLm1pbkRhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCkgYXMgZGF5anMuRGF5anM7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQuc2V0KFtdKTtcblxuICAgICAgaWYgKG1pbkRhdGU/LnllYXIoKSA9PT0gdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IChtaW5EYXRlPy5tb250aCgpICsgMSk7IGkrKykge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkubGVmdC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZT8ueWVhcigpID09PSB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXhEYXRlPy5tb250aCgpICsgMjsgaSA8IDEzOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC5zZXQoW10pO1xuICAgIGlmIChtaW5EYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IChtaW5EYXRlPy5tb250aCgpICsgMSk7IGkrKykge1xuICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLnJpZ2h0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXhEYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gbWF4RGF0ZT8ubW9udGgoKSArIDI7IGkgPCAxMzsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkucmlnaHQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucHVzaChpKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKChOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikgPT09IE51bWJlcih0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpOyBpKyspIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tQcmV2KHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uc3VidHJhY3QoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5tb250aCgpID8/IDApICsgMTtcbiAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy55ZWFyKCk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja05leHQoc2lkZTogU2lkZUVudW0pIHtcbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoPy55ZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoKSAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA9PT0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSB7XG4gICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclBpY2tlckRhdGUoZXZlbnQ6IGFueSwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldD8udGFnTmFtZSA9PT0gJ1REJykge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2F2YWlsYWJsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQucGFyZW50RWxlbWVudCAmJiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYXZhaWxhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlLnNldCh0aGlzLmRhdGVPcHRpb25zKCkuY3VzdG9tUmFuZ2VMYWJlbCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5jYWxlbmRhcj8uW3Jvd11bY29sXSA6IHRoaXMucmlnaHRDYWxlbmRhcigpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnRbc2lkZSA9PT0gU2lkZUVudW0ubGVmdCA/ICdzdGFydCcgOiAnZW5kJ10udXBkYXRlKHNpZGVDdXJyZW50ID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnQuZGF5ID0gZGF0ZS5kYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHNpZGVDdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlU3RhcnRFbmREYXRlKGRhdGUpO1xuXG4gICAgaWYgKHRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLnNldEVuZERhdGUodGhpcy5zdGFydERhdGUoKSk7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcblxuICAgICAgaWYgKHRoaXMuYXV0b0FwcGx5KCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2xpY2tBcHBseSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIGlmICh0aGlzLmF1dG9BcHBseSgpICYmIHRoaXMuc3RhcnREYXRlKCkgJiYgdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlckNsaWNrQXBwbHkoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQXBwbHkoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyB0aGlzLnZhbGlkYXRlKCk7XG4gICAgLy8gaWYgKCF0aGlzLnZhbGlkYXRlKCkpIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnNldFRpbWVJbnB1dChTaWRlRW51bS5sZWZ0KTtcbiAgICAgIHRoaXMuc2V0VGltZUlucHV0KFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy5jYWxjdWxhdGVTZWxlY3RlZExhYmVsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZExhYmVsKCkpIHtcbiAgICAgIHRoaXMub3V0UGlja2VyRGF0ZS5lbWl0KHsgZGlzcGxheUxhYmVsOiB0aGlzLnNlbGVjdGVkTGFiZWwoKSwgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpLCBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSwgZGV0YWlsRGF0ZVBpY2tlcjogdGhpcy5zcGxpdFBpY2tlckRhdGUoKSB9KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0NhbmNlbChldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF5anMoMCkpO1xuICAgIHRoaXMuZW5kRGF0ZS5zZXQoZGF5anMoMCkpO1xuICAgIHRoaXMub3V0Q2FuY2VsLmVtaXQoJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5zZXQodHlwZSwgZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCwgdHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoe1xuICAgICAgaXNNb3VzZUVudGVyOiBmYWxzZSxcbiAgICAgIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlLFxuICAgICAgaXNDb250YWluZXJIYXNTY3JvbGw6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ubGVmdH1tb250aGA6XG4gICAgICBjYXNlIGAke1NpZGVFbnVtLnJpZ2h0fW1vbnRoYDpcbiAgICAgICAgdGhpcy51cGRhdGVNb250aFNlbGVjdChldmVudCwgdHlwZSk7XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ubGVmdH15ZWFyYDpcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ucmlnaHR9eWVhcmA6XG4gICAgICAgIHRoaXMudXBkYXRlWWVhclNlbGVjdChldmVudCwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLnNwbGl0UGlja2VyRGF0ZS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBpZiAodHlwZSA9PT0gYCR7U2lkZUVudW0ubGVmdH1tb250aGAgfHwgdHlwZSA9PT0gYCR7U2lkZUVudW0ubGVmdH15ZWFyYCkge1xuICAgICAgICBjdXJyZW50LnN0YXJ0LnVwZGF0ZShzdGFydCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9bW9udGhgKSB7XG4gICAgICAgICAgICBzdGFydC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlID09PSBgJHtTaWRlRW51bS5sZWZ0fXllYXJgKSB7XG4gICAgICAgICAgICBzdGFydC55ZWFyID0gZXZlbnQua2V5IGFzIG51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RhcnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LmVuZC51cGRhdGUoZW5kID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLnJpZ2h0fW1vbnRoYCkge1xuICAgICAgICAgIGVuZC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLnJpZ2h0fXllYXJgKSB7XG4gICAgICAgICAgZW5kLnllYXIgPSBldmVudC5rZXkgYXMgbnVtYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTW9udGhTZWxlY3QoZXZlbnQ6IElFbWl0U2VsZWN0S2V5LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaWRlID0gdHlwZS5pbmNsdWRlcyhTaWRlRW51bS5sZWZ0KSA/IFNpZGVFbnVtLmxlZnQgOiBTaWRlRW51bS5yaWdodDtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkuZHJvcGRvd25zPy4oKT8uY3VycmVudFllYXIgfHwgZGF5anMoKS55ZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBOdW1iZXIoZXZlbnQua2V5KSAtIDE7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZERhdGEoKS5sZWZ0bW9udGgpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5sZWZ0bW9udGggPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSBldmVudC5rZXk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA+PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICYmIChOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikgPT09IE51bWJlcih0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpKSB7XG4gICAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA8PSAxMSkge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcihldmVudC5rZXkpICsgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlcihldmVudC5rZXkpID09PSAxMikge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IDE7XG4gICAgICAgICAgICBjdXJyZW50LnllYXIgKz0gMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkucmlnaHRtb250aCkge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnJpZ2h0bW9udGggPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuXG4gICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuICAgIHRoaXMubW9udGhPclllYXJDaGFuZ2VkKG1vbnRoLCB5ZWFyLCBzaWRlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVllYXJTZWxlY3QoZXZlbnQ6IElFbWl0U2VsZWN0S2V5LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaWRlID0gdHlwZS5pbmNsdWRlcyhTaWRlRW51bS5sZWZ0KSA/IFNpZGVFbnVtLmxlZnQgOiBTaWRlRW51bS5yaWdodDtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkRGF0YSgpPy5sZWZ0eWVhcikge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmxlZnR5ZWFyID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgnbGVmdCcpO1xuICAgICAgICAvLyB0aGlzLlNldExpc3RZZWFyUmlnaHQodGhpcy5saXN0Vmlld0tleVNlbGVjdGVkWWVhciBhcyBudW1iZXIpO1xuICAgICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldCh0eXBlKSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlbW92ZUxpc3QoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnllYXIgPSBldmVudC5rZXk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA+PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpIHtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgPD0gMTEpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICsgMTtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RGlzYWJsZSgnbGVmdCcpO1xuICAgICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ucmlnaHQsIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgYXMgbnVtYmVyKTtcbiAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkucmlnaHR5ZWFyKSB7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZERhdGEudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucmlnaHR5ZWFyID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA+PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgPD0gMTEpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICsgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID09PSAxMikge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICBsZXQgbW9udGggPSBkYXlqcygpLm1vbnRoKCk7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQgJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIHtcbiAgICAgIG1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSAtIDE7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0ICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSB7XG4gICAgICBtb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgLSAxO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gTnVtYmVyKGV2ZW50LmtleSk7XG5cbiAgICB0aGlzLm1vbnRoT3JZZWFyQ2hhbmdlZChtb250aCwgeWVhciwgc2lkZSk7XG5cbiAgfVxuICBwcml2YXRlIG1vbnRoT3JZZWFyQ2hhbmdlZChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgY29uc3QgaXNMZWZ0ID0gc2lkZSA9PT0gU2lkZUVudW0ubGVmdDtcbiAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5taW5EYXRlKCkgYXMgZGF5anMuRGF5anM7XG4gICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSgpIGFzIGRheWpzLkRheWpzO1xuXG4gICAgaWYgKG1pbkRhdGUgJiYgKHllYXIgPCBtaW5EYXRlPy55ZWFyKCkgfHwgKHllYXIgPT09IG1pbkRhdGU/LnllYXIoKSAmJiBtb250aCA8IG1pbkRhdGU/Lm1vbnRoKCkpKSkge1xuICAgICAgbW9udGggPSBtaW5EYXRlPy5tb250aCgpO1xuICAgICAgeWVhciA9IG1pbkRhdGU/LnllYXIoKTtcbiAgICB9XG5cbiAgICBpZiAobWF4RGF0ZSAmJiAoeWVhciA+IG1heERhdGU/LnllYXIoKSB8fCAoeWVhciA9PT0gbWF4RGF0ZT8ueWVhcigpICYmIG1vbnRoID4gbWF4RGF0ZT8ubW9udGgoKSkpKSB7XG4gICAgICBtb250aCA9IG1heERhdGU/Lm1vbnRoKCk7XG4gICAgICB5ZWFyID0gbWF4RGF0ZT8ueWVhcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3Bkb3ducyA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpLmRyb3Bkb3ducztcblxuICAgIGlmIChkcm9wZG93bnM/LigpKSB7XG4gICAgICBkcm9wZG93bnMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmN1cnJlbnRZZWFyID0geWVhcjtcbiAgICAgICAgY3VycmVudC5jdXJyZW50TW9udGggPSBtb250aDtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pXG5cbiAgICB9XG4gICAgaWYgKGlzTGVmdCAmJiB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoKSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgaWYgKG1vbnRoID09PSAxMikge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmNsb25lKCkuYWRkKDEsICdtb250aCcpO1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcklucHV0RXZlbnQoZXZlbnQ6IElFdmVudCwgdHlwZTogYGxlZnRob3VyYCB8IGBsZWZ0bWludXRlYCB8IGByaWdodGhvdXJgIHwgYHJpZ2h0bWludXRlYCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlICE9PSA4KSB7XG4gICAgICBldmVudC5rZXlDb2RlICYmIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMua2V5Q29kZUJhY2tzcGFjZS5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5rZXlDb2RlQmFja3NwYWNlLnNldCh0cnVlKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbGVmdG1pbnV0ZSc6XG4gICAgICAgIGlmIChpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzKClbdHlwZV0oKSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoY3VycmVudFt0eXBlXSgpICsgMSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoMSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KGAke1NpZGVFbnVtLmxlZnR9aG91cmApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlnaHRtaW51dGUnOlxuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpKSkge1xuICAgICAgICAgIGlmICh0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMoKVt0eXBlXSgpID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldChjdXJyZW50W3R5cGVdKCkgKyAxKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldCgxKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQoYCR7U2lkZUVudW0ucmlnaHR9aG91cmApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoZXZlbnQ6IElGb2N1c0FuZEJsdXJFdmVudCwgdHlwZTogYGxlZnRob3VyYCB8IGBsZWZ0bWludXRlYCB8IGByaWdodGhvdXJgIHwgYHJpZ2h0bWludXRlYCkge1xuICAgIGlmIChldmVudC5uYW1lID09PSAnZm9jdXMnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50SW5wdXQgPSBldmVudC5ldmVudCBhcyBJRXZlbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRJbnB1dC50YXJnZXQ7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2xlZnRob3VyJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5zZWxlY3RlZEhvdXIgPSAhaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkgOiAwO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSA9PT0gMCkgfHwgaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LmxlZnRob3VyLnNldCgwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gJzAwJztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSl9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlnaHRob3VyJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkucmlnaHQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkgOiAwO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpKSB7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQucmlnaHRob3VyLnNldCgwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gJzAwJztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnRtaW51dGUnOlxuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSA6IDA7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LmxlZnRtaW51dGUuc2V0KDApO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSAnMDAnO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyaWdodG1pbnV0ZSc6XG4gICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpLnJpZ2h0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPyB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpIDogMDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkpIHtcbiAgICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5yaWdodG1pbnV0ZS5zZXQoMCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9ICcwMCc7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSl9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVRpbWVWYWx1ZShldmVudDogc3RyaW5nIHwgbnVtYmVyLCB0eXBlOiBgbGVmdGhvdXJgIHwgYGxlZnRtaW51dGVgIHwgYHJpZ2h0aG91cmAgfCBgcmlnaHRtaW51dGVgKSB7XG4gICAgdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KGV2ZW50IGFzIG51bWJlcik7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lkZSA9IHR5cGUuaW5jbHVkZXMoU2lkZUVudW0ubGVmdCkgPyBTaWRlRW51bS5sZWZ0IDogU2lkZUVudW0ucmlnaHQ7XG4gICAgY29uc3QgYXR0ciA9IHR5cGUuaW5jbHVkZXMoJ2hvdXInKSA/ICdob3VyJyA6ICdtaW51dGUnO1xuXG4gICAgdGhpcy5zcGxpdFBpY2tlckRhdGUudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudFtzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gJ3N0YXJ0JyA6ICdlbmQnXS51cGRhdGUoc2lkZUN1cnJlbnQgPT4ge1xuICAgICAgICBzaWRlQ3VycmVudFthdHRyXSA9IGV2ZW50IGFzIG51bWJlcjtcblxuICAgICAgICByZXR1cm4gc2lkZUN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgaWYgKCh0eXBlICE9PSAnbGVmdGhvdXInICYmIHR5cGUgIT09ICdyaWdodGhvdXInKSB8fCBldmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzWmVyby5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgoYCR7ZXZlbnR9YC5sZW5ndGggPT09IDIpIHx8IChOdW1iZXIoZXZlbnQpID4gMikgfHwgKE51bWJlcihldmVudCkgPD0gMiAmJiBOdW1iZXIoZXZlbnQpID4gMCAmJiB0aGlzLmlzWmVybygpKSB8fCAodGhpcy5pc1plcm8oKSAmJiAhdGhpcy5rZXlDb2RlQmFja3NwYWNlKCkpKSB7XG4gICAgICB0aGlzLmlzWmVyby5zZXQoZmFsc2UpO1xuICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQodHlwZSA9PT0gJ2xlZnRob3VyJyA/IGAke1NpZGVFbnVtLmxlZnR9bWludXRlYCA6IGAke1NpZGVFbnVtLnJpZ2h0fW1pbnV0ZWApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyKGV2ZW50KSA9PT0gMCAmJiAhdGhpcy5rZXlDb2RlQmFja3NwYWNlKCkpIHtcbiAgICAgIHRoaXMuaXNaZXJvLnNldCh0cnVlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2hvd0xpc3REcm9wZG93bihldmVudDogYm9vbGVhbiwgdHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGVja1Nob3dMaXN0RHJvcGRvd24udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50W3R5cGVdID0gZXZlbnQ7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnZlcnRJdGVtTW9udGggPSAoaXRlbTogYW55KSA9PiB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHNldChpdGVtLCAnbGFiZWxEaXNwbGF5JywgdGhpcy50cmFuc2xhdGUuaW5zdGFudChpdGVtLmxhYmVsIHx8ICcgJywgeyB5ZWFyOiAnJyB9KSk7XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydEl0ZW1ZZWFyID0gKGl0ZW06IGFueSkgPT4ge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpdGVtLmxhYmVsRGlzcGxheSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2kxOG5feWVhcl9wYXJhbScsIHsgeWVhcjogaXRlbS5sYWJlbCB9KTtcblxuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb250aHNJblZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoICYmIHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoICYmXG4gICAgICAgICgodGhpcy5sZWZ0Q2FsZW5kYXIoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykpIHx8ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpKSlcbiAgICAgICAgJiYgKHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgfHwgdGhpcy5lbmREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpID09PSB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykpXG4gICAgICApIHsgcmV0dXJuOyB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5lbmREYXRlKCk/Lm1vbnRoKCkgIT09IHRoaXMuc3RhcnREYXRlKCk/Lm1vbnRoKCkgfHwgdGhpcy5lbmREYXRlKCk/LnllYXIoKSAhPT0gdGhpcy5zdGFydERhdGUoKT8ueWVhcigpKSB7XG4gICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLmVuZERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKT8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpICYmIHRoaXMubGVmdENhbGVuZGFyKCkubW9udGggJiYgdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGggJiYgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgIT09IHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpICYmIHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5mb3JtYXQoJ1lZWVktTU0nKSAhPT0gdGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdZWVlZLU1NJykpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCk/LmRhdGUoMik7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpPy5kYXRlKDIpPy5hZGQoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRpbWVJbnB1dChzaWRlOiBTaWRlRW51bSkge1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkSG91cn1gKTtcbiAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkTWludXRlfWApO1xuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKTtcblxuICAgICAgc3RhcnQgPSBzdGFydD8uaG91cihob3VyKTtcbiAgICAgIHN0YXJ0ID0gc3RhcnQ/Lm1pbnV0ZShtaW51dGUpO1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoc3RhcnQpO1xuICAgICAgaWYgKHRoaXMuaXNTaW5nbGUoKSkge1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kRGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gc3RhcnQ/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmIHRoaXMuZW5kRGF0ZSgpPy5pc0JlZm9yZShzdGFydCkpIHtcbiAgICAgICAgdGhpcy5zZXRFbmREYXRlKHN0YXJ0Py5jbG9uZSgpKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5lbmREYXRlKCkgJiYgc3RhcnQgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDbG9uZSA9IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKHN0YXJ0LCBTaWRlRW51bS5yaWdodCk7XG5cbiAgICAgICAgaWYgKHN0YXJ0Q2xvbmUuaXNCZWZvcmUoc3RhcnQpKSB7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbU2lkZUVudW0ucmlnaHRdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gaG91cjtcbiAgICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRNaW51dGUgPSBtaW51dGU7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICBsZXQgZW5kID0gdGhpcy5lbmREYXRlKCk/LmNsb25lKCk7XG5cbiAgICAgIGVuZCA9IGVuZD8uaG91cihob3VyKTtcbiAgICAgIGVuZCA9IGVuZD8ubWludXRlKG1pbnV0ZSk7XG4gICAgICB0aGlzLnNldEVuZERhdGUoZW5kKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJzKCkge1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5yaWdodCk7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDYWxlbmRhcihzaWRlOiBTaWRlRW51bSkgeyAvLyBzaWRlIGVudW1cbiAgICBjb25zdCBtYWluQ2FsZW5kYXI6IHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXIsIG1vbnRoPzogZGF5anMuRGF5anMgfSA9IChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSA/IHRoaXMubGVmdENhbGVuZGFyKCkgOiB0aGlzLnJpZ2h0Q2FsZW5kYXIoKTtcblxuICAgIGlmICghbWFpbkNhbGVuZGFyLm1vbnRoIHx8ICh0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9udGggPSBtYWluQ2FsZW5kYXIubW9udGgubW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbWFpbkNhbGVuZGFyLm1vbnRoLnllYXIoKTtcbiAgICBjb25zdCBob3VyID0gbWFpbkNhbGVuZGFyLm1vbnRoLmhvdXIoKTtcbiAgICBjb25zdCBtaW51dGUgPSBtYWluQ2FsZW5kYXIubW9udGgubWludXRlKCk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFpbkNhbGVuZGFyLm1vbnRoLnNlY29uZCgpO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgpKS5kYXlzSW5Nb250aCgpO1xuICAgIGNvbnN0IGZpcnN0RGF5ID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgsIDEpKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgsIGRheXNJbk1vbnRoKSk7XG4gICAgY29uc3QgbGFzdE1vbnRoID0gZGF5anMoZmlyc3REYXkpLnN1YnRyYWN0KDEsICdtb250aCcpLm1vbnRoKCk7XG4gICAgY29uc3QgbGFzdFllYXIgPSBkYXlqcyhmaXJzdERheSkuc3VidHJhY3QoMSwgJ21vbnRoJykueWVhcigpO1xuICAgIGNvbnN0IGRheXNJbkxhc3RNb250aCA9IGRheWpzKG5ldyBEYXRlKGxhc3RZZWFyLCBsYXN0TW9udGgpKS5kYXlzSW5Nb250aCgpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGZpcnN0RGF5LmRheSgpO1xuICAgIGNvbnN0IGNhbGVuZGFyOiBJQ2FsZW5kYXIgPSB7fTtcblxuICAgIGNhbGVuZGFyLmZpcnN0RGF5ID0gZmlyc3REYXk7XG4gICAgY2FsZW5kYXIubGFzdERheSA9IGxhc3REYXk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgIGNhbGVuZGFyW2ldID0gW107XG4gICAgfVxuICAgIGxldCBzdGFydERheSA9IGRheXNJbkxhc3RNb250aCAtIGRheU9mV2VlayArICh0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPz8gMSkgKyAxO1xuXG4gICAgaWYgKHN0YXJ0RGF5ID4gZGF5c0luTGFzdE1vbnRoKSB7XG4gICAgICBzdGFydERheSAtPSA3O1xuICAgIH1cbiAgICBpZiAoZGF5T2ZXZWVrID09PSB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkpIHtcbiAgICAgIHN0YXJ0RGF5ID0gZGF5c0luTGFzdE1vbnRoIC0gNjtcbiAgICB9XG4gICAgbGV0IGN1ckRhdGUgPSBkYXlqcyhuZXcgRGF0ZShsYXN0WWVhciwgbGFzdE1vbnRoLCBzdGFydERheSwgMTIsIG1pbnV0ZSwgc2Vjb25kKSk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgY29sID0gMCwgcm93ID0gMDsgaSA8IDQyOyBpKyssIGNvbCsrLCBjdXJEYXRlID0gZGF5anMoY3VyRGF0ZSkuYWRkKDI0LCAnaG91cicpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgY29sICUgNyA9PT0gMCkge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IGN1ckRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgY3VyRGF0ZSA9IGN1ckRhdGUuaG91cigxMik7XG5cbiAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLm1pbkRhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgIGlmIChtaW5EYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gbWluRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQmVmb3JlKG1pbkRhdGUpICYmIHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0gPSBtaW5EYXRlPy5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgaWYgKG1heERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBtYXhEYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNBZnRlcihtYXhEYXRlKSAmJiBzaWRlID09PSAncmlnaHQnKSB7XG4gICAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IG1heERhdGU/LmNsb25lKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCkge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1pbkRhdGUgPSBzaWRlID09PSAnbGVmdCcgPyAodGhpcy5taW5EYXRlKCkgYXMgZGF5anMuRGF5anMpIDogdGhpcy5zdGFydERhdGUoKTtcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCkgYXMgZGF5anMuRGF5anM7XG5cbiAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0uc2V0KHtcbiAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgIHllYXI6IHllYXIsXG4gICAgICBob3VyOiBob3VyLFxuICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICBzZWNvbmQ6IHNlY29uZCxcbiAgICAgIGRheXNJbk1vbnRoOiBkYXlzSW5Nb250aCxcbiAgICAgIGZpcnN0RGF5OiBmaXJzdERheSxcbiAgICAgIGxhc3REYXk6IGxhc3REYXksXG4gICAgICBsYXN0TW9udGg6IGxhc3RNb250aCxcbiAgICAgIGxhc3RZZWFyOiBsYXN0WWVhcixcbiAgICAgIGRheXNJbkxhc3RNb250aDogZGF5c0luTGFzdE1vbnRoLFxuICAgICAgZGF5T2ZXZWVrOiBkYXlPZldlZWssXG4gICAgICBjYWxSb3dzOiBzaWduYWwoQXJyYXkuZnJvbShBcnJheSg2KS5rZXlzKCkpKSxcbiAgICAgIGNhbENvbHM6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSkpLFxuICAgICAgY2xhc3Nlczoge30sXG4gICAgICBtaW5EYXRlOiBtaW5EYXRlLFxuICAgICAgbWF4RGF0ZTogbWF4RGF0ZSxcbiAgICAgIGNhbGVuZGFyOiBjYWxlbmRhcixcbiAgICAgIGRyb3Bkb3duczogc2lnbmFsKHt9KVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNob3dEcm9wZG93bnNTZWxlY3QoKSkge1xuICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gY2FsZW5kYXJbMV1bMV0ueWVhcigpO1xuICAgICAgY29uc3QgbWF4WWVhciA9IG1heERhdGU/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSO1xuICAgICAgY29uc3QgbWluWWVhciA9IG1pbkRhdGU/LnllYXIoKSA/PyBERUZBVUxUX01JTl9ZRUFSO1xuICAgICAgY29uc3QgaW5NaW5ZZWFyID0gY3VycmVudFllYXIgPT09IG1pblllYXI7XG4gICAgICBjb25zdCBpbk1heFllYXIgPSBjdXJyZW50WWVhciA9PT0gbWF4WWVhcjtcbiAgICAgIGNvbnN0IHllYXJzID0gW107XG5cbiAgICAgIGZvciAobGV0IHkgPSBtaW5ZZWFyOyB5IDw9IG1heFllYXI7IHkrKykge1xuICAgICAgICB5ZWFycy5wdXNoKHkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkuZHJvcGRvd25zPy5zZXQoe1xuICAgICAgICBjdXJyZW50TW9udGg6IGN1cnJlbnRNb250aCxcbiAgICAgICAgY3VycmVudFllYXI6IGN1cnJlbnRZZWFyLFxuICAgICAgICBtYXhZZWFyOiBtYXhZZWFyLFxuICAgICAgICBtaW5ZZWFyOiBtaW5ZZWFyLFxuICAgICAgICBpbk1pblllYXI6IGluTWluWWVhcixcbiAgICAgICAgaW5NYXhZZWFyOiBpbk1heFllYXIsXG4gICAgICAgIG1vbnRoQXJyYXlzOiBzaWduYWwoQXJyYXkuZnJvbShBcnJheSgxMikua2V5cygpKSksXG4gICAgICAgIHllYXJBcnJheXM6IHNpZ25hbCh5ZWFycylcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkQ2VsbHMoY2FsZW5kYXIsIHNpZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENlbGxzKGNhbGVuZGFyOiBJQ2FsZW5kYXIsIHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgNjsgcm93KyspIHtcbiAgICAgIGNvbnN0IGNsYXNzbGVzcyA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpO1xuXG4gICAgICBpZiAoY2xhc3NsZXNzLmNsYXNzZXMpIHtcbiAgICAgICAgY2xhc3NsZXNzLmNsYXNzZXNbcm93XSA9IHt9O1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNzsgY29sKyspIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlKCkgYXMgZGF5anMuRGF5anM7XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgICAgY29uc3Qgbm93SG92ZXJlZERhdGUgPSB0aGlzLm5vd0hvdmVyZWREYXRlKCk7XG5cbiAgICAgICAgaWYgKGNhbGVuZGFyW3Jvd11bY29sXS5pc1NhbWUobmV3IERhdGUoKSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCd0b2RheScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0uaXNvV2Vla2RheSgpID4gNSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnd2Vla2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0ubW9udGgoKSAhPT0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRGF0ZSgpICYmIGNhbGVuZGFyW3Jvd11bY29sXS5pc0JlZm9yZSh0aGlzLm1pbkRhdGUoKSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkubWF4RGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNBZnRlcih0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5tYXhEYXRlLCAnZGF5JykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ29mZicsICdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBzdGFydERhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnLCAnc3RhcnQtZGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmREYXRlICE9PSBudWxsICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gZW5kRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScsICdlbmQtZGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBzdGFydERhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmICghZW5kRGF0ZSB8fCBlbmREYXRlICE9PSBudWxsICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gZW5kRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnLCAnZnVsbC1kYXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUgJiYgKChub3dIb3ZlcmVkRGF0ZSAhPT0gbnVsbCAmJiB0aGlzLnBpY2tpbmdEYXRlKCkpIHx8IGVuZERhdGUgIT09IG51bGwpICYmIChjYWxlbmRhcltyb3ddW2NvbF0gPiBzdGFydERhdGUgJiYgKGNhbGVuZGFyW3Jvd11bY29sXSA8IGVuZERhdGUgfHwgKG5vd0hvdmVyZWREYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXSA8IG5vd0hvdmVyZWREYXRlICYmIHRoaXMucGlja2luZ0RhdGUoKSkpKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCghY2xhc3Nlcy5maW5kKGVsID0+IGVsID09PSAnb2ZmJykgPyAnaW4tcmFuZ2UnIDogJ2ZvY3VzLW9mZicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjbmFtZSA9ICcnLCBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNuYW1lICs9IGNsYXNzZXNbaV0gKyAnICc7XG5cbiAgICAgICAgICBpZiAoY2xhc3Nlc1tpXSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgIGNuYW1lICs9ICdhdmFpbGFibGUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYXNzbGVzcy5jbGFzc2VzKSB7XG4gICAgICAgICAgY2xhc3NsZXNzLmNsYXNzZXNbcm93XVtjb2xdID0gY25hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJUaW1lUGlja2VyKHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgbGV0IHNlbGVjdGVkOiBkYXlqcy5EYXlqcyA9IGRheWpzKCksIG1pbkRhdGU7XG4gICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuZW5kRGF0ZSgpO1xuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgc3RhcnREYXRlKSB7XG4gICAgICBzZWxlY3RlZCA9IHN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgbWluRGF0ZSA9IHRoaXMubWF4RGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQgJiYgZW5kRGF0ZSkge1xuICAgICAgc2VsZWN0ZWQgPSBlbmREYXRlLmNsb25lKCk7XG4gICAgICBtaW5EYXRlID0gdGhpcy5zdGFydERhdGUoKTtcbiAgICB9XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0ICYmICFlbmREYXRlKSB7XG4gICAgICBpZiAoIXN0YXJ0RGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWxlY3RlZCA9IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKHN0YXJ0RGF0ZSwgU2lkZUVudW0ucmlnaHQpO1xuICAgICAgaWYgKHNlbGVjdGVkLmlzQmVmb3JlKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBzdGFydERhdGUuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIG1pbkRhdGUgPSBzdGFydERhdGU7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gMDtcbiAgICBjb25zdCBlbmQgPSAyMztcblxuICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnNldCh7XG4gICAgICBob3VyczogW10sXG4gICAgICBtaW51dGVzOiBbXSxcbiAgICAgIG1pbnV0ZXNMYWJlbDogW10sXG4gICAgICBzZWNvbmRzOiBbXSxcbiAgICAgIHNlY29uZHNMYWJlbDogW10sXG4gICAgICBkaXNhYmxlZEhvdXJzOiBbXSxcbiAgICAgIGRpc2FibGVkTWludXRlczogW10sXG4gICAgICBkaXNhYmxlZFNlY29uZHM6IFtdLFxuICAgICAgc2VsZWN0ZWRIb3VyOiAwLFxuICAgICAgc2VsZWN0ZWRNaW51dGU6IDAsXG4gICAgICBzZWxlY3RlZFNlY29uZDogMCxcbiAgICB9KTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGNvbnN0IGlfaW5fMjQgPSBpO1xuXG4gICAgICBjb25zdCB0aW1lID0gc2VsZWN0ZWQuY2xvbmUoKS5ob3VyKGlfaW5fMjQpO1xuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUubWludXRlKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLm1pbnV0ZSgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5ob3Vycz8ucHVzaChpKTtcbiAgICAgICAgaWYgKGlfaW5fMjQgPT09IHNlbGVjdGVkLmhvdXIoKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkSG91ciA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNhYmxlZEhvdXJzPy5wdXNoKGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2MDsgaSArPSB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkge1xuICAgICAgY29uc3QgcGFkZGVkID0gaSA8IDEwID8gJzAnICsgaSA6IGAke2l9YDtcbiAgICAgIGNvbnN0IHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLm1pbnV0ZShpKTtcblxuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUuc2Vjb25kKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLnNlY29uZCgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5taW51dGVzPy5wdXNoKGkpO1xuICAgICAgICBjdXJyZW50Lm1pbnV0ZXNMYWJlbD8ucHVzaChwYWRkZWQpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQubWludXRlKCkgPT09IGkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5zZWxlY3RlZE1pbnV0ZSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNhYmxlZE1pbnV0ZXM/LnB1c2goaSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVsZW1lbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWwuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGFydERhdGUoKSAmJiB0aGlzLmVuZERhdGUoKSkge1xuICAgICAgLy8gaWYgd2UgdXNlIHJhbmdlcyBhbmQgc2hvdWxkIHNob3cgcmFuZ2UgbGFiZWwgb24gaW5wdXRcbiAgICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGggJiYgdGhpcy5zaG93UmFuZ2VMYWJlbE9uSW5wdXQoKSAmJiB0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpICYmIHRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsICE9PSB0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbC5zZXQodGhpcy5zZWxlY3RlZFF1aWNrUmFuZ2UoKSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZExhYmVsLnNldChgJHt0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKX0ke3RoaXMuZGF0ZU9wdGlvbnMoKS5zZXBhcmF0b3J9JHt0aGlzLmVuZERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaWV3KCkge1xuICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLmxlZnQpO1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRlV2l0aFRpbWUoZGF0ZTogZGF5anMuRGF5anMsIHNpZGU6IFNpZGVFbnVtKTogZGF5anMuRGF5anMge1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkSG91cn1gLCAxMCk7XG4gICAgY29uc3QgbWludXRlID0gcGFyc2VJbnQoYCR7dGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0oKS5zZWxlY3RlZE1pbnV0ZX1gLCAxMCk7XG4gICAgY29uc3Qgc2Vjb25kID0gdGhpcy5oYXNTZWNvbmRQaWNrZXIoKSAmJiAhaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkU2Vjb25kKSA/IHBhcnNlSW50KGAke3RoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRTZWNvbmR9YCwgMTApIDogMDtcblxuICAgIHJldHVybiBkYXRlLmNsb25lKCkuaG91cihob3VyKS5taW51dGUobWludXRlKS5zZWNvbmQoc2Vjb25kKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtTWluTWF4RGF0ZSh2YWx1ZTogZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBkYXlqcy5EYXlqcyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoZGF5anMuaXNEYXlqcyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXlqcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZWREaXNwbGF5VGltZShzaWRlOiBJVGltZXBpY2tlclZhcmlhYmxlc1NpZGUpIHtcbiAgICBsZXQgc3RySG91cnM6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHNpZGUuc2VsZWN0ZWRIb3VyO1xuICAgIGxldCBzdHJNaW51dGU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHNpZGUuc2VsZWN0ZWRNaW51dGU7XG5cbiAgICBpZiAoKHNpZGUuc2VsZWN0ZWRIb3VyIHx8IDApIDwgMTApIHtcbiAgICAgIHN0ckhvdXJzID0gYDAke3NpZGUuc2VsZWN0ZWRIb3VyID8/IDB9YDtcbiAgICB9XG5cbiAgICBpZiAoKHNpZGUuc2VsZWN0ZWRNaW51dGUgfHwgMCkgPCAxMCkge1xuICAgICAgc3RyTWludXRlID0gYDAke3NpZGUuc2VsZWN0ZWRNaW51dGUgPz8gMH1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtzdHJIb3Vyc306JHtzdHJNaW51dGV9YDtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZWREaXNwbGF5VGltZUlucHV0KHNpZGU6IFNpZGVFbnVtLCB0aW1lVHlwZTogJ2hvdXInIHwgJ21pbnV0ZScpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZVR5cGUgPT09ICdob3VyJyA/IChzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSA6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpKSA6IChzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpIDogdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSk7XG5cbiAgICBpZiAoIXRpbWUpIHtcbiAgICAgIHJldHVybiAnMDAnO1xuICAgIH1cbiAgICBpZiAodGltZSA8IDEwKSB7XG4gICAgICByZXR1cm4gYDAke3RpbWV9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXIgdGVzdC1jbGFzc1wiPlxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyXCJcbiAgICAgIFtjbGFzcy5yaWdodF09XCJpc1NpbmdsZSgpXCJcbiAgICAgIFtjbGFzcy5sZWZ0XT1cIiFpc1NpbmdsZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1bNHB4XSBiZy1bI2ZmZmZmZl1cIj5cbiAgICAgICAgQGlmIChjYWxlbmRhclZhcmlhYmxlcygpOyBhcyBjYWxlbmRhclZhcmlhYmxlcykge1xuICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiN1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbnRoXCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKHNob3dEcm9wZG93bnNTZWxlY3QoKSAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuZHJvcGRvd25zPy4oKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIWZsZXggbWItWzEwcHhdIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTMvNCBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbXItWzhweF0nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpICsgMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie3dpZHRoQnlQYXJlbnQ6ZmFsc2UsaWdub3JlQXJyb3c6dHJ1ZSxwYWRkaW5nTGVmdEl0ZW06IHRydWUsIGNsYXNzSW5jbHVkZTogJyF3LVsxMzBweF0nLHBvc2l0aW9uOnsgbW9kZTonY2VudGVyJyxkaXN0YW5jZTowfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleXNEaXNhYmxlXT1cImRpc2FibGVNb250aCgpLmxlZnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1Nb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdE1vbnRoc0NvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJtb250aEh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnbW9udGgnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnbW9udGgnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg0bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8ubW9udGgoKSA/PyAtMV0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsxM3B4XSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucm90YXRlXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93biBbbGlzdE1heEl0ZW1TaG93XT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInt3aWR0aEJ5UGFyZW50OmZhbHNlLGlnbm9yZUFycm93OnRydWUscGFkZGluZ0xlZnRJdGVtOiB0cnVlLGNsYXNzSW5jbHVkZTogJyF3LVsxMTBweF0nLHBvc2l0aW9uOnttb2RlOidjZW50ZXInLGRpc3RhbmNlOjB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtWWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJsaXN0WWVhckhpZGRlbklucHV0U2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RMZWZ0WWVhckNvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJsZWZ0WWVhckh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ3llYXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICd5ZWFyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ3llYXInXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoXCIgWVlZWVwiKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnJvdGF0ZV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS80IGZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWluRGF0ZSB8fCAoY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1pbkRhdGU/LmlzQmVmb3JlKGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LmZpcnN0RGF5KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiaGFuZGxlckNsaWNrUHJldihzaWRlRW51bS5sZWZ0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBhYnNvbHV0ZSBsZWZ0LTAgdG9wLVstM3B4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCByb3RhdGUtWzE4MGRlZ10gdGV4dC1bIzZhNzM4M10gY3Vyc29yLXBvaW50ZXIgbGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoKCFjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWF4RGF0ZSB8fCBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWF4RGF0ZT8uaXNBZnRlcihjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5sYXN0RGF5KSkgJiYgaXNTaW5nbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVyQ2xpY2tOZXh0KHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1sLVsxMnB4XSBhYnNvbHV0ZSByaWdodC0wIHRvcC1bLTNweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgdGV4dC1bIzZhNzM4M10gY3Vyc29yLXBvaW50ZXIgbGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAaWYgKCFzaG93RHJvcGRvd25zU2VsZWN0KCkgfHwgIWNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5kcm9wZG93bnMpIHtcbiAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8ubW9udGgoKSA/PyAtMV0gfX1cbiAgICAgICAgICAgICAgICAgICAge3sgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/LmZvcm1hdChcIiBZWVlZXCIpIH19XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwid2Vlay1kYXlzXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoZGF5b2Z3ZWVrIG9mIGRhdGVPcHRpb25zKCkuZGF5c09mV2VlazsgdHJhY2sgZGF5b2Z3ZWVrKSB7XG4gICAgICAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg2bSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+e3sgZGF5b2Z3ZWVrIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiZHJwLWFuaW1hdGVcIj5cbiAgICAgICAgICAgICAgQGZvciAocm93IG9mIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxSb3dzPy4oKTsgdHJhY2sgcm93KSB7XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaC1bMzJweF1cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzPy5bcm93XT8uY2xhc3NMaXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbENvbHM/LigpOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cImNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpID09PSB0b2RheSgpLmRhdGUoKSAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ubW9udGgoKSA9PT0gdG9kYXkoKS5tb250aCgpICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy55ZWFyKCkgPT09IHRvZGF5KCkueWVhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNsYXNzZXM/Lltyb3ddPy5bY29sXVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJQaWNrZXJEYXRlKCRldmVudCwgc2lkZUVudW0ubGVmdCwgcm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVySG92ZXJEYXRlKCRldmVudCwgc2lkZUVudW0ubGVmdCwgcm93LCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiPnt7IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGNvbHVtbiBpdGVtcy1jZW50ZXIgcHQtWzEycHhdXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtWzRweF0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2U2ZThlZF1dPVwiIXRpbWVQaWNrZXJFcnJvcigpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2ZmNTQ1NF1dPVwidGltZVBpY2tlckVycm9yKClcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU9XCIhdy1bMzBweF0gIXAtMCAhYm9yZGVyLW5vbmUgIXRleHQtY2VudGVyIGxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiMjNcIlxuICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKVwiXG4gICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCAnbGVmdGhvdXInKVwiXG4gICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnaG91cicpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAnbGVmdGhvdXInKVwiXG4gICAgICAgICAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXJUaW1lKCRldmVudCwgJ2xlZnRob3VyJylcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oM3MgdGV4dC1bIzMzMzMzM11cIj46PC9zcGFuPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZT1cIiF3LVszMHB4XSAhcC0wICFib3JkZXItbm9uZSAhdGV4dC1jZW50ZXIgIWxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNTlcIlxuICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpXCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoIWlzU2luZ2xlKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyIHJpZ2h0IG1sLVsyNHB4XVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1bNHB4XSBiZy1bI2ZmZmZmZl1cIj5cbiAgICAgICAgICBAaWYgKGNhbGVuZGFyVmFyaWFibGVzKCkpIHtcbiAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiN1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibW9udGhcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93RHJvcGRvd25zU2VsZWN0KCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5sZWZ0KCkuZHJvcGRvd25zPy4oKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIhZmxleCBtYi1bMTBweF0gdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0zLzQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbXItWzhweF0nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie3dpZHRoQnlQYXJlbnQ6ZmFsc2UsaWdub3JlQXJyb3c6dHJ1ZSxwYWRkaW5nTGVmdEl0ZW06IHRydWUsY2xhc3NJbmNsdWRlOiAnIXctWzEzMHB4XScscG9zaXRpb246e21vZGU6J2NlbnRlcicsZGlzdGFuY2U6MH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlzRGlzYWJsZV09XCJkaXNhYmxlTW9udGgoKS5yaWdodCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1Nb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdE1vbnRoc0NvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwibGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cIm1vbnRoSHR0cERldGFpbENvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDRtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpICsgMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7d2lkdGhCeVBhcmVudDpmYWxzZSxpZ25vcmVBcnJvdzp0cnVlLHBhZGRpbmdMZWZ0SXRlbTogdHJ1ZSwgY2xhc3NJbmNsdWRlOiAnIXctWzExMHB4XScsICBwb3NpdGlvbjp7bW9kZTonY2VudGVyJywgZGlzdGFuY2U6MH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1ZZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwibGlzdFllYXJIaWRkZW5JbnB1dFNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RSaWdodFllYXJDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlUb1NlbGVjdGVkKCkueWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cInJpZ2h0WWVhckh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICd5ZWFyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTaG93TGlzdCk9XCJoYW5kbGVyU2hvd0xpc3REcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ3llYXInKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICd5ZWFyJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoXCJZWVlZXCIpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ3llYXInXSA/ICc5MGRlZyc6JzI3MGRlZydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvNCBmbGV4IGl0ZW1zLWNlbnRlciByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAhKCgobGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgICsxKSA9PT0gbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSAmJiAobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID09PSAxMikgJiYgbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCA9PT0gMSkmJiAobGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgPCBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpIHx8IGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiBsaXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoICYmICgobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICsgMSkgPCArbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYWJzb2x1dGUgbGVmdC0wIHRvcC1bLTNweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbGlja1ByZXYoc2lkZUVudW0ucmlnaHQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHJvdGF0ZS1bMTgwZGVnXSB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggJiYgbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCAmJiAobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID4gbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCkgJiYgbGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgJiYgbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyICYmIChsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA9PT0gbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyICkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLVsjZmZmZmZmXSB3LVsyMXB4XSBoLVsyMXB4XSBjdXJzb3Itbm9uZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVs1MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5tYXhEYXRlIHx8IChjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkubWF4RGF0ZT8uaXNBZnRlcihjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5sYXN0RGF5KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVyQ2xpY2tOZXh0KHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1sLVsxMnB4XSBhYnNvbHV0ZSByaWdodC0wIHRvcC1bLTNweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWyM2YTczODNdIGN1cnNvci1wb2ludGVyIGxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFzaG93RHJvcGRvd25zU2VsZWN0KCkgfHwgICFjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuZHJvcGRvd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8ubW9udGgoKSA/PyAtMV0gfX1cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KFwiWVlZWVwiKSB9fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwid2Vlay1kYXlzXCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChkYXlvZndlZWsgb2YgZGF0ZU9wdGlvbnMoKS5kYXlzT2ZXZWVrOyB0cmFjayBkYXlvZndlZWspIHtcbiAgICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg2bSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPnt7IGRheW9md2VlayB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgQGZvciAocm93IG9mIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxSb3dzPy4oKTsgdHJhY2sgcm93KSB7XG4gICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJoLVszMnB4XVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3Nlcz8uW3Jvd10/LmNsYXNzTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbENvbHM/LigpOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3Nlcz8uW3Jvd10/Lltjb2xdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSA9PT0gdG9kYXkoKS5kYXRlKCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/Lm1vbnRoKCkgPT09IHRvZGF5KCkubW9udGgoKSAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiZjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ueWVhcigpID09PSB0b2RheSgpLnllYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclBpY2tlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5yaWdodCwgcm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJIb3ZlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5yaWdodCwgcm93LCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcHQtWzEycHhdXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcm91bmRlZC1bNHB4XSBib3JkZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNlNmU4ZWRdXT1cIiF0aW1lUGlja2VyRXJyb3IoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2ZmNTQ1NF1dPVwidGltZVBpY2tlckVycm9yKClcIj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlPVwiIXctWzMwcHhdICFwLTAgIWJvcmRlci1ub25lICF0ZXh0LWNlbnRlciAhbGlicy11aS1mb250LWg0cyAhdGV4dC1bIzA3MTYzMV1cIlxuICAgICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJpbnRcIlxuICAgICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjIzXCJcbiAgICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFtmb2N1c1RpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAncmlnaHRob3VyJylcIlxuICAgICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCdyaWdodGhvdXInKVwiXG4gICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgJ3JpZ2h0aG91cicpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyVGltZSgkZXZlbnQsICdyaWdodGhvdXInKVwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDNzIHRleHQtWyMzMzMzMzNdXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlPVwiIXctWzMwcHhdICFwLTAgIWJvcmRlci1ub25lICF0ZXh0LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRzICF0ZXh0LVsjMDcxNjMxXVwiXG4gICAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW2VtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNTlcIlxuICAgICAgICAgICAgICAgICAgW21pblZhbHVlTnVtYmVyXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiMlwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKClcIlxuICAgICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCdyaWdodG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICA8L2Rpdj5cbiAgPGRpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgIEBpZiAoIWlzU2luZ2xlKCkgJiYgaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC1bOHB4XSBsaWJzLXVpLWZvbnQtaDdyIHRleHQtWyNmZjU0NTRdIGgtWzE0cHhdXCI+XG4gICAgICAgICAgQGlmICh0aW1lUGlja2VyRXJyb3IoKSkge1xuICAgICAgICAgICAgPHNwYW4+e3sgJ2kxOG5fZGF0ZV9jb21wYXJlX3N0YXJ0X2VuZF9tZXNzYWdlX2Vycm9yJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAoIXF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGggfHwgIWlzU2luZ2xlKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCIgZmxleCB3LWZ1bGwgcHQtWzE2cHhdIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICBAaWYgKCFpc1NpbmdsZSgpKSB7XG4gICAgICAgICAgICBAaWYgKCFlbmREYXRlKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtWyNjZGQwZDZdIGxpYnMtdWktZm9udC1oNnJcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBjb21wdXRlZERpc3BsYXlUaW1lTGVmdCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmaHlwaGVuO1xuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7IGNvbXB1dGVkRGlzcGxheVRpbWVSaWdodCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGVuZERhdGUoKSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bI2NkZDBkNl0gbGlicy11aS1mb250LWg2clwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7IGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICZoeXBoZW47XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgZW5kRGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7IGNvbXB1dGVkRGlzcGxheVRpbWVSaWdodCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gY2xhc3M9XCJtci1bMTJweF1cIlxuICAgICAgICAgICAgbGFiZWw9XCJpMThuX2NhbmNlbFwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uLXRoaXJkXCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tDYW5jZWwoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBsYWJlbD1cImkxOG5fc2VsZWN0XCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tBcHBseSgkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|