@smartbit4all/ng-client 6.0.48 → 6.0.50
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/esm2022/lib/smart-component-layout/api/api/api.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/api.module.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/configuration.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/encoder.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/index.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/param.mjs +1 -1
- package/esm2022/lib/smart-component-layout/api/variables.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/api/api.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/api/diagramService.service.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/api.module.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/configuration.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/encoder.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/index.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/diagramColor.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/diagramDataContainer.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/diagramDataItem.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/diagramDataSet.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/diagramDescriptor.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/diagramModel.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/diagramShape.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/drawTime.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/labelText.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/model/models.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/param.mjs +1 -1
- package/esm2022/lib/smart-diagram/api/variables.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/api/api.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/api.module.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/configuration.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/encoder.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/index.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilder.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/param.mjs +1 -1
- package/esm2022/lib/smart-filter-editor/api/variables.mjs +1 -1
- package/esm2022/lib/smart-form/api/api/default.service.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/dateFieldProperties.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/fileUploaderProperties.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/imageProperties.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/multiFileUploaderProperties.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/recordingUploaderProperties.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/textBoxProperties.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/textFieldProperties.mjs +1 -1
- package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +1 -1
- package/esm2022/lib/smart-form/services/smartform.service.mjs +4 -1
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +1 -1
- package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs +1 -1
- package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +3 -3
- package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +1 -1
- package/esm2022/lib/smart-map/api/api/api.mjs +1 -1
- package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +1 -1
- package/esm2022/lib/smart-map/api/api.module.mjs +1 -1
- package/esm2022/lib/smart-map/api/configuration.mjs +1 -1
- package/esm2022/lib/smart-map/api/encoder.mjs +1 -1
- package/esm2022/lib/smart-map/api/index.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +1 -1
- package/esm2022/lib/smart-map/api/model/models.mjs +1 -1
- package/esm2022/lib/smart-map/api/param.mjs +1 -1
- package/esm2022/lib/smart-map/api/variables.mjs +1 -1
- package/esm2022/lib/view-context/api/api/api.mjs +1 -1
- package/esm2022/lib/view-context/api/api/view.service.mjs +1 -1
- package/esm2022/lib/view-context/api/api.module.mjs +1 -1
- package/esm2022/lib/view-context/api/configuration.mjs +1 -1
- package/esm2022/lib/view-context/api/encoder.mjs +1 -1
- package/esm2022/lib/view-context/api/index.mjs +1 -1
- package/esm2022/lib/view-context/api/model/backgroundProcessInfo.mjs +1 -1
- package/esm2022/lib/view-context/api/model/badgeDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/clipboardData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/closeResult.mjs +1 -1
- package/esm2022/lib/view-context/api/model/componentConstraint.mjs +1 -1
- package/esm2022/lib/view-context/api/model/componentModel.mjs +1 -1
- package/esm2022/lib/view-context/api/model/componentModelChange.mjs +1 -1
- package/esm2022/lib/view-context/api/model/dataChange.mjs +1 -1
- package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +1 -1
- package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +1 -1
- package/esm2022/lib/view-context/api/model/deviceInfo.mjs +1 -1
- package/esm2022/lib/view-context/api/model/downloadedFile.mjs +1 -1
- package/esm2022/lib/view-context/api/model/iconPosition.mjs +1 -1
- package/esm2022/lib/view-context/api/model/imageResource.mjs +1 -1
- package/esm2022/lib/view-context/api/model/link.mjs +1 -1
- package/esm2022/lib/view-context/api/model/menuDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/menuOpenDirection.mjs +1 -1
- package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/messageData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/messageOption.mjs +1 -1
- package/esm2022/lib/view-context/api/model/messageOptionType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/messageResult.mjs +1 -1
- package/esm2022/lib/view-context/api/model/messageTextType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/messageType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/models.mjs +1 -1
- package/esm2022/lib/view-context/api/model/multiComboBoxElement.mjs +1 -1
- package/esm2022/lib/view-context/api/model/multiComboBoxModel.mjs +1 -1
- package/esm2022/lib/view-context/api/model/namedValidator.mjs +1 -1
- package/esm2022/lib/view-context/api/model/openPendingData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/publishedViewData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +1 -1
- package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +1 -1
- package/esm2022/lib/view-context/api/model/serverRequestType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/shellProperty.mjs +1 -1
- package/esm2022/lib/view-context/api/model/smartLinkData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/smartLinkMigrationStatus.mjs +1 -1
- package/esm2022/lib/view-context/api/model/statisticRecord.mjs +1 -1
- package/esm2022/lib/view-context/api/model/style.mjs +1 -1
- package/esm2022/lib/view-context/api/model/themeDefinition.mjs +1 -1
- package/esm2022/lib/view-context/api/model/themeDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiAction.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uploadWidgetType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uploadedFile.mjs +1 -1
- package/esm2022/lib/view-context/api/model/valueSet.mjs +1 -1
- package/esm2022/lib/view-context/api/model/view.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewApiError.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewConstraint.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewContext.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewContextChange.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewContextData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewState.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewType.mjs +1 -1
- package/esm2022/lib/view-context/api/param.mjs +1 -1
- package/esm2022/lib/view-context/api/variables.mjs +1 -1
- package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +1 -1
- package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +3 -3
- package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +3 -3
- package/esm2022/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.mjs +1 -1
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +1 -1
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +1 -1
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +1 -1
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +1 -1
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +1 -1
- package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +3 -3
- package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +13 -3
- package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +3 -3
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +1 -1
- package/fesm2022/smartbit4all-ng-client.mjs +35 -22
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +3 -1
- package/package.json +1 -1
- package/smartbit4all-ng-client-6.0.50.tgz +0 -0
- package/smartbit4all-ng-client-6.0.48.tgz +0 -0
|
@@ -146,6 +146,9 @@ export class SmartFormService {
|
|
|
146
146
|
widget = this.findSmartFormWidgetByKey(widgets, key);
|
|
147
147
|
if (widget) {
|
|
148
148
|
let value = this.getValueDeeply(data, key);
|
|
149
|
+
if (widget.type === SmartFormWidgetType.CHECK_BOX && typeof value !== 'boolean') {
|
|
150
|
+
value = value === 'true';
|
|
151
|
+
}
|
|
149
152
|
if (typeof value === 'boolean' &&
|
|
150
153
|
widget.type !== SmartFormWidgetType.TOGGLE &&
|
|
151
154
|
widget.type !== SmartFormWidgetType.CHECK_BOX) {
|
|
@@ -680,4 +683,4 @@ export function extractTime(widgetInstance) {
|
|
|
680
683
|
}
|
|
681
684
|
return time;
|
|
682
685
|
}
|
|
683
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1mb3JtL3NlcnZpY2VzL3NtYXJ0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFTMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFLL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDM0YsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7QUFHNUIsTUFBTSxPQUFPLGdCQUFnQjtJQVMzQixZQUFnQyxpQkFBeUM7UUFBekMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF3QjtRQVJ4RCxhQUFRLEdBQVcsV0FBVyxDQUFDO1FBQ2hELHFCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3BDLFVBQUssR0FBUSxFQUFFLENBQUM7UUFpbUJDLG9CQUFlLEdBQUcsSUFBSSxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNoRSw2QkFBd0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNELDBCQUFxQixHQUFHLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELGdDQUEyQixHQUFHLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELHNCQUFpQixHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLCtCQUEwQixHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELHdCQUFtQixHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLHNCQUFpQixHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLG1CQUFjLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFubUJvQixDQUFDO0lBRTdFLHVCQUF1QixDQUFDLEdBQVc7UUFDakMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLHdCQUF3QixDQUM5QixPQUFtRCxFQUNuRCxJQUFjO1FBRWQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3BCLElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO2dCQUN4QyxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQ3BDLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVztnQkFDMUMsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxjQUFjLEVBQzdDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUNELElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxnQkFBZ0I7Z0JBQy9DLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTtnQkFDckMsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxlQUFlO2dCQUM5QyxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFlBQVk7Z0JBQzNDLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUyxFQUN4QyxDQUFDO2dCQUNELElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2xFLFlBQVksR0FBRyxZQUFZO3lCQUN4QixNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO3lCQUN0QyxPQUFPLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUUvQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsT0FBK0IsRUFDL0IsR0FBVztRQUVYLElBQUksZ0JBQWtELENBQUM7UUFFdkQsS0FBSyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztpQkFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzNFLGdCQUFnQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3JCLE9BQU8sZ0JBQWdCLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFVLEVBQUUsR0FBVztRQUM1QyxJQUFJLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBVSxDQUFDO1FBRWYsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUNFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTO29CQUN0QixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtvQkFDakIsQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsRUFDekMsQ0FBQztvQkFDRCxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNYLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7cUJBQU0sQ0FBQztvQkFDTixLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsS0FBVTtRQUNoRCxJQUFJLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxDLElBQUksU0FBUyxHQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxTQUFjLENBQUM7UUFFbkIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN6RCxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTdCLElBQ0UsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFDbEQsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssU0FBUztnQkFDbkQsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFDbEQsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFDNUMsQ0FBQztnQkFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLDZGQUE2RjtnQkFDN0YsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDbEUsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDekMsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsT0FBWTtRQUNqQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5QixJQUNFLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVE7Z0JBQ3JDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVM7Z0JBQ3RDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVE7Z0JBQ3JDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTO2dCQUMvQixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSTtnQkFDMUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNsQixDQUFDLE9BQU8sRUFDUixDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUNuQyxDQUFDLGFBQXFCLEVBQUUsRUFBRSxDQUFDLEdBQUcsUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUMxRCxDQUFDO1lBRUYsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELGtCQUFrQixDQUFDLE9BQWdDLEVBQUUsT0FBMEI7UUFDN0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVUsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzlCLENBQUM7UUFDRCxNQUFNLElBQUksR0FBYSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLElBQUksTUFBd0MsQ0FBQztRQUM3QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDckQsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDM0MsSUFDRSxPQUFPLEtBQUssS0FBSyxTQUFTO3dCQUMxQixNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE1BQU07d0JBQzFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUyxFQUM3QyxDQUFDO3dCQUNELEtBQUssR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO29CQUNyQixDQUFDO29CQUNELElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDOUMsSUFDRSxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFdBQVc7NEJBQy9DLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsZ0JBQWdCLEVBQ3BELENBQUM7NEJBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQ0FDVixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNqQyxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUzt3QkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLO3dCQUN6QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxNQUFNO3dCQUMxQyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsY0FBYyxFQUNsRCxDQUFDO3dCQUNELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3dCQUNyQixJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDMUQsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7d0JBQzFCLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2hGLENBQUM7cUJBQU0sQ0FBQztvQkFDTix1QkFBdUI7b0JBQ3ZCLElBQUksWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2xDLFlBQVksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2hELE1BQU0sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDeEUsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDOUQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUM5RSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDckIsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQW9CLEVBQUUsRUFBRTtnQ0FDL0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dDQUNwRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQ0FDbkIsT0FBTyxJQUFJLENBQUM7NEJBQ2QsQ0FBQyxDQUFDLENBQUM7d0JBQ0wsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxNQUE0QixFQUFFLFNBQWM7UUFDL0UsSUFDRSxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE1BQU07WUFDMUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxlQUFlO1lBQ25ELE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsWUFBWTtZQUNoRCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFdBQVc7WUFDL0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxVQUFVLEVBQzlDLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNwRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztvQkFDekMsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFFakMsSUFBSSxtQkFBbUIsR0FBSSxNQUEyQixDQUFDLFNBQVMsQ0FBQztvQkFDakUsSUFBSSxlQUFlLEdBQUcsbUJBQW1CLEVBQUUsZUFBZSxJQUFJLGNBQWMsQ0FBQztvQkFFN0UsMEVBQTBFO29CQUMxRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQzt3QkFDakQsZUFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQjt3QkFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUM7NEJBQ2pELGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQyxxQkFBcUI7d0JBQ3pELENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLDJCQUEyQixDQUFDLFFBQVE7d0JBQzlELENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUNoQyxDQUFDO3dCQUNELElBQUksV0FBVyxHQUNiLG1CQUFtQixFQUFFLFdBQVcsSUFBSSxZQUFZLEVBQUUsV0FBVyxJQUFJLFdBQVcsQ0FBQzt3QkFFL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7NEJBQzdDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxtQkFBbUI7NEJBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO2dDQUM3QyxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsa0JBQWtCOzRCQUMvQyxDQUFDO3dCQUNILENBQUM7d0JBQ0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7NEJBQzNDLE9BQU87Z0NBQ0wsR0FBRyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUM7Z0NBQ3ZCLEtBQUssRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDO2dDQUM3QixJQUFJLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtnQ0FDOUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUM7NkJBQzFCLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNwRSxDQUFDO3lCQUFNLElBQ0wsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssMkJBQTJCLENBQUMsTUFBTTt3QkFDNUQsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQ2hDLENBQUM7d0JBQ0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEtBQWEsRUFBRSxFQUFFOzRCQUMxRCxPQUFPO2dDQUNMLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRTtnQ0FDZixLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQ0FDN0IsSUFBSSxFQUFFLG1CQUFtQixDQUFDLElBQUk7Z0NBQzlCLEtBQUssRUFBRSxLQUFLOzZCQUNiLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN2QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxhQUFhLENBQUMsTUFBZ0IsRUFBRSxRQUFnQjtRQUN0RCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLG1DQUFtQztZQUNuQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUEwQjtRQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxPQUFPLEVBQUUsT0FBUSxDQUFDLENBQUM7UUFFM0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFNBQVUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQzFCLElBQUksQ0FBQyxTQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQXlCLEVBQUUsRUFBRTtnQkFDM0QsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxrQkFBa0IsQ0FDaEIsT0FBa0QsRUFDbEQsT0FBeUIsRUFDekIsU0FBa0I7UUFFbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3JCLElBQ0UsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO2dCQUM3QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUztnQkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLO2dCQUN6QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEdBQUc7Z0JBQ3ZDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsR0FBRztnQkFDdkMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxPQUFPO2dCQUMzQyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVztnQkFDL0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxJQUFJO2dCQUN4QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7Z0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTtnQkFDMUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxjQUFjLEVBQ2xELENBQUM7Z0JBQ0QsSUFBSSxPQUFRLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMvQyxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVzt3QkFDL0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFDcEQsQ0FBQzt3QkFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDakIsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM1RixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsZ0JBQWdCO29CQUNwRCxPQUFPLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxFQUNwQyxDQUFDO29CQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsR0FBRyxNQUFNLENBQUMsR0FBRyxPQUFPLEVBQ3BCLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFDbkIsTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3RCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTt3QkFDL0IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFOzRCQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLEdBQUcsTUFBTSxDQUFDLEdBQUcsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUM1QixTQUFTLEVBQUUsK0NBQStDOzRCQUMxRCxNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFDO3dCQUNKLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQ2pELElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUN0QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3RFLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLEdBQUcsU0FBUyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFDNUIsTUFBTSxDQUFDLEtBQUssRUFDWixNQUFNLENBQUMsVUFBVSxFQUNqQixTQUFTLENBQ1YsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ2hGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQXlCLEVBQUUsSUFBdUI7UUFDbEUsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRU8saUJBQWlCLENBQ3ZCLEdBQVcsRUFDWCxLQUFjLEVBQ2QsVUFBb0IsRUFDcEIsVUFBNkI7UUFFN0IsSUFBSSxXQUFXLEdBQXVCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDaEMsQ0FBQztRQUNELFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM5QixVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBeUIsRUFBRSxFQUFFO1lBQzVDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDNUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyw4QkFBOEIsQ0FDcEMsT0FBK0IsRUFDL0IsS0FBdUI7UUFFdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3pCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDOUUsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN0QixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0RSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQy9CLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTs0QkFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0NBQzdCLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUs7NkJBQzFELENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBRUgsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxzREFBc0Q7b0JBQ3RELElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2RSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQy9CLElBQUksT0FBTyxHQUFVLEVBQUUsQ0FBQzt3QkFDeEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQWdCLEVBQUUsRUFBRTs0QkFDckMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQzdDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0NBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDekIsQ0FBQzt3QkFDSCxDQUFDLENBQUMsQ0FBQzt3QkFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQ25DLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQ2pELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFDTCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7Z0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsS0FBSztnQkFDekMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO2dCQUM3QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsR0FBRztnQkFDdkMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO2dCQUN2QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsT0FBTztnQkFDM0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxXQUFXO2dCQUMvQyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7Z0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsY0FBYyxFQUNsRCxDQUFDO2dCQUNELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBdUI7UUFDakMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25FLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQztZQUNqRCxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3BELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUF1QjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDdkQsSUFBSSxXQUFXLEdBQUcsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBRXZDLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBQ2pELHVDQUF1QztRQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztRQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1FBRW5ELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsT0FBK0IsRUFDL0IsV0FBMkM7UUFFM0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQTRCLEVBQUUsRUFBRTtZQUMvQyxJQUFJLGlCQUFpQixHQUFHLFdBQVcsRUFBRSxNQUFNO1lBQ3pDLGtGQUFrRjtZQUNsRixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FDckUsQ0FBQztZQUVGLElBQUksaUJBQWlCLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUN2QyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3JDLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQzs0QkFDbkMsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7d0JBQzFCLENBQUM7b0JBQ0gsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztvQkFDeEMsQ0FBQztvQkFDRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUzt3QkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLO3dCQUN6QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsS0FBSzt3QkFDekMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO3dCQUN2QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEdBQUc7d0JBQ3ZDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxNQUFNO3dCQUMxQyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsY0FBYyxFQUNsRCxDQUFDO3dCQUNELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO3dCQUN6QyxJQUFJLGFBQWEsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDckYsSUFBSSxZQUFZLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQzt3QkFDdEMsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO3dCQUMxQixJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7NEJBQ3ZDLDRDQUE0Qzs0QkFDNUMsbUVBQW1FOzRCQUNuRSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUM7d0JBQ25ELENBQUM7NkJBQU0sQ0FBQzs0QkFDTixhQUFhLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQzt3QkFDdkMsQ0FBQzt3QkFDRCxJQUFJLENBQUMsWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDOzRCQUNuQyx5QkFBeUI7NEJBQ3pCLE1BQU0sQ0FBQyxVQUFVLEdBQUc7Z0NBQ2xCLEdBQUcsVUFBVTtnQ0FDYjtvQ0FDRSxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQVE7b0NBQzlCLFFBQVEsRUFBRSxLQUFLO29DQUNmLFlBQVksRUFBRSxFQUFFO29DQUNoQixJQUFJLEVBQUUsVUFBVTtpQ0FDakI7NkJBQ0YsQ0FBQzs0QkFDRixvQkFBb0I7NEJBQ3BCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDNUMsQ0FBQzt3QkFDRCxJQUFJLFlBQVksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOzRCQUNuQyw0QkFBNEI7NEJBQzVCLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDNUMsaUJBQWlCOzRCQUNqQixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7NEJBQ3BCLElBQUksV0FBVyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dDQUMxQixVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDOzRCQUNsRCxDQUFDOzRCQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ25ELENBQUM7d0JBQ0QsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDOzRCQUNwRSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7Z0NBQ3BDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDOzRCQUM1QixDQUFDO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQzs0QkFDeEMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO2dDQUNqRCxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQzs0QkFDMUMsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsTUFBOEIsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDdEYsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUztnQkFDN0MsTUFBTSxDQUFDLFNBQVM7Z0JBQ2hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUN2QixDQUFDO2dCQUNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFZRCxjQUFjLENBQUMsT0FBZ0IsRUFBRSxJQUFhO1FBQzVDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0Qix5REFBeUQ7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsOENBQThDO1lBQzlDLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVqRSxxREFBcUQ7WUFFckQscUVBQXFFO1lBQ3JFLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLGNBQWM7WUFDL0YsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUN6RixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhO1lBQy9GLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVk7WUFFbEYscUVBQXFFO1lBQ3JFLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDbEYsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztZQUUxRSw0Q0FBNEM7WUFDNUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRWpFLHlCQUF5QjtZQUN6QixLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELDRDQUE0QztRQUM1QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQWdDO1FBQy9DLElBQ0UsSUFBSSxDQUFDLFNBQVUsQ0FBQyxjQUFjLEVBQUUsV0FBVztZQUMzQyxJQUFJLENBQUMsU0FBVSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBVSxDQUFDLE9BQU8sQ0FBQztZQUNwQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBVSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQztJQUVELHVCQUF1QixDQUFDLE1BQTRCLEVBQUUsVUFBbUI7UUFDdkUsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQztvQkFDeEIsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUNsQixLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUU7b0JBQ3ZCLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO29CQUM5QixLQUFLLEVBQUUsRUFBRSxFQUFFLDZFQUE2RTtpQkFDekYsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsNEJBQTRCLENBQUMsTUFBNEI7UUFDdkQsSUFBSSxXQUFXLElBQUksTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLFNBQVMsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCLENBQUMsT0FBK0I7UUFDdkQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBNEIsRUFBRSxFQUFFLENBQ3JELE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ3pELENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQVc7UUFDM0MsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFVLENBQUMsZ0JBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RFLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQStCO1FBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBNEIsRUFBRSxFQUFFO1lBQ2pELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxjQUFjO2dCQUFFLE9BQU87WUFDL0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUMxQixNQUFNLENBQUMsYUFBYSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMzQyxDQUFDO2dCQUNELFNBQVM7Z0JBQ1QsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRXBFLGNBQWM7Z0JBQ2QsSUFDRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsVUFBVTtvQkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxpQkFBaUI7b0JBQ3JELE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsZ0JBQWdCO29CQUNwRCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7b0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsUUFBUSxDQUFDO29CQUMvQyxNQUFNLENBQUMsV0FBVyxFQUNsQixDQUFDO29CQUNELElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzt3QkFDaEMsTUFBTSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN2RCxDQUFDO29CQUNELE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ2xGLENBQUM7Z0JBRUQsYUFBYTtnQkFDYixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUztvQkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLO29CQUN6QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7b0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsR0FBRztvQkFDdkMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO29CQUN2QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLGFBQWE7b0JBQ2pELE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsbUJBQW1CO29CQUN2RCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE9BQU87b0JBQzNDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTtvQkFDMUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO29CQUM3QyxNQUFNLENBQUMsVUFBVSxFQUNqQixDQUFDO29CQUNELE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNuQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBeUIsRUFBRSxFQUFFO3dCQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLENBQUM7NEJBQ3BDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDL0QsQ0FBQzt3QkFDRCxTQUFTLENBQUMsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUNyRCxTQUFTLENBQUMsb0JBQW9CLENBQy9CLENBQUM7d0JBQ0YsT0FBTyxTQUFTLENBQUM7b0JBQ25CLENBQUMsQ0FBQyxDQUNILENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxZQUFZO2dCQUNaLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO3dCQUNwRCxNQUFNLENBQUMsU0FBUyxDQUFDLDZCQUE2Qjs0QkFDNUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6RSxDQUFDO29CQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMscUJBQXFCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN4RCxNQUFNLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FDeEMsS0FBSyxFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUNyQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FDNUIsTUFBTSxDQUFDLFNBQVUsQ0FBQyw2QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FDeEQsQ0FDSixDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxJQUNFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxnQkFBZ0I7b0JBQ25ELE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTtvQkFDMUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxlQUFlO29CQUNuRCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFdBQVc7b0JBQy9DLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsWUFBWSxDQUFDO29CQUNuRCxNQUFNLENBQUMsU0FBUyxFQUNoQixDQUFDO29CQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFVLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBMEI7UUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUF1QixFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLGFBQWEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsU0FBUztZQUNULE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOytHQWx5QlUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQVVJLFFBQVE7O0FBNHhCdkIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxjQUF3QztJQUNsRSxJQUFJLElBQUksQ0FBQztJQUNULElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdFLElBQUksR0FBRyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEYsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRSxjQUFjLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksR0FBRyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25EZWZpbml0aW9uVHlwZUVudW0sIFNtYXJ0Rm9ybVdpZGdldFR5cGUgfSBmcm9tICcuLi9hcGknO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0RGF0ZVRpbWVQaWNrZXIsXHJcbiAgU21hcnRGb3JtV2lkZ2V0LFxyXG4gIFNtYXJ0SXRlbSxcclxuICBTbWFydEl0ZW1zLFxyXG4gIFNtYXJ0U2VsZWN0LFxyXG59IGZyb20gJy4uL3NtYXJ0Zm9ybS5mb3JtLW1vZGVsJztcclxuaW1wb3J0IHsgU21hcnRGb3JtLCBTbWFydEZvcm1Db21wb25lbnRDb25zdHJhaW50LCBTbWFydFZhbGlkYXRvciwgVmFsdWUgfSBmcm9tICcuLi9zbWFydGZvcm0ubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMaWJyYXJ5IH0gZnJvbSAnLi4vLi4vdmlldy1jb250ZXh0L3V0aWxpdHkvY29tcG9uZW50TGlicmFyeSc7XHJcbmltcG9ydCB7XHJcbiAgTmFtZWRWYWxpZGF0b3JTZXJ2aWNlLFxyXG4gIFZhbGlkYXRlZFdpZGdldCxcclxufSBmcm9tICcuLi8uLi9zbWFydC12YWxpZGF0aW9uL25hbWVkLXZhbGlkYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU21hcnRXaWRnZXRTZXR0aW5ncyB9IGZyb20gJy4uL3dpZGdldHMvc21hcnRmb3Jtd2lkZ2V0L3NtYXJ0Zm9ybXdpZGdldC5jb21wb25lbnQnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTbWFydEZvcm1TZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5S2V5OiBzdHJpbmcgPSAnZSNtJXBAdCp5JztcclxuICBjb21wb25lbnRMaWJyYXJ5ID0gQ29tcG9uZW50TGlicmFyeTtcclxuICBncm91cDogYW55ID0ge307XHJcblxyXG4gIGZvcm1Hcm91cD86IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gIHNtYXJ0Rm9ybT86IFNtYXJ0Rm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJpdmF0ZSB2YWxpZGF0b3JQcm92aWRlcj86IE5hbWVkVmFsaWRhdG9yU2VydmljZSkge31cclxuXHJcbiAgZ2V0U21hcnRGb3JtV2lkZ2V0QnlLZXkoa2V5OiBzdHJpbmcpOiBTbWFydEZvcm1XaWRnZXQ8YW55PiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5maW5kU21hcnRGb3JtV2lkZ2V0QnlLZXkodGhpcy5zbWFydEZvcm0/LndpZGdldHMhLCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb2xsZWN0S2V5c0Zyb21TbWFydEZvcm0oXHJcbiAgICB3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdIHwgU21hcnRJdGVtczxhbnk+W10sXHJcbiAgICBrZXlzOiBzdHJpbmdbXVxyXG4gICk6IHN0cmluZ1tdIHtcclxuICAgIHdpZGdldHMuZm9yRWFjaCgodykgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdy50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICAgIHcudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICAgIHcudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiAmJlxyXG4gICAgICAgIHcudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICApIHtcclxuICAgICAgICBrZXlzLnB1c2gody5rZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICB3LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyB8fFxyXG4gICAgICAgIHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1QgfHxcclxuICAgICAgICB3LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUX01VTFRJUExFIHx8XHJcbiAgICAgICAgdy50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTiB8fFxyXG4gICAgICAgIHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVJcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKHcudmFsdWVMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIGtleXMgPSB0aGlzLmNvbGxlY3RLZXlzRnJvbVNtYXJ0Rm9ybSh3LnZhbHVlTGlzdCwga2V5cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMikge1xyXG4gICAgICAgIGlmICh3LnZhbHVlTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsZXQgY2hpbGRyZW5LZXlzID0gdGhpcy5jb2xsZWN0S2V5c0Zyb21TbWFydEZvcm0ody52YWx1ZUxpc3QsIFtdKTtcclxuICAgICAgICAgIGNoaWxkcmVuS2V5cyA9IGNoaWxkcmVuS2V5c1xyXG4gICAgICAgICAgICAuZmlsdGVyKChrZXk6IHN0cmluZykgPT4ga2V5ICE9PSB3LmtleSlcclxuICAgICAgICAgICAgLmZsYXRNYXAoKGtleTogc3RyaW5nKSA9PiBgJHt3LmtleX0uJHtrZXl9YCk7XHJcblxyXG4gICAgICAgICAga2V5cy5wdXNoKC4uLmNoaWxkcmVuS2V5cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZFNtYXJ0Rm9ybVdpZGdldEJ5S2V5KFxyXG4gICAgd2lkZ2V0czogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSxcclxuICAgIGtleTogc3RyaW5nXHJcbiAgKTogU21hcnRGb3JtV2lkZ2V0PGFueT4gfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IHdpZGdldEZvdW5kQnlLZXk6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGZvciAobGV0IHcgb2Ygd2lkZ2V0cykge1xyXG4gICAgICBpZiAody5rZXkgPT09IGtleSkge1xyXG4gICAgICAgIHJldHVybiB3O1xyXG4gICAgICB9IGVsc2UgaWYgKHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiYgdy52YWx1ZUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHdpZGdldEZvdW5kQnlLZXkgPSB0aGlzLmZpbmRTbWFydEZvcm1XaWRnZXRCeUtleSh3LnZhbHVlTGlzdCwga2V5KTtcclxuICAgICAgICBpZiAod2lkZ2V0Rm91bmRCeUtleSkge1xyXG4gICAgICAgICAgcmV0dXJuIHdpZGdldEZvdW5kQnlLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gd2lkZ2V0Rm91bmRCeUtleTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VmFsdWVEZWVwbHkobW9kZWw6IGFueSwga2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgbGV0IHNwbGl0dGVkS2V5ID0ga2V5LnNwbGl0KCcuJyk7XHJcbiAgICBsZXQgdmFsdWU6IGFueTtcclxuXHJcbiAgICBzcGxpdHRlZEtleS5mb3JFYWNoKChrOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgIHZhbHVlID0gbW9kZWxba107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdmFsdWVba10gPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgICAgdmFsdWVba10gPT09IG51bGwgfHxcclxuICAgICAgICAgICghdmFsdWUgJiYgdHlwZW9mIHZhbHVlW2tdICE9PSAnYm9vbGVhbicpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlW2tdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZURlZXBseShtb2RlbDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IHNwbGl0dGVkS2V5cyA9IGtleS5zcGxpdCgnLicpO1xyXG5cclxuICAgIGxldCBkZWVwTW9kZWw6IGFueVtdID0gW21vZGVsXTtcclxuICAgIGxldCB0ZW1wTW9kZWw6IGFueTtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3BsaXR0ZWRLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICB0ZW1wTW9kZWwgPSBkZWVwTW9kZWxbaW5kZXhdO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ2Jvb2xlYW4nICYmXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ251bWJlcicgJiZcclxuICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09IHVuZGVmaW5lZFxyXG4gICAgICApIHtcclxuICAgICAgICBkZWVwTW9kZWwucHVzaCh0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW5kZXggPT09IHNwbGl0dGVkS2V5cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgbGV0IG9sZFZhbHVlID0gdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dO1xyXG4gICAgICAgIC8vIGlmICh2YWx1ZSA9PT0gJycgJiYgKG9sZFZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHRoZW4gZG9uJ3QgY2hhbmdlIHZhbHVlLlxyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gJycgfHwgKG9sZFZhbHVlICE9PSBudWxsICYmIG9sZFZhbHVlICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFByb3BlcnR5TmFtZXNEZWVwbHkoZWxlbWVudDogYW55KTogc3RyaW5nW10ge1xyXG4gICAgbGV0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhlbGVtZW50KTtcclxuICAgIHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiBlbGVtZW50W3Byb3BlcnR5XSA9PT0gJ3N0cmluZycgfHxcclxuICAgICAgICB0eXBlb2YgZWxlbWVudFtwcm9wZXJ0eV0gPT09ICdib29sZWFuJyB8fFxyXG4gICAgICAgIHR5cGVvZiBlbGVtZW50W3Byb3BlcnR5XSA9PT0gJ251bWJlcicgfHxcclxuICAgICAgICBlbGVtZW50W3Byb3BlcnR5XSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgZWxlbWVudFtwcm9wZXJ0eV0gPT09IG51bGwgfHxcclxuICAgICAgICAhZWxlbWVudFtwcm9wZXJ0eV0gfHxcclxuICAgICAgICAhZWxlbWVudFxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGlubmVyUHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lc0RlZXBseShlbGVtZW50W3Byb3BlcnR5XSk7XHJcbiAgICAgIGlubmVyUHJvcGVydGllcyA9IGlubmVyUHJvcGVydGllcy5tYXAoXHJcbiAgICAgICAgKGlubmVyUHJvcGVydHk6IHN0cmluZykgPT4gYCR7cHJvcGVydHl9LiR7aW5uZXJQcm9wZXJ0eX1gXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBwcm9wZXJ0aWVzLnB1c2goLi4uaW5uZXJQcm9wZXJ0aWVzKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZXNGcm9tTW9kZWwod2lkZ2V0cz86IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10sIGNvbXBMaWI/OiBDb21wb25lbnRMaWJyYXJ5KTogdm9pZCB7XHJcbiAgICBjb25zdCBzbWFydEZvcm0gPSB0aGlzLnNtYXJ0Rm9ybSE7XHJcbiAgICBjb25zdCBkYXRhID0gc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsPy5kYXRhO1xyXG4gICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXdpZGdldHMpIHtcclxuICAgICAgd2lkZ2V0cyA9IHNtYXJ0Rm9ybS53aWRnZXRzO1xyXG4gICAgfVxyXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSB0aGlzLmNvbGxlY3RLZXlzRnJvbVNtYXJ0Rm9ybSh3aWRnZXRzLCBbXSk7XHJcblxyXG4gICAgbGV0IHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmdldFByb3BlcnR5TmFtZXNEZWVwbHkoZGF0YSkpIHtcclxuICAgICAgaWYgKGtleXMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgIHdpZGdldCA9IHRoaXMuZmluZFNtYXJ0Rm9ybVdpZGdldEJ5S2V5KHdpZGdldHMsIGtleSk7XHJcbiAgICAgICAgaWYgKHdpZGdldCkge1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZURlZXBseShkYXRhLCBrZXkpO1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5UT0dHTEUgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUiB8fFxyXG4gICAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVJcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB3aWRnZXQudmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHdpZGdldC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICBpZiAod2lkZ2V0LnNob3dMYWJlbCA9PT0gdW5kZWZpbmVkICYmIHNtYXJ0Rm9ybS5zaG93TGFiZWwpIHtcclxuICAgICAgICAgICAgICB3aWRnZXQuc2hvd0xhYmVsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuY29weUZyb21WYWx1ZVNldFRvVmFsdWVzTGlzdCh3aWRnZXQsIHNtYXJ0Rm9ybS5jb21wb25lbnRNb2RlbC52YWx1ZVNldHMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBJbiBjYXNlIG9mIENoZWNrQm94MlxyXG4gICAgICAgICAgbGV0IHNwbGl0dGVkS2V5cyA9IGtleS5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgc3BsaXR0ZWRLZXlzLnNwbGljZShzcGxpdHRlZEtleXMubGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgICB3aWRnZXQgPSB0aGlzLmZpbmRTbWFydEZvcm1XaWRnZXRCeUtleSh3aWRnZXRzLCBzcGxpdHRlZEtleXMuam9pbignLicpKTtcclxuICAgICAgICAgIGlmICh3aWRnZXQgJiYgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzIpIHtcclxuICAgICAgICAgICAgdGhpcy5jb3B5RnJvbVZhbHVlU2V0VG9WYWx1ZXNMaXN0KHdpZGdldCwgc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLnZhbHVlU2V0cyk7XHJcbiAgICAgICAgICAgIGlmICh3aWRnZXQudmFsdWVMaXN0KSB7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdCA9IHdpZGdldC52YWx1ZUxpc3QubWFwKChpdGVtOiBTbWFydEl0ZW08YW55PikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZURlZXBseShkYXRhLCBgJHt3aWRnZXQ/LmtleX0uJHtpdGVtLmtleX1gKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvcHlGcm9tVmFsdWVTZXRUb1ZhbHVlc0xpc3Qod2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55PiwgdmFsdWVTZXRzOiBhbnkpIHtcclxuICAgIGlmIChcclxuICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUIHx8XHJcbiAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxyXG4gICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT04gfHxcclxuICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzIgfHxcclxuICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRFxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh3aWRnZXQuc2VsZWN0aW9uICYmIHZhbHVlU2V0cykge1xyXG4gICAgICAgIGxldCB2YWx1ZVNldCA9IHZhbHVlU2V0c1t3aWRnZXQuc2VsZWN0aW9uLnZhbHVlU2V0TmFtZV07XHJcbiAgICAgICAgaWYgKCF2YWx1ZVNldCkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCd2YWx1ZVNldCBub3QgZm91bmQnLCB3aWRnZXQuc2VsZWN0aW9uLnZhbHVlU2V0TmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCB2YWx1ZVNldERhdGEgPSB2YWx1ZVNldC52YWx1ZVNldERhdGE7XHJcbiAgICAgICAgICBsZXQgdmFsdWVzID0gdmFsdWVTZXREYXRhLnZhbHVlcztcclxuXHJcbiAgICAgICAgICBsZXQgc2VsZWN0aW9uRGVmaW5pdGlvbiA9ICh3aWRnZXQgYXMgU21hcnRTZWxlY3Q8YW55Pikuc2VsZWN0aW9uO1xyXG4gICAgICAgICAgbGV0IGRpc3BsYXlQcm9wZXJ0eSA9IHNlbGVjdGlvbkRlZmluaXRpb24/LmRpc3BsYXlQcm9wZXJ0eSA/PyAnZGlzcGxheVZhbHVlJztcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayBpcyBkaXNwbGF5UHJvcGVydHkgZXhpc3RzLCBmYWxsYmFjayBmb3IgY29tbW9uIGRpc3BsYXkgcHJvcGVydGllc1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNoZWNrUHJvcGVydHkodmFsdWVzLCBkaXNwbGF5UHJvcGVydHkpKSB7XHJcbiAgICAgICAgICAgIGRpc3BsYXlQcm9wZXJ0eSA9ICduYW1lJzsgLy8gR2VuZXJpY1ZhbHVlLm5hbWVcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrUHJvcGVydHkodmFsdWVzLCBkaXNwbGF5UHJvcGVydHkpKSB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheVByb3BlcnR5ID0gJ2Rpc3BsYXlWYWx1ZSc7IC8vIFZhbHVlLmRpc3BsYXlWYWx1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpZGdldC5zZWxlY3Rpb24udHlwZSA9PT0gU2VsZWN0aW9uRGVmaW5pdGlvblR5cGVFbnVtLlBST1BFUlRZICYmXHJcbiAgICAgICAgICAgICF3aWRnZXQuc2VsZWN0aW9uLm1hcHBpbmcubGVuZ3RoXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgbGV0IGtleVByb3BlcnR5ID1cclxuICAgICAgICAgICAgICBzZWxlY3Rpb25EZWZpbml0aW9uPy5rZXlQcm9wZXJ0eSA/PyB2YWx1ZVNldERhdGE/LmtleVByb3BlcnR5ID8/ICdvYmplY3RVcmknO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrUHJvcGVydHkodmFsdWVzLCBrZXlQcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgICBrZXlQcm9wZXJ0eSA9ICd1cmknOyAvLyBHZW5lcmljVmFsdWUudXJpXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrUHJvcGVydHkodmFsdWVzLCBrZXlQcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgICAgIGtleVByb3BlcnR5ID0gJ29iamVjdFVyaSc7IC8vIFZhbHVlLm9iamVjdFVyaVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aWRnZXQudmFsdWVMaXN0ID0gdmFsdWVzLm1hcCgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IHZhbHVlW2tleVByb3BlcnR5XSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZVtkaXNwbGF5UHJvcGVydHldLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2tleVByb3BlcnR5XSxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5hZGRFbXB0eUl0ZW1Ub1ZhbHVlTGlzdCh3aWRnZXQsIHdpZGdldC5zZWxlY3Rpb24uZW1wdHlMYWJlbCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICB3aWRnZXQuc2VsZWN0aW9uLnR5cGUgPT09IFNlbGVjdGlvbkRlZmluaXRpb25UeXBlRW51bS5PQkpFQ1QgJiZcclxuICAgICAgICAgICAgIXdpZGdldC5zZWxlY3Rpb24ubWFwcGluZy5sZW5ndGhcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB3aWRnZXQudmFsdWVMaXN0ID0gdmFsdWVzLm1hcCgodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGAke2luZGV4fWAsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogdmFsdWVbZGlzcGxheVByb3BlcnR5XSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSVRFTSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5hZGRFbXB0eUl0ZW1Ub1ZhbHVlTGlzdCh3aWRnZXQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1Byb3BlcnR5KHZhbHVlczogb2JqZWN0W10sIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghdmFsdWVzPy5sZW5ndGgpIHtcclxuICAgICAgLy8gbm8gc2FtcGxlIGRhdGEsIGFzc3VtZSBleGlzdGFuY2VcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcGVydHkgaW4gdmFsdWVzWzBdO1xyXG4gIH1cclxuXHJcbiAgdG9Gb3JtR3JvdXAoY29tcExpYj86IENvbXBvbmVudExpYnJhcnkpOiBVbnR5cGVkRm9ybUdyb3VwIHtcclxuICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKHRoaXMuc21hcnRGb3JtIS53aWRnZXRzLCBjb21wTGliISk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzID0gdGhpcy5ncm91cDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAodGhpcy5ncm91cCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc21hcnRGb3JtIS52YWxpZGF0b3JzICYmIHRoaXMuc21hcnRGb3JtIS52YWxpZGF0b3JzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5zZXRWYWxpZGF0b3JzKFxyXG4gICAgICAgIHRoaXMuc21hcnRGb3JtIS52YWxpZGF0b3JzLm1hcCgodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0b3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXA7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVGb3JtQ29udHJvbHMoXHJcbiAgICB3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdIHwgU21hcnRJdGVtPGFueT5bXSxcclxuICAgIGNvbXBMaWI6IENvbXBvbmVudExpYnJhcnksXHJcbiAgICBwYXJlbnRLZXk/OiBzdHJpbmdcclxuICApOiB2b2lkIHtcclxuICAgIHdpZGdldHMubWFwKCh3aWRnZXQpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzIgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTUFUUklYICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVJcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKGNvbXBMaWIhID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUiB8fFxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKHdpZGdldC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHdpZGdldC52YWx1ZSA9IG5ldyBEYXRlKHdpZGdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChgJHt3aWRnZXQua2V5fWAsIHdpZGdldC52YWx1ZSwgd2lkZ2V0LmlzRGlzYWJsZWQsIHdpZGdldC52YWxpZGF0b3JzKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSICYmXHJcbiAgICAgICAgICBjb21wTGliICE9PSBDb21wb25lbnRMaWJyYXJ5LlBSSU1FTkdcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgIGAke3dpZGdldC5rZXl9LXRpbWVgLFxyXG4gICAgICAgICAgICBleHRyYWN0VGltZSh3aWRnZXQpLFxyXG4gICAgICAgICAgICB3aWRnZXQuaXNEaXNhYmxlZCxcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbGlkYXRvcnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTUFUUklYKSB7XHJcbiAgICAgICAgaWYgKHdpZGdldC5pc011bHRpcGxlKSB7XHJcbiAgICAgICAgICBsZXQgZGF0YUtleXMgPSBPYmplY3Qua2V5cyh3aWRnZXQudmFsdWUuZGF0YSk7XHJcbiAgICAgICAgICBsZXQgaXRlbUtleXMgPSB3aWRnZXQudmFsdWUuY29sdW1ucy5tYXAoKHZhbHVlOiBWYWx1ZSkgPT4gdmFsdWUuY29kZSk7XHJcbiAgICAgICAgICBkYXRhS2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpdGVtS2V5cy5mb3JFYWNoKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgICAgYCR7d2lkZ2V0LmtleX0uZGF0YS4ke2tleX0uJHtpdGVtfWAsXHJcbiAgICAgICAgICAgICAgICB3aWRnZXQudmFsdWUuZGF0YVtrZXldW2l0ZW1dLFxyXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLCAvLyBUT0RPIHJlYWxseSB3ZSBkb24ndCBwYXNzIHdpZGdldC5pc0Rpc2FibGVkP1xyXG4gICAgICAgICAgICAgICAgd2lkZ2V0LnZhbGlkYXRvcnNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyh3aWRnZXQudmFsdWUuZGF0YSkubWFwKChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgIGAke3dpZGdldC5rZXl9LiR7a2V5fWAsXHJcbiAgICAgICAgICAgICAgd2lkZ2V0LmlzTXVsdGlwbGUgPyB3aWRnZXQudmFsdWUuZGF0YVtrZXldIDogd2lkZ2V0LnZhbHVlLmRhdGFba2V5XVswXSxcclxuICAgICAgICAgICAgICB3aWRnZXQuaXNEaXNhYmxlZCxcclxuICAgICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9yc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNICYmIHBhcmVudEtleSkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICBgJHtwYXJlbnRLZXl9LiR7d2lkZ2V0LmtleX1gLFxyXG4gICAgICAgICAgd2lkZ2V0LnZhbHVlLFxyXG4gICAgICAgICAgd2lkZ2V0LmlzRGlzYWJsZWQsXHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmIHdpZGdldC52YWx1ZUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKHdpZGdldC52YWx1ZUxpc3QsIGNvbXBMaWIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiAmJiB3aWRnZXQudmFsdWVMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9scyh3aWRnZXQudmFsdWVMaXN0LCBjb21wTGliLCB3aWRnZXQua2V5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc1ZhbGlkYXRvckluTGlzdCh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yLCBsaXN0PzogU21hcnRWYWxpZGF0b3JbXSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGxpc3QgIT09IHVuZGVmaW5lZCAmJiBsaXN0Lmxlbmd0aCA+IDAgJiYgbGlzdC5zb21lKCh2KSA9PiB2ID09PSB2YWxpZGF0b3IpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtQ29udHJvbChcclxuICAgIGtleTogc3RyaW5nLFxyXG4gICAgdmFsdWU/OiBzdHJpbmcsXHJcbiAgICBpc0Rpc2FibGVkPzogYm9vbGVhbixcclxuICAgIHZhbGlkYXRvcnM/OiBTbWFydFZhbGlkYXRvcltdXHJcbiAgKTogVW50eXBlZEZvcm1Db250cm9sIHtcclxuICAgIGxldCBmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gdGhpcy5ncm91cFtrZXldO1xyXG4gICAgaWYgKCFmb3JtQ29udHJvbCkge1xyXG4gICAgICBmb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICAgICAgdGhpcy5ncm91cFtrZXldID0gZm9ybUNvbnRyb2w7XHJcbiAgICB9XHJcbiAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSB8fCAnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgZm9ybUNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICB2YWxpZGF0b3JzPy5tYXAoKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHtcclxuICAgICAgZm9ybUNvbnRyb2wuYWRkVmFsaWRhdG9ycyh2YWxpZGF0b3IudmFsaWRhdG9yKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChpc0Rpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGlzRGlzYWJsZWQpIHtcclxuICAgICAgICBmb3JtQ29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3JtQ29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZm9ybUNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvcHlWYWx1ZUZyb21Gb3JtVG9XaWRnZXRCZWFucyhcclxuICAgIHdpZGdldHM6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10sXHJcbiAgICBncm91cDogVW50eXBlZEZvcm1Hcm91cFxyXG4gICk6IHZvaWQge1xyXG4gICAgd2lkZ2V0cy5mb3JFYWNoKCh3aWRnZXQpID0+IHtcclxuICAgICAgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJiB3aWRnZXQudmFsdWVMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNvcHlWYWx1ZUZyb21Gb3JtVG9XaWRnZXRCZWFucyh3aWRnZXQudmFsdWVMaXN0LCBncm91cCk7XHJcbiAgICAgIH0gZWxzZSBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTUFUUklYKSB7XHJcbiAgICAgICAgaWYgKHdpZGdldC5pc011bHRpcGxlKSB7XHJcbiAgICAgICAgICBsZXQgZGF0YUtleXMgPSBPYmplY3Qua2V5cyh3aWRnZXQudmFsdWUuZGF0YSk7XHJcbiAgICAgICAgICBsZXQgaXRlbUtleXMgPSB3aWRnZXQudmFsdWUuY29sdW1ucy5tYXAoKHZhbHVlOiBWYWx1ZSkgPT4gdmFsdWUuY29kZSk7XHJcbiAgICAgICAgICBkYXRhS2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpdGVtS2V5cy5mb3JFYWNoKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICB3aWRnZXQudmFsdWUuZGF0YVtrZXldW2l0ZW1dID0gW1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAuY29udHJvbHNbYCR7d2lkZ2V0LmtleX0uZGF0YS4ke2tleX0uJHtpdGVtfWBdLnZhbHVlLFxyXG4gICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgbGV0IGRhdGFrZXlzID0gT2JqZWN0LmtleXMod2lkZ2V0LnZhbHVlLmRhdGEpO1xyXG4gICAgICAgICAgLy9NYXAgY2hlY2tib3gga2V5IC0gYm9vbGVhbiB2YWx1ZSB0byBzdHJpbmcga2V5IGFycmF5XHJcbiAgICAgICAgICBsZXQgdmFsdWVLZXlzID0gd2lkZ2V0LnZhbHVlLmNvbHVtbnMubWFwKCh2YWx1ZTogVmFsdWUpID0+IHZhbHVlLmNvZGUpO1xyXG4gICAgICAgICAgZGF0YWtleXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IG5ld0RhdGE6IGFueVtdID0gW107XHJcbiAgICAgICAgICAgIHZhbHVlS2V5cy5mb3JFYWNoKCh2YWx1ZUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IHZhbHVlID0gd2lkZ2V0LnZhbHVlLmRhdGFba2V5XVt2YWx1ZUtleV07XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdEYXRhLnB1c2godmFsdWVLZXkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHdpZGdldC52YWx1ZS5kYXRhW2tleV0gPSBuZXdEYXRhO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKHdpZGdldC52YWx1ZS5kYXRhKS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHdpZGdldC52YWx1ZS5kYXRhW2tleV0gPSBbZ3JvdXAuY29udHJvbHNbYCR7d2lkZ2V0LmtleX0uJHtrZXl9YF0udmFsdWVdO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzIgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICApIHtcclxuICAgICAgICB3aWRnZXQudmFsdWUgPSBncm91cC5jb250cm9sc1t3aWRnZXQua2V5XS52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b1NtYXJ0Rm9ybShncm91cDogVW50eXBlZEZvcm1Hcm91cCk6IFNtYXJ0Rm9ybSB7XHJcbiAgICBpZiAodGhpcy5zbWFydEZvcm0pIHtcclxuICAgICAgdGhpcy5jb3B5VmFsdWVGcm9tRm9ybVRvV2lkZ2V0QmVhbnModGhpcy5zbWFydEZvcm0ud2lkZ2V0cywgZ3JvdXApO1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zbWFydEZvcm0uY29tcG9uZW50TW9kZWw/LmRhdGE7XHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5nZXRQcm9wZXJ0eU5hbWVzRGVlcGx5KGRhdGEpKSB7XHJcbiAgICAgICAgICBpZiAoZ3JvdXAuY29udHJvbHNba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlRGVlcGx5KGRhdGEsIGtleSwgZ3JvdXAuY29udHJvbHNba2V5XS52YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydEZvcm0hO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9kZWwoZ3JvdXA6IFVudHlwZWRGb3JtR3JvdXApOiBhbnkge1xyXG4gICAgaWYgKCF0aGlzLnNtYXJ0Rm9ybT8uY29tcG9uZW50TW9kZWwpIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgbGV0IG9yaWdpbmFsTW9kZWwgPSB0aGlzLnNtYXJ0Rm9ybS5jb21wb25lbnRNb2RlbC5kYXRhO1xyXG4gICAgbGV0IGNvcHlPZk1vZGVsID0geyAuLi5vcmlnaW5hbE1vZGVsIH07XHJcblxyXG4gICAgLy8gY29weU9mTW9kZWwgc2hvdWxkIGJlIHRoZSBjdXJyZW50IG1vZGVsXHJcbiAgICB0aGlzLnNtYXJ0Rm9ybS5jb21wb25lbnRNb2RlbC5kYXRhID0gY29weU9mTW9kZWw7XHJcbiAgICAvLyBjb3B5IHZhbHVlIGZyb20gRm9ybUdyb3VwIGludG8gbW9kZWxcclxuICAgIHRoaXMudG9TbWFydEZvcm0oZ3JvdXApO1xyXG5cclxuICAgIGxldCBuZXdNb2RlbCA9IHRoaXMuc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLmRhdGE7XHJcbiAgICB0aGlzLnNtYXJ0Rm9ybS5jb21wb25lbnRNb2RlbC5kYXRhID0gb3JpZ2luYWxNb2RlbDtcclxuXHJcbiAgICByZXR1cm4gbmV3TW9kZWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5Q29tcG9uZW50Q29uc3RyYWludHMoXHJcbiAgICB3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdLFxyXG4gICAgY29uc3RyYWludHM6IFNtYXJ0Rm9ybUNvbXBvbmVudENvbnN0cmFpbnRbXVxyXG4gICkge1xyXG4gICAgd2lkZ2V0cy5mb3JFYWNoKCh3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KSA9PiB7XHJcbiAgICAgIGxldCB3aWRnZXRDb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzPy5maWx0ZXIoXHJcbiAgICAgICAgLy8oY29uc3RyYWludDogU21hcnRGb3JtQ29tcG9uZW50Q29uc3RyYWludCkgPT4gY29uc3RyYWludC5kYXRhTmFtZSA9PT0gd2lkZ2V0LmtleVxyXG4gICAgICAgIChjb25zdHJhaW50KSA9PiB0aGlzLmFudFBhdGhNYXRjaGVyKGNvbnN0cmFpbnQuZGF0YU5hbWUsIHdpZGdldC5rZXkpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAod2lkZ2V0Q29uc3RyYWludHMgJiYgd2lkZ2V0Q29uc3RyYWludHMubGVuZ3RoKSB7XHJcbiAgICAgICAgd2lkZ2V0Q29uc3RyYWludHMuZm9yRWFjaCgoY29uc3RyYWludCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNvbnN0cmFpbnQudmlzaWJsZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh3aWRnZXQuaXNWaXNpYmxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB3aWRnZXQuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2lkZ2V0LmlzVmlzaWJsZSA9IGNvbnN0cmFpbnQudmlzaWJsZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID0gd2lkZ2V0LnZhbGlkYXRvcnMgPz8gW107XHJcbiAgICAgICAgICAgIGxldCByZXF1aXJlZEluZGV4ID0gdmFsaWRhdG9ycy5maW5kSW5kZXgoKHYpID0+IHYudmFsaWRhdG9yID09PSBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgbGV0IHdhc01hbmRhdG9yeSA9IHJlcXVpcmVkSW5kZXggPj0gMDtcclxuICAgICAgICAgICAgbGV0IHRvYmVNYW5kYXRvcnkgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQubWFuZGF0b3J5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAvLyBub3Qgc3BlY2lmaWVkIG9uIHNlcnZlciwgdXNlIGNsaWVudCBzdGF0ZVxyXG4gICAgICAgICAgICAgIC8vIGlmIHdpZGdldCBpcyBub3QgdmlzaWJsZSwgY2xpZW50IHNob3VsZCBkZWZhdWx0IHRvIG5vdCBtYW5kYXRvcnlcclxuICAgICAgICAgICAgICB0b2JlTWFuZGF0b3J5ID0gd2lkZ2V0LmlzVmlzaWJsZSAmJiB3YXNNYW5kYXRvcnk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdG9iZU1hbmRhdG9yeSA9IGNvbnN0cmFpbnQubWFuZGF0b3J5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghd2FzTWFuZGF0b3J5ICYmIHRvYmVNYW5kYXRvcnkpIHtcclxuICAgICAgICAgICAgICAvLyBhZGQgcmVxdWlyZWQgdmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnZhbGlkYXRvcnMgPSBbXHJcbiAgICAgICAgICAgICAgICAuLi52YWxpZGF0b3JzLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgICAgIGlzQ3VzdG9tOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiAnJyxcclxuICAgICAgICAgICAgICAgICAgbmFtZTogJ3JlcXVpcmVkJyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAvLyByZW1vdmUgZW1wdHkgaXRlbVxyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlRW1wdHlJdGVtRnJvbVZhbHVlTGlzdCh3aWRnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh3YXNNYW5kYXRvcnkgJiYgIXRvYmVNYW5kYXRvcnkpIHtcclxuICAgICAgICAgICAgICAvLyByZW1vdmUgcmVxdWlyZWQgdmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnZhbGlkYXRvcnM/LnNwbGljZShyZXF1aXJlZEluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAvLyBhZGQgZW1wdHkgaXRlbVxyXG4gICAgICAgICAgICAgIGxldCBlbXB0eUxhYmVsID0gJyc7XHJcbiAgICAgICAgICAgICAgaWYgKCdzZWxlY3Rpb24nIGluIHdpZGdldCkge1xyXG4gICAgICAgICAgICAgICAgZW1wdHlMYWJlbCA9IHdpZGdldC5zZWxlY3Rpb24/LmVtcHR5TGFiZWwgPz8gJyc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuYWRkRW1wdHlJdGVtVG9WYWx1ZUxpc3Qod2lkZ2V0LCBlbXB0eUxhYmVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5lbmFibGVkID09PSB1bmRlZmluZWQgfHwgY29uc3RyYWludC5lbmFibGVkID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHdpZGdldC5pc0Rpc2FibGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHdpZGdldC5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHdpZGdldC5pc0Rpc2FibGVkID0gIWNvbnN0cmFpbnQuZW5hYmxlZDtcclxuICAgICAgICAgICAgICBpZiAod2lkZ2V0LnR5cGUgPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFQpIHtcclxuICAgICAgICAgICAgICAgIHdpZGdldC5pc1JlYWRvbmx5ID0gIWNvbnN0cmFpbnQuZW5hYmxlZDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JQcm92aWRlcj8uYXBwbHlDb25zdHJhaW50KHdpZGdldCBhcyBWYWxpZGF0ZWRXaWRnZXQ8YW55PiwgY29uc3RyYWludCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICAgIHdpZGdldC52YWx1ZUxpc3QgJiZcclxuICAgICAgICB3aWRnZXQudmFsdWVMaXN0Lmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmFwcGx5Q29tcG9uZW50Q29uc3RyYWludHMod2lkZ2V0LnZhbHVlTGlzdCwgY29uc3RyYWludHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnZXhSZWdleENoYXJzID0gbmV3IFJlZ0V4cCgvW1xcLlxcLVxcW1xcXVxcL1xce1xcfVxcKFxcKVxcK1xcXlxcJFxcXFxcXHxdL2cpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnZXhBc3Rlcmlza0luVGhlTWlkZGxlID0gbmV3IFJlZ0V4cCgvKFteXFwqXSlcXCooW15cXCpdKS9nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4QXN0ZXJpc2tJblRoZUVuZCA9IG5ldyBSZWdFeHAoLyhbXlxcKl0pXFwqJC9nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4QXN0ZXJpc2tJblRoZUJlZ2lubmluZyA9IG5ldyBSZWdFeHAoL15cXCooW15cXCpdKS9nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4QXN0ZXJpc2tPbmx5ID0gbmV3IFJlZ0V4cCgvXlxcKiQvZyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWdleERvdWJsZUFzdGVyaXNrV2l0aERvdCA9IG5ldyBSZWdFeHAoL1xcKlxcKlxcXFxcXC4vZyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWdleERvdWJsZUFzdGVyaXNrID0gbmV3IFJlZ0V4cCgvXFwqXFwqL2cpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnZXhRdWVzdGlvbk1hcmsgPSBuZXcgUmVnRXhwKC9cXD8vZyk7XHJcbiAgcHJpdmF0ZSByZWdleEJ5UGF0dGVybjogTWFwPHN0cmluZywgUmVnRXhwPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgYW50UGF0aE1hdGNoZXIocGF0dGVybj86IHN0cmluZywgcGF0aD86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFwYXR0ZXJuIHx8ICFwYXRoKSB7XHJcbiAgICAgIC8vIGVtcHR5IHBhdHRlcm4gb3IgcGF0aCAtPiBub3QgZXZhbHVhdGVkLCB0cnVlIG9yIGZhbHNlP1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVnZXggPSB0aGlzLnJlZ2V4QnlQYXR0ZXJuLmdldChwYXR0ZXJuKTtcclxuICAgIGlmIChyZWdleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIGVzY2FwZSByZWdleCBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgPywgKiwgKipcclxuICAgICAgbGV0IHJlZ2V4UGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4UmVnZXhDaGFycywgJ1xcXFwkJicpO1xyXG5cclxuICAgICAgLy8gcmVwbGFjZSBhbnQtc3R5bGUgd2lsZGNhcmRzIHdpdGggcmVnZXggZXF1aXZhbGVudHNcclxuXHJcbiAgICAgIC8vIHJlcGxhY2UgKiB3aXRoIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgYW55IGNoYXJhY3RlciBleGNlcHQgZm9yICcuJ1xyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4QXN0ZXJpc2tJblRoZU1pZGRsZSwgJyQxW14uXSokMicpOyAvLyBub3QqICogbm90KlxyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4QXN0ZXJpc2tJblRoZUVuZCwgJyQxW14uXSonKTsgLy8gbm90KiAqIEVPTFxyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4QXN0ZXJpc2tJblRoZUJlZ2lubmluZywgJ1teLl0qJDEnKTsgLy8gQk9MICogbm90KlxyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4QXN0ZXJpc2tPbmx5LCAnW14uXSonKTsgLy8gQk9MICogRU9MXHJcblxyXG4gICAgICAvLyByZXBsYWNlICoqIHdpdGggYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluY2x1ZGluZyAnLidcclxuICAgICAgcmVnZXhQYXR0ZXJuID0gcmVnZXhQYXR0ZXJuLnJlcGxhY2UodGhpcy5yZWdleERvdWJsZUFzdGVyaXNrV2l0aERvdCwgJy4qJyk7IC8vICoqLlxyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4RG91YmxlQXN0ZXJpc2ssICcuKicpOyAvLyAqKlxyXG5cclxuICAgICAgLy8gcmVwbGFjZSA/IHdpdGggYSBzaW5nbGUgY2hhcmFjdGVyIG1hdGNoZXJcclxuICAgICAgcmVnZXhQYXR0ZXJuID0gcmVnZXhQYXR0ZXJuLnJlcGxhY2UodGhpcy5yZWdleFF1ZXN0aW9uTWFyaywgJy4nKTtcclxuXHJcbiAgICAgIC8vIGNyZWF0ZSBhIFJlZ0V4cCBvYmplY3RcclxuICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIHJlZ2V4UGF0dGVybiArICckJyk7XHJcbiAgICAgIHRoaXMucmVnZXhCeVBhdHRlcm4uc2V0KHBhdHRlcm4sIHJlZ2V4KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXN0IHRoZSBwYXRoIGFnYWluc3QgdGhlIGdlbmVyYXRlZCByZWdleFxyXG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QocGF0aCk7XHJcbiAgfVxyXG5cclxuICBhcHBseUNvbnN0cmFpbnRzKHdpZGdldHM/OiBTbWFydEZvcm1XaWRnZXQ8YW55PltdKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc21hcnRGb3JtIS5jb21wb25lbnRNb2RlbD8uY29uc3RyYWludHMgJiZcclxuICAgICAgdGhpcy5zbWFydEZvcm0hLmNvbXBvbmVudE1vZGVsPy5jb25zdHJhaW50cy5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICBpZiAoIXdpZGdldHMpIHtcclxuICAgICAgICB3aWRnZXRzID0gdGhpcy5zbWFydEZvcm0hLndpZGdldHM7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hcHBseUNvbXBvbmVudENvbnN0cmFpbnRzKHdpZGdldHMsIHRoaXMuc21hcnRGb3JtIS5jb21wb25lbnRNb2RlbD8uY29uc3RyYWludHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkRW1wdHlJdGVtVG9WYWx1ZUxpc3Qod2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55PiwgZW1wdHlMYWJlbD86IHN0cmluZykge1xyXG4gICAgaWYgKHdpZGdldC50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRhaW5zRW1wdHlLZXkgPSB3aWRnZXQudmFsdWVMaXN0LnNvbWUoKHYpID0+IHYua2V5ID09PSB0aGlzLmVtcHR5S2V5KTtcclxuICAgICAgaWYgKCFjb250YWluc0VtcHR5S2V5KSB7XHJcbiAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdD8udW5zaGlmdCh7XHJcbiAgICAgICAgICBrZXk6IHRoaXMuZW1wdHlLZXksXHJcbiAgICAgICAgICBsYWJlbDogZW1wdHlMYWJlbCA/PyAnJyxcclxuICAgICAgICAgIHR5cGU6IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSVRFTSxcclxuICAgICAgICAgIHZhbHVlOiAnJywgLy8gdGhpcyBzaG91bGQgYmUgdW5kZWZpbmVkLCBidXQgRm9ybUNvbnRyb2wgY2Fubm90IGJlIG51bGwsIGZyb20gdjE0IGl0IHdpbGxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRW1wdHlJdGVtRnJvbVZhbHVlTGlzdCh3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KSB7XHJcbiAgICBpZiAoJ3ZhbHVlTGlzdCcgaW4gd2lkZ2V0KSB7XHJcbiAgICAgIGlmICh3aWRnZXQudmFsdWVMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgZmlyc3RJdGVtID0gd2lkZ2V0LnZhbHVlTGlzdFswXTtcclxuICAgICAgICBpZiAoZmlyc3RJdGVtPy5rZXkgPT09IHRoaXMuZW1wdHlLZXkpIHtcclxuICAgICAgICAgIHdpZGdldC52YWx1ZUxpc3Quc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbHRlcldpZGdldHNCeVZpc2liaWxpdHkod2lkZ2V0czogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSk6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10ge1xyXG4gICAgcmV0dXJuIHdpZGdldHMuZmlsdGVyKCh3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KSA9PlxyXG4gICAgICB3aWRnZXQuaXNWaXNpYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogd2lkZ2V0LmlzVmlzaWJsZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0VHJhbnNsYXRpb25PZktleShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zbWFydEZvcm0hLnRyYW5zbGF0ZVNlcnZpY2UhLmdldChrZXkpLnRvUHJvbWlzZSgpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoa2V5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHRyYW5zbGF0ZVdpZGdldHMod2lkZ2V0czogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHdpZGdldHMubWFwKGFzeW5jICh3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KSA9PiB7XHJcbiAgICAgICAgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUikge1xyXG4gICAgICAgICAgaWYgKCF3aWRnZXQub3JpZ2luYWxMYWJlbCkge1xyXG4gICAgICAgICAgICB3aWRnZXQub3JpZ2luYWxMYWJlbCA9IGAke3dpZGdldC5sYWJlbH1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gIExhYmVsXHJcbiAgICAgICAgICB3aWRnZXQubGFiZWwgPSBhd2FpdCB0aGlzLmdldFRyYW5zbGF0aW9uT2ZLZXkod2lkZ2V0Lm9yaWdpbmFsTGFiZWwpO1xyXG5cclxuICAgICAgICAgIC8vIFBsYWNlaG9sZGVyXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEIHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9OVU1CRVIgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTIHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUIHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9CT1gpICYmXHJcbiAgICAgICAgICAgIHdpZGdldC5wbGFjZWhvbGRlclxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmICghd2lkZ2V0Lm9yaWdpbmFsUGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgICB3aWRnZXQub3JpZ2luYWxQbGFjZWhvbGRlciA9IGAke3dpZGdldC5wbGFjZWhvbGRlcn1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdpZGdldC5wbGFjZWhvbGRlciA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNsYXRpb25PZktleSh3aWRnZXQub3JpZ2luYWxQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gVmFsaWRhdG9yc1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJViAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UICYmXHJcbiAgICAgICAgICAgIHdpZGdldC52YWxpZGF0b3JzXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbGlkYXRvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9ycy5tYXAoYXN5bmMgKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdG9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci5vcmlnaW5hbEVycm9yTWVzc2FnZSA9IGAke3ZhbGlkYXRvci5lcnJvck1lc3NhZ2V9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvci5lcnJvck1lc3NhZ2UgPSBhd2FpdCB0aGlzLmdldFRyYW5zbGF0aW9uT2ZLZXkoXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci5vcmlnaW5hbEVycm9yTWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3I7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIEluZGljYXRvclxyXG4gICAgICAgICAgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJiB3aWRnZXQuaW5kaWNhdG9yKSB7XHJcbiAgICAgICAgICAgIGlmICghd2lkZ2V0LmluZGljYXRvci5vcmlnaW5hbEluZGljYXRvclN0YXR1c0xhYmVscykge1xyXG4gICAgICAgICAgICAgIHdpZGdldC5pbmRpY2F0b3Iub3JpZ2luYWxJbmRpY2F0b3JTdGF0dXNMYWJlbHMgPVxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0LmluZGljYXRvci5pbmRpY2F0b3JTdGF0dXNMYWJlbHMubWFwKChsYWJlbDogc3RyaW5nKSA9PiBsYWJlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2lkZ2V0LmluZGljYXRvci5pbmRpY2F0b3JTdGF0dXNMYWJlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICB3aWRnZXQuaW5kaWNhdG9yLmluZGljYXRvclN0YXR1c0xhYmVscy5tYXAoXHJcbiAgICAgICAgICAgICAgICBhc3luYyAobGFiZWw6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUcmFuc2xhdGlvbk9mS2V5KFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZGdldC5pbmRpY2F0b3IhLm9yaWdpbmFsSW5kaWNhdG9yU3RhdHVzTGFiZWxzIVtpbmRleF1cclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTIHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUIHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUX01VTFRJUExFIHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzIgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT04pICYmXHJcbiAgICAgICAgICAgIHdpZGdldC52YWx1ZUxpc3RcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVdpZGdldEl0ZW1zKHdpZGdldC52YWx1ZUxpc3QpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVdpZGdldHMod2lkZ2V0LnZhbHVlTGlzdCEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB0cmFuc2xhdGVXaWRnZXRJdGVtcyh3aWRnZXRzOiBTbWFydEl0ZW1zPGFueT5bXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHdpZGdldHMubWFwKGFzeW5jICh3aWRnZXQ6IFNtYXJ0SXRlbXM8YW55PikgPT4ge1xyXG4gICAgICAgIGlmICghd2lkZ2V0Lm9yaWdpbmFsTGFiZWwpIHtcclxuICAgICAgICAgIHdpZGdldC5vcmlnaW5hbExhYmVsID0gYCR7d2lkZ2V0LmxhYmVsfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vICBMYWJlbFxyXG4gICAgICAgIHdpZGdldC5sYWJlbCA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNsYXRpb25PZktleSh3aWRnZXQub3JpZ2luYWxMYWJlbCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUaW1lKHdpZGdldEluc3RhbmNlOiBTbWFydERhdGVUaW1lUGlja2VyPGFueT4pIHtcclxuICBsZXQgdGltZTtcclxuICBpZiAod2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUod2lkZ2V0SW5zdGFuY2UudmFsdWUpO1xyXG4gICAgbGV0IGhvdXIgPSBTbWFydFdpZGdldFNldHRpbmdzLnVzZVV0YyA/IGRhdGUuZ2V0VVRDSG91cnMoKSA6IGRhdGUuZ2V0SG91cnMoKTtcclxuICAgIGxldCBtaW4gPSBTbWFydFdpZGdldFNldHRpbmdzLnVzZVV0YyA/IGRhdGUuZ2V0VVRDTWludXRlcygpIDogZGF0ZS5nZXRNaW51dGVzKCk7XHJcbiAgICB0aW1lID0gU3RyaW5nKGhvdXIpLnBhZFN0YXJ0KDIsICcwJykgKyAnOicgKyBTdHJpbmcobWluKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgd2lkZ2V0SW5zdGFuY2UudmFsdWUgPSBtb21lbnQoZGF0ZSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRpbWUgPSAnJztcclxuICB9XHJcbiAgcmV0dXJuIHRpbWU7XHJcbn1cclxuIl19
|
|
686
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1mb3JtL3NlcnZpY2VzL3NtYXJ0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFTMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFLL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDM0YsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7QUFHNUIsTUFBTSxPQUFPLGdCQUFnQjtJQVMzQixZQUFnQyxpQkFBeUM7UUFBekMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF3QjtRQVJ4RCxhQUFRLEdBQVcsV0FBVyxDQUFDO1FBQ2hELHFCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3BDLFVBQUssR0FBUSxFQUFFLENBQUM7UUFvbUJDLG9CQUFlLEdBQUcsSUFBSSxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNoRSw2QkFBd0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNELDBCQUFxQixHQUFHLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELGdDQUEyQixHQUFHLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELHNCQUFpQixHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLCtCQUEwQixHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELHdCQUFtQixHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLHNCQUFpQixHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLG1CQUFjLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUF0bUJvQixDQUFDO0lBRTdFLHVCQUF1QixDQUFDLEdBQVc7UUFDakMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLHdCQUF3QixDQUM5QixPQUFtRCxFQUNuRCxJQUFjO1FBRWQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3BCLElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO2dCQUN4QyxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQ3BDLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVztnQkFDMUMsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxjQUFjLEVBQzdDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUNELElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxnQkFBZ0I7Z0JBQy9DLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTtnQkFDckMsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxlQUFlO2dCQUM5QyxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFlBQVk7Z0JBQzNDLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUyxFQUN4QyxDQUFDO2dCQUNELElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2xFLFlBQVksR0FBRyxZQUFZO3lCQUN4QixNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO3lCQUN0QyxPQUFPLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUUvQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsT0FBK0IsRUFDL0IsR0FBVztRQUVYLElBQUksZ0JBQWtELENBQUM7UUFFdkQsS0FBSyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztpQkFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzNFLGdCQUFnQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3JCLE9BQU8sZ0JBQWdCLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFVLEVBQUUsR0FBVztRQUM1QyxJQUFJLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBVSxDQUFDO1FBRWYsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUNFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTO29CQUN0QixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtvQkFDakIsQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsRUFDekMsQ0FBQztvQkFDRCxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNYLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7cUJBQU0sQ0FBQztvQkFDTixLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsS0FBVTtRQUNoRCxJQUFJLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxDLElBQUksU0FBUyxHQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxTQUFjLENBQUM7UUFFbkIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN6RCxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTdCLElBQ0UsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFDbEQsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssU0FBUztnQkFDbkQsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFDbEQsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFDNUMsQ0FBQztnQkFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLDZGQUE2RjtnQkFDN0YsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDbEUsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDekMsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsT0FBWTtRQUNqQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5QixJQUNFLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVE7Z0JBQ3JDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVM7Z0JBQ3RDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVE7Z0JBQ3JDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTO2dCQUMvQixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSTtnQkFDMUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNsQixDQUFDLE9BQU8sRUFDUixDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUNuQyxDQUFDLGFBQXFCLEVBQUUsRUFBRSxDQUFDLEdBQUcsUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUMxRCxDQUFDO1lBRUYsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELGtCQUFrQixDQUFDLE9BQWdDLEVBQUUsT0FBMEI7UUFDN0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVUsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzlCLENBQUM7UUFDRCxNQUFNLElBQUksR0FBYSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLElBQUksTUFBd0MsQ0FBQztRQUM3QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDckQsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVMsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDaEYsS0FBSyxHQUFHLEtBQUssS0FBSyxNQUFNLENBQUM7b0JBQzNCLENBQUM7b0JBQ0QsSUFDRSxPQUFPLEtBQUssS0FBSyxTQUFTO3dCQUMxQixNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE1BQU07d0JBQzFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUyxFQUM3QyxDQUFDO3dCQUNELEtBQUssR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO29CQUNyQixDQUFDO29CQUNELElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDOUMsSUFDRSxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFdBQVc7NEJBQy9DLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsZ0JBQWdCLEVBQ3BELENBQUM7NEJBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQ0FDVixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNqQyxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUzt3QkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLO3dCQUN6QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxNQUFNO3dCQUMxQyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsY0FBYyxFQUNsRCxDQUFDO3dCQUNELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3dCQUNyQixJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDMUQsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7d0JBQzFCLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2hGLENBQUM7cUJBQU0sQ0FBQztvQkFDTix1QkFBdUI7b0JBQ3ZCLElBQUksWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2xDLFlBQVksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2hELE1BQU0sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDeEUsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDOUQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUM5RSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDckIsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQW9CLEVBQUUsRUFBRTtnQ0FDL0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dDQUNwRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQ0FDbkIsT0FBTyxJQUFJLENBQUM7NEJBQ2QsQ0FBQyxDQUFDLENBQUM7d0JBQ0wsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxNQUE0QixFQUFFLFNBQWM7UUFDL0UsSUFDRSxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE1BQU07WUFDMUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxlQUFlO1lBQ25ELE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsWUFBWTtZQUNoRCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFdBQVc7WUFDL0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxVQUFVLEVBQzlDLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNwRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztvQkFDekMsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFFakMsSUFBSSxtQkFBbUIsR0FBSSxNQUEyQixDQUFDLFNBQVMsQ0FBQztvQkFDakUsSUFBSSxlQUFlLEdBQUcsbUJBQW1CLEVBQUUsZUFBZSxJQUFJLGNBQWMsQ0FBQztvQkFFN0UsMEVBQTBFO29CQUMxRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQzt3QkFDakQsZUFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQjt3QkFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUM7NEJBQ2pELGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQyxxQkFBcUI7d0JBQ3pELENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLDJCQUEyQixDQUFDLFFBQVE7d0JBQzlELENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUNoQyxDQUFDO3dCQUNELElBQUksV0FBVyxHQUNiLG1CQUFtQixFQUFFLFdBQVcsSUFBSSxZQUFZLEVBQUUsV0FBVyxJQUFJLFdBQVcsQ0FBQzt3QkFFL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7NEJBQzdDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxtQkFBbUI7NEJBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO2dDQUM3QyxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsa0JBQWtCOzRCQUMvQyxDQUFDO3dCQUNILENBQUM7d0JBQ0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7NEJBQzNDLE9BQU87Z0NBQ0wsR0FBRyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUM7Z0NBQ3ZCLEtBQUssRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDO2dDQUM3QixJQUFJLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtnQ0FDOUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUM7NkJBQzFCLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNwRSxDQUFDO3lCQUFNLElBQ0wsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssMkJBQTJCLENBQUMsTUFBTTt3QkFDNUQsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQ2hDLENBQUM7d0JBQ0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEtBQWEsRUFBRSxFQUFFOzRCQUMxRCxPQUFPO2dDQUNMLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRTtnQ0FDZixLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQ0FDN0IsSUFBSSxFQUFFLG1CQUFtQixDQUFDLElBQUk7Z0NBQzlCLEtBQUssRUFBRSxLQUFLOzZCQUNiLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN2QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxhQUFhLENBQUMsTUFBZ0IsRUFBRSxRQUFnQjtRQUN0RCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLG1DQUFtQztZQUNuQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUEwQjtRQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxPQUFPLEVBQUUsT0FBUSxDQUFDLENBQUM7UUFFM0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFNBQVUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQzFCLElBQUksQ0FBQyxTQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQXlCLEVBQUUsRUFBRTtnQkFDM0QsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxrQkFBa0IsQ0FDaEIsT0FBa0QsRUFDbEQsT0FBeUIsRUFDekIsU0FBa0I7UUFFbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3JCLElBQ0UsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO2dCQUM3QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUztnQkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLO2dCQUN6QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEdBQUc7Z0JBQ3ZDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsR0FBRztnQkFDdkMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxPQUFPO2dCQUMzQyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVztnQkFDL0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxJQUFJO2dCQUN4QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7Z0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTtnQkFDMUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxjQUFjLEVBQ2xELENBQUM7Z0JBQ0QsSUFBSSxPQUFRLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMvQyxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVzt3QkFDL0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFDcEQsQ0FBQzt3QkFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDakIsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM1RixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsZ0JBQWdCO29CQUNwRCxPQUFPLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxFQUNwQyxDQUFDO29CQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsR0FBRyxNQUFNLENBQUMsR0FBRyxPQUFPLEVBQ3BCLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFDbkIsTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3RCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTt3QkFDL0IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFOzRCQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLEdBQUcsTUFBTSxDQUFDLEdBQUcsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUM1QixTQUFTLEVBQUUsK0NBQStDOzRCQUMxRCxNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFDO3dCQUNKLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQ2pELElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUN0QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3RFLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLEdBQUcsU0FBUyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFDNUIsTUFBTSxDQUFDLEtBQUssRUFDWixNQUFNLENBQUMsVUFBVSxFQUNqQixTQUFTLENBQ1YsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ2hGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQXlCLEVBQUUsSUFBdUI7UUFDbEUsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRU8saUJBQWlCLENBQ3ZCLEdBQVcsRUFDWCxLQUFXLEVBQ1gsVUFBb0IsRUFDcEIsVUFBNkI7UUFFN0IsSUFBSSxXQUFXLEdBQXVCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDaEMsQ0FBQztRQUNELFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM5QixVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBeUIsRUFBRSxFQUFFO1lBQzVDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDNUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyw4QkFBOEIsQ0FDcEMsT0FBK0IsRUFDL0IsS0FBdUI7UUFFdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3pCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDOUUsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN0QixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0RSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQy9CLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTs0QkFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0NBQzdCLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUs7NkJBQzFELENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBRUgsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxzREFBc0Q7b0JBQ3RELElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2RSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQy9CLElBQUksT0FBTyxHQUFVLEVBQUUsQ0FBQzt3QkFDeEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQWdCLEVBQUUsRUFBRTs0QkFDckMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQzdDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0NBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDekIsQ0FBQzt3QkFDSCxDQUFDLENBQUMsQ0FBQzt3QkFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQ25DLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQ2pELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFDTCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7Z0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsS0FBSztnQkFDekMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO2dCQUM3QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsR0FBRztnQkFDdkMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO2dCQUN2QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsT0FBTztnQkFDM0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxXQUFXO2dCQUMvQyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7Z0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsY0FBYyxFQUNsRCxDQUFDO2dCQUNELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBdUI7UUFDakMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25FLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQztZQUNqRCxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3BELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUF1QjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDdkQsSUFBSSxXQUFXLEdBQUcsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBRXZDLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBQ2pELHVDQUF1QztRQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztRQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1FBRW5ELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsT0FBK0IsRUFDL0IsV0FBMkM7UUFFM0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQTRCLEVBQUUsRUFBRTtZQUMvQyxJQUFJLGlCQUFpQixHQUFHLFdBQVcsRUFBRSxNQUFNO1lBQ3pDLGtGQUFrRjtZQUNsRixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FDckUsQ0FBQztZQUVGLElBQUksaUJBQWlCLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUN2QyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3JDLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQzs0QkFDbkMsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7d0JBQzFCLENBQUM7b0JBQ0gsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztvQkFDeEMsQ0FBQztvQkFDRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUzt3QkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLO3dCQUN6QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsS0FBSzt3QkFDekMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO3dCQUN2QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEdBQUc7d0JBQ3ZDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxNQUFNO3dCQUMxQyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsY0FBYyxFQUNsRCxDQUFDO3dCQUNELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO3dCQUN6QyxJQUFJLGFBQWEsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDckYsSUFBSSxZQUFZLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQzt3QkFDdEMsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO3dCQUMxQixJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7NEJBQ3ZDLDRDQUE0Qzs0QkFDNUMsbUVBQW1FOzRCQUNuRSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUM7d0JBQ25ELENBQUM7NkJBQU0sQ0FBQzs0QkFDTixhQUFhLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQzt3QkFDdkMsQ0FBQzt3QkFDRCxJQUFJLENBQUMsWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDOzRCQUNuQyx5QkFBeUI7NEJBQ3pCLE1BQU0sQ0FBQyxVQUFVLEdBQUc7Z0NBQ2xCLEdBQUcsVUFBVTtnQ0FDYjtvQ0FDRSxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQVE7b0NBQzlCLFFBQVEsRUFBRSxLQUFLO29DQUNmLFlBQVksRUFBRSxFQUFFO29DQUNoQixJQUFJLEVBQUUsVUFBVTtpQ0FDakI7NkJBQ0YsQ0FBQzs0QkFDRixvQkFBb0I7NEJBQ3BCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDNUMsQ0FBQzt3QkFDRCxJQUFJLFlBQVksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOzRCQUNuQyw0QkFBNEI7NEJBQzVCLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDNUMsaUJBQWlCOzRCQUNqQixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7NEJBQ3BCLElBQUksV0FBVyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dDQUMxQixVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDOzRCQUNsRCxDQUFDOzRCQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ25ELENBQUM7d0JBQ0QsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDOzRCQUNwRSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7Z0NBQ3BDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDOzRCQUM1QixDQUFDO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQzs0QkFDeEMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO2dDQUNqRCxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQzs0QkFDMUMsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsTUFBOEIsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDdEYsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUztnQkFDN0MsTUFBTSxDQUFDLFNBQVM7Z0JBQ2hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUN2QixDQUFDO2dCQUNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFZRCxjQUFjLENBQUMsT0FBZ0IsRUFBRSxJQUFhO1FBQzVDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0Qix5REFBeUQ7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsOENBQThDO1lBQzlDLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVqRSxxREFBcUQ7WUFFckQscUVBQXFFO1lBQ3JFLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLGNBQWM7WUFDL0YsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUN6RixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhO1lBQy9GLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVk7WUFFbEYscUVBQXFFO1lBQ3JFLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDbEYsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztZQUUxRSw0Q0FBNEM7WUFDNUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRWpFLHlCQUF5QjtZQUN6QixLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELDRDQUE0QztRQUM1QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQWdDO1FBQy9DLElBQ0UsSUFBSSxDQUFDLFNBQVUsQ0FBQyxjQUFjLEVBQUUsV0FBVztZQUMzQyxJQUFJLENBQUMsU0FBVSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBVSxDQUFDLE9BQU8sQ0FBQztZQUNwQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBVSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQztJQUVELHVCQUF1QixDQUFDLE1BQTRCLEVBQUUsVUFBbUI7UUFDdkUsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQztvQkFDeEIsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUNsQixLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUU7b0JBQ3ZCLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO29CQUM5QixLQUFLLEVBQUUsRUFBRSxFQUFFLDZFQUE2RTtpQkFDekYsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsNEJBQTRCLENBQUMsTUFBNEI7UUFDdkQsSUFBSSxXQUFXLElBQUksTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLFNBQVMsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCLENBQUMsT0FBK0I7UUFDdkQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBNEIsRUFBRSxFQUFFLENBQ3JELE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ3pELENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQVc7UUFDM0MsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFVLENBQUMsZ0JBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RFLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQStCO1FBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBNEIsRUFBRSxFQUFFO1lBQ2pELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxjQUFjO2dCQUFFLE9BQU87WUFDL0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUMxQixNQUFNLENBQUMsYUFBYSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMzQyxDQUFDO2dCQUNELFNBQVM7Z0JBQ1QsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRXBFLGNBQWM7Z0JBQ2QsSUFDRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsVUFBVTtvQkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxpQkFBaUI7b0JBQ3JELE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsZ0JBQWdCO29CQUNwRCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7b0JBQzdDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsUUFBUSxDQUFDO29CQUMvQyxNQUFNLENBQUMsV0FBVyxFQUNsQixDQUFDO29CQUNELElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzt3QkFDaEMsTUFBTSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN2RCxDQUFDO29CQUNELE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ2xGLENBQUM7Z0JBRUQsYUFBYTtnQkFDYixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsU0FBUztvQkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLO29CQUN6QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7b0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsR0FBRztvQkFDdkMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO29CQUN2QyxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLGFBQWE7b0JBQ2pELE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsbUJBQW1CO29CQUN2RCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLE9BQU87b0JBQzNDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTtvQkFDMUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO29CQUM3QyxNQUFNLENBQUMsVUFBVSxFQUNqQixDQUFDO29CQUNELE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNuQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBeUIsRUFBRSxFQUFFO3dCQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLENBQUM7NEJBQ3BDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDL0QsQ0FBQzt3QkFDRCxTQUFTLENBQUMsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUNyRCxTQUFTLENBQUMsb0JBQW9CLENBQy9CLENBQUM7d0JBQ0YsT0FBTyxTQUFTLENBQUM7b0JBQ25CLENBQUMsQ0FBQyxDQUNILENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxZQUFZO2dCQUNaLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO3dCQUNwRCxNQUFNLENBQUMsU0FBUyxDQUFDLDZCQUE2Qjs0QkFDNUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6RSxDQUFDO29CQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMscUJBQXFCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN4RCxNQUFNLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FDeEMsS0FBSyxFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUNyQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FDNUIsTUFBTSxDQUFDLFNBQVUsQ0FBQyw2QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FDeEQsQ0FDSixDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxJQUNFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxnQkFBZ0I7b0JBQ25ELE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTtvQkFDMUMsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxlQUFlO29CQUNuRCxNQUFNLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLFdBQVc7b0JBQy9DLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsWUFBWSxDQUFDO29CQUNuRCxNQUFNLENBQUMsU0FBUyxFQUNoQixDQUFDO29CQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFVLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBMEI7UUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUF1QixFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLGFBQWEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsU0FBUztZQUNULE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOytHQXJ5QlUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQVVJLFFBQVE7O0FBK3hCdkIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxjQUF3QztJQUNsRSxJQUFJLElBQUksQ0FBQztJQUNULElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdFLElBQUksR0FBRyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEYsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRSxjQUFjLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksR0FBRyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25EZWZpbml0aW9uVHlwZUVudW0sIFNtYXJ0Rm9ybVdpZGdldFR5cGUgfSBmcm9tICcuLi9hcGknO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0RGF0ZVRpbWVQaWNrZXIsXHJcbiAgU21hcnRGb3JtV2lkZ2V0LFxyXG4gIFNtYXJ0SXRlbSxcclxuICBTbWFydEl0ZW1zLFxyXG4gIFNtYXJ0U2VsZWN0LFxyXG59IGZyb20gJy4uL3NtYXJ0Zm9ybS5mb3JtLW1vZGVsJztcclxuaW1wb3J0IHsgU21hcnRGb3JtLCBTbWFydEZvcm1Db21wb25lbnRDb25zdHJhaW50LCBTbWFydFZhbGlkYXRvciwgVmFsdWUgfSBmcm9tICcuLi9zbWFydGZvcm0ubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMaWJyYXJ5IH0gZnJvbSAnLi4vLi4vdmlldy1jb250ZXh0L3V0aWxpdHkvY29tcG9uZW50TGlicmFyeSc7XHJcbmltcG9ydCB7XHJcbiAgTmFtZWRWYWxpZGF0b3JTZXJ2aWNlLFxyXG4gIFZhbGlkYXRlZFdpZGdldCxcclxufSBmcm9tICcuLi8uLi9zbWFydC12YWxpZGF0aW9uL25hbWVkLXZhbGlkYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU21hcnRXaWRnZXRTZXR0aW5ncyB9IGZyb20gJy4uL3dpZGdldHMvc21hcnRmb3Jtd2lkZ2V0L3NtYXJ0Zm9ybXdpZGdldC5jb21wb25lbnQnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTbWFydEZvcm1TZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5S2V5OiBzdHJpbmcgPSAnZSNtJXBAdCp5JztcclxuICBjb21wb25lbnRMaWJyYXJ5ID0gQ29tcG9uZW50TGlicmFyeTtcclxuICBncm91cDogYW55ID0ge307XHJcblxyXG4gIGZvcm1Hcm91cD86IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gIHNtYXJ0Rm9ybT86IFNtYXJ0Rm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJpdmF0ZSB2YWxpZGF0b3JQcm92aWRlcj86IE5hbWVkVmFsaWRhdG9yU2VydmljZSkge31cclxuXHJcbiAgZ2V0U21hcnRGb3JtV2lkZ2V0QnlLZXkoa2V5OiBzdHJpbmcpOiBTbWFydEZvcm1XaWRnZXQ8YW55PiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5maW5kU21hcnRGb3JtV2lkZ2V0QnlLZXkodGhpcy5zbWFydEZvcm0/LndpZGdldHMhLCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb2xsZWN0S2V5c0Zyb21TbWFydEZvcm0oXHJcbiAgICB3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdIHwgU21hcnRJdGVtczxhbnk+W10sXHJcbiAgICBrZXlzOiBzdHJpbmdbXVxyXG4gICk6IHN0cmluZ1tdIHtcclxuICAgIHdpZGdldHMuZm9yRWFjaCgodykgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdy50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICAgIHcudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICAgIHcudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiAmJlxyXG4gICAgICAgIHcudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICApIHtcclxuICAgICAgICBrZXlzLnB1c2gody5rZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICB3LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyB8fFxyXG4gICAgICAgIHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1QgfHxcclxuICAgICAgICB3LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUX01VTFRJUExFIHx8XHJcbiAgICAgICAgdy50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTiB8fFxyXG4gICAgICAgIHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVJcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKHcudmFsdWVMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIGtleXMgPSB0aGlzLmNvbGxlY3RLZXlzRnJvbVNtYXJ0Rm9ybSh3LnZhbHVlTGlzdCwga2V5cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMikge1xyXG4gICAgICAgIGlmICh3LnZhbHVlTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsZXQgY2hpbGRyZW5LZXlzID0gdGhpcy5jb2xsZWN0S2V5c0Zyb21TbWFydEZvcm0ody52YWx1ZUxpc3QsIFtdKTtcclxuICAgICAgICAgIGNoaWxkcmVuS2V5cyA9IGNoaWxkcmVuS2V5c1xyXG4gICAgICAgICAgICAuZmlsdGVyKChrZXk6IHN0cmluZykgPT4ga2V5ICE9PSB3LmtleSlcclxuICAgICAgICAgICAgLmZsYXRNYXAoKGtleTogc3RyaW5nKSA9PiBgJHt3LmtleX0uJHtrZXl9YCk7XHJcblxyXG4gICAgICAgICAga2V5cy5wdXNoKC4uLmNoaWxkcmVuS2V5cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZFNtYXJ0Rm9ybVdpZGdldEJ5S2V5KFxyXG4gICAgd2lkZ2V0czogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSxcclxuICAgIGtleTogc3RyaW5nXHJcbiAgKTogU21hcnRGb3JtV2lkZ2V0PGFueT4gfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IHdpZGdldEZvdW5kQnlLZXk6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGZvciAobGV0IHcgb2Ygd2lkZ2V0cykge1xyXG4gICAgICBpZiAody5rZXkgPT09IGtleSkge1xyXG4gICAgICAgIHJldHVybiB3O1xyXG4gICAgICB9IGVsc2UgaWYgKHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiYgdy52YWx1ZUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHdpZGdldEZvdW5kQnlLZXkgPSB0aGlzLmZpbmRTbWFydEZvcm1XaWRnZXRCeUtleSh3LnZhbHVlTGlzdCwga2V5KTtcclxuICAgICAgICBpZiAod2lkZ2V0Rm91bmRCeUtleSkge1xyXG4gICAgICAgICAgcmV0dXJuIHdpZGdldEZvdW5kQnlLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gd2lkZ2V0Rm91bmRCeUtleTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VmFsdWVEZWVwbHkobW9kZWw6IGFueSwga2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgbGV0IHNwbGl0dGVkS2V5ID0ga2V5LnNwbGl0KCcuJyk7XHJcbiAgICBsZXQgdmFsdWU6IGFueTtcclxuXHJcbiAgICBzcGxpdHRlZEtleS5mb3JFYWNoKChrOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgIHZhbHVlID0gbW9kZWxba107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdmFsdWVba10gPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgICAgdmFsdWVba10gPT09IG51bGwgfHxcclxuICAgICAgICAgICghdmFsdWUgJiYgdHlwZW9mIHZhbHVlW2tdICE9PSAnYm9vbGVhbicpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlW2tdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZURlZXBseShtb2RlbDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IHNwbGl0dGVkS2V5cyA9IGtleS5zcGxpdCgnLicpO1xyXG5cclxuICAgIGxldCBkZWVwTW9kZWw6IGFueVtdID0gW21vZGVsXTtcclxuICAgIGxldCB0ZW1wTW9kZWw6IGFueTtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3BsaXR0ZWRLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICB0ZW1wTW9kZWwgPSBkZWVwTW9kZWxbaW5kZXhdO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ2Jvb2xlYW4nICYmXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ251bWJlcicgJiZcclxuICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09IHVuZGVmaW5lZFxyXG4gICAgICApIHtcclxuICAgICAgICBkZWVwTW9kZWwucHVzaCh0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW5kZXggPT09IHNwbGl0dGVkS2V5cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgbGV0IG9sZFZhbHVlID0gdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dO1xyXG4gICAgICAgIC8vIGlmICh2YWx1ZSA9PT0gJycgJiYgKG9sZFZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHRoZW4gZG9uJ3QgY2hhbmdlIHZhbHVlLlxyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gJycgfHwgKG9sZFZhbHVlICE9PSBudWxsICYmIG9sZFZhbHVlICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFByb3BlcnR5TmFtZXNEZWVwbHkoZWxlbWVudDogYW55KTogc3RyaW5nW10ge1xyXG4gICAgbGV0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhlbGVtZW50KTtcclxuICAgIHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiBlbGVtZW50W3Byb3BlcnR5XSA9PT0gJ3N0cmluZycgfHxcclxuICAgICAgICB0eXBlb2YgZWxlbWVudFtwcm9wZXJ0eV0gPT09ICdib29sZWFuJyB8fFxyXG4gICAgICAgIHR5cGVvZiBlbGVtZW50W3Byb3BlcnR5XSA9PT0gJ251bWJlcicgfHxcclxuICAgICAgICBlbGVtZW50W3Byb3BlcnR5XSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgZWxlbWVudFtwcm9wZXJ0eV0gPT09IG51bGwgfHxcclxuICAgICAgICAhZWxlbWVudFtwcm9wZXJ0eV0gfHxcclxuICAgICAgICAhZWxlbWVudFxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGlubmVyUHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lc0RlZXBseShlbGVtZW50W3Byb3BlcnR5XSk7XHJcbiAgICAgIGlubmVyUHJvcGVydGllcyA9IGlubmVyUHJvcGVydGllcy5tYXAoXHJcbiAgICAgICAgKGlubmVyUHJvcGVydHk6IHN0cmluZykgPT4gYCR7cHJvcGVydHl9LiR7aW5uZXJQcm9wZXJ0eX1gXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBwcm9wZXJ0aWVzLnB1c2goLi4uaW5uZXJQcm9wZXJ0aWVzKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZXNGcm9tTW9kZWwod2lkZ2V0cz86IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10sIGNvbXBMaWI/OiBDb21wb25lbnRMaWJyYXJ5KTogdm9pZCB7XHJcbiAgICBjb25zdCBzbWFydEZvcm0gPSB0aGlzLnNtYXJ0Rm9ybSE7XHJcbiAgICBjb25zdCBkYXRhID0gc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsPy5kYXRhO1xyXG4gICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXdpZGdldHMpIHtcclxuICAgICAgd2lkZ2V0cyA9IHNtYXJ0Rm9ybS53aWRnZXRzO1xyXG4gICAgfVxyXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSB0aGlzLmNvbGxlY3RLZXlzRnJvbVNtYXJ0Rm9ybSh3aWRnZXRzLCBbXSk7XHJcblxyXG4gICAgbGV0IHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmdldFByb3BlcnR5TmFtZXNEZWVwbHkoZGF0YSkpIHtcclxuICAgICAgaWYgKGtleXMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgIHdpZGdldCA9IHRoaXMuZmluZFNtYXJ0Rm9ybVdpZGdldEJ5S2V5KHdpZGdldHMsIGtleSk7XHJcbiAgICAgICAgaWYgKHdpZGdldCkge1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZURlZXBseShkYXRhLCBrZXkpO1xyXG4gICAgICAgICAgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWCAmJiB0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSAndHJ1ZSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRPR0dMRSAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY29tcExpYiA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSIHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUlxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHdpZGdldC52YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGlmICh3aWRnZXQuc2hvd0xhYmVsID09PSB1bmRlZmluZWQgJiYgc21hcnRGb3JtLnNob3dMYWJlbCkge1xyXG4gICAgICAgICAgICAgIHdpZGdldC5zaG93TGFiZWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5jb3B5RnJvbVZhbHVlU2V0VG9WYWx1ZXNMaXN0KHdpZGdldCwgc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLnZhbHVlU2V0cyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEluIGNhc2Ugb2YgQ2hlY2tCb3gyXHJcbiAgICAgICAgICBsZXQgc3BsaXR0ZWRLZXlzID0ga2V5LnNwbGl0KCcuJyk7XHJcbiAgICAgICAgICBzcGxpdHRlZEtleXMuc3BsaWNlKHNwbGl0dGVkS2V5cy5sZW5ndGggLSAxLCAxKTtcclxuICAgICAgICAgIHdpZGdldCA9IHRoaXMuZmluZFNtYXJ0Rm9ybVdpZGdldEJ5S2V5KHdpZGdldHMsIHNwbGl0dGVkS2V5cy5qb2luKCcuJykpO1xyXG4gICAgICAgICAgaWYgKHdpZGdldCAmJiB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMikge1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlGcm9tVmFsdWVTZXRUb1ZhbHVlc0xpc3Qod2lkZ2V0LCBzbWFydEZvcm0uY29tcG9uZW50TW9kZWwudmFsdWVTZXRzKTtcclxuICAgICAgICAgICAgaWYgKHdpZGdldC52YWx1ZUxpc3QpIHtcclxuICAgICAgICAgICAgICB3aWRnZXQudmFsdWVMaXN0ID0gd2lkZ2V0LnZhbHVlTGlzdC5tYXAoKGl0ZW06IFNtYXJ0SXRlbTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFZhbHVlRGVlcGx5KGRhdGEsIGAke3dpZGdldD8ua2V5fS4ke2l0ZW0ua2V5fWApO1xyXG4gICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29weUZyb21WYWx1ZVNldFRvVmFsdWVzTGlzdCh3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+LCB2YWx1ZVNldHM6IGFueSkge1xyXG4gICAgaWYgKFxyXG4gICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1QgfHxcclxuICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUX01VTFRJUExFIHx8XHJcbiAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTiB8fFxyXG4gICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiB8fFxyXG4gICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEXHJcbiAgICApIHtcclxuICAgICAgaWYgKHdpZGdldC5zZWxlY3Rpb24gJiYgdmFsdWVTZXRzKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlU2V0ID0gdmFsdWVTZXRzW3dpZGdldC5zZWxlY3Rpb24udmFsdWVTZXROYW1lXTtcclxuICAgICAgICBpZiAoIXZhbHVlU2V0KSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ3ZhbHVlU2V0IG5vdCBmb3VuZCcsIHdpZGdldC5zZWxlY3Rpb24udmFsdWVTZXROYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHZhbHVlU2V0RGF0YSA9IHZhbHVlU2V0LnZhbHVlU2V0RGF0YTtcclxuICAgICAgICAgIGxldCB2YWx1ZXMgPSB2YWx1ZVNldERhdGEudmFsdWVzO1xyXG5cclxuICAgICAgICAgIGxldCBzZWxlY3Rpb25EZWZpbml0aW9uID0gKHdpZGdldCBhcyBTbWFydFNlbGVjdDxhbnk+KS5zZWxlY3Rpb247XHJcbiAgICAgICAgICBsZXQgZGlzcGxheVByb3BlcnR5ID0gc2VsZWN0aW9uRGVmaW5pdGlvbj8uZGlzcGxheVByb3BlcnR5ID8/ICdkaXNwbGF5VmFsdWUnO1xyXG5cclxuICAgICAgICAgIC8vIGNoZWNrIGlzIGRpc3BsYXlQcm9wZXJ0eSBleGlzdHMsIGZhbGxiYWNrIGZvciBjb21tb24gZGlzcGxheSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tQcm9wZXJ0eSh2YWx1ZXMsIGRpc3BsYXlQcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgZGlzcGxheVByb3BlcnR5ID0gJ25hbWUnOyAvLyBHZW5lcmljVmFsdWUubmFtZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tQcm9wZXJ0eSh2YWx1ZXMsIGRpc3BsYXlQcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgICBkaXNwbGF5UHJvcGVydHkgPSAnZGlzcGxheVZhbHVlJzsgLy8gVmFsdWUuZGlzcGxheVZhbHVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgd2lkZ2V0LnNlbGVjdGlvbi50eXBlID09PSBTZWxlY3Rpb25EZWZpbml0aW9uVHlwZUVudW0uUFJPUEVSVFkgJiZcclxuICAgICAgICAgICAgIXdpZGdldC5zZWxlY3Rpb24ubWFwcGluZy5sZW5ndGhcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBsZXQga2V5UHJvcGVydHkgPVxyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbkRlZmluaXRpb24/LmtleVByb3BlcnR5ID8/IHZhbHVlU2V0RGF0YT8ua2V5UHJvcGVydHkgPz8gJ29iamVjdFVyaSc7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tQcm9wZXJ0eSh2YWx1ZXMsIGtleVByb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgIGtleVByb3BlcnR5ID0gJ3VyaSc7IC8vIEdlbmVyaWNWYWx1ZS51cmlcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tQcm9wZXJ0eSh2YWx1ZXMsIGtleVByb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgICAga2V5UHJvcGVydHkgPSAnb2JqZWN0VXJpJzsgLy8gVmFsdWUub2JqZWN0VXJpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdpZGdldC52YWx1ZUxpc3QgPSB2YWx1ZXMubWFwKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGtleTogdmFsdWVba2V5UHJvcGVydHldLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlW2Rpc3BsYXlQcm9wZXJ0eV0sXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBTbWFydEZvcm1XaWRnZXRUeXBlLklURU0sXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVba2V5UHJvcGVydHldLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEVtcHR5SXRlbVRvVmFsdWVMaXN0KHdpZGdldCwgd2lkZ2V0LnNlbGVjdGlvbi5lbXB0eUxhYmVsKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIHdpZGdldC5zZWxlY3Rpb24udHlwZSA9PT0gU2VsZWN0aW9uRGVmaW5pdGlvblR5cGVFbnVtLk9CSkVDVCAmJlxyXG4gICAgICAgICAgICAhd2lkZ2V0LnNlbGVjdGlvbi5tYXBwaW5nLmxlbmd0aFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHdpZGdldC52YWx1ZUxpc3QgPSB2YWx1ZXMubWFwKCh2YWx1ZTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGtleTogYCR7aW5kZXh9YCxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZVtkaXNwbGF5UHJvcGVydHldLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEVtcHR5SXRlbVRvVmFsdWVMaXN0KHdpZGdldCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrUHJvcGVydHkodmFsdWVzOiBvYmplY3RbXSwgcHJvcGVydHk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF2YWx1ZXM/Lmxlbmd0aCkge1xyXG4gICAgICAvLyBubyBzYW1wbGUgZGF0YSwgYXNzdW1lIGV4aXN0YW5jZVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wZXJ0eSBpbiB2YWx1ZXNbMF07XHJcbiAgfVxyXG5cclxuICB0b0Zvcm1Hcm91cChjb21wTGliPzogQ29tcG9uZW50TGlicmFyeSk6IFVudHlwZWRGb3JtR3JvdXAge1xyXG4gICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHModGhpcy5zbWFydEZvcm0hLndpZGdldHMsIGNvbXBMaWIhKTtcclxuXHJcbiAgICBpZiAodGhpcy5mb3JtR3JvdXApIHtcclxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMgPSB0aGlzLmdyb3VwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbWFydEZvcm0hLnZhbGlkYXRvcnMgJiYgdGhpcy5zbWFydEZvcm0hLnZhbGlkYXRvcnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnNldFZhbGlkYXRvcnMoXHJcbiAgICAgICAgdGhpcy5zbWFydEZvcm0hLnZhbGlkYXRvcnMubWFwKCh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cDtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUZvcm1Db250cm9scyhcclxuICAgIHdpZGdldHM6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10gfCBTbWFydEl0ZW08YW55PltdLFxyXG4gICAgY29tcExpYjogQ29tcG9uZW50TGlicmFyeSxcclxuICAgIHBhcmVudEtleT86IHN0cmluZ1xyXG4gICk6IHZvaWQge1xyXG4gICAgd2lkZ2V0cy5tYXAoKHdpZGdldCkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJViAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklURU0gJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NQVRSSVggJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoY29tcExpYiEgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSIHx8XHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAod2lkZ2V0LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnZhbHVlID0gbmV3IERhdGUod2lkZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKGAke3dpZGdldC5rZXl9YCwgd2lkZ2V0LnZhbHVlLCB3aWRnZXQuaXNEaXNhYmxlZCwgd2lkZ2V0LnZhbGlkYXRvcnMpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVIgJiZcclxuICAgICAgICAgIGNvbXBMaWIgIT09IENvbXBvbmVudExpYnJhcnkuUFJJTUVOR1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgYCR7d2lkZ2V0LmtleX0tdGltZWAsXHJcbiAgICAgICAgICAgIGV4dHJhY3RUaW1lKHdpZGdldCksXHJcbiAgICAgICAgICAgIHdpZGdldC5pc0Rpc2FibGVkLFxyXG4gICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9yc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NQVRSSVgpIHtcclxuICAgICAgICBpZiAod2lkZ2V0LmlzTXVsdGlwbGUpIHtcclxuICAgICAgICAgIGxldCBkYXRhS2V5cyA9IE9iamVjdC5rZXlzKHdpZGdldC52YWx1ZS5kYXRhKTtcclxuICAgICAgICAgIGxldCBpdGVtS2V5cyA9IHdpZGdldC52YWx1ZS5jb2x1bW5zLm1hcCgodmFsdWU6IFZhbHVlKSA9PiB2YWx1ZS5jb2RlKTtcclxuICAgICAgICAgIGRhdGFLZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW1LZXlzLmZvckVhY2goKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICBgJHt3aWRnZXQua2V5fS5kYXRhLiR7a2V5fS4ke2l0ZW19YCxcclxuICAgICAgICAgICAgICAgIHdpZGdldC52YWx1ZS5kYXRhW2tleV1baXRlbV0sXHJcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsIC8vIFRPRE8gcmVhbGx5IHdlIGRvbid0IHBhc3Mgd2lkZ2V0LmlzRGlzYWJsZWQ/XHJcbiAgICAgICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9yc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKHdpZGdldC52YWx1ZS5kYXRhKS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgYCR7d2lkZ2V0LmtleX0uJHtrZXl9YCxcclxuICAgICAgICAgICAgICB3aWRnZXQuaXNNdWx0aXBsZSA/IHdpZGdldC52YWx1ZS5kYXRhW2tleV0gOiB3aWRnZXQudmFsdWUuZGF0YVtrZXldWzBdLFxyXG4gICAgICAgICAgICAgIHdpZGdldC5pc0Rpc2FibGVkLFxyXG4gICAgICAgICAgICAgIHdpZGdldC52YWxpZGF0b3JzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklURU0gJiYgcGFyZW50S2V5KSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChcclxuICAgICAgICAgIGAke3BhcmVudEtleX0uJHt3aWRnZXQua2V5fWAsXHJcbiAgICAgICAgICB3aWRnZXQudmFsdWUsXHJcbiAgICAgICAgICB3aWRnZXQuaXNEaXNhYmxlZCxcclxuICAgICAgICAgIHVuZGVmaW5lZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiYgd2lkZ2V0LnZhbHVlTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHMod2lkZ2V0LnZhbHVlTGlzdCwgY29tcExpYik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWF8yICYmIHdpZGdldC52YWx1ZUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKHdpZGdldC52YWx1ZUxpc3QsIGNvbXBMaWIsIHdpZGdldC5rZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlzVmFsaWRhdG9ySW5MaXN0KHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IsIGxpc3Q/OiBTbWFydFZhbGlkYXRvcltdKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gbGlzdCAhPT0gdW5kZWZpbmVkICYmIGxpc3QubGVuZ3RoID4gMCAmJiBsaXN0LnNvbWUoKHYpID0+IHYgPT09IHZhbGlkYXRvcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZvcm1Db250cm9sKFxyXG4gICAga2V5OiBzdHJpbmcsXHJcbiAgICB2YWx1ZT86IGFueSxcclxuICAgIGlzRGlzYWJsZWQ/OiBib29sZWFuLFxyXG4gICAgdmFsaWRhdG9ycz86IFNtYXJ0VmFsaWRhdG9yW11cclxuICApOiBVbnR5cGVkRm9ybUNvbnRyb2wge1xyXG4gICAgbGV0IGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSB0aGlzLmdyb3VwW2tleV07XHJcbiAgICBpZiAoIWZvcm1Db250cm9sKSB7XHJcbiAgICAgIGZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xyXG4gICAgICB0aGlzLmdyb3VwW2tleV0gPSBmb3JtQ29udHJvbDtcclxuICAgIH1cclxuICAgIGZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlIHx8ICcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICBmb3JtQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgIHZhbGlkYXRvcnM/Lm1hcCgodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4ge1xyXG4gICAgICBmb3JtQ29udHJvbC5hZGRWYWxpZGF0b3JzKHZhbGlkYXRvci52YWxpZGF0b3IpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGlzRGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoaXNEaXNhYmxlZCkge1xyXG4gICAgICAgIGZvcm1Db250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvcm1Db250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtQ29udHJvbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29weVZhbHVlRnJvbUZvcm1Ub1dpZGdldEJlYW5zKFxyXG4gICAgd2lkZ2V0czogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSxcclxuICAgIGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwXHJcbiAgKTogdm9pZCB7XHJcbiAgICB3aWRnZXRzLmZvckVhY2goKHdpZGdldCkgPT4ge1xyXG4gICAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmIHdpZGdldC52YWx1ZUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29weVZhbHVlRnJvbUZvcm1Ub1dpZGdldEJlYW5zKHdpZGdldC52YWx1ZUxpc3QsIGdyb3VwKTtcclxuICAgICAgfSBlbHNlIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NQVRSSVgpIHtcclxuICAgICAgICBpZiAod2lkZ2V0LmlzTXVsdGlwbGUpIHtcclxuICAgICAgICAgIGxldCBkYXRhS2V5cyA9IE9iamVjdC5rZXlzKHdpZGdldC52YWx1ZS5kYXRhKTtcclxuICAgICAgICAgIGxldCBpdGVtS2V5cyA9IHdpZGdldC52YWx1ZS5jb2x1bW5zLm1hcCgodmFsdWU6IFZhbHVlKSA9PiB2YWx1ZS5jb2RlKTtcclxuICAgICAgICAgIGRhdGFLZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW1LZXlzLmZvckVhY2goKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIHdpZGdldC52YWx1ZS5kYXRhW2tleV1baXRlbV0gPSBbXHJcbiAgICAgICAgICAgICAgICBncm91cC5jb250cm9sc1tgJHt3aWRnZXQua2V5fS5kYXRhLiR7a2V5fS4ke2l0ZW19YF0udmFsdWUsXHJcbiAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBsZXQgZGF0YWtleXMgPSBPYmplY3Qua2V5cyh3aWRnZXQudmFsdWUuZGF0YSk7XHJcbiAgICAgICAgICAvL01hcCBjaGVja2JveCBrZXkgLSBib29sZWFuIHZhbHVlIHRvIHN0cmluZyBrZXkgYXJyYXlcclxuICAgICAgICAgIGxldCB2YWx1ZUtleXMgPSB3aWRnZXQudmFsdWUuY29sdW1ucy5tYXAoKHZhbHVlOiBWYWx1ZSkgPT4gdmFsdWUuY29kZSk7XHJcbiAgICAgICAgICBkYXRha2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbmV3RGF0YTogYW55W10gPSBbXTtcclxuICAgICAgICAgICAgdmFsdWVLZXlzLmZvckVhY2goKHZhbHVlS2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB3aWRnZXQudmFsdWUuZGF0YVtrZXldW3ZhbHVlS2V5XTtcclxuICAgICAgICAgICAgICBpZiAodmFsdWVbMF0pIHtcclxuICAgICAgICAgICAgICAgIG5ld0RhdGEucHVzaCh2YWx1ZUtleSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbHVlLmRhdGFba2V5XSA9IG5ld0RhdGE7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgT2JqZWN0LmtleXMod2lkZ2V0LnZhbHVlLmRhdGEpLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbHVlLmRhdGFba2V5XSA9IFtncm91cC5jb250cm9sc1tgJHt3aWRnZXQua2V5fS4ke2tleX1gXS52YWx1ZV07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJViAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICAgICkge1xyXG4gICAgICAgIHdpZGdldC52YWx1ZSA9IGdyb3VwLmNvbnRyb2xzW3dpZGdldC5rZXldLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvU21hcnRGb3JtKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogU21hcnRGb3JtIHtcclxuICAgIGlmICh0aGlzLnNtYXJ0Rm9ybSkge1xyXG4gICAgICB0aGlzLmNvcHlWYWx1ZUZyb21Gb3JtVG9XaWRnZXRCZWFucyh0aGlzLnNtYXJ0Rm9ybS53aWRnZXRzLCBncm91cCk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNtYXJ0Rm9ybS5jb21wb25lbnRNb2RlbD8uZGF0YTtcclxuICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmdldFByb3BlcnR5TmFtZXNEZWVwbHkoZGF0YSkpIHtcclxuICAgICAgICAgIGlmIChncm91cC5jb250cm9sc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVEZWVwbHkoZGF0YSwga2V5LCBncm91cC5jb250cm9sc1trZXldLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnNtYXJ0Rm9ybSE7XHJcbiAgfVxyXG5cclxuICBnZXRNb2RlbChncm91cDogVW50eXBlZEZvcm1Hcm91cCk6IGFueSB7XHJcbiAgICBpZiAoIXRoaXMuc21hcnRGb3JtPy5jb21wb25lbnRNb2RlbCkge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBsZXQgb3JpZ2luYWxNb2RlbCA9IHRoaXMuc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLmRhdGE7XHJcbiAgICBsZXQgY29weU9mTW9kZWwgPSB7IC4uLm9yaWdpbmFsTW9kZWwgfTtcclxuXHJcbiAgICAvLyBjb3B5T2ZNb2RlbCBzaG91bGQgYmUgdGhlIGN1cnJlbnQgbW9kZWxcclxuICAgIHRoaXMuc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLmRhdGEgPSBjb3B5T2ZNb2RlbDtcclxuICAgIC8vIGNvcHkgdmFsdWUgZnJvbSBGb3JtR3JvdXAgaW50byBtb2RlbFxyXG4gICAgdGhpcy50b1NtYXJ0Rm9ybShncm91cCk7XHJcblxyXG4gICAgbGV0IG5ld01vZGVsID0gdGhpcy5zbWFydEZvcm0uY29tcG9uZW50TW9kZWwuZGF0YTtcclxuICAgIHRoaXMuc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLmRhdGEgPSBvcmlnaW5hbE1vZGVsO1xyXG5cclxuICAgIHJldHVybiBuZXdNb2RlbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlDb21wb25lbnRDb25zdHJhaW50cyhcclxuICAgIHdpZGdldHM6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10sXHJcbiAgICBjb25zdHJhaW50czogU21hcnRGb3JtQ29tcG9uZW50Q29uc3RyYWludFtdXHJcbiAgKSB7XHJcbiAgICB3aWRnZXRzLmZvckVhY2goKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4pID0+IHtcclxuICAgICAgbGV0IHdpZGdldENvbnN0cmFpbnRzID0gY29uc3RyYWludHM/LmZpbHRlcihcclxuICAgICAgICAvLyhjb25zdHJhaW50OiBTbWFydEZvcm1Db21wb25lbnRDb25zdHJhaW50KSA9PiBjb25zdHJhaW50LmRhdGFOYW1lID09PSB3aWRnZXQua2V5XHJcbiAgICAgICAgKGNvbnN0cmFpbnQpID0+IHRoaXMuYW50UGF0aE1hdGNoZXIoY29uc3RyYWludC5kYXRhTmFtZSwgd2lkZ2V0LmtleSlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICh3aWRnZXRDb25zdHJhaW50cyAmJiB3aWRnZXRDb25zdHJhaW50cy5sZW5ndGgpIHtcclxuICAgICAgICB3aWRnZXRDb25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29uc3RyYWludC52aXNpYmxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHdpZGdldC5pc1Zpc2libGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIHdpZGdldC5pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB3aWRnZXQuaXNWaXNpYmxlID0gY29uc3RyYWludC52aXNpYmxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgbGV0IHZhbGlkYXRvcnMgPSB3aWRnZXQudmFsaWRhdG9ycyA/PyBbXTtcclxuICAgICAgICAgICAgbGV0IHJlcXVpcmVkSW5kZXggPSB2YWxpZGF0b3JzLmZpbmRJbmRleCgodikgPT4gdi52YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICBsZXQgd2FzTWFuZGF0b3J5ID0gcmVxdWlyZWRJbmRleCA+PSAwO1xyXG4gICAgICAgICAgICBsZXQgdG9iZU1hbmRhdG9yeSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5tYW5kYXRvcnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIC8vIG5vdCBzcGVjaWZpZWQgb24gc2VydmVyLCB1c2UgY2xpZW50IHN0YXRlXHJcbiAgICAgICAgICAgICAgLy8gaWYgd2lkZ2V0IGlzIG5vdCB2aXNpYmxlLCBjbGllbnQgc2hvdWxkIGRlZmF1bHQgdG8gbm90IG1hbmRhdG9yeVxyXG4gICAgICAgICAgICAgIHRvYmVNYW5kYXRvcnkgPSB3aWRnZXQuaXNWaXNpYmxlICYmIHdhc01hbmRhdG9yeTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0b2JlTWFuZGF0b3J5ID0gY29uc3RyYWludC5tYW5kYXRvcnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF3YXNNYW5kYXRvcnkgJiYgdG9iZU1hbmRhdG9yeSkge1xyXG4gICAgICAgICAgICAgIC8vIGFkZCByZXF1aXJlZCB2YWxpZGF0b3JcclxuICAgICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9ycyA9IFtcclxuICAgICAgICAgICAgICAgIC4uLnZhbGlkYXRvcnMsXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgICAgICAgaXNDdXN0b206IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6ICcnLFxyXG4gICAgICAgICAgICAgICAgICBuYW1lOiAncmVxdWlyZWQnLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBlbXB0eSBpdGVtXHJcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eUl0ZW1Gcm9tVmFsdWVMaXN0KHdpZGdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHdhc01hbmRhdG9yeSAmJiAhdG9iZU1hbmRhdG9yeSkge1xyXG4gICAgICAgICAgICAgIC8vIHJlbW92ZSByZXF1aXJlZCB2YWxpZGF0b3JcclxuICAgICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9ycz8uc3BsaWNlKHJlcXVpcmVkSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgIC8vIGFkZCBlbXB0eSBpdGVtXHJcbiAgICAgICAgICAgICAgbGV0IGVtcHR5TGFiZWwgPSAnJztcclxuICAgICAgICAgICAgICBpZiAoJ3NlbGVjdGlvbicgaW4gd2lkZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICBlbXB0eUxhYmVsID0gd2lkZ2V0LnNlbGVjdGlvbj8uZW1wdHlMYWJlbCA/PyAnJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5hZGRFbXB0eUl0ZW1Ub1ZhbHVlTGlzdCh3aWRnZXQsIGVtcHR5TGFiZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50LmVuYWJsZWQgPT09IHVuZGVmaW5lZCB8fCBjb25zdHJhaW50LmVuYWJsZWQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBpZiAod2lkZ2V0LmlzRGlzYWJsZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgd2lkZ2V0LmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LmlzRGlzYWJsZWQgPSAhY29uc3RyYWludC5lbmFibGVkO1xyXG4gICAgICAgICAgICAgIGlmICh3aWRnZXQudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVCkge1xyXG4gICAgICAgICAgICAgICAgd2lkZ2V0LmlzUmVhZG9ubHkgPSAhY29uc3RyYWludC5lbmFibGVkO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRvclByb3ZpZGVyPy5hcHBseUNvbnN0cmFpbnQod2lkZ2V0IGFzIFZhbGlkYXRlZFdpZGdldDxhbnk+LCBjb25zdHJhaW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdCAmJlxyXG4gICAgICAgIHdpZGdldC52YWx1ZUxpc3QubGVuZ3RoXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuYXBwbHlDb21wb25lbnRDb25zdHJhaW50cyh3aWRnZXQudmFsdWVMaXN0LCBjb25zdHJhaW50cyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWdleFJlZ2V4Q2hhcnMgPSBuZXcgUmVnRXhwKC9bXFwuXFwtXFxbXFxdXFwvXFx7XFx9XFwoXFwpXFwrXFxeXFwkXFxcXFxcfF0vZyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWdleEFzdGVyaXNrSW5UaGVNaWRkbGUgPSBuZXcgUmVnRXhwKC8oW15cXCpdKVxcKihbXlxcKl0pL2cpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnZXhBc3Rlcmlza0luVGhlRW5kID0gbmV3IFJlZ0V4cCgvKFteXFwqXSlcXCokL2cpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnZXhBc3Rlcmlza0luVGhlQmVnaW5uaW5nID0gbmV3IFJlZ0V4cCgvXlxcKihbXlxcKl0pL2cpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnZXhBc3Rlcmlza09ubHkgPSBuZXcgUmVnRXhwKC9eXFwqJC9nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4RG91YmxlQXN0ZXJpc2tXaXRoRG90ID0gbmV3IFJlZ0V4cCgvXFwqXFwqXFxcXFxcLi9nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4RG91YmxlQXN0ZXJpc2sgPSBuZXcgUmVnRXhwKC9cXCpcXCovZyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWdleFF1ZXN0aW9uTWFyayA9IG5ldyBSZWdFeHAoL1xcPy9nKTtcclxuICBwcml2YXRlIHJlZ2V4QnlQYXR0ZXJuOiBNYXA8c3RyaW5nLCBSZWdFeHA+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBhbnRQYXRoTWF0Y2hlcihwYXR0ZXJuPzogc3RyaW5nLCBwYXRoPzogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXBhdHRlcm4gfHwgIXBhdGgpIHtcclxuICAgICAgLy8gZW1wdHkgcGF0dGVybiBvciBwYXRoIC0+IG5vdCBldmFsdWF0ZWQsIHRydWUgb3IgZmFsc2U/XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGxldCByZWdleCA9IHRoaXMucmVnZXhCeVBhdHRlcm4uZ2V0KHBhdHRlcm4pO1xyXG4gICAgaWYgKHJlZ2V4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gZXNjYXBlIHJlZ2V4IGNoYXJhY3RlcnMgZXhjZXB0IGZvciA/LCAqLCAqKlxyXG4gICAgICBsZXQgcmVnZXhQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKHRoaXMucmVnZXhSZWdleENoYXJzLCAnXFxcXCQmJyk7XHJcblxyXG4gICAgICAvLyByZXBsYWNlIGFudC1zdHlsZSB3aWxkY2FyZHMgd2l0aCByZWdleCBlcXVpdmFsZW50c1xyXG5cclxuICAgICAgLy8gcmVwbGFjZSAqIHdpdGggYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBmb3IgJy4nXHJcbiAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5yZXBsYWNlKHRoaXMucmVnZXhBc3Rlcmlza0luVGhlTWlkZGxlLCAnJDFbXi5dKiQyJyk7IC8vIG5vdCogKiBub3QqXHJcbiAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5yZXBsYWNlKHRoaXMucmVnZXhBc3Rlcmlza0luVGhlRW5kLCAnJDFbXi5dKicpOyAvLyBub3QqICogRU9MXHJcbiAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5yZXBsYWNlKHRoaXMucmVnZXhBc3Rlcmlza0luVGhlQmVnaW5uaW5nLCAnW14uXSokMScpOyAvLyBCT0wgKiBub3QqXHJcbiAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5yZXBsYWNlKHRoaXMucmVnZXhBc3Rlcmlza09ubHksICdbXi5dKicpOyAvLyBCT0wgKiBFT0xcclxuXHJcbiAgICAgIC8vIHJlcGxhY2UgKiogd2l0aCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgaW5jbHVkaW5nICcuJ1xyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4RG91YmxlQXN0ZXJpc2tXaXRoRG90LCAnLionKTsgLy8gKiouXHJcbiAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5yZXBsYWNlKHRoaXMucmVnZXhEb3VibGVBc3RlcmlzaywgJy4qJyk7IC8vICoqXHJcblxyXG4gICAgICAvLyByZXBsYWNlID8gd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2hlclxyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4UXVlc3Rpb25NYXJrLCAnLicpO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIGEgUmVnRXhwIG9iamVjdFxyXG4gICAgICByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgcmVnZXhQYXR0ZXJuICsgJyQnKTtcclxuICAgICAgdGhpcy5yZWdleEJ5UGF0dGVybi5zZXQocGF0dGVybiwgcmVnZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRlc3QgdGhlIHBhdGggYWdhaW5zdCB0aGUgZ2VuZXJhdGVkIHJlZ2V4XHJcbiAgICByZXR1cm4gcmVnZXgudGVzdChwYXRoKTtcclxuICB9XHJcblxyXG4gIGFwcGx5Q29uc3RyYWludHMod2lkZ2V0cz86IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10pOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbWFydEZvcm0hLmNvbXBvbmVudE1vZGVsPy5jb25zdHJhaW50cyAmJlxyXG4gICAgICB0aGlzLnNtYXJ0Rm9ybSEuY29tcG9uZW50TW9kZWw/LmNvbnN0cmFpbnRzLmxlbmd0aFxyXG4gICAgKSB7XHJcbiAgICAgIGlmICghd2lkZ2V0cykge1xyXG4gICAgICAgIHdpZGdldHMgPSB0aGlzLnNtYXJ0Rm9ybSEud2lkZ2V0cztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFwcGx5Q29tcG9uZW50Q29uc3RyYWludHMod2lkZ2V0cywgdGhpcy5zbWFydEZvcm0hLmNvbXBvbmVudE1vZGVsPy5jb25zdHJhaW50cyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRFbXB0eUl0ZW1Ub1ZhbHVlTGlzdCh3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+LCBlbXB0eUxhYmVsPzogc3RyaW5nKSB7XHJcbiAgICBpZiAod2lkZ2V0LnR5cGUgPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1QpIHtcclxuICAgICAgY29uc3QgY29udGFpbnNFbXB0eUtleSA9IHdpZGdldC52YWx1ZUxpc3Quc29tZSgodikgPT4gdi5rZXkgPT09IHRoaXMuZW1wdHlLZXkpO1xyXG4gICAgICBpZiAoIWNvbnRhaW5zRW1wdHlLZXkpIHtcclxuICAgICAgICB3aWRnZXQudmFsdWVMaXN0Py51bnNoaWZ0KHtcclxuICAgICAgICAgIGtleTogdGhpcy5lbXB0eUtleSxcclxuICAgICAgICAgIGxhYmVsOiBlbXB0eUxhYmVsID8/ICcnLFxyXG4gICAgICAgICAgdHlwZTogU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNLFxyXG4gICAgICAgICAgdmFsdWU6ICcnLCAvLyB0aGlzIHNob3VsZCBiZSB1bmRlZmluZWQsIGJ1dCBGb3JtQ29udHJvbCBjYW5ub3QgYmUgbnVsbCwgZnJvbSB2MTQgaXQgd2lsbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVFbXB0eUl0ZW1Gcm9tVmFsdWVMaXN0KHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4pIHtcclxuICAgIGlmICgndmFsdWVMaXN0JyBpbiB3aWRnZXQpIHtcclxuICAgICAgaWYgKHdpZGdldC52YWx1ZUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBmaXJzdEl0ZW0gPSB3aWRnZXQudmFsdWVMaXN0WzBdO1xyXG4gICAgICAgIGlmIChmaXJzdEl0ZW0/LmtleSA9PT0gdGhpcy5lbXB0eUtleSkge1xyXG4gICAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdC5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyV2lkZ2V0c0J5VmlzaWJpbGl0eSh3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdKTogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSB7XHJcbiAgICByZXR1cm4gd2lkZ2V0cy5maWx0ZXIoKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4pID0+XHJcbiAgICAgIHdpZGdldC5pc1Zpc2libGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB3aWRnZXQuaXNWaXNpYmxlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRUcmFuc2xhdGlvbk9mS2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNtYXJ0Rm9ybSEudHJhbnNsYXRlU2VydmljZSEuZ2V0KGtleSkudG9Qcm9taXNlKCk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShrZXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdHJhbnNsYXRlV2lkZ2V0cyh3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBQcm9taXNlLmFsbChcclxuICAgICAgd2lkZ2V0cy5tYXAoYXN5bmMgKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4pID0+IHtcclxuICAgICAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVIpIHJldHVybjtcclxuICAgICAgICBpZiAod2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSKSB7XHJcbiAgICAgICAgICBpZiAoIXdpZGdldC5vcmlnaW5hbExhYmVsKSB7XHJcbiAgICAgICAgICAgIHdpZGdldC5vcmlnaW5hbExhYmVsID0gYCR7d2lkZ2V0LmxhYmVsfWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyAgTGFiZWxcclxuICAgICAgICAgIHdpZGdldC5sYWJlbCA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNsYXRpb25PZktleSh3aWRnZXQub3JpZ2luYWxMYWJlbCk7XHJcblxyXG4gICAgICAgICAgLy8gUGxhY2Vob2xkZXJcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTEQgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX05VTUJFUiB8fFxyXG4gICAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFQgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0JPWCkgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnBsYWNlaG9sZGVyXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKCF3aWRnZXQub3JpZ2luYWxQbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgICAgIHdpZGdldC5vcmlnaW5hbFBsYWNlaG9sZGVyID0gYCR7d2lkZ2V0LnBsYWNlaG9sZGVyfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2lkZ2V0LnBsYWNlaG9sZGVyID0gYXdhaXQgdGhpcy5nZXRUcmFuc2xhdGlvbk9mS2V5KHdpZGdldC5vcmlnaW5hbFBsYWNlaG9sZGVyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBWYWxpZGF0b3JzXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbGlkYXRvcnNcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9ycyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgIHdpZGdldC52YWxpZGF0b3JzLm1hcChhc3luYyAodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0b3Iub3JpZ2luYWxFcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlID0gYCR7dmFsaWRhdG9yLmVycm9yTWVzc2FnZX1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLmVycm9yTWVzc2FnZSA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNsYXRpb25PZktleShcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvcjtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gSW5kaWNhdG9yXHJcbiAgICAgICAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmIHdpZGdldC5pbmRpY2F0b3IpIHtcclxuICAgICAgICAgICAgaWYgKCF3aWRnZXQuaW5kaWNhdG9yLm9yaWdpbmFsSW5kaWNhdG9yU3RhdHVzTGFiZWxzKSB7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LmluZGljYXRvci5vcmlnaW5hbEluZGljYXRvclN0YXR1c0xhYmVscyA9XHJcbiAgICAgICAgICAgICAgICB3aWRnZXQuaW5kaWNhdG9yLmluZGljYXRvclN0YXR1c0xhYmVscy5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IGxhYmVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aWRnZXQuaW5kaWNhdG9yLmluZGljYXRvclN0YXR1c0xhYmVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgIHdpZGdldC5pbmRpY2F0b3IuaW5kaWNhdG9yU3RhdHVzTGFiZWxzLm1hcChcclxuICAgICAgICAgICAgICAgIGFzeW5jIChsYWJlbDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRyYW5zbGF0aW9uT2ZLZXkoXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LmluZGljYXRvciEub3JpZ2luYWxJbmRpY2F0b3JTdGF0dXNMYWJlbHMhW2luZGV4XVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1QgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RfTVVMVElQTEUgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiB8fFxyXG4gICAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTikgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlV2lkZ2V0SXRlbXMod2lkZ2V0LnZhbHVlTGlzdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlV2lkZ2V0cyh3aWRnZXQudmFsdWVMaXN0ISk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHRyYW5zbGF0ZVdpZGdldEl0ZW1zKHdpZGdldHM6IFNtYXJ0SXRlbXM8YW55PltdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBQcm9taXNlLmFsbChcclxuICAgICAgd2lkZ2V0cy5tYXAoYXN5bmMgKHdpZGdldDogU21hcnRJdGVtczxhbnk+KSA9PiB7XHJcbiAgICAgICAgaWYgKCF3aWRnZXQub3JpZ2luYWxMYWJlbCkge1xyXG4gICAgICAgICAgd2lkZ2V0Lm9yaWdpbmFsTGFiZWwgPSBgJHt3aWRnZXQubGFiZWx9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gIExhYmVsXHJcbiAgICAgICAgd2lkZ2V0LmxhYmVsID0gYXdhaXQgdGhpcy5nZXRUcmFuc2xhdGlvbk9mS2V5KHdpZGdldC5vcmlnaW5hbExhYmVsKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFRpbWUod2lkZ2V0SW5zdGFuY2U6IFNtYXJ0RGF0ZVRpbWVQaWNrZXI8YW55Pikge1xyXG4gIGxldCB0aW1lO1xyXG4gIGlmICh3aWRnZXRJbnN0YW5jZS52YWx1ZSkge1xyXG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh3aWRnZXRJbnN0YW5jZS52YWx1ZSk7XHJcbiAgICBsZXQgaG91ciA9IFNtYXJ0V2lkZ2V0U2V0dGluZ3MudXNlVXRjID8gZGF0ZS5nZXRVVENIb3VycygpIDogZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgbGV0IG1pbiA9IFNtYXJ0V2lkZ2V0U2V0dGluZ3MudXNlVXRjID8gZGF0ZS5nZXRVVENNaW51dGVzKCkgOiBkYXRlLmdldE1pbnV0ZXMoKTtcclxuICAgIHRpbWUgPSBTdHJpbmcoaG91cikucGFkU3RhcnQoMiwgJzAnKSArICc6JyArIFN0cmluZyhtaW4pLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICB3aWRnZXRJbnN0YW5jZS52YWx1ZSA9IG1vbWVudChkYXRlKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGltZSA9ICcnO1xyXG4gIH1cclxuICByZXR1cm4gdGltZTtcclxufVxyXG4iXX0=
|
|
@@ -165,7 +165,7 @@ export class SmartfileuploaderComponent {
|
|
|
165
165
|
};
|
|
166
166
|
}
|
|
167
167
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartfileuploaderComponent, deps: [{ token: i1.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
168
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartfileuploaderComponent, selector: "smartfileuploader", inputs: { uploadCallback: "uploadCallback", fileFormats: "fileFormats", maxSizeMb: "maxSizeMb", i18n: "i18n", useIconButton: "useIconButton", isMultiple: "isMultiple", autoUpload: "autoUpload", isDisabled: "isDisabled" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div\r\n class=\"container\"\r\n [ngClass]=\"{ disabledWidget: isDisabled }\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n [class.dragover]=\"isDragOver\"\r\n>\r\n <div class=\"fileContainer\" (click)=\"fileInput.click()\">\r\n <input\r\n #fileInput\r\n id=\"addFile\"\r\n placeholder=\"fileInput\"\r\n type=\"file\"\r\n (change)=\"getFile($event)\"\r\n class=\"file\"\r\n accept=\"{{ fileFormats?.join(', ') }}\"\r\n [size]=\"maxSizeMb\"\r\n [multiple]=\"isMultiple\"\r\n [disabled]=\"isDisabled\"\r\n style=\"display: none\"\r\n />\r\n <div class=\"fileUploadContentContainer\">\r\n <div class=\"icon\">\r\n <mat-label *ngIf=\"useIconButton\" class=\"addFileButton\">\r\n <mat-icon color=\"primary\" class=\"addCircle\">add_circle</mat-icon>\r\n </mat-label>\r\n <button *ngIf=\"!useIconButton\" mat-raised-button color=\"primary\" class=\"addFileButton\">\r\n {{ i18n!.addFile }}\r\n </button>\r\n </div>\r\n <div class=\"labels\">\r\n <mat-label *ngIf=\"useIconButton\" class=\"label primary title\">\r\n {{ i18n!.addFile }}\r\n </mat-label>\r\n <mat-label class=\"label secondary\"> {{ i18n!.browseOrDrag }} </mat-label>\r\n <mat-label class=\"subLabel primary\"> {{ i18n!.maxSize }} </mat-label>\r\n <mat-label class=\"subLabel primary\"> {{ i18n!.formats }} </mat-label>\r\n </div>\r\n <div class=\"uploadButton\" *ngIf=\"files.length\">\r\n <ui-action-button\r\n (actionClick)=\"uploadFile()\"\r\n [code]=\"'default-upload'\"\r\n [descriptor]=\"uploadButton\"\r\n >\r\n </ui-action-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"errors.length\" class=\"errorMessage\">\r\n <smart-icon [icon]=\"'error'\" [color]=\"'warn'\"></smart-icon>\r\n <div class=\"errors\">\r\n <span *ngFor=\"let error of errors\">{{ error }}</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"files.length\" class=\"uploadedFilesContainer\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"uploadedFile\">\r\n <ng-container *ngIf=\"filePreviewUrl(file); else fileIcon\">\r\n <img [src]=\"filePreviewUrl(file)\" [alt]=\"file.name\" width=\"50\" height=\"50\" />\r\n </ng-container>\r\n <ng-template #fileIcon>\r\n <smart-icon [icon]=\"'insert_drive_file'\"></smart-icon>\r\n </ng-template>\r\n\r\n <div class=\"fileData\">\r\n <div class=\"fileDataContainer\">\r\n <span class=\"fileName\">{{ file.name }}</span>\r\n <span class=\"fileSize\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fileActions\">\r\n <smart-icon\r\n class=\"downloadIcon\"\r\n icon=\"download\"\r\n (click)=\"downloadFile(file)\"\r\n [attr.data-testid]=\"'default_download'\"\r\n ></smart-icon>\r\n <smart-icon\r\n class=\"removeIcon\"\r\n icon=\"delete\"\r\n [attr.data-testid]=\"'default_remove'\"\r\n (click)=\"remove(i)\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{--border-color: #a6aabd60;--warninig-color: #be2d2e;--def-border-radius: .5rem}.container{display:flex;flex-direction:column;border:2px dashed var(--border-color);border-radius:var(--def-border-radius)}.fileContainer{cursor:pointer;padding:1rem;display:flex;flex-direction:column}.fileContainer:hover{background-color:rgb(from var(--border-color) r g b / .1)}.disabledWidget ::ng-deep .fileContainer:hover{background-color:unset;cursor:unset}.disabledWidget ::ng-deep *{opacity:.85}.dragover{background-color:rgb(from var(--border-color) r g b / .1)}.fileUploadContentContainer{display:flex;flex-direction:row;gap:1rem}.icon mat-icon{font-size:3rem;width:unset;height:unset}.icon{align-content:center}.labels{flex:1;display:flex;flex-direction:column;justify-content:center;width:fit-content}.uploadButton{align-content:center}.primary{color:var(--primary-color)}.secondary{color:var(--gray)}.label{margin:unset}.subLabel{font-size:smaller}.title{padding-bottom:.3rem}.errorMessage,.uploadedFilesContainer{border-top:2px solid var(--border-color)}.errorMessage{display:flex;flex-direction:row;align-items:center;color:var(--warninig-color);padding:.5rem 1rem;gap:1rem}.errorMessage ::ng-deep mat-icon{color:var(--warninig-color)}.errors{display:flex;flex-direction:column}.uploadedFile{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;padding:1rem;border-bottom:1px solid #e0e0e0;gap:1rem}.uploadedFile:last-child{border-bottom:none}.fileSize{display:flex;flex-direction:row;font-size:smaller}.fileData{flex:1;display:flex;flex-direction:column}.fileDataContainer{display:flex;flex-direction:column;justify-content:flex-end;width:fit-content}.removeIcon ::ng-deep mat-icon{color:var(--warninig-color)}smart-icon ::ng-deep mat-icon{font-size:3rem;width:unset;height:unset}.fileActions{display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.fileActions ::ng-deep .pi{width:unset!important}.removeIcon ::ng-deep i,.removeIcon ::ng-deep mat-icon{color:var(--warninig-color)}.removeIcon ::ng-deep .pi,.downloadIcon ::ng-deep .pi{font-size:1.5rem!important}.removeIcon ::ng-deep mat-icon,.downloadIcon ::ng-deep mat-icon{font-size:2rem}.removeIcon:hover,.downloadIcon:hover{cursor:pointer}smart-icon{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "component", type: i7.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "viewActivated", "addedCssClass", "addBasicClasses", "iconPlaceholder"], outputs: ["actionClick", "actionDoubleClick"] }] }); }
|
|
168
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartfileuploaderComponent, selector: "smartfileuploader", inputs: { uploadCallback: "uploadCallback", fileFormats: "fileFormats", maxSizeMb: "maxSizeMb", i18n: "i18n", useIconButton: "useIconButton", isMultiple: "isMultiple", autoUpload: "autoUpload", isDisabled: "isDisabled" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div\r\n class=\"container\"\r\n [ngClass]=\"{ disabledWidget: isDisabled }\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n [class.dragover]=\"isDragOver\"\r\n>\r\n <div class=\"fileContainer\" (click)=\"fileInput.click()\">\r\n <input\r\n #fileInput\r\n id=\"addFile\"\r\n placeholder=\"fileInput\"\r\n type=\"file\"\r\n (change)=\"getFile($event)\"\r\n class=\"file\"\r\n accept=\"{{ fileFormats?.join(', ') }}\"\r\n [size]=\"maxSizeMb\"\r\n [multiple]=\"isMultiple\"\r\n [disabled]=\"isDisabled\"\r\n style=\"display: none\"\r\n />\r\n <div class=\"fileUploadContentContainer\">\r\n <div class=\"icon\">\r\n <mat-label *ngIf=\"useIconButton\" class=\"addFileButton\">\r\n <mat-icon color=\"primary\" class=\"addCircle\">add_circle</mat-icon>\r\n </mat-label>\r\n <button *ngIf=\"!useIconButton\" mat-raised-button color=\"primary\" class=\"addFileButton\">\r\n {{ i18n!.addFile }}\r\n </button>\r\n </div>\r\n <div class=\"labels\">\r\n <mat-label *ngIf=\"useIconButton\" class=\"label primary title\">\r\n {{ i18n!.addFile }}\r\n </mat-label>\r\n <mat-label class=\"label secondary\"> {{ i18n!.browseOrDrag }} </mat-label>\r\n <mat-label class=\"subLabel primary\"> {{ i18n!.maxSize }} </mat-label>\r\n <mat-label class=\"subLabel primary\"> {{ i18n!.formats }} </mat-label>\r\n </div>\r\n <div class=\"uploadButton\" *ngIf=\"files.length\">\r\n <ui-action-button\r\n (actionClick)=\"uploadFile()\"\r\n [code]=\"'default-upload'\"\r\n [descriptor]=\"uploadButton\"\r\n >\r\n </ui-action-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"errors.length\" class=\"errorMessage\">\r\n <smart-icon [icon]=\"'error'\" [color]=\"'warn'\"></smart-icon>\r\n <div class=\"errors\">\r\n <span *ngFor=\"let error of errors\">{{ error }}</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"files.length\" class=\"uploadedFilesContainer\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"uploadedFile\">\r\n <ng-container *ngIf=\"filePreviewUrl(file); else fileIcon\">\r\n <img [src]=\"filePreviewUrl(file)\" [alt]=\"file.name\" width=\"50\" height=\"50\" />\r\n </ng-container>\r\n <ng-template #fileIcon>\r\n <smart-icon [icon]=\"'insert_drive_file'\"></smart-icon>\r\n </ng-template>\r\n\r\n <div class=\"fileData\">\r\n <div class=\"fileDataContainer\">\r\n <span class=\"fileName\">{{ file.name }}</span>\r\n <span class=\"fileSize\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fileActions\">\r\n <smart-icon\r\n class=\"downloadIcon\"\r\n icon=\"download\"\r\n (click)=\"downloadFile(file)\"\r\n [attr.data-testid]=\"'default_download'\"\r\n ></smart-icon>\r\n <smart-icon\r\n class=\"removeIcon\"\r\n icon=\"delete\"\r\n [attr.data-testid]=\"'default_remove'\"\r\n (click)=\"remove(i)\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{--border-color: #a6aabd60;--warninig-color: #be2d2e;--def-border-radius: .5rem}.container{display:flex;flex-direction:column;border:2px dashed var(--border-color);border-radius:var(--def-border-radius)}.fileContainer{cursor:pointer;padding:1rem;display:flex;flex-direction:column}.fileContainer:hover{background-color:rgb(from var(--border-color) r g b / .1)}.disabledWidget ::ng-deep .fileContainer:hover{background-color:unset;cursor:unset}.disabledWidget ::ng-deep *{opacity:.85}.dragover{background-color:rgb(from var(--border-color) r g b / .1)}.fileUploadContentContainer{display:flex;flex-direction:row;gap:1rem}.icon mat-icon{font-size:3rem;width:unset;height:unset}.icon{align-content:center}.labels{flex:1;display:flex;flex-direction:column;justify-content:center;width:fit-content}.uploadButton{align-content:center}.primary{color:var(--primary-color)}.secondary{color:var(--gray)}.label{margin:unset}.subLabel{font-size:smaller}.title{padding-bottom:.3rem}.errorMessage,.uploadedFilesContainer{border-top:2px solid var(--border-color)}.errorMessage{display:flex;flex-direction:row;align-items:center;color:var(--warninig-color);padding:.5rem 1rem;gap:1rem}.errorMessage ::ng-deep mat-icon{color:var(--warninig-color)}.errors{display:flex;flex-direction:column}.uploadedFile{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;padding:1rem;border-bottom:1px solid #e0e0e0;gap:1rem}.uploadedFile:last-child{border-bottom:none}.fileSize{display:flex;flex-direction:row;font-size:smaller}.fileData{flex:1;display:flex;flex-direction:column}.fileDataContainer{display:flex;flex-direction:column;justify-content:flex-end;width:fit-content}.removeIcon ::ng-deep mat-icon{color:var(--warninig-color)}smart-icon ::ng-deep mat-icon{font-size:3rem;width:unset;height:unset}.fileActions{display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.fileActions ::ng-deep .pi{width:unset!important}.removeIcon ::ng-deep i,.removeIcon ::ng-deep mat-icon{color:var(--warninig-color)}.removeIcon ::ng-deep .pi,.downloadIcon ::ng-deep .pi{font-size:1.5rem!important}.removeIcon ::ng-deep mat-icon,.downloadIcon ::ng-deep mat-icon{font-size:2rem}.removeIcon:hover,.downloadIcon:hover{cursor:pointer}smart-icon{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "component", type: i7.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "identifier", "viewActivated", "addedCssClass", "addBasicClasses", "iconPlaceholder"], outputs: ["actionClick", "actionDoubleClick"] }] }); }
|
|
169
169
|
}
|
|
170
170
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartfileuploaderComponent, decorators: [{
|
|
171
171
|
type: Component,
|
package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs
CHANGED
|
@@ -152,7 +152,7 @@ export class SmartFileEditorComponent {
|
|
|
152
152
|
useExisting: forwardRef(() => SmartFileEditorComponent),
|
|
153
153
|
multi: true,
|
|
154
154
|
},
|
|
155
|
-
], viewQueries: [{ propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }], ngImport: i0, template: "@if (widgetInstance && widgetInstance.fileUploaderProperties) {\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ widgetInstance.label }}\r\n </h4>\r\n\r\n <div class=\"fileEditorComponent\">\r\n @if (widgetInstance.value && !isTypeSupported(widgetInstance.value)) {\r\n <div class=\"errorMessage\">\r\n <smart-icon [icon]=\"errorIcon\" [color]=\"'var(--warninig-color)'\"></smart-icon>\r\n <span> Unsupported widgetInstance.value type for this widget.</span>\r\n </div>\r\n } @else if (!widgetInstance.value || fileToChange) {\r\n <smart-upload-widget\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [uploadDescriptor]=\"widgetInstance.fileUploaderProperties.uploadDescriptor!\"\r\n [isMultiple]=\"false\"\r\n [isDisabled]=\"widgetInstance.isDisabled\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n }\r\n\r\n <div\r\n [ngClass]=\"{ disabledWidget: widgetInstance.isDisabled }\"\r\n class=\"uploadedFileContainer\"\r\n [style.display]=\"\r\n widgetInstance.value && isTypeSupported(widgetInstance.value) ? 'block' : 'none'\r\n \"\r\n >\r\n <div class=\"uploadedFile\">\r\n <smart-icon class=\"uploadedFileIcon\" [icon]=\"fileIcon\"></smart-icon>\r\n\r\n <div class=\"fileData\">\r\n <div class=\"fileDataContainer\">\r\n <span class=\"fileName\">{{ widgetInstance.value?.fileName }}</span>\r\n <span class=\"fileSize\">{{ formatSize(widgetInstance.value?.size) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fileActions\">\r\n <smart-ui-action-toolbar\r\n [id]=\"widgetInstance.toolbarId\"\r\n #toolbar\r\n ></smart-ui-action-toolbar>\r\n\r\n @if (!fileToChange) {\r\n <ui-action-button\r\n class=\"changeButton\"\r\n (actionClick)=\"change(widgetInstance.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n [descriptor]=\"changeButton\"\r\n >\r\n </ui-action-button>\r\n } @else {\r\n <ui-action-button\r\n class=\"removeIcon\"\r\n (actionClick)=\"cancelChange()\"\r\n [descriptor]=\"removeButton\"\r\n ></ui-action-button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: [":host{--border-color: #a6aabd60;--warninig-color: #be2d2e;--def-border-radius: .5rem;width:100%}.fileEditorComponent{border:2px dashed var(--border-color);border-radius:var(--def-border-radius)}.fileEditorComponent ::ng-deep smartfileuploader ::ng-deep .container{border:unset;border-radius:unset}.uploadedFileContainer{display:flex;flex-direction:column}.uploadedFile{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;padding:1rem;gap:1rem}.fileEditorComponent:has(::ng-deep prime-file-uploader) ::ng-deep .uploadedFile,.fileEditorComponent:has(::ng-deep smartfileuploader) ::ng-deep .uploadedFile{border-top:1px solid #e0e0e0}.fileSize{display:flex;flex-direction:row;font-size:smaller}.fileData{flex:1;display:flex;flex-direction:column}.fileDataContainer{display:flex;flex-direction:column;justify-content:flex-end;width:fit-content}.fileActions{display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.fileActions ::ng-deep button{border:unset}.fileActions ::ng-deep button:hover{border:unset}.removeIcon ::ng-deep mat-icon{color:var(--warninig-color)}smart-icon ::ng-deep mat-icon{font-size:3rem;width:unset;height:unset}.uploadedFileIcon{width:3rem;display:flex;justify-content:center}:host ::ng-deep .p-fileupload-content{border:unset;border-radius:var(--def-border-radius)}smart-icon ::ng-deep .pi{font-size:2rem!important}.fileEditorComponent:has(::ng-deep .errorMessage){border-color:var(--warninig-color)}.errorMessage{padding:1rem;font-size:1.5rem;color:var(--warninig-color);display:flex;flex-direction:row;align-items:center;gap:1rem}:host ::ng-deep .disabledWidget ::ng-deep .changeButton *,:host ::ng-deep .disabledWidget ::ng-deep .fileData *{opacity:.7}:host ::ng-deep smartfileuploader ::ng-deep .uploadedFile,:host ::ng-deep .p-fileupload-file{background:repeating-linear-gradient(45deg,#fafafa,#fafafa 12px,#f1f1f1 12px 24px)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i3.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: i4.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "viewActivated", "addedCssClass", "addBasicClasses", "iconPlaceholder"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: i5.UploadWidgetComponent, selector: "smart-upload-widget", inputs: ["uploadDescriptor", "isMultiple", "isDisabled"], outputs: ["uploadFilesEvent"] }] }); }
|
|
155
|
+
], viewQueries: [{ propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }], ngImport: i0, template: "@if (widgetInstance && widgetInstance.fileUploaderProperties) {\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ widgetInstance.label }}\r\n </h4>\r\n\r\n <div class=\"fileEditorComponent\">\r\n @if (widgetInstance.value && !isTypeSupported(widgetInstance.value)) {\r\n <div class=\"errorMessage\">\r\n <smart-icon [icon]=\"errorIcon\" [color]=\"'var(--warninig-color)'\"></smart-icon>\r\n <span> Unsupported widgetInstance.value type for this widget.</span>\r\n </div>\r\n } @else if (!widgetInstance.value || fileToChange) {\r\n <smart-upload-widget\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [uploadDescriptor]=\"widgetInstance.fileUploaderProperties.uploadDescriptor!\"\r\n [isMultiple]=\"false\"\r\n [isDisabled]=\"widgetInstance.isDisabled\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n }\r\n\r\n <div\r\n [ngClass]=\"{ disabledWidget: widgetInstance.isDisabled }\"\r\n class=\"uploadedFileContainer\"\r\n [style.display]=\"\r\n widgetInstance.value && isTypeSupported(widgetInstance.value) ? 'block' : 'none'\r\n \"\r\n >\r\n <div class=\"uploadedFile\">\r\n <smart-icon class=\"uploadedFileIcon\" [icon]=\"fileIcon\"></smart-icon>\r\n\r\n <div class=\"fileData\">\r\n <div class=\"fileDataContainer\">\r\n <span class=\"fileName\">{{ widgetInstance.value?.fileName }}</span>\r\n <span class=\"fileSize\">{{ formatSize(widgetInstance.value?.size) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fileActions\">\r\n <smart-ui-action-toolbar\r\n [id]=\"widgetInstance.toolbarId\"\r\n #toolbar\r\n ></smart-ui-action-toolbar>\r\n\r\n @if (!fileToChange) {\r\n <ui-action-button\r\n class=\"changeButton\"\r\n (actionClick)=\"change(widgetInstance.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n [descriptor]=\"changeButton\"\r\n >\r\n </ui-action-button>\r\n } @else {\r\n <ui-action-button\r\n class=\"removeIcon\"\r\n (actionClick)=\"cancelChange()\"\r\n [descriptor]=\"removeButton\"\r\n ></ui-action-button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: [":host{--border-color: #a6aabd60;--warninig-color: #be2d2e;--def-border-radius: .5rem;width:100%}.fileEditorComponent{border:2px dashed var(--border-color);border-radius:var(--def-border-radius)}.fileEditorComponent ::ng-deep smartfileuploader ::ng-deep .container{border:unset;border-radius:unset}.uploadedFileContainer{display:flex;flex-direction:column}.uploadedFile{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;padding:1rem;gap:1rem}.fileEditorComponent:has(::ng-deep prime-file-uploader) ::ng-deep .uploadedFile,.fileEditorComponent:has(::ng-deep smartfileuploader) ::ng-deep .uploadedFile{border-top:1px solid #e0e0e0}.fileSize{display:flex;flex-direction:row;font-size:smaller}.fileData{flex:1;display:flex;flex-direction:column}.fileDataContainer{display:flex;flex-direction:column;justify-content:flex-end;width:fit-content}.fileActions{display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.fileActions ::ng-deep button{border:unset}.fileActions ::ng-deep button:hover{border:unset}.removeIcon ::ng-deep mat-icon{color:var(--warninig-color)}smart-icon ::ng-deep mat-icon{font-size:3rem;width:unset;height:unset}.uploadedFileIcon{width:3rem;display:flex;justify-content:center}:host ::ng-deep .p-fileupload-content{border:unset;border-radius:var(--def-border-radius)}smart-icon ::ng-deep .pi{font-size:2rem!important}.fileEditorComponent:has(::ng-deep .errorMessage){border-color:var(--warninig-color)}.errorMessage{padding:1rem;font-size:1.5rem;color:var(--warninig-color);display:flex;flex-direction:row;align-items:center;gap:1rem}:host ::ng-deep .disabledWidget ::ng-deep .changeButton *,:host ::ng-deep .disabledWidget ::ng-deep .fileData *{opacity:.7}:host ::ng-deep smartfileuploader ::ng-deep .uploadedFile,:host ::ng-deep .p-fileupload-file{background:repeating-linear-gradient(45deg,#fafafa,#fafafa 12px,#f1f1f1 12px 24px)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i3.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: i4.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "identifier", "viewActivated", "addedCssClass", "addBasicClasses", "iconPlaceholder"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: i5.UploadWidgetComponent, selector: "smart-upload-widget", inputs: ["uploadDescriptor", "isMultiple", "isDisabled"], outputs: ["uploadFilesEvent"] }] }); }
|
|
156
156
|
}
|
|
157
157
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartFileEditorComponent, decorators: [{
|
|
158
158
|
type: Component,
|