@hmcts/ccd-case-ui-toolkit 5.0.29-angular11-upgrade → 5.0.31-angular11-upgrade
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.
- package/bundles/hmcts-ccd-case-ui-toolkit.umd.js +12829 -9709
- package/bundles/hmcts-ccd-case-ui-toolkit.umd.js.map +1 -1
- package/bundles/hmcts-ccd-case-ui-toolkit.umd.min.js +1 -1
- package/bundles/hmcts-ccd-case-ui-toolkit.umd.min.js.map +1 -1
- package/esm2015/lib/app.config.js +1 -1
- package/esm2015/lib/components/banners/banners.module.js +13 -6
- package/esm2015/lib/components/banners/index.js +2 -1
- package/esm2015/lib/components/banners/notification-banner/domain/index.js +2 -0
- package/esm2015/lib/components/banners/notification-banner/domain/notification-banner-config.model.js +2 -0
- package/esm2015/lib/components/banners/notification-banner/enums/index.js +3 -0
- package/esm2015/lib/components/banners/notification-banner/enums/notification-banner-style.enum.js +8 -0
- package/esm2015/lib/components/banners/notification-banner/enums/notification-banner-type.enum.js +8 -0
- package/esm2015/lib/components/banners/notification-banner/index.js +4 -0
- package/esm2015/lib/components/banners/notification-banner/notification-banner.component.js +130 -0
- package/esm2015/lib/components/banners/notification-banner/notification-banner.module.js +19 -0
- package/esm2015/lib/shared/components/case-editor/case-edit-confirm/case-edit-confirm.component.js +2 -7
- package/esm2015/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.js +42 -31
- package/esm2015/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.js +157 -153
- package/esm2015/lib/shared/components/case-editor/case-editor.module.js +19 -16
- package/esm2015/lib/shared/components/case-list-filters/case-list-filters.component.js +2 -4
- package/esm2015/lib/shared/components/case-list-filters/case-list-filters.module.js +4 -1
- package/esm2015/lib/shared/components/case-viewer/case-challenged-access-request/case-challenged-access-request.component.js +2 -5
- package/esm2015/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.js +32 -17
- package/esm2015/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.js +197 -104
- package/esm2015/lib/shared/components/case-viewer/case-review-specific-access-request/case-review-specific-access-request.component.js +2 -4
- package/esm2015/lib/shared/components/case-viewer/case-specific-access-request/case-specific-access-request.component.js +2 -5
- package/esm2015/lib/shared/components/case-viewer/case-viewer.module.js +18 -10
- package/esm2015/lib/shared/components/case-viewer/printer/case-printer.component.js +2 -5
- package/esm2015/lib/shared/components/palette/address/write-address-field.component.js +2 -6
- package/esm2015/lib/shared/components/palette/base-field/field-read.component.js +2 -4
- package/esm2015/lib/shared/components/palette/base-field/field-write.component.js +5 -1
- package/esm2015/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.js +145 -0
- package/esm2015/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.js +97 -0
- package/esm2015/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.js +148 -0
- package/esm2015/lib/shared/components/palette/case-flag/components/index.js +9 -0
- package/esm2015/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.js +200 -0
- package/esm2015/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.js +295 -0
- package/esm2015/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.js +188 -0
- package/esm2015/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.js +251 -0
- package/esm2015/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.js +192 -0
- package/esm2015/lib/shared/components/palette/case-flag/domain/case-flag-state.model.js +2 -0
- package/esm2015/lib/shared/components/palette/case-flag/domain/case-flag.model.js +2 -0
- package/esm2015/lib/shared/components/palette/case-flag/domain/index.js +4 -0
- package/esm2015/lib/shared/components/palette/case-flag/domain/language.model.js +2 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.js +6 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.js +6 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.js +7 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/case-flag-summary-list-display-mode.enum.js +6 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.js +12 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/index.js +14 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/search-language-interpreter-error-message.enum.js +7 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/search-language-interpreter-step.enum.js +8 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.js +6 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/select-flag-location-error-message.enum.js +6 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.js +7 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.js +6 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.js +6 -0
- package/esm2015/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.js +14 -0
- package/esm2015/lib/shared/components/palette/case-flag/index.js +6 -0
- package/esm2015/lib/shared/components/palette/case-flag/read-case-flag-field.component.js +152 -0
- package/esm2015/lib/shared/components/palette/case-flag/write-case-flag-field.component.js +455 -0
- package/esm2015/lib/shared/components/palette/complex/read-complex-field.component.js +2 -6
- package/esm2015/lib/shared/components/palette/date/write-date-container-field.component.js +2 -6
- package/esm2015/lib/shared/components/palette/history/case-history-viewer-field.component.js +2 -3
- package/esm2015/lib/shared/components/palette/history/event-log/event-log.component.js +2 -5
- package/esm2015/lib/shared/components/palette/index.js +2 -1
- package/esm2015/lib/shared/components/palette/judicial-user/read-judicial-user-field.component.js +4 -4
- package/esm2015/lib/shared/components/palette/label/label-field.component.js +2 -4
- package/esm2015/lib/shared/components/palette/order-summary/read-order-summary-field.component.js +2 -5
- package/esm2015/lib/shared/components/palette/order-summary/read-order-summary-row.component.js +2 -3
- package/esm2015/lib/shared/components/palette/order-summary/write-order-summary-field.component.js +2 -3
- package/esm2015/lib/shared/components/palette/organisation/read-organisation-field.component.js +2 -5
- package/esm2015/lib/shared/components/palette/organisation/write-organisation-field.component.js +2 -6
- package/esm2015/lib/shared/components/palette/palette.module.js +69 -17
- package/esm2015/lib/shared/components/palette/palette.service.js +5 -1
- package/esm2015/lib/shared/components/search-result/search-result.component.js +45 -50
- package/esm2015/lib/shared/domain/case-flag/flag-type.model.js +13 -0
- package/esm2015/lib/shared/domain/case-flag/hmcts-service-detail.model.js +9 -0
- package/esm2015/lib/shared/domain/case-flag/index.js +3 -0
- package/esm2015/lib/shared/domain/case-view/case-view.model.js +1 -1
- package/esm2015/lib/shared/domain/definition/field-type-enum.model.js +1 -1
- package/esm2015/lib/shared/pipes/complex/ccd-read-fields-filter.pipe.js +2 -2
- package/esm2015/lib/shared/services/addresses/address-parser.js +6 -6
- package/esm2015/lib/shared/services/addresses/address-type.enum.js +7 -0
- package/esm2015/lib/shared/services/addresses/addresses.service.js +3 -5
- package/esm2015/lib/shared/services/case-flag/case-flag-refdata.service.js +75 -0
- package/esm2015/lib/shared/services/case-flag/index.js +3 -0
- package/esm2015/lib/shared/services/case-flag/refdata-case-flag-type.enum.js +6 -0
- package/esm2015/lib/shared/services/fields/fields.utils.js +220 -5
- package/esm2015/lib/shared/services/form/form-value.service.js +100 -73
- package/esm2015/lib/shared/services/index.js +2 -1
- package/fesm2015/hmcts-ccd-case-ui-toolkit.js +13996 -11169
- package/fesm2015/hmcts-ccd-case-ui-toolkit.js.map +1 -1
- package/lib/app.config.d.ts +2 -0
- package/lib/app.config.d.ts.map +1 -1
- package/lib/components/banners/banners.module.d.ts +2 -1
- package/lib/components/banners/banners.module.d.ts.map +1 -1
- package/lib/components/banners/index.d.ts +1 -0
- package/lib/components/banners/index.d.ts.map +1 -1
- package/lib/components/banners/notification-banner/domain/index.d.ts +2 -0
- package/lib/components/banners/notification-banner/domain/index.d.ts.map +1 -0
- package/lib/components/banners/notification-banner/domain/notification-banner-config.model.d.ts +13 -0
- package/lib/components/banners/notification-banner/domain/notification-banner-config.model.d.ts.map +1 -0
- package/lib/components/banners/notification-banner/enums/index.d.ts +3 -0
- package/lib/components/banners/notification-banner/enums/index.d.ts.map +1 -0
- package/lib/components/banners/notification-banner/enums/notification-banner-style.enum.d.ts +7 -0
- package/lib/components/banners/notification-banner/enums/notification-banner-style.enum.d.ts.map +1 -0
- package/lib/components/banners/notification-banner/enums/notification-banner-type.enum.d.ts +7 -0
- package/lib/components/banners/notification-banner/enums/notification-banner-type.enum.d.ts.map +1 -0
- package/lib/components/banners/notification-banner/index.d.ts +4 -0
- package/lib/components/banners/notification-banner/index.d.ts.map +1 -0
- package/lib/components/banners/notification-banner/notification-banner.component.d.ts +13 -0
- package/lib/components/banners/notification-banner/notification-banner.component.d.ts.map +1 -0
- package/lib/components/banners/notification-banner/notification-banner.module.d.ts +9 -0
- package/lib/components/banners/notification-banner/notification-banner.module.d.ts.map +1 -0
- package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts +11 -5
- package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
- package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts +14 -25
- package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts.map +1 -1
- package/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.d.ts +6 -10
- package/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.d.ts.map +1 -1
- package/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.d.ts +18 -4
- package/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.d.ts.map +1 -1
- package/lib/shared/components/case-viewer/case-viewer.module.d.ts.map +1 -1
- package/lib/shared/components/palette/base-field/field-read.component.d.ts.map +1 -1
- package/lib/shared/components/palette/base-field/field-write.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.d.ts +25 -0
- package/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.d.ts +20 -0
- package/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.d.ts +12 -0
- package/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/index.d.ts +9 -0
- package/lib/shared/components/palette/case-flag/components/index.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts +28 -0
- package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.d.ts +39 -0
- package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts +26 -0
- package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.d.ts +40 -0
- package/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.d.ts +26 -0
- package/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/domain/case-flag-state.model.d.ts +18 -0
- package/lib/shared/components/palette/case-flag/domain/case-flag-state.model.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/domain/case-flag.model.d.ts +47 -0
- package/lib/shared/components/palette/case-flag/domain/case-flag.model.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/domain/index.d.ts +4 -0
- package/lib/shared/components/palette/case-flag/domain/index.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/domain/language.model.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/domain/language.model.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.d.ts +6 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-summary-list-display-mode.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-summary-list-display-mode.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.d.ts +11 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/index.d.ts +14 -0
- package/lib/shared/components/palette/case-flag/enums/index.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/search-language-interpreter-error-message.enum.d.ts +6 -0
- package/lib/shared/components/palette/case-flag/enums/search-language-interpreter-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/search-language-interpreter-step.enum.d.ts +7 -0
- package/lib/shared/components/palette/case-flag/enums/search-language-interpreter-step.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/select-flag-location-error-message.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/select-flag-location-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.d.ts +6 -0
- package/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.d.ts +12 -0
- package/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/index.d.ts +6 -0
- package/lib/shared/components/palette/case-flag/index.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts +27 -0
- package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts +61 -0
- package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts.map +1 -0
- package/lib/shared/components/palette/index.d.ts +1 -0
- package/lib/shared/components/palette/index.d.ts.map +1 -1
- package/lib/shared/components/palette/judicial-user/read-judicial-user-field.component.d.ts +3 -3
- package/lib/shared/components/palette/judicial-user/read-judicial-user-field.component.d.ts.map +1 -1
- package/lib/shared/components/palette/palette.module.d.ts +94 -84
- package/lib/shared/components/palette/palette.module.d.ts.map +1 -1
- package/lib/shared/components/palette/palette.service.d.ts.map +1 -1
- package/lib/shared/domain/case-flag/flag-type.model.d.ts +21 -0
- package/lib/shared/domain/case-flag/flag-type.model.d.ts.map +1 -0
- package/lib/shared/domain/case-flag/hmcts-service-detail.model.d.ts +17 -0
- package/lib/shared/domain/case-flag/hmcts-service-detail.model.d.ts.map +1 -0
- package/lib/shared/domain/case-flag/index.d.ts +3 -0
- package/lib/shared/domain/case-flag/index.d.ts.map +1 -0
- package/lib/shared/domain/case-view/case-view.model.d.ts +2 -0
- package/lib/shared/domain/case-view/case-view.model.d.ts.map +1 -1
- package/lib/shared/domain/definition/field-type-enum.model.d.ts +1 -1
- package/lib/shared/domain/definition/field-type-enum.model.d.ts.map +1 -1
- package/lib/shared/pipes/complex/ccd-read-fields-filter.pipe.d.ts.map +1 -1
- package/lib/shared/services/addresses/address-type.enum.d.ts +6 -0
- package/lib/shared/services/addresses/address-type.enum.d.ts.map +1 -0
- package/lib/shared/services/addresses/addresses.service.d.ts +0 -3
- package/lib/shared/services/addresses/addresses.service.d.ts.map +1 -1
- package/lib/shared/services/case-flag/case-flag-refdata.service.d.ts +31 -0
- package/lib/shared/services/case-flag/case-flag-refdata.service.d.ts.map +1 -0
- package/lib/shared/services/case-flag/index.d.ts +3 -0
- package/lib/shared/services/case-flag/index.d.ts.map +1 -0
- package/lib/shared/services/case-flag/refdata-case-flag-type.enum.d.ts +5 -0
- package/lib/shared/services/case-flag/refdata-case-flag-type.enum.d.ts.map +1 -0
- package/lib/shared/services/fields/fields.utils.d.ts +41 -8
- package/lib/shared/services/fields/fields.utils.d.ts.map +1 -1
- package/lib/shared/services/form/form-value.service.d.ts +20 -19
- package/lib/shared/services/form/form-value.service.d.ts.map +1 -1
- package/lib/shared/services/index.d.ts +1 -0
- package/lib/shared/services/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/esm2015/lib/shared/components/case-editor/case-edit-page/case-edit-page-text.enum.js +0 -11
- package/lib/shared/components/case-editor/case-edit-page/case-edit-page-text.enum.d.ts +0 -10
- package/lib/shared/components/case-editor/case-edit-page/case-edit-page-text.enum.d.ts.map +0 -1
|
@@ -2,8 +2,9 @@ import { CurrencyPipe } from '@angular/common';
|
|
|
2
2
|
import { Injectable } from '@angular/core';
|
|
3
3
|
import { FormArray, FormControl, FormGroup } from '@angular/forms';
|
|
4
4
|
import { plainToClassFromExist } from 'class-transformer';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { CaseFlagStatus } from '../../components/palette/case-flag/enums/case-flag-status.enum';
|
|
6
|
+
import { DatePipe } from '../../components/palette/utils';
|
|
7
|
+
import { CaseField } from '../../domain';
|
|
7
8
|
import { FormatTranslatorService } from '../case-fields/format-translator.service';
|
|
8
9
|
import * as i0 from "@angular/core";
|
|
9
10
|
// @dynamic
|
|
@@ -82,6 +83,7 @@ export class FieldsUtils {
|
|
|
82
83
|
const objectRefs = [];
|
|
83
84
|
// Also test for numeric values, and length > 0 for non-numeric values because this covers both strings and arrays.
|
|
84
85
|
// Note: Deliberate use of non-equality (!=) operator for null check, to handle both null and undefined values.
|
|
86
|
+
// tslint:disable-next-line: triple-equals
|
|
85
87
|
const hasNonNullPrimitive = values.some(x => (x != null &&
|
|
86
88
|
((typeof x === 'object' && x.constructor === Object) || Array.isArray(x)
|
|
87
89
|
? !objectRefs.push(x)
|
|
@@ -201,6 +203,217 @@ export class FieldsUtils {
|
|
|
201
203
|
}
|
|
202
204
|
return output;
|
|
203
205
|
}
|
|
206
|
+
static isFlagsCaseField(caseField) {
|
|
207
|
+
if (!caseField) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return this.isFlagsFieldType(caseField.field_type);
|
|
211
|
+
}
|
|
212
|
+
static isFlagLauncherCaseField(caseField) {
|
|
213
|
+
if (!caseField) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
return caseField.field_type.type === 'FlagLauncher';
|
|
217
|
+
}
|
|
218
|
+
static isFlagsFieldType(fieldType) {
|
|
219
|
+
if (!fieldType) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
// Note: This implementation supports the dummy field type ID of "CaseFlag" for testing and the real field type
|
|
223
|
+
// ID of "Flags"
|
|
224
|
+
return (fieldType.type === 'Complex' && (fieldType.id === 'CaseFlag' || fieldType.id === 'Flags'));
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Extract flags data from a `CaseField` instance, recursing and iterating through sub-fields of a Complex field or
|
|
228
|
+
* each field in a Collection field.
|
|
229
|
+
*
|
|
230
|
+
* @param flags An array for accumulating extracted flags data and derived `FormGroup` paths
|
|
231
|
+
* @param caseField A `CaseField` instance from which to extract the flags data
|
|
232
|
+
* @param pathToFlagsFormGroup A (dot-delimited) string for concatenating the name of each control that forms the path
|
|
233
|
+
* to the `FormGroup` for the `Flags` instance
|
|
234
|
+
* @param topLevelCaseField The top-level `CaseField` that contains the value property. This is required because _only
|
|
235
|
+
* top-level_ `CaseField`s contain actual values and a reference needs to be maintained to such a field
|
|
236
|
+
* @param currentValue The current value object of a `CaseField` that is a sub-field of a non root-level Complex field.
|
|
237
|
+
* Required for mapping the `CaseField` value to a `Flags` object if it is a "Flags" `CaseField`. (For Complex types,
|
|
238
|
+
* only the _root-level_ `CaseField` contains a value property - all sub-fields, including any nested Complex fields,
|
|
239
|
+
* do *not* contain any values themselves.)
|
|
240
|
+
* @returns An array of `FlagsWithFormGroupPath`, each instance comprising a `Flags` object derived from a `CaseField`
|
|
241
|
+
* of type "Flags", and the dot-delimited path string to the corresponding `FormGroup`
|
|
242
|
+
*/
|
|
243
|
+
static extractFlagsDataFromCaseField(flags, caseField, pathToFlagsFormGroup, topLevelCaseField, currentValue) {
|
|
244
|
+
const fieldType = caseField.field_type;
|
|
245
|
+
switch (fieldType.type) {
|
|
246
|
+
case 'Complex':
|
|
247
|
+
// If the field is a Flags CaseField (these are implemented as Complex types), it can be mapped to a Flags
|
|
248
|
+
// object immediately
|
|
249
|
+
if (FieldsUtils.isFlagsCaseField(caseField)) {
|
|
250
|
+
// If the Flags CaseField has a value, it is a root-level Complex field; if it does not, it is a Flags
|
|
251
|
+
// CaseField that is a sub-field within another Complex field, so use the currentValue value (if any)
|
|
252
|
+
// instead. The exception to this is the "caseFlags" Flags CaseField, which will have an empty object value
|
|
253
|
+
// initially, because no party name is required
|
|
254
|
+
if (caseField.value && FieldsUtils.isNonEmptyObject(caseField.value) ||
|
|
255
|
+
caseField.id === this.caseLevelCaseFlagsFieldId) {
|
|
256
|
+
flags.push(this.mapCaseFieldToFlagsWithFormGroupPathObject(caseField, pathToFlagsFormGroup));
|
|
257
|
+
}
|
|
258
|
+
else if (currentValue && FieldsUtils.isNonEmptyObject(currentValue)) {
|
|
259
|
+
pathToFlagsFormGroup += `.${caseField.id}`;
|
|
260
|
+
flags.push(this.mapValueToFlagsWithFormGroupPathObject(caseField.id, currentValue, pathToFlagsFormGroup, topLevelCaseField));
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else if (fieldType.complex_fields) {
|
|
264
|
+
const value = caseField.value ? caseField.value : currentValue;
|
|
265
|
+
if (value && FieldsUtils.isNonEmptyObject(value)) {
|
|
266
|
+
flags = fieldType.complex_fields.reduce((flagsOfComplexField, subField) => {
|
|
267
|
+
return this.extractFlagsDataFromCaseField(flagsOfComplexField, subField, pathToFlagsFormGroup, topLevelCaseField, value[subField.id]);
|
|
268
|
+
}, flags);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
break;
|
|
272
|
+
// For a Collection field, the values are stored directly as key-value pairs in the CaseField's value property
|
|
273
|
+
// as an array, unless the collection is a sub-field of a Complex type - sub-fields never contain values
|
|
274
|
+
case 'Collection':
|
|
275
|
+
// If this is a collection of Flags CaseFields, these can be mapped to Flags objects immediately
|
|
276
|
+
if (FieldsUtils.isFlagsFieldType(fieldType.collection_field_type)) {
|
|
277
|
+
// If the Collection CaseField has a value (an array), it is a root-level Collection field; if it does not,
|
|
278
|
+
// it is a Collection CaseField that is a sub-field within a Complex field, so use the currentValue value
|
|
279
|
+
// (if any) instead
|
|
280
|
+
const pathFragment = pathToFlagsFormGroup += '.index.value';
|
|
281
|
+
if (caseField.value) {
|
|
282
|
+
caseField.value.forEach((item, index) => {
|
|
283
|
+
// At each iteration, replace the "index" placeholder with the actual index
|
|
284
|
+
pathToFlagsFormGroup = pathFragment.replace('index', index.toString(10));
|
|
285
|
+
flags.push(this.mapValueToFlagsWithFormGroupPathObject(item.id, item.value, pathToFlagsFormGroup, caseField));
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
else if (currentValue) {
|
|
289
|
+
currentValue.forEach((item, index) => {
|
|
290
|
+
pathToFlagsFormGroup = pathFragment.replace('index', index.toString(10));
|
|
291
|
+
flags.push(this.mapValueToFlagsWithFormGroupPathObject(item.id, item.value, pathToFlagsFormGroup, topLevelCaseField));
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else if (fieldType.collection_field_type.type === 'Complex' && fieldType.collection_field_type.complex_fields) {
|
|
296
|
+
if (caseField.value) {
|
|
297
|
+
// Perform a reduction over each Complex field's sub-fields (similar to what is done above for non-Flags
|
|
298
|
+
// Complex fields)
|
|
299
|
+
// (Cannot just call this function recursively for each Complex field in the collection because the CaseField
|
|
300
|
+
// for each one is not part of the collection)
|
|
301
|
+
const pathFragment = pathToFlagsFormGroup += '.index.value';
|
|
302
|
+
caseField.value.forEach((item, index) => {
|
|
303
|
+
// At each iteration, replace the "index" placeholder with the actual index
|
|
304
|
+
pathToFlagsFormGroup = pathFragment.replace('index', index.toString(10));
|
|
305
|
+
flags = fieldType.collection_field_type.complex_fields.reduce((flagsOfComplexField, subField) => {
|
|
306
|
+
return this.extractFlagsDataFromCaseField(flagsOfComplexField, subField, pathToFlagsFormGroup, topLevelCaseField, item.value[subField.id]);
|
|
307
|
+
}, flags);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
break;
|
|
312
|
+
default:
|
|
313
|
+
// Ignore all other field types
|
|
314
|
+
}
|
|
315
|
+
return flags;
|
|
316
|
+
}
|
|
317
|
+
static mapCaseFieldToFlagsWithFormGroupPathObject(caseField, pathToFlagsFormGroup) {
|
|
318
|
+
return this.mapValueToFlagsWithFormGroupPathObject(caseField.id, caseField.value, pathToFlagsFormGroup, caseField);
|
|
319
|
+
}
|
|
320
|
+
static mapValueToFlagsWithFormGroupPathObject(id, value, pathToFlagsFormGroup, caseField) {
|
|
321
|
+
return {
|
|
322
|
+
flags: {
|
|
323
|
+
flagsCaseFieldId: id,
|
|
324
|
+
partyName: value ? value['partyName'] : null,
|
|
325
|
+
roleOnCase: value ? value['roleOnCase'] : null,
|
|
326
|
+
details: value && value['details'] && value['details'].length > 0
|
|
327
|
+
? value['details'].map(detail => {
|
|
328
|
+
return Object.assign({}, ...Object.keys(detail.value).map(k => {
|
|
329
|
+
// The id property set below will be null for a new case flag, and a unique id returned from CCD when
|
|
330
|
+
// updating an existing flag
|
|
331
|
+
switch (k) {
|
|
332
|
+
// These two fields are date-time fields
|
|
333
|
+
case 'dateTimeModified':
|
|
334
|
+
case 'dateTimeCreated':
|
|
335
|
+
return { [k]: detail.value[k] ? new Date(detail.value[k]) : null, id: detail.id };
|
|
336
|
+
// This field is a "yes/no" field
|
|
337
|
+
case 'hearingRelevant':
|
|
338
|
+
return detail.value[k].toUpperCase() === 'YES' ? { [k]: true, id: detail.id } : { [k]: false, id: detail.id };
|
|
339
|
+
default:
|
|
340
|
+
return { [k]: detail.value[k], id: detail.id };
|
|
341
|
+
}
|
|
342
|
+
}));
|
|
343
|
+
})
|
|
344
|
+
: null
|
|
345
|
+
},
|
|
346
|
+
pathToFlagsFormGroup,
|
|
347
|
+
caseField
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Count active flags in a `CaseField` instance, recursing and iterating through sub-fields of a Complex field or each
|
|
352
|
+
* field in a Collection field.
|
|
353
|
+
*
|
|
354
|
+
* @param activeCount An accumulation of the total number of active flags
|
|
355
|
+
* @param caseField A `CaseField` instance for which to count the active flags
|
|
356
|
+
* @param currentValue The current value object of a `CaseField` that is a sub-field of a non root-level Complex field.
|
|
357
|
+
* (For Complex types, only the _root-level_ `CaseField` contains a value property - all sub-fields, including any
|
|
358
|
+
* nested Complex fields, do *not* contain any values themselves.)
|
|
359
|
+
* @returns The count of active flags
|
|
360
|
+
*/
|
|
361
|
+
static countActiveFlagsInCaseField(activeCount, caseField, currentValue) {
|
|
362
|
+
const fieldType = caseField.field_type;
|
|
363
|
+
switch (fieldType.type) {
|
|
364
|
+
case 'Complex':
|
|
365
|
+
if (FieldsUtils.isFlagsCaseField(caseField)) {
|
|
366
|
+
// If the Flags CaseField has a value, it is a root-level Complex field; if it does not, it is a Flags
|
|
367
|
+
// CaseField that is a sub-field within another Complex field, so use the currentValue value (if any) instead
|
|
368
|
+
const value = caseField.value ? caseField.value : currentValue;
|
|
369
|
+
if (value && FieldsUtils.isNonEmptyObject(value) && value.details) {
|
|
370
|
+
activeCount = value.details.reduce((count, detail) => detail.value.status === CaseFlagStatus.ACTIVE ? count + 1 : count, activeCount);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
else if (fieldType.complex_fields) {
|
|
374
|
+
const value = caseField.value ? caseField.value : currentValue;
|
|
375
|
+
if (value && FieldsUtils.isNonEmptyObject(value)) {
|
|
376
|
+
activeCount = fieldType.complex_fields.reduce((activeFlagsCountOfComplexField, subField) => {
|
|
377
|
+
return this.countActiveFlagsInCaseField(activeFlagsCountOfComplexField, subField, value[subField.id]);
|
|
378
|
+
}, activeCount);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
break;
|
|
382
|
+
// For a Collection field, the values are stored directly as key-value pairs in the CaseField's value property
|
|
383
|
+
// as an array, unless the collection is a sub-field of a Complex type - sub-fields never contain values
|
|
384
|
+
case 'Collection':
|
|
385
|
+
if (FieldsUtils.isFlagsFieldType(fieldType.collection_field_type)) {
|
|
386
|
+
// If the Collection CaseField has a value (an array), it is a root-level Collection field; if it does not,
|
|
387
|
+
// it is a Collection CaseField that is a sub-field within a Complex field, so use the currentValue value
|
|
388
|
+
// (if any) instead
|
|
389
|
+
const value = caseField.value ? caseField.value : currentValue;
|
|
390
|
+
if (value) {
|
|
391
|
+
value.forEach((item) => {
|
|
392
|
+
if (item.value['details']) {
|
|
393
|
+
activeCount = item.value['details'].reduce((count, detail) => detail.value.status === CaseFlagStatus.ACTIVE ? count + 1 : count, activeCount);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else if (fieldType.collection_field_type.type === 'Complex' && fieldType.collection_field_type.complex_fields) {
|
|
399
|
+
if (caseField.value) {
|
|
400
|
+
// Perform a reduction over each Complex field's sub-fields (similar to what is done above for non-Flags
|
|
401
|
+
// Complex fields)
|
|
402
|
+
// (Cannot just call this function recursively for each Complex field in the collection because the CaseField
|
|
403
|
+
// for each one is not part of the collection)
|
|
404
|
+
caseField.value.forEach((item) => {
|
|
405
|
+
activeCount = fieldType.collection_field_type.complex_fields.reduce((activeFlagsCountOfComplexField, subField) => {
|
|
406
|
+
return this.countActiveFlagsInCaseField(activeFlagsCountOfComplexField, subField, item.value[subField.id]);
|
|
407
|
+
}, activeCount);
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
break;
|
|
412
|
+
default:
|
|
413
|
+
// Ignore all other field types
|
|
414
|
+
}
|
|
415
|
+
return activeCount;
|
|
416
|
+
}
|
|
204
417
|
buildCanShowPredicate(eventTrigger, form) {
|
|
205
418
|
const currentState = this.getCurrentEventState(eventTrigger, form);
|
|
206
419
|
return (page) => {
|
|
@@ -241,14 +454,15 @@ export class FieldsUtils {
|
|
|
241
454
|
return result;
|
|
242
455
|
}
|
|
243
456
|
}
|
|
457
|
+
FieldsUtils.caseLevelCaseFlagsFieldId = 'caseFlags';
|
|
458
|
+
FieldsUtils.currencyPipe = new CurrencyPipe('en-GB');
|
|
459
|
+
FieldsUtils.datePipe = new DatePipe(new FormatTranslatorService());
|
|
244
460
|
// EUI-4244. 3 dashes instead of 1 to make this less likely to clash with a real field.
|
|
245
461
|
FieldsUtils.LABEL_SUFFIX = '---LABEL';
|
|
246
462
|
// Handling of Dynamic Lists in Complex Types
|
|
247
463
|
FieldsUtils.SERVER_RESPONSE_FIELD_TYPE_COLLECTION = 'Collection';
|
|
248
464
|
FieldsUtils.SERVER_RESPONSE_FIELD_TYPE_COMPLEX = 'Complex';
|
|
249
465
|
FieldsUtils.SERVER_RESPONSE_FIELD_TYPE_DYNAMIC_LIST_TYPE = ['DynamicList', 'DynamicRadioList'];
|
|
250
|
-
FieldsUtils.currencyPipe = new CurrencyPipe('en-GB');
|
|
251
|
-
FieldsUtils.datePipe = new DatePipe(new FormatTranslatorService());
|
|
252
466
|
FieldsUtils.DEFAULT_MERGE_FUNCTION = function mergeFunction(field, result) {
|
|
253
467
|
if (!result.hasOwnProperty(field.id)) {
|
|
254
468
|
result[field.id] = field.value;
|
|
@@ -258,6 +472,7 @@ FieldsUtils.LABEL_MERGE_FUNCTION = function mergeFunction(field, result) {
|
|
|
258
472
|
if (!result.hasOwnProperty(field.id)) {
|
|
259
473
|
result[field.id] = field.value;
|
|
260
474
|
}
|
|
475
|
+
// tslint:disable-next-line: switch-default
|
|
261
476
|
switch (field.field_type.type) {
|
|
262
477
|
case 'FixedList':
|
|
263
478
|
case 'FixedRadioList': {
|
|
@@ -331,4 +546,4 @@ FieldsUtils.ɵprov = i0.ɵɵdefineInjectable({ token: FieldsUtils, factory: Fiel
|
|
|
331
546
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FieldsUtils, [{
|
|
332
547
|
type: Injectable
|
|
333
548
|
}], null, null); })();
|
|
334
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9maWVsZHMvZmllbGRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFJcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBS3JFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOztBQUVuRixXQUFXO0FBRVgsTUFBTSxPQUFPLFdBQVc7SUFXZixNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBUTtRQUN2QyxJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksU0FBUyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUF1QjtRQUMvQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQs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eUJBQ1A7cUJBQ0Y7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUNELE1BQU07U0FDUDtLQUNGO0FBQ0gsQ0FBQyxDQUFDO3NFQTdOUyxXQUFXO21EQUFYLFdBQVcsV0FBWCxXQUFXO3VGQUFYLFdBQVc7Y0FEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHBsYWluVG9DbGFzc0Zyb21FeGlzdCB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcblxuaW1wb3J0IHsgV2l6YXJkUGFnZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY2FzZS1lZGl0b3IvZG9tYWluL3dpemFyZC1wYWdlLm1vZGVsJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL2Jhc2UtZmllbGQvYWJzdHJhY3QtZm9ybS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvdXRpbHMvZGF0ZS5waXBlJztcbmltcG9ydCB7IENhc2VFdmVudFRyaWdnZXIgfSBmcm9tICcuLi8uLi9kb21haW4vY2FzZS12aWV3L2Nhc2UtZXZlbnQtdHJpZ2dlci5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlVGFiIH0gZnJvbSAnLi4vLi4vZG9tYWluL2Nhc2Utdmlldy9jYXNlLXRhYi5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlVmlldyB9IGZyb20gJy4uLy4uL2RvbWFpbi9jYXNlLXZpZXcvY2FzZS12aWV3Lm1vZGVsJztcbmltcG9ydCB7IENhc2VGaWVsZCB9IGZyb20gJy4uLy4uL2RvbWFpbi9kZWZpbml0aW9uL2Nhc2UtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgRmllbGRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2RvbWFpbi9kZWZpbml0aW9uL2ZpZWxkLXR5cGUtZW51bS5tb2RlbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9kb21haW4vZGVmaW5pdGlvbi9maWVsZC10eXBlLm1vZGVsJztcbmltcG9ydCB7IEZpeGVkTGlzdEl0ZW0gfSBmcm9tICcuLi8uLi9kb21haW4vZGVmaW5pdGlvbi9maXhlZC1saXN0LWl0ZW0ubW9kZWwnO1xuaW1wb3J0IHsgUHJlZGljYXRlIH0gZnJvbSAnLi4vLi4vZG9tYWluL3ByZWRpY2F0ZS5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtYXRUcmFuc2xhdG9yU2VydmljZSB9IGZyb20gJy4uL2Nhc2UtZmllbGRzL2Zvcm1hdC10cmFuc2xhdG9yLnNlcnZpY2UnO1xuXG4vLyBAZHluYW1pY1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpZWxkc1V0aWxzIHtcbiAgLy8gRVVJLTQyNDQuIDMgZGFzaGVzIGluc3RlYWQgb2YgMSB0byBtYWtlIHRoaXMgbGVzcyBsaWtlbHkgdG8gY2xhc2ggd2l0aCBhIHJlYWwgZmllbGQuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTEFCRUxfU1VGRklYID0gJy0tLUxBQkVMJztcbiAgLy8gSGFuZGxpbmcgb2YgRHluYW1pYyBMaXN0cyBpbiBDb21wbGV4IFR5cGVzXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfQ09MTEVDVElPTiA9ICdDb2xsZWN0aW9uJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT01QTEVYID0gJ0NvbXBsZXgnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0RZTkFNSUNfTElTVF9UWVBFOiBGaWVsZFR5cGVFbnVtW10gPSBbJ0R5bmFtaWNMaXN0JywgJ0R5bmFtaWNSYWRpb0xpc3QnXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSA9IG5ldyBDdXJyZW5jeVBpcGUoJ2VuLUdCJyk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRhdGVQaXBlOiBEYXRlUGlwZSA9IG5ldyBEYXRlUGlwZShuZXcgRm9ybWF0VHJhbnNsYXRvclNlcnZpY2UoKSk7XG5cbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VG9DYXNlRmllbGQob2JqOiBhbnkpOiBDYXNlRmllbGQge1xuICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENhc2VGaWVsZCkpIHtcbiAgICAgIHJldHVybiBwbGFpblRvQ2xhc3NGcm9tRXhpc3QobmV3IENhc2VGaWVsZCgpLCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1ZhbHVlc01hcChjYXNlRmllbGRzOiBDYXNlRmllbGRbXSk6IGFueSB7XG4gICAgY29uc3QgdmFsdWVNYXAgPSB7fTtcbiAgICBjYXNlRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgdmFsdWVNYXBbZmllbGQuaWRdID0gRmllbGRzVXRpbHMucHJlcGFyZVZhbHVlKGZpZWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVNYXA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFR5cGUoZWxlbTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsZW0pLnNsaWNlKDgsIC0xKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNPYmplY3QoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbGVtID09PSAnb2JqZWN0JyAmJiBlbGVtICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc05vbkVtcHR5T2JqZWN0KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT2JqZWN0KGVsZW0pICYmIE9iamVjdC5rZXlzKGVsZW0pLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheShlbGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlbGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXJlQ29sbGVjdGlvblZhbHVlc1NpbXBsZUZpZWxkcyhmaWVsZFZhbHVlOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc09iamVjdChmaWVsZFZhbHVlWzBdWyd2YWx1ZSddKSAmJiAhQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlWzBdWyd2YWx1ZSddKSAmJiBmaWVsZFZhbHVlWzBdWyd2YWx1ZSddICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbk9mU2ltcGxlVHlwZXMoZmllbGRWYWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb2xsZWN0aW9uKGZpZWxkVmFsdWUpICYmIHRoaXMuYXJlQ29sbGVjdGlvblZhbHVlc1NpbXBsZUZpZWxkcyhmaWVsZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNNdWx0aVNlbGVjdFZhbHVlKGZvcm06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTm9uRW1wdHlBcnJheShmb3JtKSAmJiAhdGhpcy5pc0NvbGxlY3Rpb25XaXRoVmFsdWUoZm9ybSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTm9uRW1wdHlBcnJheShwYWdlRm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFnZUZvcm1GaWVsZHMpICYmIHBhZ2VGb3JtRmllbGRzWzBdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbihwYWdlRm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNOb25FbXB0eUFycmF5KHBhZ2VGb3JtRmllbGRzKSAmJiB0aGlzLmlzQ29sbGVjdGlvbldpdGhWYWx1ZShwYWdlRm9ybUZpZWxkcyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbldpdGhWYWx1ZShwYWdlRm9ybUZpZWxkczogYW55W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGFnZUZvcm1GaWVsZHNbMF1bJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2xvbmVPYmplY3Qob2JqOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuICB9XG5cbiAgLy8gdGVtcG9yYXJ5IGZ1bmN0aW9uIHVudGlsIHRoaXMgY2FuIGJlIG1vdmVkIHRvIENhc2VWaWV3IGNsYXNzIChSRE0tMjY4MSlcbiAgcHVibGljIHN0YXRpYyBnZXRDYXNlRmllbGRzKGNhc2VWaWV3OiBDYXNlVmlldyk6IENhc2VGaWVsZFtdIHtcbiAgICBjb25zdCBjYXNlRGF0YUZpZWxkczogQ2FzZUZpZWxkW10gPSBjYXNlVmlldy50YWJzLnJlZHVjZSgoYWNjOiBDYXNlRmllbGRbXSwgdGFiOiBDYXNlVGFiKSA9PiB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdCh0YWIuZmllbGRzKTtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBtZXRhZGF0YUZpZWxkczogQ2FzZUZpZWxkW10gPSBjYXNlVmlldy5tZXRhZGF0YUZpZWxkcztcbiAgICByZXR1cm4gbWV0YWRhdGFGaWVsZHMuY29uY2F0KGNhc2VEYXRhRmllbGRzLmZpbHRlcigoY2FzZUZpZWxkOiBDYXNlRmllbGQpID0+IHtcbiAgICAgIHJldHVybiBtZXRhZGF0YUZpZWxkcy5maW5kSW5kZXgobWV0YWRhdGFGaWVsZCA9PiBtZXRhZGF0YUZpZWxkLmlkID09PSBjYXNlRmllbGQuaWQpIDwgMDtcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFkZENhc2VGaWVsZEFuZENvbXBvbmVudFJlZmVyZW5jZXMgKGM6IEFic3RyYWN0Q29udHJvbCwgY2Y6IENhc2VGaWVsZCwgY29tcDogQWJzdHJhY3RGb3JtRmllbGRDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjWydjYXNlRmllbGQnXSA9IGNmO1xuICAgIGNbJ2NvbXBvbmVudCddID0gY29tcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmUgY2hlY2sgb2YgYW4gYXJyYXkgb3Igb2JqZWN0IGFuZCBpdHMgZGVzY2VuZGFudHMgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbnkgbm9uLWVtcHR5IHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdCBUaGUgYXJyYXkgb3Igb2JqZWN0IHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXkgb3Igb2JqZWN0IChvciBhIGRlc2NlbmRhbnQpIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBub24tZW1wdHkgdmFsdWU7IGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zTm9uRW1wdHlWYWx1ZXMob2JqZWN0OiBvYmplY3QpOiBib29sZWFuIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLm1hcChrZXkgPT4gb2JqZWN0W2tleV0pO1xuICAgIGNvbnN0IG9iamVjdFJlZnMgPSBbXTtcbiAgICAvLyBBbHNvIHRlc3QgZm9yIG51bWVyaWMgdmFsdWVzLCBhbmQgbGVuZ3RoID4gMCBmb3Igbm9uLW51bWVyaWMgdmFsdWVzIGJlY2F1c2UgdGhpcyBjb3ZlcnMgYm90aCBzdHJpbmdzIGFuZCBhcnJheXMuXG4gICAgLy8gTm90ZTogRGVsaWJlcmF0ZSB1c2Ugb2Ygbm9uLWVxdWFsaXR5ICghPSkgb3BlcmF0b3IgZm9yIG51bGwgY2hlY2ssIHRvIGhhbmRsZSBib3RoIG51bGwgYW5kIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgY29uc3QgaGFzTm9uTnVsbFByaW1pdGl2ZSA9IHZhbHVlcy5zb21lKHggPT4gKHggIT0gbnVsbCAmJlxuICAgICAgKCh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB8fCBBcnJheS5pc0FycmF5KHgpXG4gICAgICAgID8gIW9iamVjdFJlZnMucHVzaCh4KVxuICAgICAgICA6IHR5cGVvZiB4ID09PSAnbnVtYmVyJyB8fCB4Lmxlbmd0aCA+IDApXG4gICAgKSk7XG4gICAgcmV0dXJuICFoYXNOb25OdWxsUHJpbWl0aXZlID8gb2JqZWN0UmVmcy5zb21lKHkgPT4gdGhpcy5jb250YWluc05vbkVtcHR5VmFsdWVzKHkpKSA6IGhhc05vbk51bGxQcmltaXRpdmU7XG4gIH1cblxuICAvKipcbiAgICogaGFuZGxlTmVzdGVkRHluYW1pY0xpc3RzKClcbiAgICogUmVhc3NpZ25zIGxpc3RfaXRlbSBhbmQgdmFsdWUgZGF0YSB0byBEeW5hbWljTGlzdCBjaGlsZHJlblxuICAgKiBkb3duIHRoZSB0cmVlLiBTZXJ2ZXIgcmVzcG9uc2UgcmV0dXJucyBkYXRhIG9ubHkgaW5cbiAgICogdGhlIGB2YWx1ZWAgb2JqZWN0IG9mIHBhcmVudCBjb21wbGV4IHR5cGVcbiAgICpcbiAgICogRVVJLTI1MzAgRHluYW1pYyBMaXN0cyBmb3IgRWxlbWVudHMgaW4gYSBDb21wbGV4IFR5cGVcbiAgICpcbiAgICogQHBhcmFtIGpzb25Cb2R5IC0geyBjYXNlX2ZpZWxkczogWyBDYXNlRmllbGQsIENhc2VGaWVsZCBdIH1cbiAgICovXG4gICBwdWJsaWMgc3RhdGljIGhhbmRsZU5lc3RlZER5bmFtaWNMaXN0cyhqc29uQm9keTogeyBjYXNlX2ZpZWxkczogQ2FzZUZpZWxkW10gfSk6IGFueSB7XG5cbiAgICBpZiAoanNvbkJvZHkuY2FzZV9maWVsZHMpIHtcbiAgICAgIGpzb25Cb2R5LmNhc2VfZmllbGRzLmZvckVhY2goY2FzZUZpZWxkID0+IHtcbiAgICAgICAgaWYgKGNhc2VGaWVsZC5maWVsZF90eXBlKSB7XG4gICAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oY2FzZUZpZWxkLCBjYXNlRmllbGQuZmllbGRfdHlwZSwgY2FzZUZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb25Cb2R5O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcHJlcGFyZVZhbHVlKGZpZWxkOiBDYXNlRmllbGQpOiBhbnkge1xuICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgcmV0dXJuIGZpZWxkLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZmllbGQuaXNDb21wbGV4KCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlTWFwID0ge307XG4gICAgICBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmZvckVhY2goY29tcGxleEZpZWxkID0+IHtcbiAgICAgICAgdmFsdWVNYXBbY29tcGxleEZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLnByZXBhcmVWYWx1ZShjb21wbGV4RmllbGQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWVNYXA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NRVJHRV9GVU5DVElPTiA9IGZ1bmN0aW9uIG1lcmdlRnVuY3Rpb24oZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXJlc3VsdC5oYXNPd25Qcm9wZXJ0eShmaWVsZC5pZCkpIHtcbiAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBmaWVsZC52YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTEFCRUxfTUVSR0VfRlVOQ1RJT04gPSBmdW5jdGlvbiBtZXJnZUZ1bmN0aW9uKGZpZWxkOiBDYXNlRmllbGQsIHJlc3VsdDogb2JqZWN0KTogdm9pZCB7XG4gICAgaWYgKCFyZXN1bHQuaGFzT3duUHJvcGVydHkoZmllbGQuaWQpKSB7XG4gICAgICByZXN1bHRbZmllbGQuaWRdID0gZmllbGQudmFsdWU7XG4gICAgfVxuICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdGaXhlZExpc3QnOlxuICAgICAgY2FzZSAnRml4ZWRSYWRpb0xpc3QnOiB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQsIHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ011bHRpU2VsZWN0TGlzdCc6IHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHJlc3VsdFtmaWVsZC5pZF0gfHwgW107XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZCArIEZpZWxkc1V0aWxzLkxBQkVMX1NVRkZJWF0gPSBbXTtcbiAgICAgICAgZmllbGRWYWx1ZS5mb3JFYWNoKChjb2RlOiBhbnksIGlkeDogYW55KSA9PiB7XG4gICAgICAgICAgcmVzdWx0W2ZpZWxkLmlkICsgRmllbGRzVXRpbHMuTEFCRUxfU1VGRklYXVtpZHhdID0gRmllbGRzVXRpbHMuZ2V0Rml4ZWRMaXN0TGFiZWxCeUNvZGVPckVtcHR5KGZpZWxkLCBjb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTGFiZWwnOiB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRMYWJlbChmaWVsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTW9uZXlHQlAnOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRNb25leUdCUChmaWVsZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdEYXRlJzoge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gKHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0RGF0ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdDb21wbGV4Jzoge1xuICAgICAgICBpZiAocmVzdWx0W2ZpZWxkLmlkXSAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKChmOiBDYXNlRmllbGQpID0+IHtcbiAgICAgICAgICAgIGlmIChbJ0NvbGxlY3Rpb24nLCAnQ29tcGxleCcsICdNdWx0aVNlbGVjdExpc3QnXS5pbmRleE9mKGYuZmllbGRfdHlwZS50eXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKGYsIHJlc3VsdFtmaWVsZC5pZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQ29sbGVjdGlvbic6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIGlmIChlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ01vbmV5R0JQJzoge1xuICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSBGaWVsZHNVdGlscy5nZXRNb25leUdCUChlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdEYXRlJzoge1xuICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSBGaWVsZHNVdGlscy5nZXREYXRlKGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0NvbXBsZXgnOiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKChmOiBDYXNlRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFsnQ29sbGVjdGlvbicsICdDb21wbGV4JywgJ011bHRpU2VsZWN0TGlzdCddLmluZGV4T2YoZi5maWVsZF90eXBlLnR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTihmLCBlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgYE1vbmV5R0JQYCB2YWx1ZSB0byBpbmNsdWRlIGN1cnJlbmN5IHVuaXRzLlxuICAgKiBAcGFyYW0gZmllbGRWYWx1ZSBUaGUgQ3VycmVuY3lQaXBlIGV4cGVjdHMgYW4gYGFueWAgcGFyYW1ldGVyIHNvIHRoaXMgbXVzdCBhbHNvIGJlIGBhbnlgLFxuICAgKiBidXQgaXQgc2hvdWxkIGJlIFwibnVtYmVyLWxpa2VcIiAoZS5nLiwgJzEyMzQnKVxuICAgKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBzdHJpbmcgKGUuZy4sIMKjMTIuMzQpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRNb25leUdCUChmaWVsZFZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZFZhbHVlID8gRmllbGRzVXRpbHMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShmaWVsZFZhbHVlIC8gMTAwLCAnR0JQJywgJ3N5bWJvbCcpIDogZmllbGRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExhYmVsKGZpZWxkVmFsdWU6IENhc2VGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWUgPyBmaWVsZFZhbHVlLmxhYmVsIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXREYXRlKGZpZWxkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZvcm1hdCBzcGVjaWZpZWQgaGVyZSB3YXNuJ3QgcHJldmlvdXNseSB3b3JraW5nIGFuZCBsb3RzIG9mIHRlc3RzIGRlcGVuZCBvbiBpdCBub3Qgd29ya2luZ1xuICAgICAgLy8gTm93IHRoYXQgZm9ybWF0cyB3b3JrIGNvcnJlY3RseSBtYW55IHRlc3Qgd291bGQgYnJlYWsgLSBhbmQgdGhpcyBjb3VsZCBhZmZlY3Qgc2VydmljZXMgd2hpY2ggbWF5IGRlcGVuZCBvblxuICAgICAgLy8gdGhlIG9yZ2luYWwgYmVoYXZpb3VyIG9mIHJldHVybmluZyBkYXRlcyBpbiBcImQgTU1NIHl5eXlcIlxuICAgICAgLy8gTm90ZSAtIHJlcGxhY2VkICdkJyB3aXRoICdEJyBhcyBkYXRlcGlwZSB1c2luZyBtb21lbnQgdG8gYXZvaWQgdGltZXpvbmUgZGlzY3JlcGFuY2llc1xuICAgICAgcmV0dXJuIEZpZWxkc1V0aWxzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZFZhbHVlLCBudWxsLCAnRCBNTU0geXl5eScpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHRGb3JJbnZhbGlkRmllbGQoJ0RhdGUnLCBmaWVsZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQ6IENhc2VGaWVsZCwgY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWxldmFudEl0ZW06IEZpeGVkTGlzdEl0ZW0gPSBjb2RlID8gZmllbGQuZmllbGRfdHlwZS5maXhlZF9saXN0X2l0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmNvZGUgPT09IGNvZGUpIDogbnVsbDtcbiAgICByZXR1cm4gcmVsZXZhbnRJdGVtID8gcmVsZXZhbnRJdGVtLmxhYmVsIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB0ZXh0Rm9ySW52YWxpZEZpZWxkKHR5cGU6IHN0cmluZywgaW52YWxpZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgeyBJbnZhbGlkICR7dHlwZX06ICR7aW52YWxpZFZhbHVlfSB9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQ6IENhc2VGaWVsZCwgY2FzZUZpZWxkVHlwZTogRmllbGRUeXBlLCByb290Q2FzZUZpZWxkOiBDYXNlRmllbGQpIHtcbiAgICBpZiAoY2FzZUZpZWxkVHlwZS50eXBlID09PSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT01QTEVYKSB7XG5cbiAgICAgIGNhc2VGaWVsZFR5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaXNEeW5hbWljRmllbGQgPSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9EWU5BTUlDX0xJU1RfVFlQRS5pbmRleE9mKGZpZWxkLmZpZWxkX3R5cGUudHlwZSkgIT09IC0xO1xuXG4gICAgICAgICAgaWYgKGlzRHluYW1pY0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljTGlzdFZhbHVlID0gdGhpcy5nZXREeW5hbWljTGlzdFZhbHVlKHJvb3RDYXNlRmllbGQudmFsdWUsIGZpZWxkLmlkKTtcbiAgICAgICAgICAgIGlmIChkeW5hbWljTGlzdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxpc3RfaXRlbXMgPSBkeW5hbWljTGlzdFZhbHVlWzBdLmxpc3RfaXRlbXM7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhWYWx1ZSA9IGR5bmFtaWNMaXN0VmFsdWUubWFwKGRhdGEgPT4gZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0ge1xuICAgICAgICAgICAgICAgIGxpc3RfaXRlbXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBsZXhWYWx1ZS5sZW5ndGggPiAwID8gY29tcGxleFZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0ge1xuICAgICAgICAgICAgICAgIC4uLnZhbHVlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZpZWxkLmZvcm1hdHRlZF92YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZC5mb3JtYXR0ZWRfdmFsdWUsXG4gICAgICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oZmllbGQsIGZpZWxkLmZpZWxkX3R5cGUsIHJvb3RDYXNlRmllbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FzZUZpZWxkVHlwZS50eXBlID09PSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT0xMRUNUSU9OKSB7XG4gICAgICBpZiAoY2FzZUZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpIHtcbiAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oY2FzZUZpZWxkLCBjYXNlRmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSwgcm9vdENhc2VGaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RHluYW1pY0xpc3RWYWx1ZShqc29uQmxvY2s6IGFueSwga2V5OiBzdHJpbmcpIHtcblxuICAgIGNvbnN0IGRhdGEgPSBqc29uQmxvY2sgPyB0aGlzLmdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25CbG9jaywga2V5LCBbXSkgOiBbXTtcblxuICAgIHJldHVybiBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25EYXRhOiBhbnksIGtleTogc3RyaW5nLCBvdXRwdXQ6IGFueVtdID0gW10pIHtcbiAgICBpZiAoanNvbkRhdGEgJiYganNvbkRhdGFba2V5XSkge1xuICAgICAgb3V0cHV0LnB1c2goanNvbkRhdGFba2V5XSk7XG4gICAgfSBlbHNlICB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRLZXkgaW4ganNvbkRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uRGF0YSA9PT0gJ29iamVjdCcgJiYganNvbkRhdGEuaGFzT3duUHJvcGVydHkoZWxlbWVudEtleSkpIHtcbiAgICAgICAgICB0aGlzLmdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25EYXRhW2VsZW1lbnRLZXldLCBrZXksIG91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZENhblNob3dQcmVkaWNhdGUoZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyLCBmb3JtOiBhbnkpOiBQcmVkaWNhdGU8V2l6YXJkUGFnZT4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudEV2ZW50U3RhdGUoZXZlbnRUcmlnZ2VyLCBmb3JtKTtcbiAgICByZXR1cm4gKHBhZ2U6IFdpemFyZFBhZ2UpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBwYWdlLnBhcnNlZFNob3dDb25kaXRpb24ubWF0Y2goY3VycmVudFN0YXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlcjogeyBjYXNlX2ZpZWxkczogQ2FzZUZpZWxkW10gfSwgZm9ybTogRm9ybUdyb3VwKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUNhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcywgZm9ybS5jb250cm9sc1snZGF0YSddLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZUNhc2VGaWVsZChvYmo6IGFueSk6IENhc2VGaWVsZCB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IENhc2VGaWVsZCgpLCBvYmopO1xuICB9XG5cbiAgcHVibGljIG1lcmdlQ2FzZUZpZWxkc0FuZEZvcm1GaWVsZHMoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10sIGZvcm1GaWVsZHM6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VGaWVsZHMoY2FzZUZpZWxkcywgZm9ybUZpZWxkcywgRmllbGRzVXRpbHMuREVGQVVMVF9NRVJHRV9GVU5DVElPTik7XG4gIH1cblxuICBwdWJsaWMgbWVyZ2VMYWJlbENhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1lcmdlRmllbGRzKGNhc2VGaWVsZHMsIGZvcm1GaWVsZHMsIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKTtcbiAgfVxuXG4gIHB1YmxpYyBjb250cm9sSXRlcmF0b3IoXG4gICAgYUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgICBmb3JtQXJyYXlGbjogKGFycmF5OiBGb3JtQXJyYXkpID0+IHZvaWQsXG4gICAgZm9ybUdyb3VwRm46IChncm91cDogRm9ybUdyb3VwKSA9PiB2b2lkLFxuICAgIGNvbnRyb2xGbjogKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmIChhQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkgeyAvLyBXZSdyZSBpbiBhIGNvbGxlY3Rpb25cbiAgICAgIGZvcm1BcnJheUZuKGFDb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGFDb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7IC8vIFdlJ3JlIGluIGEgY29tcGxleCB0eXBlLlxuICAgICAgZm9ybUdyb3VwRm4oYUNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoYUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkgeyAvLyBGb3JtQ29udHJvbFxuICAgICAgY29udHJvbEZuKGFDb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lcmdlRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QsIG1lcmdlRnVuY3Rpb246IChmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCkgPT4gdm9pZCk6IG9iamVjdCB7XG4gICAgY29uc3QgcmVzdWx0OiBvYmplY3QgPSBGaWVsZHNVdGlscy5jbG9uZU9iamVjdChmb3JtRmllbGRzKTtcbiAgICBjYXNlRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgbWVyZ2VGdW5jdGlvbihmaWVsZCwgcmVzdWx0KTtcbiAgICAgIGlmIChmaWVsZC5maWVsZF90eXBlICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMgJiYgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSB0aGlzLm1lcmdlRmllbGRzKGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIHJlc3VsdFtmaWVsZC5pZF0sIG1lcmdlRnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
|
|
549
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9maWVsZHMvZmllbGRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDaEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBb0IsU0FBUyxFQUF5RSxNQUFNLGNBQWMsQ0FBQztBQUNsSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFFbkYsV0FBVztBQUVYLE1BQU0sT0FBTyxXQUFXO0lBWWYsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQVE7UUFDdkMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLE9BQU8scUJBQXFCLENBQUMsSUFBSSxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBdUI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FB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QUM7YUFDSjtZQUNELE1BQU07U0FDUDtLQUNGO0FBQ0gsQ0FBQyxDQUFDO3NFQWpPUyxXQUFXO21EQUFYLFdBQVcsV0FBWCxXQUFXO3VGQUFYLFdBQVc7Y0FEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHBsYWluVG9DbGFzc0Zyb21FeGlzdCB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IFdpemFyZFBhZ2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbic7XG5pbXBvcnQgeyBBYnN0cmFjdEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS9iYXNlLWZpZWxkL2Fic3RyYWN0LWZvcm0tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEZsYWdEZXRhaWwsIEZsYWdzV2l0aEZvcm1Hcm91cFBhdGggfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvY2FzZS1mbGFnL2RvbWFpbi9jYXNlLWZsYWcubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUZsYWdTdGF0dXMgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvY2FzZS1mbGFnL2VudW1zL2Nhc2UtZmxhZy1zdGF0dXMuZW51bSc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS91dGlscyc7XG5pbXBvcnQgeyBDYXNlRXZlbnRUcmlnZ2VyLCBDYXNlRmllbGQsIENhc2VUYWIsIENhc2VWaWV3LCBGaWVsZFR5cGUsIEZpZWxkVHlwZUVudW0sIEZpeGVkTGlzdEl0ZW0sIFByZWRpY2F0ZSB9IGZyb20gJy4uLy4uL2RvbWFpbic7XG5pbXBvcnQgeyBGb3JtYXRUcmFuc2xhdG9yU2VydmljZSB9IGZyb20gJy4uL2Nhc2UtZmllbGRzL2Zvcm1hdC10cmFuc2xhdG9yLnNlcnZpY2UnO1xuXG4vLyBAZHluYW1pY1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpZWxkc1V0aWxzIHtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjYXNlTGV2ZWxDYXNlRmxhZ3NGaWVsZElkID0gJ2Nhc2VGbGFncyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGN1cnJlbmN5UGlwZTogQ3VycmVuY3lQaXBlID0gbmV3IEN1cnJlbmN5UGlwZSgnZW4tR0InKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZGF0ZVBpcGU6IERhdGVQaXBlID0gbmV3IERhdGVQaXBlKG5ldyBGb3JtYXRUcmFuc2xhdG9yU2VydmljZSgpKTtcbiAgLy8gRVVJLTQyNDQuIDMgZGFzaGVzIGluc3RlYWQgb2YgMSB0byBtYWtlIHRoaXMgbGVzcyBsaWtlbHkgdG8gY2xhc2ggd2l0aCBhIHJlYWwgZmllbGQuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTEFCRUxfU1VGRklYID0gJy0tLUxBQkVMJztcbiAgLy8gSGFuZGxpbmcgb2YgRHluYW1pYyBMaXN0cyBpbiBDb21wbGV4IFR5cGVzXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfQ09MTEVDVElPTiA9ICdDb2xsZWN0aW9uJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT01QTEVYID0gJ0NvbXBsZXgnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0RZTkFNSUNfTElTVF9UWVBFOiBGaWVsZFR5cGVFbnVtW10gPSBbJ0R5bmFtaWNMaXN0JywgJ0R5bmFtaWNSYWRpb0xpc3QnXTtcblxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRUb0Nhc2VGaWVsZChvYmo6IGFueSk6IENhc2VGaWVsZCB7XG4gICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ2FzZUZpZWxkKSkge1xuICAgICAgcmV0dXJuIHBsYWluVG9DbGFzc0Zyb21FeGlzdChuZXcgQ2FzZUZpZWxkKCksIG9iaik7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvVmFsdWVzTWFwKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZU1hcCA9IHt9O1xuICAgIGNhc2VGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICB2YWx1ZU1hcFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5wcmVwYXJlVmFsdWUoZmllbGQpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZU1hcDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0VHlwZShlbGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZWxlbSkuc2xpY2UoOCwgLTEpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc09iamVjdChlbGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGVsZW0gPT09ICdvYmplY3QnICYmIGVsZW0gIT09IG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTm9uRW1wdHlPYmplY3QoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNPYmplY3QoZWxlbSkgJiYgT2JqZWN0LmtleXMoZWxlbSkubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGVsZW0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhcmVDb2xsZWN0aW9uVmFsdWVzU2ltcGxlRmllbGRzKGZpZWxkVmFsdWU6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzT2JqZWN0KGZpZWxkVmFsdWVbMF1bJ3ZhbHVlJ10pICYmICFBcnJheS5pc0FycmF5KGZpZWxkVmFsdWVbMF1bJ3ZhbHVlJ10pICYmIGZpZWxkVmFsdWVbMF1bJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNDb2xsZWN0aW9uT2ZTaW1wbGVUeXBlcyhmaWVsZFZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbGxlY3Rpb24oZmllbGRWYWx1ZSkgJiYgdGhpcy5hcmVDb2xsZWN0aW9uVmFsdWVzU2ltcGxlRmllbGRzKGZpZWxkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc011bHRpU2VsZWN0VmFsdWUoZm9ybTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNOb25FbXB0eUFycmF5KGZvcm0pICYmICF0aGlzLmlzQ29sbGVjdGlvbldpdGhWYWx1ZShmb3JtKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOb25FbXB0eUFycmF5KHBhZ2VGb3JtRmllbGRzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYWdlRm9ybUZpZWxkcykgJiYgcGFnZUZvcm1GaWVsZHNbMF0gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNDb2xsZWN0aW9uKHBhZ2VGb3JtRmllbGRzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc05vbkVtcHR5QXJyYXkocGFnZUZvcm1GaWVsZHMpICYmIHRoaXMuaXNDb2xsZWN0aW9uV2l0aFZhbHVlKHBhZ2VGb3JtRmllbGRzKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNDb2xsZWN0aW9uV2l0aFZhbHVlKHBhZ2VGb3JtRmllbGRzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYWdlRm9ybUZpZWxkc1swXVsndmFsdWUnXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjbG9uZU9iamVjdChvYmo6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iaik7XG4gIH1cblxuICAvLyB0ZW1wb3JhcnkgZnVuY3Rpb24gdW50aWwgdGhpcyBjYW4gYmUgbW92ZWQgdG8gQ2FzZVZpZXcgY2xhc3MgKFJETS0yNjgxKVxuICBwdWJsaWMgc3RhdGljIGdldENhc2VGaWVsZHMoY2FzZVZpZXc6IENhc2VWaWV3KTogQ2FzZUZpZWxkW10ge1xuICAgIGNvbnN0IGNhc2VEYXRhRmllbGRzOiBDYXNlRmllbGRbXSA9IGNhc2VWaWV3LnRhYnMucmVkdWNlKChhY2M6IENhc2VGaWVsZFtdLCB0YWI6IENhc2VUYWIpID0+IHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KHRhYi5maWVsZHMpO1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhRmllbGRzOiBDYXNlRmllbGRbXSA9IGNhc2VWaWV3Lm1ldGFkYXRhRmllbGRzO1xuICAgIHJldHVybiBtZXRhZGF0YUZpZWxkcy5jb25jYXQoY2FzZURhdGFGaWVsZHMuZmlsdGVyKChjYXNlRmllbGQ6IENhc2VGaWVsZCkgPT4ge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhRmllbGRzLmZpbmRJbmRleChtZXRhZGF0YUZpZWxkID0+IG1ldGFkYXRhRmllbGQuaWQgPT09IGNhc2VGaWVsZC5pZCkgPCAwO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWRkQ2FzZUZpZWxkQW5kQ29tcG9uZW50UmVmZXJlbmNlcyAoYzogQWJzdHJhY3RDb250cm9sLCBjZjogQ2FzZUZpZWxkLCBjb21wOiBBYnN0cmFjdEZvcm1GaWVsZENvbXBvbmVudCk6IHZvaWQge1xuICAgIGNbJ2Nhc2VGaWVsZCddID0gY2Y7XG4gICAgY1snY29tcG9uZW50J10gPSBjb21wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBjaGVjayBvZiBhbiBhcnJheSBvciBvYmplY3QgYW5kIGl0cyBkZXNjZW5kYW50cyBmb3IgdGhlIHByZXNlbmNlIG9mIGFueSBub24tZW1wdHkgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBhcnJheSBvciBvYmplY3QgdG8gY2hlY2tcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheSBvciBvYmplY3QgKG9yIGEgZGVzY2VuZGFudCkgY29udGFpbnMgYXQgbGVhc3Qgb25lIG5vbi1lbXB0eSB2YWx1ZTsgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29udGFpbnNOb25FbXB0eVZhbHVlcyhvYmplY3Q6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKG9iamVjdCkubWFwKGtleSA9PiBvYmplY3Rba2V5XSk7XG4gICAgY29uc3Qgb2JqZWN0UmVmcyA9IFtdO1xuICAgIC8vIEFsc28gdGVzdCBmb3IgbnVtZXJpYyB2YWx1ZXMsIGFuZCBsZW5ndGggPiAwIGZvciBub24tbnVtZXJpYyB2YWx1ZXMgYmVjYXVzZSB0aGlzIGNvdmVycyBib3RoIHN0cmluZ3MgYW5kIGFycmF5cy5cbiAgICAvLyBOb3RlOiBEZWxpYmVyYXRlIHVzZSBvZiBub24tZXF1YWxpdHkgKCE9KSBvcGVyYXRvciBmb3IgbnVsbCBjaGVjaywgdG8gaGFuZGxlIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcy5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICBjb25zdCBoYXNOb25OdWxsUHJpbWl0aXZlID0gdmFsdWVzLnNvbWUoeCA9PiAoeCAhPSBudWxsICYmXG4gICAgICAoKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4LmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHx8IEFycmF5LmlzQXJyYXkoeClcbiAgICAgICAgPyAhb2JqZWN0UmVmcy5wdXNoKHgpXG4gICAgICAgIDogdHlwZW9mIHggPT09ICdudW1iZXInIHx8IHgubGVuZ3RoID4gMClcbiAgICApKTtcbiAgICByZXR1cm4gIWhhc05vbk51bGxQcmltaXRpdmUgPyBvYmplY3RSZWZzLnNvbWUoeSA9PiB0aGlzLmNvbnRhaW5zTm9uRW1wdHlWYWx1ZXMoeSkpIDogaGFzTm9uTnVsbFByaW1pdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBoYW5kbGVOZXN0ZWREeW5hbWljTGlzdHMoKVxuICAgKiBSZWFzc2lnbnMgbGlzdF9pdGVtIGFuZCB2YWx1ZSBkYXRhIHRvIER5bmFtaWNMaXN0IGNoaWxkcmVuXG4gICAqIGRvd24gdGhlIHRyZWUuIFNlcnZlciByZXNwb25zZSByZXR1cm5zIGRhdGEgb25seSBpblxuICAgKiB0aGUgYHZhbHVlYCBvYmplY3Qgb2YgcGFyZW50IGNvbXBsZXggdHlwZVxuICAgKlxuICAgKiBFVUktMjUzMCBEeW5hbWljIExpc3RzIGZvciBFbGVtZW50cyBpbiBhIENvbXBsZXggVHlwZVxuICAgKlxuICAgKiBAcGFyYW0ganNvbkJvZHkgLSB7IGNhc2VfZmllbGRzOiBbIENhc2VGaWVsZCwgQ2FzZUZpZWxkIF0gfVxuICAgKi9cbiAgIHB1YmxpYyBzdGF0aWMgaGFuZGxlTmVzdGVkRHluYW1pY0xpc3RzKGpzb25Cb2R5OiB7IGNhc2VfZmllbGRzOiBDYXNlRmllbGRbXSB9KTogYW55IHtcblxuICAgIGlmIChqc29uQm9keS5jYXNlX2ZpZWxkcykge1xuICAgICAganNvbkJvZHkuY2FzZV9maWVsZHMuZm9yRWFjaChjYXNlRmllbGQgPT4ge1xuICAgICAgICBpZiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUpIHtcbiAgICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQsIGNhc2VGaWVsZC5maWVsZF90eXBlLCBjYXNlRmllbGQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbkJvZHk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwcmVwYXJlVmFsdWUoZmllbGQ6IENhc2VGaWVsZCk6IGFueSB7XG4gICAgaWYgKGZpZWxkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gZmllbGQudmFsdWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZC5pc0NvbXBsZXgoKSkge1xuICAgICAgY29uc3QgdmFsdWVNYXAgPSB7fTtcbiAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaChjb21wbGV4RmllbGQgPT4ge1xuICAgICAgICB2YWx1ZU1hcFtjb21wbGV4RmllbGQuaWRdID0gRmllbGRzVXRpbHMucHJlcGFyZVZhbHVlKGNvbXBsZXhGaWVsZCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZU1hcDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01FUkdFX0ZVTkNUSU9OID0gZnVuY3Rpb24gbWVyZ2VGdW5jdGlvbihmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCk6IHZvaWQge1xuICAgIGlmICghcmVzdWx0Lmhhc093blByb3BlcnR5KGZpZWxkLmlkKSkge1xuICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IGZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMQUJFTF9NRVJHRV9GVU5DVElPTiA9IGZ1bmN0aW9uIG1lcmdlRnVuY3Rpb24oZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXJlc3VsdC5oYXNPd25Qcm9wZXJ0eShmaWVsZC5pZCkpIHtcbiAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBmaWVsZC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHN3aXRjaC1kZWZhdWx0XG4gICAgc3dpdGNoIChmaWVsZC5maWVsZF90eXBlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0ZpeGVkTGlzdCc6XG4gICAgICBjYXNlICdGaXhlZFJhZGlvTGlzdCc6IHtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLmdldEZpeGVkTGlzdExhYmVsQnlDb2RlT3JFbXB0eShmaWVsZCwgcmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTXVsdGlTZWxlY3RMaXN0Jzoge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcmVzdWx0W2ZpZWxkLmlkXSB8fCBbXTtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkICsgRmllbGRzVXRpbHMuTEFCRUxfU1VGRklYXSA9IFtdO1xuICAgICAgICBmaWVsZFZhbHVlLmZvckVhY2goKGNvZGU6IGFueSwgaWR4OiBhbnkpID0+IHtcbiAgICAgICAgICByZXN1bHRbZmllbGQuaWQgKyBGaWVsZHNVdGlscy5MQUJFTF9TVUZGSVhdW2lkeF0gPSBGaWVsZHNVdGlscy5nZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQsIGNvZGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdMYWJlbCc6IHtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLmdldExhYmVsKGZpZWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdNb25leUdCUCc6IHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IChyZXN1bHRbZmllbGQuaWRdIHx8IGZpZWxkLnZhbHVlKTtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLmdldE1vbmV5R0JQKGZpZWxkVmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0RhdGUnOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXREYXRlKGZpZWxkVmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NvbXBsZXgnOiB7XG4gICAgICAgIGlmIChyZXN1bHRbZmllbGQuaWRdICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmZvckVhY2goKGY6IENhc2VGaWVsZCkgPT4ge1xuICAgICAgICAgICAgaWYgKFsnQ29sbGVjdGlvbicsICdDb21wbGV4JywgJ011bHRpU2VsZWN0TGlzdCddLmluZGV4T2YoZi5maWVsZF90eXBlLnR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgRmllbGRzVXRpbHMuTEFCRUxfTUVSR0VfRlVOQ1RJT04oZiwgcmVzdWx0W2ZpZWxkLmlkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdDb2xsZWN0aW9uJzoge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IChyZXN1bHRbZmllbGQuaWRdIHx8IGZpZWxkLnZhbHVlKTtcbiAgICAgICAgaWYgKGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnTW9uZXlHQlAnOiB7XG4gICAgICAgICAgICAgICAgZWxlbS52YWx1ZSA9IEZpZWxkc1V0aWxzLmdldE1vbmV5R0JQKGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0RhdGUnOiB7XG4gICAgICAgICAgICAgICAgZWxlbS52YWx1ZSA9IEZpZWxkc1V0aWxzLmdldERhdGUoZWxlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnQ29tcGxleCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmZvckVhY2goKGY6IENhc2VGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoWydDb2xsZWN0aW9uJywgJ0NvbXBsZXgnLCAnTXVsdGlTZWxlY3RMaXN0J10uaW5kZXhPZihmLmZpZWxkX3R5cGUudHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKGYsIGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBgTW9uZXlHQlBgIHZhbHVlIHRvIGluY2x1ZGUgY3VycmVuY3kgdW5pdHMuXG4gICAqIEBwYXJhbSBmaWVsZFZhbHVlIFRoZSBDdXJyZW5jeVBpcGUgZXhwZWN0cyBhbiBgYW55YCBwYXJhbWV0ZXIgc28gdGhpcyBtdXN0IGFsc28gYmUgYGFueWAsXG4gICAqIGJ1dCBpdCBzaG91bGQgYmUgXCJudW1iZXItbGlrZVwiIChlLmcuLCAnMTIzNCcpXG4gICAqIEByZXR1cm5zIEEgZm9ybWF0dGVkIHN0cmluZyAoZS5nLiwgwqMxMi4zNClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE1vbmV5R0JQKGZpZWxkVmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWUgPyBGaWVsZHNVdGlscy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKGZpZWxkVmFsdWUgLyAxMDAsICdHQlAnLCAnc3ltYm9sJykgOiBmaWVsZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TGFiZWwoZmllbGRWYWx1ZTogQ2FzZUZpZWxkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmllbGRWYWx1ZSA/IGZpZWxkVmFsdWUubGFiZWwgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldERhdGUoZmllbGRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9ybWF0IHNwZWNpZmllZCBoZXJlIHdhc24ndCBwcmV2aW91c2x5IHdvcmtpbmcgYW5kIGxvdHMgb2YgdGVzdHMgZGVwZW5kIG9uIGl0IG5vdCB3b3JraW5nXG4gICAgICAvLyBOb3cgdGhhdCBmb3JtYXRzIHdvcmsgY29ycmVjdGx5IG1hbnkgdGVzdCB3b3VsZCBicmVhayAtIGFuZCB0aGlzIGNvdWxkIGFmZmVjdCBzZXJ2aWNlcyB3aGljaCBtYXkgZGVwZW5kIG9uXG4gICAgICAvLyB0aGUgb3JnaW5hbCBiZWhhdmlvdXIgb2YgcmV0dXJuaW5nIGRhdGVzIGluIFwiZCBNTU0geXl5eVwiXG4gICAgICAvLyBOb3RlIC0gcmVwbGFjZWQgJ2QnIHdpdGggJ0QnIGFzIGRhdGVwaXBlIHVzaW5nIG1vbWVudCB0byBhdm9pZCB0aW1lem9uZSBkaXNjcmVwYW5jaWVzXG4gICAgICByZXR1cm4gRmllbGRzVXRpbHMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkVmFsdWUsIG51bGwsICdEIE1NTSB5eXl5Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dEZvckludmFsaWRGaWVsZCgnRGF0ZScsIGZpZWxkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEZpeGVkTGlzdExhYmVsQnlDb2RlT3JFbXB0eShmaWVsZDogQ2FzZUZpZWxkLCBjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlbGV2YW50SXRlbTogRml4ZWRMaXN0SXRlbSA9IGNvZGUgPyBmaWVsZC5maWVsZF90eXBlLmZpeGVkX2xpc3RfaXRlbXMuZmluZChpdGVtID0+IGl0ZW0uY29kZSA9PT0gY29kZSkgOiBudWxsO1xuICAgIHJldHVybiByZWxldmFudEl0ZW0gPyByZWxldmFudEl0ZW0ubGFiZWwgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHRleHRGb3JJbnZhbGlkRmllbGQodHlwZTogc3RyaW5nLCBpbnZhbGlkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB7IEludmFsaWQgJHt0eXBlfTogJHtpbnZhbGlkVmFsdWV9IH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0RHluYW1pY0xpc3REZWZpbml0aW9uKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCBjYXNlRmllbGRUeXBlOiBGaWVsZFR5cGUsIHJvb3RDYXNlRmllbGQ6IENhc2VGaWVsZCkge1xuICAgIGlmIChjYXNlRmllbGRUeXBlLnR5cGUgPT09IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTVBMRVgpIHtcblxuICAgICAgY2FzZUZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBpc0R5bmFtaWNGaWVsZCA9IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0RZTkFNSUNfTElTVF9UWVBFLmluZGV4T2YoZmllbGQuZmllbGRfdHlwZS50eXBlKSAhPT0gLTE7XG5cbiAgICAgICAgICBpZiAoaXNEeW5hbWljRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNMaXN0VmFsdWUgPSB0aGlzLmdldER5bmFtaWNMaXN0VmFsdWUocm9vdENhc2VGaWVsZC52YWx1ZSwgZmllbGQuaWQpO1xuICAgICAgICAgICAgaWYgKGR5bmFtaWNMaXN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgbGlzdF9pdGVtcyA9IGR5bmFtaWNMaXN0VmFsdWVbMF0ubGlzdF9pdGVtcztcbiAgICAgICAgICAgICAgY29uc3QgY29tcGxleFZhbHVlID0gZHluYW1pY0xpc3RWYWx1ZS5tYXAoZGF0YSA9PiBkYXRhLnZhbHVlKTtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgbGlzdF9pdGVtcyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29tcGxleFZhbHVlLmxlbmd0aCA+IDAgPyBjb21wbGV4VmFsdWUgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZmllbGQuZm9ybWF0dGVkX3ZhbHVlID0ge1xuICAgICAgICAgICAgICAgIC4uLmZpZWxkLmZvcm1hdHRlZF92YWx1ZSxcbiAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihmaWVsZCwgZmllbGQuZmllbGRfdHlwZSwgcm9vdENhc2VGaWVsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjYXNlRmllbGRUeXBlLnR5cGUgPT09IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTExFQ1RJT04pIHtcbiAgICAgIGlmIChjYXNlRmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkge1xuICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQsIGNhc2VGaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLCByb290Q2FzZUZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXREeW5hbWljTGlzdFZhbHVlKGpzb25CbG9jazogYW55LCBrZXk6IHN0cmluZykge1xuXG4gICAgY29uc3QgZGF0YSA9IGpzb25CbG9jayA/IHRoaXMuZ2V0TmVzdGVkRmllbGRWYWx1ZXMoanNvbkJsb2NrLCBrZXksIFtdKSA6IFtdO1xuXG4gICAgcmV0dXJuIGRhdGEubGVuZ3RoID4gMCA/IGRhdGEgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TmVzdGVkRmllbGRWYWx1ZXMoanNvbkRhdGE6IGFueSwga2V5OiBzdHJpbmcsIG91dHB1dDogYW55W10gPSBbXSkge1xuICAgIGlmIChqc29uRGF0YSAmJiBqc29uRGF0YVtrZXldKSB7XG4gICAgICBvdXRwdXQucHVzaChqc29uRGF0YVtrZXldKTtcbiAgICB9IGVsc2UgIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEtleSBpbiBqc29uRGF0YSkge1xuICAgICAgICBpZiAodHlwZW9mIGpzb25EYXRhID09PSAnb2JqZWN0JyAmJiBqc29uRGF0YS5oYXNPd25Qcm9wZXJ0eShlbGVtZW50S2V5KSkge1xuICAgICAgICAgIHRoaXMuZ2V0TmVzdGVkRmllbGRWYWx1ZXMoanNvbkRhdGFbZWxlbWVudEtleV0sIGtleSwgb3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXNlRmllbGQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc0ZsYWdzRmllbGRUeXBlKGNhc2VGaWVsZC5maWVsZF90eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnTGF1bmNoZXJDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoIWNhc2VGaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnRmxhZ0xhdW5jaGVyJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnc0ZpZWxkVHlwZShmaWVsZFR5cGU6IEZpZWxkVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZHVtbXkgZmllbGQgdHlwZSBJRCBvZiBcIkNhc2VGbGFnXCIgZm9yIHRlc3RpbmcgYW5kIHRoZSByZWFsIGZpZWxkIHR5cGVcbiAgICAvLyBJRCBvZiBcIkZsYWdzXCJcbiAgICByZXR1cm4gKGZpZWxkVHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgKGZpZWxkVHlwZS5pZCA9PT0gJ0Nhc2VGbGFnJyB8fCBmaWVsZFR5cGUuaWQgPT09ICdGbGFncycpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGZsYWdzIGRhdGEgZnJvbSBhIGBDYXNlRmllbGRgIGluc3RhbmNlLCByZWN1cnNpbmcgYW5kIGl0ZXJhdGluZyB0aHJvdWdoIHN1Yi1maWVsZHMgb2YgYSBDb21wbGV4IGZpZWxkIG9yXG4gICAqIGVhY2ggZmllbGQgaW4gYSBDb2xsZWN0aW9uIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZmxhZ3MgQW4gYXJyYXkgZm9yIGFjY3VtdWxhdGluZyBleHRyYWN0ZWQgZmxhZ3MgZGF0YSBhbmQgZGVyaXZlZCBgRm9ybUdyb3VwYCBwYXRoc1xuICAgKiBAcGFyYW0gY2FzZUZpZWxkIEEgYENhc2VGaWVsZGAgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBmbGFncyBkYXRhXG4gICAqIEBwYXJhbSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCBBIChkb3QtZGVsaW1pdGVkKSBzdHJpbmcgZm9yIGNvbmNhdGVuYXRpbmcgdGhlIG5hbWUgb2YgZWFjaCBjb250cm9sIHRoYXQgZm9ybXMgdGhlIHBhdGhcbiAgICogdG8gdGhlIGBGb3JtR3JvdXBgIGZvciB0aGUgYEZsYWdzYCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdG9wTGV2ZWxDYXNlRmllbGQgVGhlIHRvcC1sZXZlbCBgQ2FzZUZpZWxkYCB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSBwcm9wZXJ0eS4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIF9vbmx5XG4gICAqIHRvcC1sZXZlbF8gYENhc2VGaWVsZGBzIGNvbnRhaW4gYWN0dWFsIHZhbHVlcyBhbmQgYSByZWZlcmVuY2UgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCB0byBzdWNoIGEgZmllbGRcbiAgICogQHBhcmFtIGN1cnJlbnRWYWx1ZSBUaGUgY3VycmVudCB2YWx1ZSBvYmplY3Qgb2YgYSBgQ2FzZUZpZWxkYCB0aGF0IGlzIGEgc3ViLWZpZWxkIG9mIGEgbm9uIHJvb3QtbGV2ZWwgQ29tcGxleCBmaWVsZC5cbiAgICogUmVxdWlyZWQgZm9yIG1hcHBpbmcgdGhlIGBDYXNlRmllbGRgIHZhbHVlIHRvIGEgYEZsYWdzYCBvYmplY3QgaWYgaXQgaXMgYSBcIkZsYWdzXCIgYENhc2VGaWVsZGAuIChGb3IgQ29tcGxleCB0eXBlcyxcbiAgICogb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueSBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsXG4gICAqIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhgLCBlYWNoIGluc3RhbmNlIGNvbXByaXNpbmcgYSBgRmxhZ3NgIG9iamVjdCBkZXJpdmVkIGZyb20gYSBgQ2FzZUZpZWxkYFxuICAgKiBvZiB0eXBlIFwiRmxhZ3NcIiwgYW5kIHRoZSBkb3QtZGVsaW1pdGVkIHBhdGggc3RyaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIGBGb3JtR3JvdXBgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKGZsYWdzOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoW10sIGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcsIHRvcExldmVsQ2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhbXSB7XG4gICAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgRmxhZ3MgQ2FzZUZpZWxkICh0aGVzZSBhcmUgaW1wbGVtZW50ZWQgYXMgQ29tcGxleCB0eXBlcyksIGl0IGNhbiBiZSBtYXBwZWQgdG8gYSBGbGFnc1xuICAgICAgICAgIC8vIG9iamVjdCBpbW1lZGlhdGVseVxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBGbGFncyBDYXNlRmllbGQgaGFzIGEgdmFsdWUsIGl0IGlzIGEgcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkOyBpZiBpdCBkb2VzIG5vdCwgaXQgaXMgYSBGbGFnc1xuICAgICAgICAgICAgLy8gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGFub3RoZXIgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWUgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGluc3RlYWQuIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgXCJjYXNlRmxhZ3NcIiBGbGFncyBDYXNlRmllbGQsIHdoaWNoIHdpbGwgaGF2ZSBhbiBlbXB0eSBvYmplY3QgdmFsdWVcbiAgICAgICAgICAgIC8vIGluaXRpYWxseSwgYmVjYXVzZSBubyBwYXJ0eSBuYW1lIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY2FzZUZpZWxkLnZhbHVlKSB8fFxuICAgICAgICAgICAgICBjYXNlRmllbGQuaWQgPT09IHRoaXMuY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCkge1xuICAgICAgICAgICAgICBmbGFncy5wdXNoKHRoaXMubWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSBgLiR7Y2FzZUZpZWxkLmlkfWA7XG4gICAgICAgICAgICAgIGZsYWdzLnB1c2godGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChcbiAgICAgICAgICAgICAgICBjYXNlRmllbGQuaWQsIGN1cnJlbnRWYWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGZsYWdzID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGZsYWdzT2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgdG9wTGV2ZWxDYXNlRmllbGQsIHZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEZvciBhIENvbGxlY3Rpb24gZmllbGQsIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBhcyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIENhc2VGaWVsZCdzIHZhbHVlIHByb3BlcnR5XG4gICAgICAgIC8vIGFzIGFuIGFycmF5LCB1bmxlc3MgdGhlIGNvbGxlY3Rpb24gaXMgYSBzdWItZmllbGQgb2YgYSBDb21wbGV4IHR5cGUgLSBzdWItZmllbGRzIG5ldmVyIGNvbnRhaW4gdmFsdWVzXG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIEZsYWdzIENhc2VGaWVsZHMsIHRoZXNlIGNhbiBiZSBtYXBwZWQgdG8gRmxhZ3Mgb2JqZWN0cyBpbW1lZGlhdGVseVxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzRmllbGRUeXBlKGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ29sbGVjdGlvbiBDYXNlRmllbGQgaGFzIGEgdmFsdWUgKGFuIGFycmF5KSwgaXQgaXMgYSByb290LWxldmVsIENvbGxlY3Rpb24gZmllbGQ7IGlmIGl0IGRvZXMgbm90LFxuICAgICAgICAgICAgLy8gaXQgaXMgYSBDb2xsZWN0aW9uIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlXG4gICAgICAgICAgICAvLyAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCBwYXRoRnJhZ21lbnQgPSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSAnLmluZGV4LnZhbHVlJztcbiAgICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgY2FzZUZpZWxkLnZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEF0IGVhY2ggaXRlcmF0aW9uLCByZXBsYWNlIHRoZSBcImluZGV4XCIgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGluZGV4XG4gICAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgPSBwYXRoRnJhZ21lbnQucmVwbGFjZSgnaW5kZXgnLCBpbmRleC50b1N0cmluZygxMCkpO1xuICAgICAgICAgICAgICAgIGZsYWdzLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGl0ZW0uaWQsIGl0ZW0udmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCBjYXNlRmllbGQpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFtdKS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MucHVzaChcbiAgICAgICAgICAgICAgICAgIHRoaXMubWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoaXRlbS5pZCwgaXRlbS52YWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcmVkdWN0aW9uIG92ZXIgZWFjaCBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyAoc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgYWJvdmUgZm9yIG5vbi1GbGFnc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGhGcmFnbWVudCA9IHBhdGhUb0ZsYWdzRm9ybUdyb3VwICs9ICcuaW5kZXgudmFsdWUnO1xuICAgICAgICAgICAgICBjYXNlRmllbGQudmFsdWUuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQXQgZWFjaCBpdGVyYXRpb24sIHJlcGxhY2UgdGhlIFwiaW5kZXhcIiBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgaW5kZXhcbiAgICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MgPSBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKFxuICAgICAgICAgICAgICAgICAgICBmbGFnc09mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkLCBpdGVtLnZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgICAgfSwgZmxhZ3MpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBmaWVsZCB0eXBlc1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsYWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZC5pZCwgY2FzZUZpZWxkLnZhbHVlLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgY2FzZUZpZWxkKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGlkOiBzdHJpbmcsIHZhbHVlOiBvYmplY3QsXG4gICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXA6IHN0cmluZywgY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZsYWdzOiB7XG4gICAgICAgICAgZmxhZ3NDYXNlRmllbGRJZDogaWQsXG4gICAgICAgICAgcGFydHlOYW1lOiB2YWx1ZSA/IHZhbHVlWydwYXJ0eU5hbWUnXSA6IG51bGwsXG4gICAgICAgICAgcm9sZU9uQ2FzZTogdmFsdWUgPyB2YWx1ZVsncm9sZU9uQ2FzZSddIDogbnVsbCxcbiAgICAgICAgICBkZXRhaWxzOiB2YWx1ZSAmJiB2YWx1ZVsnZGV0YWlscyddICYmIHZhbHVlWydkZXRhaWxzJ10ubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyAodmFsdWVbJ2RldGFpbHMnXSBhcyBhbnlbXSkubWFwKGRldGFpbCA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAuLi5PYmplY3Qua2V5cyhkZXRhaWwudmFsdWUpLm1hcChrID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgaWQgcHJvcGVydHkgc2V0IGJlbG93IHdpbGwgYmUgbnVsbCBmb3IgYSBuZXcgY2FzZSBmbGFnLCBhbmQgYSB1bmlxdWUgaWQgcmV0dXJuZWQgZnJvbSBDQ0Qgd2hlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGZsYWdcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGspIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIGRhdGUtdGltZSBmaWVsZHNcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lTW9kaWZpZWQnOlxuICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZVRpbWVDcmVhdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtba106IGRldGFpbC52YWx1ZVtrXSA/IG5ldyBEYXRlKGRldGFpbC52YWx1ZVtrXSkgOiBudWxsLCBpZDogZGV0YWlsLmlkfTtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgYSBcInllcy9ub1wiIGZpZWxkXG4gICAgICAgICAgICAgICAgICBjYXNlICdoZWFyaW5nUmVsZXZhbnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV0YWlsLnZhbHVlW2tdLnRvVXBwZXJDYXNlKCkgPT09ICdZRVMnID8ge1trXTogdHJ1ZSwgaWQ6IGRldGFpbC5pZH0gOiB7W2tdOiBmYWxzZSwgaWQ6IGRldGFpbC5pZH07XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1trXTogZGV0YWlsLnZhbHVlW2tdLCBpZDogZGV0YWlsLmlkfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pIGFzIEZsYWdEZXRhaWxbXVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLFxuICAgICAgICBjYXNlRmllbGRcbiAgICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgYWN0aXZlIGZsYWdzIGluIGEgYENhc2VGaWVsZGAgaW5zdGFuY2UsIHJlY3Vyc2luZyBhbmQgaXRlcmF0aW5nIHRocm91Z2ggc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggZmllbGQgb3IgZWFjaFxuICAgKiBmaWVsZCBpbiBhIENvbGxlY3Rpb24gZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBhY3RpdmVDb3VudCBBbiBhY2N1bXVsYXRpb24gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmxhZ3NcbiAgICogQHBhcmFtIGNhc2VGaWVsZCBBIGBDYXNlRmllbGRgIGluc3RhbmNlIGZvciB3aGljaCB0byBjb3VudCB0aGUgYWN0aXZlIGZsYWdzXG4gICAqIEBwYXJhbSBjdXJyZW50VmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2JqZWN0IG9mIGEgYENhc2VGaWVsZGAgdGhhdCBpcyBhIHN1Yi1maWVsZCBvZiBhIG5vbiByb290LWxldmVsIENvbXBsZXggZmllbGQuXG4gICAqIChGb3IgQ29tcGxleCB0eXBlcywgb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueVxuICAgKiBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgVGhlIGNvdW50IG9mIGFjdGl2ZSBmbGFnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb3VudEFjdGl2ZUZsYWdzSW5DYXNlRmllbGQoYWN0aXZlQ291bnQ6IG51bWJlciwgY2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IG51bWJlciB7XG4gICAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NDYXNlRmllbGQoY2FzZUZpZWxkKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEZsYWdzIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSwgaXQgaXMgYSByb290LWxldmVsIENvbXBsZXggZmllbGQ7IGlmIGl0IGRvZXMgbm90LCBpdCBpcyBhIEZsYWdzXG4gICAgICAgICAgICAvLyBDYXNlRmllbGQgdGhhdCBpcyBhIHN1Yi1maWVsZCB3aXRoaW4gYW5vdGhlciBDb21wbGV4IGZpZWxkLCBzbyB1c2UgdGhlIGN1cnJlbnRWYWx1ZSB2YWx1ZSAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KHZhbHVlKSAmJiB2YWx1ZS5kZXRhaWxzKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gdmFsdWUuZGV0YWlscy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoYWN0aXZlRmxhZ3NDb3VudE9mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50QWN0aXZlRmxhZ3NJbkNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCxcbiAgICAgICAgICAgICAgICAgIHN1YkZpZWxkLFxuICAgICAgICAgICAgICAgICAgdmFsdWVbc3ViRmllbGQuaWRdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSwgYWN0aXZlQ291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRm9yIGEgQ29sbGVjdGlvbiBmaWVsZCwgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGFzIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgQ2FzZUZpZWxkJ3MgdmFsdWUgcHJvcGVydHlcbiAgICAgICAgLy8gYXMgYW4gYXJyYXksIHVubGVzcyB0aGUgY29sbGVjdGlvbiBpcyBhIHN1Yi1maWVsZCBvZiBhIENvbXBsZXggdHlwZSAtIHN1Yi1maWVsZHMgbmV2ZXIgY29udGFpbiB2YWx1ZXNcbiAgICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NGaWVsZFR5cGUoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDb2xsZWN0aW9uIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSAoYW4gYXJyYXkpLCBpdCBpcyBhIHJvb3QtbGV2ZWwgQ29sbGVjdGlvbiBmaWVsZDsgaWYgaXQgZG9lcyBub3QsXG4gICAgICAgICAgICAvLyBpdCBpcyBhIENvbGxlY3Rpb24gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGEgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWVcbiAgICAgICAgICAgIC8vIChpZiBhbnkpIGluc3RlYWRcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlWydkZXRhaWxzJ10pIHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gaXRlbS52YWx1ZVsnZGV0YWlscyddLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcmVkdWN0aW9uIG92ZXIgZWFjaCBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyAoc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgYWJvdmUgZm9yIG5vbi1GbGFnc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgIGNhc2VGaWVsZC52YWx1ZS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0pID0+IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRBY3RpdmVGbGFnc0luQ2FzZUZpZWxkKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQsIGl0ZW0udmFsdWVbc3ViRmllbGQuaWRdKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIGZpZWxkIHR5cGVzXG4gICAgICB9XG4gICAgICByZXR1cm4gYWN0aXZlQ291bnQ7XG4gIH1cblxuICBwdWJsaWMgYnVpbGRDYW5TaG93UHJlZGljYXRlKGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlciwgZm9ybTogYW55KTogUHJlZGljYXRlPFdpemFyZFBhZ2U+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLmdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlciwgZm9ybSk7XG4gICAgcmV0dXJuIChwYWdlOiBXaXphcmRQYWdlKTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gcGFnZS5wYXJzZWRTaG93Q29uZGl0aW9uLm1hdGNoKGN1cnJlbnRTdGF0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50RXZlbnRTdGF0ZShldmVudFRyaWdnZXI6IHsgY2FzZV9maWVsZHM6IENhc2VGaWVsZFtdIH0sIGZvcm06IEZvcm1Hcm91cCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhldmVudFRyaWdnZXIuY2FzZV9maWVsZHMsIGZvcm0uY29udHJvbHNbJ2RhdGEnXS52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgY2xvbmVDYXNlRmllbGQob2JqOiBhbnkpOiBDYXNlRmllbGQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBDYXNlRmllbGQoKSwgb2JqKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZUNhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1lcmdlRmllbGRzKGNhc2VGaWVsZHMsIGZvcm1GaWVsZHMsIEZpZWxkc1V0aWxzLkRFRkFVTFRfTUVSR0VfRlVOQ1RJT04pO1xuICB9XG5cbiAgcHVibGljIG1lcmdlTGFiZWxDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0KTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUZpZWxkcyhjYXNlRmllbGRzLCBmb3JtRmllbGRzLCBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTik7XG4gIH1cblxuICBwdWJsaWMgY29udHJvbEl0ZXJhdG9yKFxuICAgIGFDb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gICAgZm9ybUFycmF5Rm46IChhcnJheTogRm9ybUFycmF5KSA9PiB2b2lkLFxuICAgIGZvcm1Hcm91cEZuOiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4gdm9pZCxcbiAgICBjb250cm9sRm46IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBpZiAoYUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHsgLy8gV2UncmUgaW4gYSBjb2xsZWN0aW9uXG4gICAgICBmb3JtQXJyYXlGbihhQ29udHJvbCk7XG4gICAgfSBlbHNlIGlmIChhQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgeyAvLyBXZSdyZSBpbiBhIGNvbXBsZXggdHlwZS5cbiAgICAgIGZvcm1Hcm91cEZuKGFDb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGFDb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHsgLy8gRm9ybUNvbnRyb2xcbiAgICAgIGNvbnRyb2xGbihhQ29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0LCBtZXJnZUZ1bmN0aW9uOiAoZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpID0+IHZvaWQpOiBvYmplY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogb2JqZWN0ID0gRmllbGRzVXRpbHMuY2xvbmVPYmplY3QoZm9ybUZpZWxkcyk7XG4gICAgY2FzZUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oZmllbGQsIHJlc3VsdCk7XG4gICAgICBpZiAoZmllbGQuZmllbGRfdHlwZSAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gdGhpcy5tZXJnZUZpZWxkcyhmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCByZXN1bHRbZmllbGQuaWRdLCBtZXJnZUZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
|