@alfresco/adf-content-services 8.1.0-15902121227 → 8.1.0-15972188736
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/fesm2022/adf-content-services.mjs +808 -829
- package/fesm2022/adf-content-services.mjs.map +1 -1
- package/lib/new-version-uploader/new-version-uploader.dialog.scss +1 -1
- package/lib/upload/components/base-upload/upload-base.d.ts +1 -1
- package/package.json +4 -6
- package/esm2022/adf-content-services.mjs +0 -5
- package/esm2022/lib/agent/index.mjs +0 -18
- package/esm2022/lib/agent/public-api.mjs +0 -18
- package/esm2022/lib/agent/services/agent.service.mjs +0 -60
- package/esm2022/lib/alfresco-icon/alfresco-icon.component.mjs +0 -27
- package/esm2022/lib/api-factories/alfresco-api-no-auth.service.mjs +0 -42
- package/esm2022/lib/api-factories/alfresco-api-v2-loader.service.mjs +0 -77
- package/esm2022/lib/api-factories/index.mjs +0 -18
- package/esm2022/lib/api-factories/public-api.mjs +0 -19
- package/esm2022/lib/aspect-list/aspect-list-dialog-data.interface.mjs +0 -18
- package/esm2022/lib/aspect-list/aspect-list-dialog.component.mjs +0 -78
- package/esm2022/lib/aspect-list/aspect-list.component.mjs +0 -140
- package/esm2022/lib/aspect-list/aspect-list.module.mjs +0 -35
- package/esm2022/lib/aspect-list/index.mjs +0 -18
- package/esm2022/lib/aspect-list/public-api.mjs +0 -24
- package/esm2022/lib/aspect-list/services/aspect-list.service.mjs +0 -83
- package/esm2022/lib/aspect-list/services/dialog-aspect-list.service.mjs +0 -86
- package/esm2022/lib/aspect-list/services/node-aspect.service.mjs +0 -52
- package/esm2022/lib/auth-loader/content-auth-loader-factory.mjs +0 -26
- package/esm2022/lib/auth-loader/content-auth-loader.service.mjs +0 -42
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -167
- package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +0 -35
- package/esm2022/lib/breadcrumb/dropdown-breadcrumb.component.mjs +0 -66
- package/esm2022/lib/breadcrumb/index.mjs +0 -18
- package/esm2022/lib/breadcrumb/public-api.mjs +0 -20
- package/esm2022/lib/category/categories-management/categories-management-mode.mjs +0 -22
- package/esm2022/lib/category/categories-management/categories-management.component.mjs +0 -309
- package/esm2022/lib/category/category.module.mjs +0 -33
- package/esm2022/lib/category/index.mjs +0 -18
- package/esm2022/lib/category/models/category-node.interface.mjs +0 -18
- package/esm2022/lib/category/public-api.mjs +0 -23
- package/esm2022/lib/category/services/category-tree-datasource.service.mjs +0 -80
- package/esm2022/lib/category/services/category.service.mjs +0 -159
- package/esm2022/lib/common/events/file.event.mjs +0 -46
- package/esm2022/lib/common/index.mjs +0 -18
- package/esm2022/lib/common/interfaces/saved-search.interface.mjs +0 -18
- package/esm2022/lib/common/interfaces/search-configuration.interface.mjs +0 -18
- package/esm2022/lib/common/mocks/ecm-user.service.mock.mjs +0 -37
- package/esm2022/lib/common/models/allowable-operations.enum.mjs +0 -30
- package/esm2022/lib/common/models/ecm-company.model.mjs +0 -19
- package/esm2022/lib/common/models/ecm-user.model.mjs +0 -45
- package/esm2022/lib/common/models/file.model.mjs +0 -53
- package/esm2022/lib/common/models/node-metadata.model.mjs +0 -23
- package/esm2022/lib/common/models/permissions.enum.mjs +0 -32
- package/esm2022/lib/common/public-api.mjs +0 -37
- package/esm2022/lib/common/services/card-view-content-update.service.mjs +0 -55
- package/esm2022/lib/common/services/content.service.mjs +0 -180
- package/esm2022/lib/common/services/discovery-api.service.mjs +0 -79
- package/esm2022/lib/common/services/favorites-api.service.mjs +0 -84
- package/esm2022/lib/common/services/nodes-api.service.mjs +0 -251
- package/esm2022/lib/common/services/people-content.service.mjs +0 -138
- package/esm2022/lib/common/services/rendition.service.mjs +0 -270
- package/esm2022/lib/common/services/saved-searches.service.mjs +0 -206
- package/esm2022/lib/common/services/sites.service.mjs +0 -243
- package/esm2022/lib/common/services/upload.service.mjs +0 -391
- package/esm2022/lib/content-metadata/components/content-metadata/content-metadata-header.component.mjs +0 -55
- package/esm2022/lib/content-metadata/components/content-metadata/content-metadata.component.mjs +0 -491
- package/esm2022/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.mjs +0 -129
- package/esm2022/lib/content-metadata/content-metadata.module.mjs +0 -36
- package/esm2022/lib/content-metadata/index.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/aspect-oriented-config.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/card-view-group.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/content-metadata-config.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/content-metadata-custom-panel.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/content-metadata-panel.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/content-metadata.interfaces.mjs +0 -28
- package/esm2022/lib/content-metadata/interfaces/indifferent-config.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/layout-oriented-config.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/organised-property-group.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/preset-config.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/property-group.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/interfaces/property.interface.mjs +0 -18
- package/esm2022/lib/content-metadata/public-api.mjs +0 -31
- package/esm2022/lib/content-metadata/services/basic-properties.service.mjs +0 -107
- package/esm2022/lib/content-metadata/services/config/aspect-oriented-config.service.mjs +0 -106
- package/esm2022/lib/content-metadata/services/config/content-metadata-config.factory.mjs +0 -76
- package/esm2022/lib/content-metadata/services/config/indifferent-config.service.mjs +0 -40
- package/esm2022/lib/content-metadata/services/config/layout-oriented-config.service.mjs +0 -108
- package/esm2022/lib/content-metadata/services/config/property-group-reader.mjs +0 -33
- package/esm2022/lib/content-metadata/services/content-metadata.service.mjs +0 -99
- package/esm2022/lib/content-metadata/services/content-type-property.service.mjs +0 -134
- package/esm2022/lib/content-metadata/services/property-descriptors.service.mjs +0 -52
- package/esm2022/lib/content-metadata/services/property-groups-translator.service.mjs +0 -169
- package/esm2022/lib/content-node-selector/content-node-dialog.service.mjs +0 -256
- package/esm2022/lib/content-node-selector/content-node-selector-panel/content-node-selector-panel.component.mjs +0 -618
- package/esm2022/lib/content-node-selector/content-node-selector-panel/content-node-selector-panel.service.mjs +0 -66
- package/esm2022/lib/content-node-selector/content-node-selector.component-data.interface.mjs +0 -18
- package/esm2022/lib/content-node-selector/content-node-selector.component.mjs +0 -206
- package/esm2022/lib/content-node-selector/content-node-selector.module.mjs +0 -50
- package/esm2022/lib/content-node-selector/index.mjs +0 -18
- package/esm2022/lib/content-node-selector/name-location-cell/name-location-cell.component.mjs +0 -48
- package/esm2022/lib/content-node-selector/public-api.mjs +0 -25
- package/esm2022/lib/content-node-selector/site-dropdown/sites-dropdown.component.mjs +0 -168
- package/esm2022/lib/content-node-share/content-node-share.dialog.mjs +0 -288
- package/esm2022/lib/content-node-share/content-node-share.directive.mjs +0 -102
- package/esm2022/lib/content-node-share/content-node-share.module.mjs +0 -35
- package/esm2022/lib/content-node-share/content-node-share.settings.mjs +0 -18
- package/esm2022/lib/content-node-share/index.mjs +0 -18
- package/esm2022/lib/content-node-share/public-api.mjs +0 -22
- package/esm2022/lib/content-node-share/services/shared-links-api.service.mjs +0 -83
- package/esm2022/lib/content-type/content-type-dialog.component.mjs +0 -58
- package/esm2022/lib/content-type/content-type-metadata.interface.mjs +0 -18
- package/esm2022/lib/content-type/content-type.service.mjs +0 -52
- package/esm2022/lib/content-type/index.mjs +0 -20
- package/esm2022/lib/content.module.mjs +0 -277
- package/esm2022/lib/dialogs/category-selector/category-selector.dialog.mjs +0 -52
- package/esm2022/lib/dialogs/dialog.module.mjs +0 -52
- package/esm2022/lib/dialogs/download-zip/download-zip.dialog.mjs +0 -111
- package/esm2022/lib/dialogs/download-zip/download-zip.dialog.module.mjs +0 -38
- package/esm2022/lib/dialogs/download-zip/services/download-zip.service.mjs +0 -66
- package/esm2022/lib/dialogs/folder/folder-name.validators.mjs +0 -44
- package/esm2022/lib/dialogs/folder/folder.dialog.mjs +0 -147
- package/esm2022/lib/dialogs/index.mjs +0 -18
- package/esm2022/lib/dialogs/library/library.dialog.mjs +0 -225
- package/esm2022/lib/dialogs/node-lock/node-lock.dialog.mjs +0 -116
- package/esm2022/lib/dialogs/public-api.mjs +0 -25
- package/esm2022/lib/directives/auto-focus.directive.mjs +0 -38
- package/esm2022/lib/directives/check-allowable-operation.directive.mjs +0 -126
- package/esm2022/lib/directives/content-directive.module.mjs +0 -75
- package/esm2022/lib/directives/index.mjs +0 -18
- package/esm2022/lib/directives/library-favorite.directive.mjs +0 -119
- package/esm2022/lib/directives/library-membership.directive.mjs +0 -202
- package/esm2022/lib/directives/node-counter.directive.mjs +0 -60
- package/esm2022/lib/directives/node-delete.directive.mjs +0 -177
- package/esm2022/lib/directives/node-download.directive.mjs +0 -138
- package/esm2022/lib/directives/node-favorite.directive.mjs +0 -193
- package/esm2022/lib/directives/node-lock.directive.mjs +0 -57
- package/esm2022/lib/directives/node-restore.directive.mjs +0 -218
- package/esm2022/lib/directives/public-api.mjs +0 -28
- package/esm2022/lib/document-list/components/content-action/content-action-list.component.mjs +0 -60
- package/esm2022/lib/document-list/components/content-action/content-action.component.mjs +0 -196
- package/esm2022/lib/document-list/components/document-list.component.mjs +0 -964
- package/esm2022/lib/document-list/components/document-list.token.mjs +0 -21
- package/esm2022/lib/document-list/components/file-auto-download/file-auto-download.component.mjs +0 -43
- package/esm2022/lib/document-list/components/filter-header/filter-header.component.mjs +0 -107
- package/esm2022/lib/document-list/components/library-name-column/library-name-column.component.mjs +0 -133
- package/esm2022/lib/document-list/components/library-role-column/library-role-column.component.mjs +0 -93
- package/esm2022/lib/document-list/components/library-status-column/library-status-column.component.mjs +0 -88
- package/esm2022/lib/document-list/components/name-column/name-column.component.mjs +0 -120
- package/esm2022/lib/document-list/components/node.event.mjs +0 -30
- package/esm2022/lib/document-list/components/trashcan-name-column/trashcan-name-column.component.mjs +0 -83
- package/esm2022/lib/document-list/data/image-resolver.model.mjs +0 -18
- package/esm2022/lib/document-list/data/row-filter.model.mjs +0 -18
- package/esm2022/lib/document-list/data/share-data-row.model.mjs +0 -102
- package/esm2022/lib/document-list/data/share-datatable-adapter.mjs +0 -258
- package/esm2022/lib/document-list/document-list.module.mjs +0 -79
- package/esm2022/lib/document-list/index.mjs +0 -18
- package/esm2022/lib/document-list/interfaces/document-list-loader.interface.mjs +0 -18
- package/esm2022/lib/document-list/models/content-action.model.mjs +0 -59
- package/esm2022/lib/document-list/models/document-folder.model.mjs +0 -23
- package/esm2022/lib/document-list/models/node-action.enum.mjs +0 -27
- package/esm2022/lib/document-list/models/permissions-style.model.mjs +0 -27
- package/esm2022/lib/document-list/models/permissions.model.mjs +0 -26
- package/esm2022/lib/document-list/models/preset.model.mjs +0 -257
- package/esm2022/lib/document-list/public-api.mjs +0 -47
- package/esm2022/lib/document-list/services/custom-resources.service.mjs +0 -378
- package/esm2022/lib/document-list/services/document-actions.service.mjs +0 -142
- package/esm2022/lib/document-list/services/document-list.service.mjs +0 -175
- package/esm2022/lib/document-list/services/folder-actions.service.mjs +0 -137
- package/esm2022/lib/document-list/services/lock.service.mjs +0 -72
- package/esm2022/lib/document-list/services/node-actions.service.mjs +0 -122
- package/esm2022/lib/group/index.mjs +0 -18
- package/esm2022/lib/group/public-api.mjs +0 -18
- package/esm2022/lib/group/services/group.service.mjs +0 -84
- package/esm2022/lib/infinite-scroll-datasource/index.mjs +0 -18
- package/esm2022/lib/infinite-scroll-datasource/infinite-scroll-datasource.mjs +0 -69
- package/esm2022/lib/infinite-scroll-datasource/public-api.mjs +0 -18
- package/esm2022/lib/interfaces/base-card-view-content-update.interface.mjs +0 -18
- package/esm2022/lib/interfaces/index.mjs +0 -18
- package/esm2022/lib/interfaces/library-entity.interface.mjs +0 -18
- package/esm2022/lib/interfaces/library-membership-error-event.interface.mjs +0 -18
- package/esm2022/lib/interfaces/library-membership-toggle-event.interface.mjs +0 -18
- package/esm2022/lib/interfaces/node-allowable-operation-subject.interface.mjs +0 -18
- package/esm2022/lib/interfaces/public-api.mjs +0 -23
- package/esm2022/lib/interfaces/restore-message-model.interface.mjs +0 -19
- package/esm2022/lib/legal-hold/index.mjs +0 -18
- package/esm2022/lib/legal-hold/public-api.mjs +0 -18
- package/esm2022/lib/legal-hold/services/legal-hold.service.mjs +0 -136
- package/esm2022/lib/material.module.mjs +0 -183
- package/esm2022/lib/mock/alfresco-api.service.mock.mjs +0 -43
- package/esm2022/lib/mock/date-range-search-filter.mock.mjs +0 -65
- package/esm2022/lib/mock/document-library.model.mock.mjs +0 -84
- package/esm2022/lib/mock/document-list.component.mock.mjs +0 -364
- package/esm2022/lib/mock/index.mjs +0 -18
- package/esm2022/lib/mock/new-version-uploader.service.mock.mjs +0 -161
- package/esm2022/lib/mock/public-api.mjs +0 -27
- package/esm2022/lib/mock/search-filter-mock.mjs +0 -637
- package/esm2022/lib/mock/search-query.mock.mjs +0 -40
- package/esm2022/lib/mock/search.component.mock.mjs +0 -165
- package/esm2022/lib/mock/search.service.mock.mjs +0 -61
- package/esm2022/lib/mock/sites-dropdown.component.mock.mjs +0 -281
- package/esm2022/lib/new-version-uploader/index.mjs +0 -18
- package/esm2022/lib/new-version-uploader/models/index.mjs +0 -18
- package/esm2022/lib/new-version-uploader/models/new-version-uploader.model.mjs +0 -24
- package/esm2022/lib/new-version-uploader/new-version-uploader.dialog.mjs +0 -75
- package/esm2022/lib/new-version-uploader/new-version-uploader.module.mjs +0 -33
- package/esm2022/lib/new-version-uploader/new-version-uploader.service.mjs +0 -103
- package/esm2022/lib/new-version-uploader/public-api.mjs +0 -21
- package/esm2022/lib/node-comments/index.mjs +0 -18
- package/esm2022/lib/node-comments/node-comments.component.mjs +0 -44
- package/esm2022/lib/node-comments/node-comments.module.mjs +0 -33
- package/esm2022/lib/node-comments/public-api.mjs +0 -20
- package/esm2022/lib/node-comments/services/node-comments.service.mjs +0 -85
- package/esm2022/lib/permission-manager/components/add-permission/add-permission-dialog-data.interface.mjs +0 -18
- package/esm2022/lib/permission-manager/components/add-permission/add-permission-dialog.component.mjs +0 -124
- package/esm2022/lib/permission-manager/components/add-permission/add-permission-panel.component.mjs +0 -103
- package/esm2022/lib/permission-manager/components/add-permission/add-permission.component.mjs +0 -70
- package/esm2022/lib/permission-manager/components/add-permission/search-config-permission.service.mjs +0 -45
- package/esm2022/lib/permission-manager/components/inherited-button.directive.mjs +0 -67
- package/esm2022/lib/permission-manager/components/node-path-column/node-path-column.component.mjs +0 -56
- package/esm2022/lib/permission-manager/components/permission-container/permission-container.component.mjs +0 -103
- package/esm2022/lib/permission-manager/components/permission-list/permission-list.component.mjs +0 -88
- package/esm2022/lib/permission-manager/components/permission-list/permission-list.service.mjs +0 -219
- package/esm2022/lib/permission-manager/components/pop-over.directive.mjs +0 -134
- package/esm2022/lib/permission-manager/components/user-icon-column/user-icon-column.component.mjs +0 -88
- package/esm2022/lib/permission-manager/components/user-name-column/user-name-column.component.mjs +0 -82
- package/esm2022/lib/permission-manager/components/user-role-column/user-role-column.component.mjs +0 -112
- package/esm2022/lib/permission-manager/index.mjs +0 -18
- package/esm2022/lib/permission-manager/models/member.model.mjs +0 -59
- package/esm2022/lib/permission-manager/models/permission.model.mjs +0 -29
- package/esm2022/lib/permission-manager/models/role.model.mjs +0 -18
- package/esm2022/lib/permission-manager/permission-manager.module.mjs +0 -84
- package/esm2022/lib/permission-manager/public-api.mjs +0 -36
- package/esm2022/lib/permission-manager/services/node-permission-dialog.service.mjs +0 -78
- package/esm2022/lib/permission-manager/services/node-permission.service.mjs +0 -299
- package/esm2022/lib/pipes/content-pipe.module.mjs +0 -37
- package/esm2022/lib/pipes/index.mjs +0 -18
- package/esm2022/lib/pipes/node-name-tooltip.pipe.mjs +0 -69
- package/esm2022/lib/pipes/public-api.mjs +0 -19
- package/esm2022/lib/prediction/index.mjs +0 -18
- package/esm2022/lib/prediction/public-api.mjs +0 -18
- package/esm2022/lib/prediction/services/index.mjs +0 -18
- package/esm2022/lib/prediction/services/prediction.service.mjs +0 -57
- package/esm2022/lib/search/components/empty-search-result.component.mjs +0 -27
- package/esm2022/lib/search/components/index.mjs +0 -43
- package/esm2022/lib/search/components/reset-search.directive.mjs +0 -41
- package/esm2022/lib/search/components/search-check-list/index.mjs +0 -18
- package/esm2022/lib/search/components/search-check-list/search-check-list.component.mjs +0 -159
- package/esm2022/lib/search/components/search-chip-autocomplete-input/index.mjs +0 -18
- package/esm2022/lib/search/components/search-chip-autocomplete-input/search-chip-autocomplete-input.component.mjs +0 -170
- package/esm2022/lib/search/components/search-chip-list/search-chip-list.component.mjs +0 -47
- package/esm2022/lib/search/components/search-control.component.mjs +0 -181
- package/esm2022/lib/search/components/search-date-range-tabbed/index.mjs +0 -22
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range/date-range-type.mjs +0 -23
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range/in-last-date-type.mjs +0 -23
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.component.mjs +0 -197
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.mjs +0 -18
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.mjs +0 -201
- package/esm2022/lib/search/components/search-datetime-range/index.mjs +0 -18
- package/esm2022/lib/search/components/search-datetime-range/search-datetime-range.component.mjs +0 -224
- package/esm2022/lib/search/components/search-facet-field/index.mjs +0 -18
- package/esm2022/lib/search/components/search-facet-field/search-facet-field.component.mjs +0 -133
- package/esm2022/lib/search/components/search-filter/index.mjs +0 -19
- package/esm2022/lib/search/components/search-filter/search-filter-card/search-filter-card.component.mjs +0 -46
- package/esm2022/lib/search/components/search-filter/search-filter.component.mjs +0 -81
- package/esm2022/lib/search/components/search-filter-autocomplete-chips/index.mjs +0 -18
- package/esm2022/lib/search/components/search-filter-autocomplete-chips/search-filter-autocomplete-chips.component.mjs +0 -155
- package/esm2022/lib/search/components/search-filter-chips/index.mjs +0 -23
- package/esm2022/lib/search/components/search-filter-chips/search-facet-chip/search-facet-chip.component.mjs +0 -105
- package/esm2022/lib/search/components/search-filter-chips/search-facet-chip-tabbed/search-facet-chip-tabbed.component.mjs +0 -110
- package/esm2022/lib/search/components/search-filter-chips/search-facet-chip-tabbed/search-facet-tabbed-content.component.mjs +0 -129
- package/esm2022/lib/search/components/search-filter-chips/search-filter-chips.component.mjs +0 -64
- package/esm2022/lib/search/components/search-filter-chips/search-filter-menu-card/search-filter-menu-card.component.mjs +0 -44
- package/esm2022/lib/search/components/search-filter-chips/search-widget-chip/search-widget-chip.component.mjs +0 -110
- package/esm2022/lib/search/components/search-filter-container/index.mjs +0 -18
- package/esm2022/lib/search/components/search-filter-container/search-filter-container.component.mjs +0 -123
- package/esm2022/lib/search/components/search-filter-tabbed/index.mjs +0 -19
- package/esm2022/lib/search/components/search-filter-tabbed/search-filter-tab.directive.mjs +0 -36
- package/esm2022/lib/search/components/search-filter-tabbed/search-filter-tabbed.component.mjs +0 -64
- package/esm2022/lib/search/components/search-form/index.mjs +0 -18
- package/esm2022/lib/search/components/search-form/search-form.component.mjs +0 -53
- package/esm2022/lib/search/components/search-input/index.mjs +0 -18
- package/esm2022/lib/search/components/search-input/search-input.component.mjs +0 -109
- package/esm2022/lib/search/components/search-logical-filter/index.mjs +0 -18
- package/esm2022/lib/search/components/search-logical-filter/search-logical-filter.component.mjs +0 -164
- package/esm2022/lib/search/components/search-number-range/index.mjs +0 -18
- package/esm2022/lib/search/components/search-number-range/search-number-range.component.mjs +0 -155
- package/esm2022/lib/search/components/search-panel/index.mjs +0 -18
- package/esm2022/lib/search/components/search-panel/search-panel.component.mjs +0 -44
- package/esm2022/lib/search/components/search-properties/file-size-condition.mjs +0 -18
- package/esm2022/lib/search/components/search-properties/file-size-operator.enum.mjs +0 -23
- package/esm2022/lib/search/components/search-properties/file-size-unit.enum.mjs +0 -26
- package/esm2022/lib/search/components/search-properties/index.mjs +0 -22
- package/esm2022/lib/search/components/search-properties/search-properties.component.mjs +0 -244
- package/esm2022/lib/search/components/search-properties/search-properties.mjs +0 -18
- package/esm2022/lib/search/components/search-radio/index.mjs +0 -18
- package/esm2022/lib/search/components/search-radio/search-radio.component.mjs +0 -146
- package/esm2022/lib/search/components/search-slider/index.mjs +0 -18
- package/esm2022/lib/search/components/search-slider/search-slider.component.mjs +0 -120
- package/esm2022/lib/search/components/search-sorting-picker/index.mjs +0 -18
- package/esm2022/lib/search/components/search-sorting-picker/search-sorting-picker.component.mjs +0 -77
- package/esm2022/lib/search/components/search-text/index.mjs +0 -18
- package/esm2022/lib/search/components/search-text/search-text.component.mjs +0 -135
- package/esm2022/lib/search/components/search-widget-container/index.mjs +0 -18
- package/esm2022/lib/search/components/search-widget-container/search-widget-container.component.mjs +0 -113
- package/esm2022/lib/search/components/search.component.mjs +0 -153
- package/esm2022/lib/search/forms/index.mjs +0 -19
- package/esm2022/lib/search/forms/live-error-state-matcher.mjs +0 -23
- package/esm2022/lib/search/forms/search-term-validator.mjs +0 -26
- package/esm2022/lib/search/index.mjs +0 -18
- package/esm2022/lib/search/mocks/index.mjs +0 -18
- package/esm2022/lib/search/mocks/search.service.mock.mjs +0 -56
- package/esm2022/lib/search/models/autocomplete-option.interface.mjs +0 -22
- package/esm2022/lib/search/models/facet-field-bucket.interface.mjs +0 -18
- package/esm2022/lib/search/models/facet-field.interface.mjs +0 -29
- package/esm2022/lib/search/models/facet-query.interface.mjs +0 -18
- package/esm2022/lib/search/models/facet-widget.interface.mjs +0 -18
- package/esm2022/lib/search/models/filter-query.interface.mjs +0 -18
- package/esm2022/lib/search/models/filter-search.interface.mjs +0 -18
- package/esm2022/lib/search/models/index.mjs +0 -34
- package/esm2022/lib/search/models/response-facet-query-list.model.mjs +0 -31
- package/esm2022/lib/search/models/search-category.interface.mjs +0 -18
- package/esm2022/lib/search/models/search-configuration.interface.mjs +0 -18
- package/esm2022/lib/search/models/search-filter-list.model.mjs +0 -148
- package/esm2022/lib/search/models/search-form.interface.mjs +0 -18
- package/esm2022/lib/search/models/search-range.interface.mjs +0 -18
- package/esm2022/lib/search/models/search-sorting-definition.interface.mjs +0 -18
- package/esm2022/lib/search/models/search-widget-settings.interface.mjs +0 -18
- package/esm2022/lib/search/models/search-widget.interface.mjs +0 -18
- package/esm2022/lib/search/models/tabbed-facet-field.interface.mjs +0 -18
- package/esm2022/lib/search/public-api.mjs +0 -24
- package/esm2022/lib/search/search-configuration.token.mjs +0 -19
- package/esm2022/lib/search/search.module.mjs +0 -192
- package/esm2022/lib/search/services/base-query-builder.service.mjs +0 -509
- package/esm2022/lib/search/services/index.mjs +0 -24
- package/esm2022/lib/search/services/search-configuration.service.mjs +0 -50
- package/esm2022/lib/search/services/search-facet-filters.service.mjs +0 -374
- package/esm2022/lib/search/services/search-filter.service.mjs +0 -56
- package/esm2022/lib/search/services/search-header-query-builder.service.mjs +0 -136
- package/esm2022/lib/search/services/search-query-builder.service.mjs +0 -48
- package/esm2022/lib/search/services/search.service.mjs +0 -89
- package/esm2022/lib/search-ai/index.mjs +0 -18
- package/esm2022/lib/search-ai/models/search-ai-input-state.mjs +0 -18
- package/esm2022/lib/search-ai/public-api.mjs +0 -19
- package/esm2022/lib/search-ai/services/search-ai.service.mjs +0 -103
- package/esm2022/lib/security/index.mjs +0 -18
- package/esm2022/lib/security/public-api.mjs +0 -18
- package/esm2022/lib/security/services/models/security-controls-group-response.interface.mjs +0 -18
- package/esm2022/lib/security/services/models/security-controls-mark-response.interface.mjs +0 -18
- package/esm2022/lib/security/services/security-controls-groups-marks-security.service.mjs +0 -274
- package/esm2022/lib/security-options-loader/security-options-loader.service.mjs +0 -43
- package/esm2022/lib/services/alfresco-api.interface.mjs +0 -18
- package/esm2022/lib/services/alfresco-api.service.mjs +0 -120
- package/esm2022/lib/services/index.mjs +0 -18
- package/esm2022/lib/services/public-api.mjs +0 -18
- package/esm2022/lib/tag/index.mjs +0 -18
- package/esm2022/lib/tag/public-api.mjs +0 -24
- package/esm2022/lib/tag/services/tag.service.mjs +0 -171
- package/esm2022/lib/tag/tag-actions/tag-actions.component.mjs +0 -115
- package/esm2022/lib/tag/tag-list/tag-list.component.mjs +0 -98
- package/esm2022/lib/tag/tag-node-list/tag-node-list.component.mjs +0 -80
- package/esm2022/lib/tag/tag.module.mjs +0 -37
- package/esm2022/lib/tag/tags-creator/tags-creator-mode.mjs +0 -27
- package/esm2022/lib/tag/tags-creator/tags-creator.component.mjs +0 -371
- package/esm2022/lib/testing/content.testing.module.mjs +0 -56
- package/esm2022/lib/tree/components/tree.component.mjs +0 -313
- package/esm2022/lib/tree/index.mjs +0 -18
- package/esm2022/lib/tree/models/tree-context-menu-result.interface.mjs +0 -18
- package/esm2022/lib/tree/models/tree-node.interface.mjs +0 -22
- package/esm2022/lib/tree/models/tree-response.interface.mjs +0 -18
- package/esm2022/lib/tree/public-api.mjs +0 -23
- package/esm2022/lib/tree/services/tree.service.mjs +0 -134
- package/esm2022/lib/tree/tree.module.mjs +0 -33
- package/esm2022/lib/tree-view/components/tree-view.component.mjs +0 -76
- package/esm2022/lib/tree-view/data/tree-view-datasource.mjs +0 -99
- package/esm2022/lib/tree-view/index.mjs +0 -18
- package/esm2022/lib/tree-view/models/tree-view.model.mjs +0 -28
- package/esm2022/lib/tree-view/public-api.mjs +0 -22
- package/esm2022/lib/tree-view/services/tree-view.service.mjs +0 -38
- package/esm2022/lib/tree-view/tree-view.module.mjs +0 -33
- package/esm2022/lib/upload/components/base-upload/upload-base.mjs +0 -176
- package/esm2022/lib/upload/components/file-uploading-dialog.component.mjs +0 -191
- package/esm2022/lib/upload/components/file-uploading-list-row.component.mjs +0 -93
- package/esm2022/lib/upload/components/file-uploading-list.component.mjs +0 -124
- package/esm2022/lib/upload/components/upload-button.component.mjs +0 -134
- package/esm2022/lib/upload/components/upload-drag-area.component.mjs +0 -112
- package/esm2022/lib/upload/components/upload-files.event.mjs +0 -41
- package/esm2022/lib/upload/components/upload-version-button.component.mjs +0 -55
- package/esm2022/lib/upload/directives/file-draggable.directive.mjs +0 -154
- package/esm2022/lib/upload/directives/toggle-icon.directive.mjs +0 -75
- package/esm2022/lib/upload/index.mjs +0 -18
- package/esm2022/lib/upload/pipes/file-upload-error.pipe.mjs +0 -39
- package/esm2022/lib/upload/public-api.mjs +0 -29
- package/esm2022/lib/upload/upload.module.mjs +0 -72
- package/esm2022/lib/version-compatibility/index.mjs +0 -18
- package/esm2022/lib/version-compatibility/public-api.mjs +0 -20
- package/esm2022/lib/version-compatibility/version-compatibility-factory.mjs +0 -26
- package/esm2022/lib/version-compatibility/version-compatibility.directive.mjs +0 -53
- package/esm2022/lib/version-compatibility/version-compatibility.module.mjs +0 -33
- package/esm2022/lib/version-compatibility/version-compatibility.service.mjs +0 -76
- package/esm2022/lib/version-manager/content-version.service.mjs +0 -53
- package/esm2022/lib/version-manager/index.mjs +0 -18
- package/esm2022/lib/version-manager/public-api.mjs +0 -23
- package/esm2022/lib/version-manager/version-comparison.component.mjs +0 -43
- package/esm2022/lib/version-manager/version-list.component.mjs +0 -216
- package/esm2022/lib/version-manager/version-manager.component.mjs +0 -146
- package/esm2022/lib/version-manager/version-manager.module.mjs +0 -48
- package/esm2022/lib/version-manager/version-upload.component.mjs +0 -155
- package/esm2022/lib/viewer/alfresco-viewer.module.mjs +0 -33
- package/esm2022/lib/viewer/components/alfresco-viewer.component.mjs +0 -409
- package/esm2022/lib/viewer/index.mjs +0 -18
- package/esm2022/lib/viewer/public-api.mjs +0 -19
- package/esm2022/public-api.mjs +0 -56
|
@@ -1,964 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
/* eslint-disable rxjs/no-subject-value */
|
|
18
|
-
/* eslint-disable @typescript-eslint/naming-convention */
|
|
19
|
-
import { AppConfigService, ColumnsSelectorComponent, CustomEmptyContentTemplateDirective, CustomLoadingContentTemplateDirective, CustomNoPermissionTemplateDirective, DataColumnListComponent, DataSorting, DataTableComponent, DataTableSchema, DataTableService, EmptyListComponent, LoadingContentTemplateDirective, MainMenuDataTableTemplateDirective, NoContentTemplateDirective, NoPermissionTemplateDirective, ShowHeaderMode, ThumbnailService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
|
|
20
|
-
import { NodePaging, NodesApi, Pagination } from '@alfresco/js-api';
|
|
21
|
-
import { Component, ContentChild, DestroyRef, ElementRef, EventEmitter, HostListener, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
22
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
23
|
-
import { BehaviorSubject, of, Subject } from 'rxjs';
|
|
24
|
-
import { ContentService, NodesApiService } from '../../common';
|
|
25
|
-
import { ShareDataTableAdapter } from '../data/share-datatable-adapter';
|
|
26
|
-
import { ContentActionModel } from '../models/content-action.model';
|
|
27
|
-
import { presetsDefaultModel } from '../models/preset.model';
|
|
28
|
-
import { DocumentListService } from '../services/document-list.service';
|
|
29
|
-
import { LockService } from '../services/lock.service';
|
|
30
|
-
import { ADF_DOCUMENT_PARENT_COMPONENT } from './document-list.token';
|
|
31
|
-
import { FileAutoDownloadComponent } from './file-auto-download/file-auto-download.component';
|
|
32
|
-
import { NodeEntityEvent, NodeEntryEvent } from './node.event';
|
|
33
|
-
import { CommonModule } from '@angular/common';
|
|
34
|
-
import { FilterHeaderComponent } from './filter-header/filter-header.component';
|
|
35
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
36
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
37
|
-
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
38
|
-
import { AlfrescoApiService } from '../../services/alfresco-api.service';
|
|
39
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
40
|
-
import * as i0 from "@angular/core";
|
|
41
|
-
import * as i1 from "../services/document-list.service";
|
|
42
|
-
import * as i2 from "@alfresco/adf-core";
|
|
43
|
-
import * as i3 from "../../common";
|
|
44
|
-
import * as i4 from "../../services/alfresco-api.service";
|
|
45
|
-
import * as i5 from "../services/lock.service";
|
|
46
|
-
import * as i6 from "@angular/material/dialog";
|
|
47
|
-
import * as i7 from "@angular/common";
|
|
48
|
-
import * as i8 from "@ngx-translate/core";
|
|
49
|
-
import * as i9 from "@angular/material/icon";
|
|
50
|
-
import * as i10 from "@angular/material/progress-spinner";
|
|
51
|
-
const BYTES_TO_MB_CONVERSION_VALUE = 1048576;
|
|
52
|
-
export class DocumentListComponent extends DataTableSchema {
|
|
53
|
-
static { this.SINGLE_CLICK_NAVIGATION = 'click'; }
|
|
54
|
-
static { this.DOUBLE_CLICK_NAVIGATION = 'dblclick'; }
|
|
55
|
-
/**
|
|
56
|
-
* Custom function to choose whether to show or hide rows.
|
|
57
|
-
* See the [Row Filter Model](row-filter.model.md) page for
|
|
58
|
-
* more information.
|
|
59
|
-
*/
|
|
60
|
-
set rowFilter(rowFilter) {
|
|
61
|
-
this._rowFilter = rowFilter;
|
|
62
|
-
if (this.data) {
|
|
63
|
-
this.data.setFilter(this._rowFilter);
|
|
64
|
-
if (this.currentFolderId) {
|
|
65
|
-
this.reload();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
get rowFilter() {
|
|
70
|
-
return this._rowFilter;
|
|
71
|
-
}
|
|
72
|
-
/** Sets columns visibility for DataTableSchema */
|
|
73
|
-
set setColumnsVisibility(columnsVisibility) {
|
|
74
|
-
this.columnsVisibility = columnsVisibility;
|
|
75
|
-
}
|
|
76
|
-
/** Sets columns width for DataTableSchema */
|
|
77
|
-
set setColumnsWidths(columnsWidths) {
|
|
78
|
-
this.columnsWidths = columnsWidths;
|
|
79
|
-
}
|
|
80
|
-
/** Sets columns order for DataTableSchema */
|
|
81
|
-
set setColumnsOrder(columnsOrder) {
|
|
82
|
-
this.columnsOrder = columnsOrder;
|
|
83
|
-
}
|
|
84
|
-
get nodesApi() {
|
|
85
|
-
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApiService.getInstance());
|
|
86
|
-
return this._nodesApi;
|
|
87
|
-
}
|
|
88
|
-
constructor(documentListService, elementRef, appConfig, userPreferencesService, contentService, thumbnailService, alfrescoApiService, nodeService, dataTableService, lockService, dialog) {
|
|
89
|
-
super(appConfig, 'default', presetsDefaultModel);
|
|
90
|
-
this.documentListService = documentListService;
|
|
91
|
-
this.elementRef = elementRef;
|
|
92
|
-
this.appConfig = appConfig;
|
|
93
|
-
this.userPreferencesService = userPreferencesService;
|
|
94
|
-
this.contentService = contentService;
|
|
95
|
-
this.thumbnailService = thumbnailService;
|
|
96
|
-
this.alfrescoApiService = alfrescoApiService;
|
|
97
|
-
this.nodeService = nodeService;
|
|
98
|
-
this.dataTableService = dataTableService;
|
|
99
|
-
this.lockService = lockService;
|
|
100
|
-
this.dialog = dialog;
|
|
101
|
-
this.DEFAULT_PAGINATION = new Pagination({
|
|
102
|
-
hasMoreItems: false,
|
|
103
|
-
skipCount: 0,
|
|
104
|
-
maxItems: 25,
|
|
105
|
-
totalItems: 0
|
|
106
|
-
});
|
|
107
|
-
this.DEFAULT_SORTING = [new DataSorting('name', 'asc'), new DataSorting('isFolder', 'desc')];
|
|
108
|
-
/**
|
|
109
|
-
* Define a set of CSS styles to apply depending on the permission
|
|
110
|
-
* of the user on that node. See the Permission Style model
|
|
111
|
-
* page for further details and examples.
|
|
112
|
-
*/
|
|
113
|
-
this.permissionsStyle = [];
|
|
114
|
-
/** The default route for all the location-based columns (if declared). */
|
|
115
|
-
this.locationFormat = '/';
|
|
116
|
-
/** Toggles navigation to folder content or file preview */
|
|
117
|
-
this.navigate = true;
|
|
118
|
-
/** Toggles the header */
|
|
119
|
-
this.showHeader = ShowHeaderMode.Data;
|
|
120
|
-
/**
|
|
121
|
-
* User interaction for folder navigation or file preview.
|
|
122
|
-
* Valid values are "click" and "dblclick". Default value: "dblclick"
|
|
123
|
-
*/
|
|
124
|
-
this.navigationMode = DocumentListComponent.DOUBLE_CLICK_NAVIGATION; // click|dblclick
|
|
125
|
-
/** Show document thumbnails rather than icons */
|
|
126
|
-
this.thumbnails = false;
|
|
127
|
-
/**
|
|
128
|
-
* Row selection mode. Can be null, `single` or `multiple`. For `multiple` mode,
|
|
129
|
-
* you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows.
|
|
130
|
-
*/
|
|
131
|
-
this.selectionMode = 'single'; // null|single|multiple
|
|
132
|
-
/** Toggles multiselect mode */
|
|
133
|
-
this.multiselect = false;
|
|
134
|
-
/** Toggles content actions for each row */
|
|
135
|
-
this.contentActions = false;
|
|
136
|
-
/** Position of the content actions dropdown menu. Can be set to "left" or "right". */
|
|
137
|
-
this.contentActionsPosition = 'right'; // left|right
|
|
138
|
-
/** Toggles context menus for each row */
|
|
139
|
-
this.contextMenuActions = false;
|
|
140
|
-
/** Custom image for empty folder. Default value: './assets/images/empty_doc_lib.svg' */
|
|
141
|
-
this.emptyFolderImageUrl = './assets/images/empty_doc_lib.svg';
|
|
142
|
-
/**
|
|
143
|
-
* When true, this enables you to drop files directly into subfolders shown
|
|
144
|
-
* as items in the list or into another file to trigger updating it's version.
|
|
145
|
-
* When false, the dropped file will be added to the
|
|
146
|
-
* current folder (ie, the one containing all the items shown in the list).
|
|
147
|
-
* See the Upload directive for further details about how the file drop is
|
|
148
|
-
* handled.
|
|
149
|
-
*/
|
|
150
|
-
this.allowDropFiles = false;
|
|
151
|
-
/**
|
|
152
|
-
* Defines default sorting. The format is an array of 2 strings `[key, direction]`
|
|
153
|
-
* i.e. `['name', 'desc']` or `['name', 'asc']`. Set this value only if you want to
|
|
154
|
-
* override the default sorting detected by the component based on columns.
|
|
155
|
-
*/
|
|
156
|
-
this.sorting = ['name', 'asc'];
|
|
157
|
-
/**
|
|
158
|
-
* Defines default sorting. The format is an array of strings `[key direction, otherKey otherDirection]`
|
|
159
|
-
* i.e. `['name desc', 'nodeType asc']` or `['name asc']`. Set this value if you want a base
|
|
160
|
-
* rule to be added to the sorting apart from the one driven by the header.
|
|
161
|
-
*/
|
|
162
|
-
this.additionalSorting = new DataSorting('isFolder', 'desc');
|
|
163
|
-
/**
|
|
164
|
-
* Defines sorting mode. Can be either `client` (items in the list
|
|
165
|
-
* are sorted client-side) or `server` (the ordering supplied by the
|
|
166
|
-
* server is used without further client-side sorting).
|
|
167
|
-
* Note that the `server` option *does not* request the server to sort the data
|
|
168
|
-
* before delivering it.
|
|
169
|
-
*/
|
|
170
|
-
this.sortingMode = 'server';
|
|
171
|
-
/**
|
|
172
|
-
* Toggles the loading state and animated spinners for the component. Used in
|
|
173
|
-
* combination with `navigate=false` to perform custom navigation and loading
|
|
174
|
-
* state indication.
|
|
175
|
-
*/
|
|
176
|
-
this.loading = false;
|
|
177
|
-
this._rowFilter = null;
|
|
178
|
-
/**
|
|
179
|
-
* Custom function to choose image file paths to show. See the
|
|
180
|
-
* [Image Resolver Model](image-resolver.model.md) page for
|
|
181
|
-
* more information.
|
|
182
|
-
*/
|
|
183
|
-
this.imageResolver = null;
|
|
184
|
-
/** Toggles the sticky header mode. */
|
|
185
|
-
this.stickyHeader = false;
|
|
186
|
-
/** Toggles the header filters mode. */
|
|
187
|
-
this.headerFilters = false;
|
|
188
|
-
/** The ID of the folder node to display or a reserved string alias for special sources */
|
|
189
|
-
this.currentFolderId = null;
|
|
190
|
-
/**
|
|
191
|
-
* Array of nodes to be pre-selected. All nodes in the
|
|
192
|
-
* array are pre-selected in multi selection mode, but only the first node
|
|
193
|
-
* is pre-selected in single selection mode.
|
|
194
|
-
*/
|
|
195
|
-
this.preselectNodes = [];
|
|
196
|
-
/** The Document list will show all the nodes contained in the NodePaging entity */
|
|
197
|
-
this.node = null;
|
|
198
|
-
/** Default value is stored in the user preference settings. Use this only if you are not using pagination. */
|
|
199
|
-
this.maxItems = this.DEFAULT_PAGINATION.maxItems;
|
|
200
|
-
/** Enables column resizing for datatable */
|
|
201
|
-
this.isResizingEnabled = false;
|
|
202
|
-
/** Enables blur when resizing datatable columns */
|
|
203
|
-
this.blurOnResize = true;
|
|
204
|
-
/** Display checkboxes in datatable rows on hover only */
|
|
205
|
-
this.displayCheckboxesOnHover = false;
|
|
206
|
-
/** Display drag and drop hint. */
|
|
207
|
-
this.displayDragAndDropHint = true;
|
|
208
|
-
/** Emitted when the user clicks a list node */
|
|
209
|
-
this.nodeClick = new EventEmitter();
|
|
210
|
-
/** Emitted when the user double-clicks a list node */
|
|
211
|
-
this.nodeDblClick = new EventEmitter();
|
|
212
|
-
/** Emitted when the current display folder changes */
|
|
213
|
-
this.folderChange = new EventEmitter();
|
|
214
|
-
/**
|
|
215
|
-
* Emitted when the user acts upon files with either single or double click
|
|
216
|
-
* (depends on `navigation-mode`). Useful for integration with the
|
|
217
|
-
* Viewer component.
|
|
218
|
-
*/
|
|
219
|
-
this.preview = new EventEmitter();
|
|
220
|
-
/** Emitted when the Document List has loaded all items and is ready for use */
|
|
221
|
-
this.ready = new EventEmitter();
|
|
222
|
-
/** Emitted when the API fails to get the Document List data */
|
|
223
|
-
this.error = new EventEmitter();
|
|
224
|
-
/** Emitted when the node selection change */
|
|
225
|
-
this.nodeSelected = new EventEmitter();
|
|
226
|
-
/** Emitted when a filter value is selected */
|
|
227
|
-
this.filterSelection = new EventEmitter();
|
|
228
|
-
/** Emitted when column widths change */
|
|
229
|
-
this.columnsWidthChanged = new EventEmitter();
|
|
230
|
-
/** Emitted when columns visibility change */
|
|
231
|
-
this.columnsVisibilityChanged = new EventEmitter();
|
|
232
|
-
/** Emitted when columns order change */
|
|
233
|
-
this.columnsOrderChanged = new EventEmitter();
|
|
234
|
-
/** Emitted when the selected row items count in the table changed. */
|
|
235
|
-
this.selectedItemsCountChanged = new EventEmitter();
|
|
236
|
-
this.actions = [];
|
|
237
|
-
this.contextActionHandler = new Subject();
|
|
238
|
-
this.noPermission = false;
|
|
239
|
-
this.selection = new Array();
|
|
240
|
-
this.$folderNode = new Subject();
|
|
241
|
-
this.allowFiltering = true;
|
|
242
|
-
this.orderBy = null;
|
|
243
|
-
this.preselectedRows = [];
|
|
244
|
-
this._pagination = this.DEFAULT_PAGINATION;
|
|
245
|
-
this.pagination = new BehaviorSubject(this.DEFAULT_PAGINATION);
|
|
246
|
-
this.sortingSubject = new BehaviorSubject(this.DEFAULT_SORTING);
|
|
247
|
-
this.rowMenuCache = {};
|
|
248
|
-
this.destroyRef = inject(DestroyRef);
|
|
249
|
-
this.nodeService.nodeUpdated.pipe(takeUntilDestroyed()).subscribe((node) => {
|
|
250
|
-
this.dataTableService.rowUpdate.next({ id: node.id, obj: { entry: node } });
|
|
251
|
-
});
|
|
252
|
-
this.userPreferencesService
|
|
253
|
-
.select(UserPreferenceValues.PaginationSize)
|
|
254
|
-
.pipe(takeUntilDestroyed())
|
|
255
|
-
.subscribe((pagSize) => {
|
|
256
|
-
this.maxItems = this._pagination.maxItems = pagSize;
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
getContextActions(node) {
|
|
260
|
-
if (node?.entry) {
|
|
261
|
-
const actions = this.getNodeActions(node);
|
|
262
|
-
if (actions && actions.length > 0) {
|
|
263
|
-
return actions.map((currentAction) => ({
|
|
264
|
-
model: currentAction,
|
|
265
|
-
node,
|
|
266
|
-
subject: this.contextActionHandler
|
|
267
|
-
}));
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
getDefaultSorting() {
|
|
273
|
-
let defaultSorting;
|
|
274
|
-
if (Array.isArray(this.sorting)) {
|
|
275
|
-
const [key, direction] = this.sorting;
|
|
276
|
-
defaultSorting = new DataSorting(key, direction);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
defaultSorting = new DataSorting(this.sorting.key, this.sorting.direction);
|
|
280
|
-
}
|
|
281
|
-
return defaultSorting;
|
|
282
|
-
}
|
|
283
|
-
isMobile() {
|
|
284
|
-
return !!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
285
|
-
}
|
|
286
|
-
isEmpty() {
|
|
287
|
-
return !this.data || this.data.getRows().length === 0;
|
|
288
|
-
}
|
|
289
|
-
ngOnInit() {
|
|
290
|
-
this.rowMenuCache = {};
|
|
291
|
-
this.loadLayoutPresets();
|
|
292
|
-
this.data = new ShareDataTableAdapter(this.thumbnailService, this.contentService, null, this.getDefaultSorting(), this.sortingMode, this.allowDropFiles);
|
|
293
|
-
this.data.thumbnails = this.thumbnails;
|
|
294
|
-
this.data.permissionsStyle = this.permissionsStyle;
|
|
295
|
-
if (this._rowFilter) {
|
|
296
|
-
this.data.setFilter(this._rowFilter);
|
|
297
|
-
}
|
|
298
|
-
if (this.imageResolver) {
|
|
299
|
-
this.data.setImageResolver(this.imageResolver);
|
|
300
|
-
}
|
|
301
|
-
this.contextActionHandler.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((val) => this.contextActionCallback(val));
|
|
302
|
-
this.enforceSingleClickNavigationForMobile();
|
|
303
|
-
if (this.filterValue && Object.keys(this.filterValue).length > 0) {
|
|
304
|
-
this.showHeader = ShowHeaderMode.Always;
|
|
305
|
-
}
|
|
306
|
-
if (this.columnsPresetKey) {
|
|
307
|
-
this.setPresetKey(this.columnsPresetKey);
|
|
308
|
-
}
|
|
309
|
-
this.documentListService.reload$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
310
|
-
this.resetSelection();
|
|
311
|
-
this.reload();
|
|
312
|
-
});
|
|
313
|
-
this.documentListService.resetSelection$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
314
|
-
this.resetSelection();
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
ngAfterContentInit() {
|
|
318
|
-
if (this.columnList) {
|
|
319
|
-
this.columnList.columns.changes.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
320
|
-
this.createColumns();
|
|
321
|
-
this.data.setColumns(this.columns);
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
this.createDatatableSchema();
|
|
325
|
-
this.data.setColumns(this.columns);
|
|
326
|
-
}
|
|
327
|
-
ngOnChanges(changes) {
|
|
328
|
-
if (!changes['preselectNodes']) {
|
|
329
|
-
this.resetSelection();
|
|
330
|
-
}
|
|
331
|
-
if (Array.isArray(this.sorting)) {
|
|
332
|
-
const [key, direction] = this.sorting;
|
|
333
|
-
this.orderBy = this.buildOrderByArray(key, direction);
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
this.orderBy = this.buildOrderByArray(this.sorting.key, this.sorting.direction);
|
|
337
|
-
}
|
|
338
|
-
if (this.data) {
|
|
339
|
-
this.data.thumbnails = this.thumbnails;
|
|
340
|
-
}
|
|
341
|
-
if (changes.sortingMode && !changes.sortingMode.firstChange && this.data) {
|
|
342
|
-
this.data.sortingMode = changes.sortingMode.currentValue;
|
|
343
|
-
}
|
|
344
|
-
if (changes.sorting && !changes.sorting.firstChange && this.data) {
|
|
345
|
-
const newValue = changes.sorting.currentValue;
|
|
346
|
-
if (newValue && newValue.length > 0) {
|
|
347
|
-
const [key, direction] = newValue;
|
|
348
|
-
this.data.setSorting(new DataSorting(key, direction));
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
if (this.currentFolderId && changes['currentFolderId']?.currentValue !== changes['currentFolderId']?.previousValue) {
|
|
352
|
-
this.loadFolder();
|
|
353
|
-
}
|
|
354
|
-
if (this.data) {
|
|
355
|
-
if (changes.node?.currentValue) {
|
|
356
|
-
const merge = this._pagination ? this._pagination.merge : false;
|
|
357
|
-
this.data.loadPage(changes.node.currentValue, merge, null);
|
|
358
|
-
this.preserveExistingSelection();
|
|
359
|
-
this.onPreselectNodes();
|
|
360
|
-
this.onDataReady(changes.node.currentValue);
|
|
361
|
-
}
|
|
362
|
-
else if (changes.imageResolver) {
|
|
363
|
-
this.data.setImageResolver(changes.imageResolver.currentValue);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
reload(hideLoadingSpinner = false) {
|
|
368
|
-
this.resetSelection();
|
|
369
|
-
this.reloadWithoutResettingSelection(hideLoadingSpinner);
|
|
370
|
-
}
|
|
371
|
-
reloadWithoutResettingSelection(hideLoadingSpinner = false) {
|
|
372
|
-
if (this.node) {
|
|
373
|
-
if (this.data) {
|
|
374
|
-
this.data.loadPage(this.node, this._pagination.merge, null);
|
|
375
|
-
this.preserveExistingSelection();
|
|
376
|
-
}
|
|
377
|
-
this.onPreselectNodes();
|
|
378
|
-
this.syncPagination();
|
|
379
|
-
this.onDataReady(this.node);
|
|
380
|
-
}
|
|
381
|
-
else {
|
|
382
|
-
this.loadFolder(hideLoadingSpinner);
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
contextActionCallback(action) {
|
|
386
|
-
if (action) {
|
|
387
|
-
this.executeContentAction(action.node, action.model);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
getNodeActions(node) {
|
|
391
|
-
if (node?.entry) {
|
|
392
|
-
let target = null;
|
|
393
|
-
if (node.entry.isFile) {
|
|
394
|
-
target = 'document';
|
|
395
|
-
}
|
|
396
|
-
else if (node.entry.isFolder) {
|
|
397
|
-
target = 'folder';
|
|
398
|
-
}
|
|
399
|
-
if (target) {
|
|
400
|
-
const actions = this.rowMenuCache[node.entry.id];
|
|
401
|
-
if (actions) {
|
|
402
|
-
actions.forEach((action) => {
|
|
403
|
-
this.refreshAction(action, node);
|
|
404
|
-
});
|
|
405
|
-
return actions;
|
|
406
|
-
}
|
|
407
|
-
const actionsByTarget = this.actions
|
|
408
|
-
.filter((entry) => {
|
|
409
|
-
const isVisible = typeof entry.visible === 'function' ? entry.visible(node) : entry.visible;
|
|
410
|
-
return isVisible && entry.target.toLowerCase() === target;
|
|
411
|
-
})
|
|
412
|
-
.map((action) => new ContentActionModel(action));
|
|
413
|
-
actionsByTarget.forEach((action) => {
|
|
414
|
-
this.refreshAction(action, node);
|
|
415
|
-
});
|
|
416
|
-
this.rowMenuCache[node.entry.id] = actionsByTarget;
|
|
417
|
-
return actionsByTarget;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
return [];
|
|
421
|
-
}
|
|
422
|
-
refreshAction(action, node) {
|
|
423
|
-
action.disabled = this.isActionDisabled(action, node);
|
|
424
|
-
action.visible = this.isActionVisible(action, node);
|
|
425
|
-
}
|
|
426
|
-
isActionVisible(action, node) {
|
|
427
|
-
if (typeof action.visible === 'function') {
|
|
428
|
-
return action.visible(node);
|
|
429
|
-
}
|
|
430
|
-
return action.visible;
|
|
431
|
-
}
|
|
432
|
-
isActionDisabled(action, node) {
|
|
433
|
-
if (typeof action.disabled === 'function') {
|
|
434
|
-
return action.disabled(node);
|
|
435
|
-
}
|
|
436
|
-
if ((action.permission && action.disableWithNoPermission && !this.contentService.hasAllowableOperations(node.entry, action.permission)) ||
|
|
437
|
-
this.lockService.isLocked(node.entry)) {
|
|
438
|
-
return true;
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
441
|
-
return action.disabled;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
onShowContextMenu(e) {
|
|
445
|
-
if (e && this.contextMenuActions) {
|
|
446
|
-
e.preventDefault();
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
navigateTo(node) {
|
|
450
|
-
if (typeof node === 'string') {
|
|
451
|
-
this.resetNewFolderPagination();
|
|
452
|
-
this.currentFolderId = node;
|
|
453
|
-
this.folderChange.emit(new NodeEntryEvent({ id: node }));
|
|
454
|
-
this.reload();
|
|
455
|
-
return true;
|
|
456
|
-
}
|
|
457
|
-
else {
|
|
458
|
-
if (this.canNavigateFolder(node)) {
|
|
459
|
-
this.resetNewFolderPagination();
|
|
460
|
-
this.currentFolderId = this.getNodeFolderDestinationId(node);
|
|
461
|
-
this.folderChange.emit(new NodeEntryEvent({ id: this.currentFolderId }));
|
|
462
|
-
this.reload();
|
|
463
|
-
return true;
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
return false;
|
|
467
|
-
}
|
|
468
|
-
getNodeFolderDestinationId(node) {
|
|
469
|
-
return this.isLinkFolder(node) ? node.properties['cm:destination'] : node.id;
|
|
470
|
-
}
|
|
471
|
-
isLinkFolder(node) {
|
|
472
|
-
return node.nodeType === 'app:folderlink' && node.properties?.['cm:destination'];
|
|
473
|
-
}
|
|
474
|
-
updateCustomSourceData(nodeId) {
|
|
475
|
-
this.currentFolderId = nodeId;
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* Invoked when executing content action for a document or folder.
|
|
479
|
-
*
|
|
480
|
-
* @param node Node to be the context of the execution.
|
|
481
|
-
* @param action Action to be executed against the context.
|
|
482
|
-
*/
|
|
483
|
-
executeContentAction(node, action) {
|
|
484
|
-
if (node?.entry && action) {
|
|
485
|
-
const handlerSub = typeof action.handler === 'function' ? action.handler(node, this, action.permission) : of(true);
|
|
486
|
-
if (typeof action.execute === 'function' && handlerSub) {
|
|
487
|
-
handlerSub.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => action.execute(node));
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
setLoadingState(value) {
|
|
492
|
-
if (this.data?.getRows().length > 0) {
|
|
493
|
-
if (value) {
|
|
494
|
-
clearTimeout(this.loadingTimeout);
|
|
495
|
-
this.loadingTimeout = setTimeout(() => {
|
|
496
|
-
this.loading = true;
|
|
497
|
-
}, 1000);
|
|
498
|
-
}
|
|
499
|
-
else {
|
|
500
|
-
clearTimeout(this.loadingTimeout);
|
|
501
|
-
this.loading = false;
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
else {
|
|
505
|
-
clearTimeout(this.loadingTimeout);
|
|
506
|
-
this.loading = value;
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
loadFolder(hideLoadingSpinner = false) {
|
|
510
|
-
if (!hideLoadingSpinner) {
|
|
511
|
-
this.setLoadingState(true);
|
|
512
|
-
}
|
|
513
|
-
if (this.documentListService.isCustomSourceService(this.currentFolderId)) {
|
|
514
|
-
this.updateCustomSourceData(this.currentFolderId);
|
|
515
|
-
}
|
|
516
|
-
this.documentListService.loadFolderByNodeId(this.currentFolderId, this._pagination, this.includeFields, this.where, this.orderBy).subscribe((documentNode) => {
|
|
517
|
-
if (documentNode.currentNode) {
|
|
518
|
-
this.folderNode = documentNode.currentNode.entry;
|
|
519
|
-
this.$folderNode.next(documentNode.currentNode.entry);
|
|
520
|
-
}
|
|
521
|
-
this.onPageLoaded(documentNode.children);
|
|
522
|
-
}, (err) => {
|
|
523
|
-
this.handleError(err);
|
|
524
|
-
});
|
|
525
|
-
}
|
|
526
|
-
resetSelection() {
|
|
527
|
-
this.dataTable.resetSelection();
|
|
528
|
-
this.selection = [];
|
|
529
|
-
this.noPermission = false;
|
|
530
|
-
}
|
|
531
|
-
onPageLoaded(nodePaging) {
|
|
532
|
-
if (nodePaging) {
|
|
533
|
-
if (this.data) {
|
|
534
|
-
this.data.loadPage(nodePaging, this._pagination.merge, this.allowDropFiles);
|
|
535
|
-
this.preserveExistingSelection();
|
|
536
|
-
}
|
|
537
|
-
this.onPreselectNodes();
|
|
538
|
-
this.setLoadingState(false);
|
|
539
|
-
this.onDataReady(nodePaging);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
onSortingChanged(event) {
|
|
543
|
-
this.orderBy = this.buildOrderByArray(event.detail.sortingKey, event.detail.direction);
|
|
544
|
-
this.sorting = [event.detail.sortingKey, event.detail.direction];
|
|
545
|
-
this.sortingSubject.next([this.additionalSorting, event.detail]);
|
|
546
|
-
if (this.sortingMode === 'server') {
|
|
547
|
-
this.reload();
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
buildOrderByArray(currentKey, currentDirection) {
|
|
551
|
-
return [`${this.additionalSorting.key} ${this.additionalSorting.direction}`, `${currentKey} ${currentDirection}`];
|
|
552
|
-
}
|
|
553
|
-
onPreviewFile(node) {
|
|
554
|
-
if (node) {
|
|
555
|
-
const sizeInMB = node.entry?.content?.sizeInBytes / BYTES_TO_MB_CONVERSION_VALUE;
|
|
556
|
-
const fileAutoDownloadFlag = this.appConfig.get('viewer.enableFileAutoDownload', true);
|
|
557
|
-
const sizeThreshold = this.appConfig.get('viewer.fileAutoDownloadSizeThresholdInMB', 15);
|
|
558
|
-
if (fileAutoDownloadFlag && sizeInMB && sizeInMB > sizeThreshold) {
|
|
559
|
-
this.dialog.open(FileAutoDownloadComponent, { disableClose: true, data: node });
|
|
560
|
-
}
|
|
561
|
-
else {
|
|
562
|
-
this.preview.emit(new NodeEntityEvent(node));
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
onColumnsVisibilityChange(columns) {
|
|
567
|
-
this.columnsVisibility = columns.reduce((visibleColumnsMap, column) => {
|
|
568
|
-
if (column.isHidden !== undefined) {
|
|
569
|
-
visibleColumnsMap[column.id] = !column.isHidden;
|
|
570
|
-
}
|
|
571
|
-
return visibleColumnsMap;
|
|
572
|
-
}, {});
|
|
573
|
-
this.createColumns();
|
|
574
|
-
this.data.setColumns(this.columns);
|
|
575
|
-
this.columnsVisibilityChanged.emit(this.columnsVisibility);
|
|
576
|
-
}
|
|
577
|
-
onColumnOrderChange(columnsWithNewOrder) {
|
|
578
|
-
this.columnsOrder = columnsWithNewOrder.map((column) => column.id);
|
|
579
|
-
this.createColumns();
|
|
580
|
-
this.columnsOrderChanged.emit(this.columnsOrder);
|
|
581
|
-
}
|
|
582
|
-
onColumnsWidthChange(columns) {
|
|
583
|
-
const newColumnsWidths = columns.reduce((widthsColumnsMap, column) => {
|
|
584
|
-
if (column.width) {
|
|
585
|
-
widthsColumnsMap[column.id] = Math.ceil(column.width);
|
|
586
|
-
}
|
|
587
|
-
return widthsColumnsMap;
|
|
588
|
-
}, {});
|
|
589
|
-
this.columnsWidths = { ...this.columnsWidths, ...newColumnsWidths };
|
|
590
|
-
this.createColumns();
|
|
591
|
-
this.columnsWidthChanged.emit(this.columnsWidths);
|
|
592
|
-
}
|
|
593
|
-
onSelectedItemsCountChanged(count) {
|
|
594
|
-
this.selectedItemsCountChanged.emit(count);
|
|
595
|
-
}
|
|
596
|
-
onNodeClick(nodeEntry) {
|
|
597
|
-
const domEvent = new CustomEvent('node-click', {
|
|
598
|
-
detail: {
|
|
599
|
-
sender: this,
|
|
600
|
-
node: nodeEntry
|
|
601
|
-
},
|
|
602
|
-
bubbles: true
|
|
603
|
-
});
|
|
604
|
-
this.elementRef.nativeElement.dispatchEvent(domEvent);
|
|
605
|
-
const event = new NodeEntityEvent(nodeEntry);
|
|
606
|
-
this.nodeClick.emit(event);
|
|
607
|
-
if (!event.defaultPrevented) {
|
|
608
|
-
if (this.navigate && this.navigationMode === DocumentListComponent.SINGLE_CLICK_NAVIGATION) {
|
|
609
|
-
this.executeActionClick(nodeEntry);
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
onNodeDblClick(nodeEntry) {
|
|
614
|
-
const domEvent = new CustomEvent('node-dblclick', {
|
|
615
|
-
detail: {
|
|
616
|
-
sender: this,
|
|
617
|
-
node: nodeEntry
|
|
618
|
-
},
|
|
619
|
-
bubbles: true
|
|
620
|
-
});
|
|
621
|
-
this.elementRef.nativeElement.dispatchEvent(domEvent);
|
|
622
|
-
const event = new NodeEntityEvent(nodeEntry);
|
|
623
|
-
this.nodeDblClick.emit(event);
|
|
624
|
-
if (!event.defaultPrevented) {
|
|
625
|
-
if (this.navigate && this.navigationMode === DocumentListComponent.DOUBLE_CLICK_NAVIGATION) {
|
|
626
|
-
this.executeActionClick(nodeEntry);
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
executeActionClick(nodeEntry) {
|
|
631
|
-
if (nodeEntry?.entry) {
|
|
632
|
-
if (nodeEntry.entry.isFile) {
|
|
633
|
-
this.onPreviewFile(nodeEntry);
|
|
634
|
-
}
|
|
635
|
-
if (nodeEntry.entry.isFolder) {
|
|
636
|
-
this.navigateTo(nodeEntry.entry);
|
|
637
|
-
}
|
|
638
|
-
if (nodeEntry.entry['guid']) {
|
|
639
|
-
const options = {
|
|
640
|
-
include: this.includeFields
|
|
641
|
-
};
|
|
642
|
-
this.nodesApi.getNode(nodeEntry.entry['guid'], options).then((node) => {
|
|
643
|
-
this.navigateTo(node.entry);
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
onNodeSelect(event) {
|
|
649
|
-
this.selection = event.selection.map((entry) => entry.node);
|
|
650
|
-
const domEvent = new CustomEvent('node-select', {
|
|
651
|
-
detail: {
|
|
652
|
-
node: event.row ? event.row.node : null,
|
|
653
|
-
selection: this.selection
|
|
654
|
-
},
|
|
655
|
-
bubbles: true
|
|
656
|
-
});
|
|
657
|
-
this.nodeSelected.emit(this.selection);
|
|
658
|
-
this.elementRef.nativeElement.dispatchEvent(domEvent);
|
|
659
|
-
}
|
|
660
|
-
onNodeUnselect(event) {
|
|
661
|
-
this.selection = event.selection.map((entry) => entry.node);
|
|
662
|
-
const domEvent = new CustomEvent('node-unselect', {
|
|
663
|
-
detail: {
|
|
664
|
-
node: event.row ? event.row.node : null,
|
|
665
|
-
selection: this.selection
|
|
666
|
-
},
|
|
667
|
-
bubbles: true
|
|
668
|
-
});
|
|
669
|
-
this.nodeSelected.emit(this.selection);
|
|
670
|
-
this.elementRef.nativeElement.dispatchEvent(domEvent);
|
|
671
|
-
}
|
|
672
|
-
onShowRowContextMenu(event) {
|
|
673
|
-
if (this.contextMenuActions) {
|
|
674
|
-
const args = event.value;
|
|
675
|
-
const node = args.row.node;
|
|
676
|
-
if (node) {
|
|
677
|
-
args.actions = this.getContextActions(node) || [];
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
onShowRowActionsMenu(event) {
|
|
682
|
-
if (this.contentActions) {
|
|
683
|
-
const args = event.value;
|
|
684
|
-
const node = args.row.node;
|
|
685
|
-
if (node) {
|
|
686
|
-
args.actions = this.getNodeActions(node) || [];
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
onExecuteRowAction(event) {
|
|
691
|
-
if (this.contentActions) {
|
|
692
|
-
const args = event.value;
|
|
693
|
-
const node = args.row.node;
|
|
694
|
-
const action = args.action;
|
|
695
|
-
this.executeContentAction(node, action);
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
enforceSingleClickNavigationForMobile() {
|
|
699
|
-
if (this.isMobile()) {
|
|
700
|
-
this.navigationMode = DocumentListComponent.SINGLE_CLICK_NAVIGATION;
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
canNavigateFolder(node) {
|
|
704
|
-
let canNavigateFolder = false;
|
|
705
|
-
if (node?.isFolder) {
|
|
706
|
-
canNavigateFolder = true;
|
|
707
|
-
}
|
|
708
|
-
return canNavigateFolder;
|
|
709
|
-
}
|
|
710
|
-
onDataReady(nodePaging) {
|
|
711
|
-
this.ready.emit(nodePaging);
|
|
712
|
-
this.pagination.next(nodePaging.list.pagination);
|
|
713
|
-
}
|
|
714
|
-
updatePagination(requestPaginationModel) {
|
|
715
|
-
this._pagination.maxItems = requestPaginationModel.maxItems;
|
|
716
|
-
this._pagination.skipCount = requestPaginationModel.skipCount;
|
|
717
|
-
this.reload(requestPaginationModel.merge);
|
|
718
|
-
}
|
|
719
|
-
syncPagination() {
|
|
720
|
-
this.node.list.pagination.maxItems = this._pagination.maxItems;
|
|
721
|
-
this.node.list.pagination.skipCount = this._pagination.skipCount;
|
|
722
|
-
}
|
|
723
|
-
onFilterSelectionChange(activeFilters) {
|
|
724
|
-
this.filterSelection.emit(activeFilters);
|
|
725
|
-
}
|
|
726
|
-
resetNewFolderPagination() {
|
|
727
|
-
this._pagination.skipCount = 0;
|
|
728
|
-
this._pagination.maxItems = this.maxItems;
|
|
729
|
-
}
|
|
730
|
-
handleError(err) {
|
|
731
|
-
if (err.message) {
|
|
732
|
-
try {
|
|
733
|
-
if (JSON.parse(err.message).error.statusCode === 403) {
|
|
734
|
-
this.noPermission = true;
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
catch (error) {
|
|
738
|
-
/* empty */
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
this.setLoadingState(false);
|
|
742
|
-
this.error.emit(err);
|
|
743
|
-
}
|
|
744
|
-
getPreselectedNodesBasedOnSelectionMode() {
|
|
745
|
-
return this.hasPreselectedNodes() ? (this.isSingleSelectionMode() ? [this.preselectNodes[0]] : this.preselectNodes) : [];
|
|
746
|
-
}
|
|
747
|
-
getPreselectedRowsBasedOnSelectionMode() {
|
|
748
|
-
return this.hasPreselectedRows() ? (this.isSingleSelectionMode() ? [this.preselectedRows[0]] : this.preselectedRows) : [];
|
|
749
|
-
}
|
|
750
|
-
getSelectionBasedOnSelectionMode() {
|
|
751
|
-
return this.hasPreselectedRows()
|
|
752
|
-
? this.isSingleSelectionMode()
|
|
753
|
-
? [this.preselectedRows[0]]
|
|
754
|
-
: this.data.getSelectedRows()
|
|
755
|
-
: this.data.getSelectedRows();
|
|
756
|
-
}
|
|
757
|
-
onPreselectNodes() {
|
|
758
|
-
if (this.hasPreselectedNodes()) {
|
|
759
|
-
this.preselectRowsOfPreselectedNodes();
|
|
760
|
-
const preselectedRows = this.getPreselectedRowsBasedOnSelectionMode();
|
|
761
|
-
const selection = this.data.getSelectedRows();
|
|
762
|
-
for (const node of preselectedRows) {
|
|
763
|
-
this.dataTable.selectRow(node, true);
|
|
764
|
-
}
|
|
765
|
-
this.onNodeSelect({ row: undefined, selection });
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
preserveExistingSelection() {
|
|
769
|
-
if (this.isMultipleSelectionMode()) {
|
|
770
|
-
for (const selection of this.selection) {
|
|
771
|
-
const rowOfSelection = this.data.getRowByNodeId(selection.entry.id);
|
|
772
|
-
if (rowOfSelection) {
|
|
773
|
-
rowOfSelection.isSelected = true;
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
preselectRowsOfPreselectedNodes() {
|
|
779
|
-
this.preselectedRows = [];
|
|
780
|
-
const preselectedNodes = this.getPreselectedNodesBasedOnSelectionMode();
|
|
781
|
-
preselectedNodes.forEach((preselectedNode) => {
|
|
782
|
-
const rowOfPreselectedNode = this.data.getRowByNodeId(preselectedNode.entry.id);
|
|
783
|
-
if (rowOfPreselectedNode) {
|
|
784
|
-
rowOfPreselectedNode.isSelected = true;
|
|
785
|
-
this.preselectedRows.push(rowOfPreselectedNode);
|
|
786
|
-
}
|
|
787
|
-
});
|
|
788
|
-
}
|
|
789
|
-
unselectRowFromNodeId(nodeId) {
|
|
790
|
-
const rowToUnselect = this.data.getRowByNodeId(nodeId);
|
|
791
|
-
if (rowToUnselect?.isSelected) {
|
|
792
|
-
rowToUnselect.isSelected = false;
|
|
793
|
-
this.dataTable.selectRow(rowToUnselect, false);
|
|
794
|
-
const selection = this.getSelectionBasedOnSelectionMode();
|
|
795
|
-
this.onNodeUnselect({ row: undefined, selection });
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
isSingleSelectionMode() {
|
|
799
|
-
return this.selectionMode === 'single';
|
|
800
|
-
}
|
|
801
|
-
isMultipleSelectionMode() {
|
|
802
|
-
return this.selectionMode === 'multiple';
|
|
803
|
-
}
|
|
804
|
-
hasPreselectedNodes() {
|
|
805
|
-
return this.preselectNodes?.length > 0;
|
|
806
|
-
}
|
|
807
|
-
hasPreselectedRows() {
|
|
808
|
-
return this.preselectedRows?.length > 0;
|
|
809
|
-
}
|
|
810
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentListComponent, deps: [{ token: i1.DocumentListService }, { token: i0.ElementRef }, { token: i2.AppConfigService }, { token: i2.UserPreferencesService }, { token: i3.ContentService }, { token: i2.ThumbnailService }, { token: i4.AlfrescoApiService }, { token: i3.NodesApiService }, { token: i2.DataTableService }, { token: i5.LockService }, { token: i6.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
811
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DocumentListComponent, isStandalone: true, selector: "adf-document-list", inputs: { includeFields: "includeFields", where: "where", permissionsStyle: "permissionsStyle", locationFormat: "locationFormat", navigate: "navigate", showHeader: "showHeader", navigationMode: "navigationMode", thumbnails: "thumbnails", selectionMode: "selectionMode", multiselect: "multiselect", contentActions: "contentActions", contentActionsPosition: "contentActionsPosition", contextMenuActions: "contextMenuActions", emptyFolderImageUrl: "emptyFolderImageUrl", allowDropFiles: "allowDropFiles", sorting: "sorting", additionalSorting: "additionalSorting", sortingMode: "sortingMode", rowStyle: "rowStyle", rowStyleClass: "rowStyleClass", loading: "loading", _rowFilter: "_rowFilter", rowFilter: "rowFilter", imageResolver: "imageResolver", stickyHeader: "stickyHeader", headerFilters: "headerFilters", filterValue: "filterValue", currentFolderId: "currentFolderId", preselectNodes: "preselectNodes", node: "node", maxItems: "maxItems", columnsPresetKey: "columnsPresetKey", setColumnsVisibility: "setColumnsVisibility", setColumnsWidths: "setColumnsWidths", setColumnsOrder: "setColumnsOrder", maxColumnsVisible: "maxColumnsVisible", isResizingEnabled: "isResizingEnabled", blurOnResize: "blurOnResize", displayCheckboxesOnHover: "displayCheckboxesOnHover", displayDragAndDropHint: "displayDragAndDropHint" }, outputs: { nodeClick: "nodeClick", nodeDblClick: "nodeDblClick", folderChange: "folderChange", preview: "preview", ready: "ready", error: "error", nodeSelected: "nodeSelected", filterSelection: "filterSelection", columnsWidthChanged: "columnsWidthChanged", columnsVisibilityChanged: "columnsVisibilityChanged", columnsOrderChanged: "columnsOrderChanged", selectedItemsCountChanged: "selectedItemsCountChanged" }, host: { listeners: { "contextmenu": "onShowContextMenu($event)" }, classAttribute: "adf-document-list" }, providers: [
|
|
812
|
-
{
|
|
813
|
-
provide: ADF_DOCUMENT_PARENT_COMPONENT,
|
|
814
|
-
useExisting: DocumentListComponent
|
|
815
|
-
},
|
|
816
|
-
DataTableService
|
|
817
|
-
], queries: [{ propertyName: "columnList", first: true, predicate: DataColumnListComponent, descendants: true }, { propertyName: "customLoadingContent", first: true, predicate: CustomLoadingContentTemplateDirective, descendants: true }, { propertyName: "customNoPermissionsTemplate", first: true, predicate: CustomNoPermissionTemplateDirective, descendants: true }, { propertyName: "customNoContentTemplate", first: true, predicate: CustomEmptyContentTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "dataTable", first: true, predicate: ["dataTable"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<adf-datatable\n #dataTable\n [selectionMode]=\"selectionMode\"\n [data]=\"data\"\n [actions]=\"contentActions\"\n [actionsPosition]=\"contentActionsPosition\"\n [multiselect]=\"multiselect\"\n [contextMenu]=\"contextMenuActions\"\n [rowStyle]=\"rowStyle\"\n [rowStyleClass]=\"rowStyleClass\"\n [showMainDatatableActions]=\"true\"\n [loading]=\"loading\"\n [noPermission]=\"noPermission\"\n [showHeader]=\"showHeader\"\n [rowMenuCacheEnabled]=\"false\"\n [stickyHeader]=\"stickyHeader\"\n [allowFiltering]=\"allowFiltering\"\n [isResizingEnabled]=\"isResizingEnabled\"\n [blurOnResize]=\"blurOnResize\"\n [displayCheckboxesOnHover]=\"displayCheckboxesOnHover\"\n (showRowContextMenu)=\"onShowRowContextMenu($event)\"\n (showRowActionsMenu)=\"onShowRowActionsMenu($event)\"\n (executeRowAction)=\"onExecuteRowAction($event)\"\n (columnsWidthChanged)=\"onColumnsWidthChange($event)\"\n (columnOrderChanged)=\"onColumnOrderChange($event)\"\n (selectedItemsCountChanged)=\"onSelectedItemsCountChanged($event)\"\n (rowClick)=\"onNodeClick($event.value?.node)\"\n (rowDblClick)=\"onNodeDblClick($event.value?.node)\"\n (row-select)=\"onNodeSelect($any($event).detail)\"\n (row-unselect)=\"onNodeUnselect($any($event).detail)\"\n (sorting-changed)=\"onSortingChanged($any($event))\"\n [class.adf-datatable-gallery-thumbnails]=\"data.thumbnails\">\n\n <div *ngIf=\"headerFilters\">\n <adf-filter-header\n [currentFolderId]=\"currentFolderId\"\n [value]=\"filterValue\"\n (filterSelection)=\"onFilterSelectionChange($event)\" />\n </div>\n\n <adf-no-content-template>\n <ng-template>\n <adf-empty-list *ngIf=\"!customNoContentTemplate\">\n <div class=\"adf-empty-list_template adf-empty-folder\">\n <div class=\"adf-empty-folder-this-space-is-empty\">{{'ADF-DOCUMENT-LIST.EMPTY.HEADER' | translate}}</div>\n <ng-container *ngIf=\"displayDragAndDropHint\">\n <div class=\"adf-empty-folder-drag-drop\">{{ 'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.TITLE' | translate }}</div>\n <div class=\"adf-empty-folder-any-files-here-to-add\">{{ 'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.SUBTITLE' | translate }}</div>\n </ng-container>\n <img [alt]=\"'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.TITLE' | translate\" class=\"adf-empty-folder-image\" [src]=\"emptyFolderImageUrl\">\n </div>\n </adf-empty-list>\n <ng-content select=\"adf-custom-empty-content-template, empty-folder-content\" />\n </ng-template>\n </adf-no-content-template>\n\n <adf-no-permission-template>\n <ng-template>\n <div class=\"adf-no-permission__template\" *ngIf=\"!customNoPermissionsTemplate\">\n <mat-icon>error</mat-icon>\n <p class=\"adf-no-permission__template--text\">{{ 'ADF-DOCUMENT-LIST.NO_PERMISSION' | translate }}</p>\n </div>\n <ng-content select=\"adf-custom-no-permission-template, no-permission-content\" />\n </ng-template>\n </adf-no-permission-template>\n\n <adf-loading-content-template>\n <ng-template>\n <div class=\"adf-document-list-loading-container\" *ngIf=\"!customLoadingContent\">\n <mat-progress-spinner\n id=\"adf-document-list-loading\"\n class=\"adf-document-list-loading-margin\"\n [attr.aria-label]=\"'ADF-DOCUMENT-LIST.LOADER_LABEL' | translate\"\n [color]=\"'primary'\"\n [mode]=\"'indeterminate'\" />\n </div>\n <ng-content select=\"adf-custom-loading-content-template\" />\n </ng-template>\n </adf-loading-content-template>\n\n <adf-main-menu-datatable-template>\n <ng-template let-mainMenuTrigger>\n <adf-datatable-column-selector\n [columns]=\"columns\"\n [mainMenuTrigger]=\"mainMenuTrigger\"\n [columnsSorting]=\"false\"\n [maxColumnsVisible]=\"maxColumnsVisible\"\n (submitColumnsVisibility)=\"onColumnsVisibilityChange($event)\" />\n </ng-template>\n </adf-main-menu-datatable-template>\n\n</adf-datatable>\n", styles: [".adf-document-list{min-height:0;height:100%;background-color:var(--theme-background-color)}.adf-sticky-document-list{height:310px;overflow-y:auto}.adf-datatable-card .adf-datatable-selected>svg{fill:var(--theme-accent-color);width:30px;height:30px;position:absolute;top:10px}.adf-datatable-list .adf-datatable-selected{display:inline-table}.adf-datatable-list .adf-datatable-selected>svg{fill:var(--theme-accent-color);width:30px;height:30px}.adf-document-list_empty_template{text-align:center;margin-top:20px;margin-bottom:20px}.adf-no-permission__template{display:flex;align-items:center;justify-content:center;flex-direction:column;width:100%;height:100%;min-height:300px}.adf-no-permission__template mat-icon{font-size:52px;height:52px;width:52px}.adf-no-permission__template--text{color:var(--adf-theme-foreground-text-color);font-size:var(--theme-subheading-2-font-size)}.adf-document-list__this-space-is-empty{height:32px;opacity:.26;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color)}.adf-document-list__drag-drop{height:56px;opacity:.54;font-size:56px;line-height:1;letter-spacing:-2px;color:var(--adf-theme-foreground-text-color);margin-top:40px}.adf-document-list__any-files-here-to-add{height:24px;opacity:.54;font-size:var(--theme-subheading-2-font-size);line-height:1.5;letter-spacing:-.4px;color:var(--adf-theme-foreground-text-color);margin-top:17px}.adf-document-list__empty_doc_lib{width:565px;height:161px;object-fit:contain;margin-top:17px}.adf-document-list-loading-margin{margin:auto}.adf-document-list-loading-container{min-height:300px;display:flex;flex-direction:row;height:100%}.adf-empty-list-header{height:32px;opacity:.26;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color)}.adf-documentlist-pagination{color:var(--adf-theme-foreground-text-color)}.adf-documentlist-pagination .adf-pagination__block{border-right:none}.adf-empty-folder-this-space-is-empty{height:32px;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color-054)}.adf-empty-folder-drag-drop{min-height:56px;font-size:53px;line-height:1;letter-spacing:-2px;color:var(--adf-theme-foreground-text-color);margin-top:40px;word-break:break-all;white-space:pre-line}@media (max-width: 599.9px){.adf-empty-folder-drag-drop{font-size:48px}}.adf-empty-folder-any-files-here-to-add{min-height:24px;font-size:var(--theme-subheading-2-font-size);line-height:1.5;letter-spacing:-.4px;color:var(--adf-theme-foreground-text-color);margin-top:17px;word-break:break-all;white-space:pre-line}.adf-empty-folder-image{width:565px;max-width:100%;object-fit:contain;margin-top:17px}@media (max-width: 599.9px){.adf-empty-folder-image{width:250px}}@media (max-width: 959.9px){.adf-empty-folder-drag-drop,.adf-empty-folder-any-files-here-to-add{display:none}}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row){height:300px}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) img{height:130px}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell{overflow:visible}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell.adf-datatable-cell--image{flex:0 0 auto;display:flex;flex-direction:column-reverse;justify-content:space-between}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell.adf-datatable-cell--image .adf-cell-value{display:flex;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DataTableComponent, selector: "adf-datatable", inputs: ["data", "rows", "sorting", "columns", "selectionMode", "multiselect", "mainTableAction", "actions", "showMainDatatableActions", "showProvidedActions", "actionsPosition", "actionsVisibleOnHover", "fallbackThumbnail", "contextMenu", "rowStyle", "rowStyleClass", "showHeader", "stickyHeader", "loading", "noPermission", "rowMenuCacheEnabled", "resolverFn", "allowFiltering", "isResizingEnabled", "blurOnResize", "displayCheckboxesOnHover", "enableDragRows"], outputs: ["rowClick", "rowDblClick", "showRowContextMenu", "showRowActionsMenu", "executeRowAction", "columnOrderChanged", "columnsWidthChanged", "selectedItemsCountChanged", "dragDropped"] }, { kind: "component", type: FilterHeaderComponent, selector: "adf-filter-header", inputs: ["value", "currentFolderId"], outputs: ["filterSelection"] }, { kind: "directive", type: NoContentTemplateDirective, selector: "adf-no-content-template, no-content-template" }, { kind: "component", type: EmptyListComponent, selector: "adf-empty-list" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "directive", type: NoPermissionTemplateDirective, selector: "adf-no-permission-template, no-permission-template" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: LoadingContentTemplateDirective, selector: "adf-loading-content-template, loading-content-template" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: MainMenuDataTableTemplateDirective, selector: "adf-main-menu-datatable-template" }, { kind: "component", type: ColumnsSelectorComponent, selector: "adf-datatable-column-selector", inputs: ["columns", "mainMenuTrigger", "columnsSorting", "maxColumnsVisible"], outputs: ["submitColumnsVisibility"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
818
|
-
}
|
|
819
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentListComponent, decorators: [{
|
|
820
|
-
type: Component,
|
|
821
|
-
args: [{ selector: 'adf-document-list', standalone: true, imports: [
|
|
822
|
-
CommonModule,
|
|
823
|
-
DataTableComponent,
|
|
824
|
-
FilterHeaderComponent,
|
|
825
|
-
NoContentTemplateDirective,
|
|
826
|
-
EmptyListComponent,
|
|
827
|
-
TranslateModule,
|
|
828
|
-
NoPermissionTemplateDirective,
|
|
829
|
-
MatIconModule,
|
|
830
|
-
LoadingContentTemplateDirective,
|
|
831
|
-
MatProgressSpinnerModule,
|
|
832
|
-
MainMenuDataTableTemplateDirective,
|
|
833
|
-
ColumnsSelectorComponent
|
|
834
|
-
], providers: [
|
|
835
|
-
{
|
|
836
|
-
provide: ADF_DOCUMENT_PARENT_COMPONENT,
|
|
837
|
-
useExisting: DocumentListComponent
|
|
838
|
-
},
|
|
839
|
-
DataTableService
|
|
840
|
-
], encapsulation: ViewEncapsulation.None, host: { class: 'adf-document-list' }, template: "<adf-datatable\n #dataTable\n [selectionMode]=\"selectionMode\"\n [data]=\"data\"\n [actions]=\"contentActions\"\n [actionsPosition]=\"contentActionsPosition\"\n [multiselect]=\"multiselect\"\n [contextMenu]=\"contextMenuActions\"\n [rowStyle]=\"rowStyle\"\n [rowStyleClass]=\"rowStyleClass\"\n [showMainDatatableActions]=\"true\"\n [loading]=\"loading\"\n [noPermission]=\"noPermission\"\n [showHeader]=\"showHeader\"\n [rowMenuCacheEnabled]=\"false\"\n [stickyHeader]=\"stickyHeader\"\n [allowFiltering]=\"allowFiltering\"\n [isResizingEnabled]=\"isResizingEnabled\"\n [blurOnResize]=\"blurOnResize\"\n [displayCheckboxesOnHover]=\"displayCheckboxesOnHover\"\n (showRowContextMenu)=\"onShowRowContextMenu($event)\"\n (showRowActionsMenu)=\"onShowRowActionsMenu($event)\"\n (executeRowAction)=\"onExecuteRowAction($event)\"\n (columnsWidthChanged)=\"onColumnsWidthChange($event)\"\n (columnOrderChanged)=\"onColumnOrderChange($event)\"\n (selectedItemsCountChanged)=\"onSelectedItemsCountChanged($event)\"\n (rowClick)=\"onNodeClick($event.value?.node)\"\n (rowDblClick)=\"onNodeDblClick($event.value?.node)\"\n (row-select)=\"onNodeSelect($any($event).detail)\"\n (row-unselect)=\"onNodeUnselect($any($event).detail)\"\n (sorting-changed)=\"onSortingChanged($any($event))\"\n [class.adf-datatable-gallery-thumbnails]=\"data.thumbnails\">\n\n <div *ngIf=\"headerFilters\">\n <adf-filter-header\n [currentFolderId]=\"currentFolderId\"\n [value]=\"filterValue\"\n (filterSelection)=\"onFilterSelectionChange($event)\" />\n </div>\n\n <adf-no-content-template>\n <ng-template>\n <adf-empty-list *ngIf=\"!customNoContentTemplate\">\n <div class=\"adf-empty-list_template adf-empty-folder\">\n <div class=\"adf-empty-folder-this-space-is-empty\">{{'ADF-DOCUMENT-LIST.EMPTY.HEADER' | translate}}</div>\n <ng-container *ngIf=\"displayDragAndDropHint\">\n <div class=\"adf-empty-folder-drag-drop\">{{ 'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.TITLE' | translate }}</div>\n <div class=\"adf-empty-folder-any-files-here-to-add\">{{ 'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.SUBTITLE' | translate }}</div>\n </ng-container>\n <img [alt]=\"'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.TITLE' | translate\" class=\"adf-empty-folder-image\" [src]=\"emptyFolderImageUrl\">\n </div>\n </adf-empty-list>\n <ng-content select=\"adf-custom-empty-content-template, empty-folder-content\" />\n </ng-template>\n </adf-no-content-template>\n\n <adf-no-permission-template>\n <ng-template>\n <div class=\"adf-no-permission__template\" *ngIf=\"!customNoPermissionsTemplate\">\n <mat-icon>error</mat-icon>\n <p class=\"adf-no-permission__template--text\">{{ 'ADF-DOCUMENT-LIST.NO_PERMISSION' | translate }}</p>\n </div>\n <ng-content select=\"adf-custom-no-permission-template, no-permission-content\" />\n </ng-template>\n </adf-no-permission-template>\n\n <adf-loading-content-template>\n <ng-template>\n <div class=\"adf-document-list-loading-container\" *ngIf=\"!customLoadingContent\">\n <mat-progress-spinner\n id=\"adf-document-list-loading\"\n class=\"adf-document-list-loading-margin\"\n [attr.aria-label]=\"'ADF-DOCUMENT-LIST.LOADER_LABEL' | translate\"\n [color]=\"'primary'\"\n [mode]=\"'indeterminate'\" />\n </div>\n <ng-content select=\"adf-custom-loading-content-template\" />\n </ng-template>\n </adf-loading-content-template>\n\n <adf-main-menu-datatable-template>\n <ng-template let-mainMenuTrigger>\n <adf-datatable-column-selector\n [columns]=\"columns\"\n [mainMenuTrigger]=\"mainMenuTrigger\"\n [columnsSorting]=\"false\"\n [maxColumnsVisible]=\"maxColumnsVisible\"\n (submitColumnsVisibility)=\"onColumnsVisibilityChange($event)\" />\n </ng-template>\n </adf-main-menu-datatable-template>\n\n</adf-datatable>\n", styles: [".adf-document-list{min-height:0;height:100%;background-color:var(--theme-background-color)}.adf-sticky-document-list{height:310px;overflow-y:auto}.adf-datatable-card .adf-datatable-selected>svg{fill:var(--theme-accent-color);width:30px;height:30px;position:absolute;top:10px}.adf-datatable-list .adf-datatable-selected{display:inline-table}.adf-datatable-list .adf-datatable-selected>svg{fill:var(--theme-accent-color);width:30px;height:30px}.adf-document-list_empty_template{text-align:center;margin-top:20px;margin-bottom:20px}.adf-no-permission__template{display:flex;align-items:center;justify-content:center;flex-direction:column;width:100%;height:100%;min-height:300px}.adf-no-permission__template mat-icon{font-size:52px;height:52px;width:52px}.adf-no-permission__template--text{color:var(--adf-theme-foreground-text-color);font-size:var(--theme-subheading-2-font-size)}.adf-document-list__this-space-is-empty{height:32px;opacity:.26;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color)}.adf-document-list__drag-drop{height:56px;opacity:.54;font-size:56px;line-height:1;letter-spacing:-2px;color:var(--adf-theme-foreground-text-color);margin-top:40px}.adf-document-list__any-files-here-to-add{height:24px;opacity:.54;font-size:var(--theme-subheading-2-font-size);line-height:1.5;letter-spacing:-.4px;color:var(--adf-theme-foreground-text-color);margin-top:17px}.adf-document-list__empty_doc_lib{width:565px;height:161px;object-fit:contain;margin-top:17px}.adf-document-list-loading-margin{margin:auto}.adf-document-list-loading-container{min-height:300px;display:flex;flex-direction:row;height:100%}.adf-empty-list-header{height:32px;opacity:.26;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color)}.adf-documentlist-pagination{color:var(--adf-theme-foreground-text-color)}.adf-documentlist-pagination .adf-pagination__block{border-right:none}.adf-empty-folder-this-space-is-empty{height:32px;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color-054)}.adf-empty-folder-drag-drop{min-height:56px;font-size:53px;line-height:1;letter-spacing:-2px;color:var(--adf-theme-foreground-text-color);margin-top:40px;word-break:break-all;white-space:pre-line}@media (max-width: 599.9px){.adf-empty-folder-drag-drop{font-size:48px}}.adf-empty-folder-any-files-here-to-add{min-height:24px;font-size:var(--theme-subheading-2-font-size);line-height:1.5;letter-spacing:-.4px;color:var(--adf-theme-foreground-text-color);margin-top:17px;word-break:break-all;white-space:pre-line}.adf-empty-folder-image{width:565px;max-width:100%;object-fit:contain;margin-top:17px}@media (max-width: 599.9px){.adf-empty-folder-image{width:250px}}@media (max-width: 959.9px){.adf-empty-folder-drag-drop,.adf-empty-folder-any-files-here-to-add{display:none}}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row){height:300px}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) img{height:130px}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell{overflow:visible}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell.adf-datatable-cell--image{flex:0 0 auto;display:flex;flex-direction:column-reverse;justify-content:space-between}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell.adf-datatable-cell--image .adf-cell-value{display:flex;justify-content:center}\n"] }]
|
|
841
|
-
}], ctorParameters: () => [{ type: i1.DocumentListService }, { type: i0.ElementRef }, { type: i2.AppConfigService }, { type: i2.UserPreferencesService }, { type: i3.ContentService }, { type: i2.ThumbnailService }, { type: i4.AlfrescoApiService }, { type: i3.NodesApiService }, { type: i2.DataTableService }, { type: i5.LockService }, { type: i6.MatDialog }], propDecorators: { columnList: [{
|
|
842
|
-
type: ContentChild,
|
|
843
|
-
args: [DataColumnListComponent]
|
|
844
|
-
}], customLoadingContent: [{
|
|
845
|
-
type: ContentChild,
|
|
846
|
-
args: [CustomLoadingContentTemplateDirective]
|
|
847
|
-
}], customNoPermissionsTemplate: [{
|
|
848
|
-
type: ContentChild,
|
|
849
|
-
args: [CustomNoPermissionTemplateDirective]
|
|
850
|
-
}], customNoContentTemplate: [{
|
|
851
|
-
type: ContentChild,
|
|
852
|
-
args: [CustomEmptyContentTemplateDirective]
|
|
853
|
-
}], includeFields: [{
|
|
854
|
-
type: Input
|
|
855
|
-
}], where: [{
|
|
856
|
-
type: Input
|
|
857
|
-
}], permissionsStyle: [{
|
|
858
|
-
type: Input
|
|
859
|
-
}], locationFormat: [{
|
|
860
|
-
type: Input
|
|
861
|
-
}], navigate: [{
|
|
862
|
-
type: Input
|
|
863
|
-
}], showHeader: [{
|
|
864
|
-
type: Input
|
|
865
|
-
}], navigationMode: [{
|
|
866
|
-
type: Input
|
|
867
|
-
}], thumbnails: [{
|
|
868
|
-
type: Input
|
|
869
|
-
}], selectionMode: [{
|
|
870
|
-
type: Input
|
|
871
|
-
}], multiselect: [{
|
|
872
|
-
type: Input
|
|
873
|
-
}], contentActions: [{
|
|
874
|
-
type: Input
|
|
875
|
-
}], contentActionsPosition: [{
|
|
876
|
-
type: Input
|
|
877
|
-
}], contextMenuActions: [{
|
|
878
|
-
type: Input
|
|
879
|
-
}], emptyFolderImageUrl: [{
|
|
880
|
-
type: Input
|
|
881
|
-
}], allowDropFiles: [{
|
|
882
|
-
type: Input
|
|
883
|
-
}], sorting: [{
|
|
884
|
-
type: Input
|
|
885
|
-
}], additionalSorting: [{
|
|
886
|
-
type: Input
|
|
887
|
-
}], sortingMode: [{
|
|
888
|
-
type: Input
|
|
889
|
-
}], rowStyle: [{
|
|
890
|
-
type: Input
|
|
891
|
-
}], rowStyleClass: [{
|
|
892
|
-
type: Input
|
|
893
|
-
}], loading: [{
|
|
894
|
-
type: Input
|
|
895
|
-
}], _rowFilter: [{
|
|
896
|
-
type: Input
|
|
897
|
-
}], rowFilter: [{
|
|
898
|
-
type: Input
|
|
899
|
-
}], imageResolver: [{
|
|
900
|
-
type: Input
|
|
901
|
-
}], stickyHeader: [{
|
|
902
|
-
type: Input
|
|
903
|
-
}], headerFilters: [{
|
|
904
|
-
type: Input
|
|
905
|
-
}], filterValue: [{
|
|
906
|
-
type: Input
|
|
907
|
-
}], currentFolderId: [{
|
|
908
|
-
type: Input
|
|
909
|
-
}], preselectNodes: [{
|
|
910
|
-
type: Input
|
|
911
|
-
}], node: [{
|
|
912
|
-
type: Input
|
|
913
|
-
}], maxItems: [{
|
|
914
|
-
type: Input
|
|
915
|
-
}], columnsPresetKey: [{
|
|
916
|
-
type: Input
|
|
917
|
-
}], setColumnsVisibility: [{
|
|
918
|
-
type: Input
|
|
919
|
-
}], setColumnsWidths: [{
|
|
920
|
-
type: Input
|
|
921
|
-
}], setColumnsOrder: [{
|
|
922
|
-
type: Input
|
|
923
|
-
}], maxColumnsVisible: [{
|
|
924
|
-
type: Input
|
|
925
|
-
}], isResizingEnabled: [{
|
|
926
|
-
type: Input
|
|
927
|
-
}], blurOnResize: [{
|
|
928
|
-
type: Input
|
|
929
|
-
}], displayCheckboxesOnHover: [{
|
|
930
|
-
type: Input
|
|
931
|
-
}], displayDragAndDropHint: [{
|
|
932
|
-
type: Input
|
|
933
|
-
}], nodeClick: [{
|
|
934
|
-
type: Output
|
|
935
|
-
}], nodeDblClick: [{
|
|
936
|
-
type: Output
|
|
937
|
-
}], folderChange: [{
|
|
938
|
-
type: Output
|
|
939
|
-
}], preview: [{
|
|
940
|
-
type: Output
|
|
941
|
-
}], ready: [{
|
|
942
|
-
type: Output
|
|
943
|
-
}], error: [{
|
|
944
|
-
type: Output
|
|
945
|
-
}], nodeSelected: [{
|
|
946
|
-
type: Output
|
|
947
|
-
}], filterSelection: [{
|
|
948
|
-
type: Output
|
|
949
|
-
}], columnsWidthChanged: [{
|
|
950
|
-
type: Output
|
|
951
|
-
}], columnsVisibilityChanged: [{
|
|
952
|
-
type: Output
|
|
953
|
-
}], columnsOrderChanged: [{
|
|
954
|
-
type: Output
|
|
955
|
-
}], selectedItemsCountChanged: [{
|
|
956
|
-
type: Output
|
|
957
|
-
}], dataTable: [{
|
|
958
|
-
type: ViewChild,
|
|
959
|
-
args: ['dataTable', { static: true }]
|
|
960
|
-
}], onShowContextMenu: [{
|
|
961
|
-
type: HostListener,
|
|
962
|
-
args: ['contextmenu', ['$event']]
|
|
963
|
-
}] } });
|
|
964
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL2RvY3VtZW50LWxpc3QvY29tcG9uZW50cy9kb2N1bWVudC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvZG9jdW1lbnQtbGlzdC9jb21wb25lbnRzL2RvY3VtZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsMENBQTBDO0FBQzFDLHlEQUF5RDtBQUV6RCxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMscUNBQXFDLEVBQ3JDLG1DQUFtQyxFQUduQyx1QkFBdUIsRUFHdkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQiwrQkFBK0IsRUFDL0Isa0NBQWtDLEVBQ2xDLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFJN0IsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3ZCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFtQixVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JGLE9BQU8sRUFFSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJL0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7QUFFaEUsTUFBTSw0QkFBNEIsR0FBRyxPQUFPLENBQUM7QUErQjdDLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxlQUFlO2FBQy9DLDRCQUF1QixHQUFXLE9BQU8sQUFBbEIsQ0FBbUI7YUFDMUMsNEJBQXVCLEdBQVcsVUFBVSxBQUFyQixDQUFzQjtJQXdKcEQ7Ozs7T0FJRztJQUNILElBQ0ksU0FBUyxDQUFDLFNBQW9CO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUE4Q0Qsa0RBQWtEO0lBQ2xELElBQ0ksb0JBQW9CLENBQUMsaUJBQThEO1FBQ25GLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztJQUMvQyxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLElBQ0ksZ0JBQWdCLENBQUMsYUFBeUQ7UUFDMUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDdkMsQ0FBQztJQUVELDZDQUE2QztJQUM3QyxJQUNJLGVBQWUsQ0FBQyxZQUFrQztRQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNyQyxDQUFDO0lBb0dELElBQUksUUFBUTtRQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN2RixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQ1ksbUJBQXdDLEVBQ3hDLFVBQXNCLEVBQ3RCLFNBQTJCLEVBQzNCLHNCQUE4QyxFQUM5QyxjQUE4QixFQUM5QixnQkFBa0MsRUFDbEMsa0JBQXNDLEVBQ3RDLFdBQTRCLEVBQzVCLGdCQUFrQyxFQUNsQyxXQUF3QixFQUN4QixNQUFpQjtRQUV6QixLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBWnpDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQTFWN0IsdUJBQWtCLEdBQWUsSUFBSSxVQUFVLENBQUM7WUFDNUMsWUFBWSxFQUFFLEtBQUs7WUFDbkIsU0FBUyxFQUFFLENBQUM7WUFDWixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxDQUFDO1NBQ2hCLENBQUMsQ0FBQztRQUVILG9CQUFlLEdBQWtCLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBeUJ2Rzs7OztXQUlHO1FBRUgscUJBQWdCLEdBQTJCLEVBQUUsQ0FBQztRQUU5QywwRUFBMEU7UUFFMUUsbUJBQWMsR0FBVyxHQUFHLENBQUM7UUFFN0IsMkRBQTJEO1FBRTNELGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIseUJBQXlCO1FBRXpCLGVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBRWpDOzs7V0FHRztRQUVILG1CQUFjLEdBQVcscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxpQkFBaUI7UUFFekYsaURBQWlEO1FBRWpELGVBQVUsR0FBWSxLQUFLLENBQUM7UUFFNUI7OztXQUdHO1FBRUgsa0JBQWEsR0FBVyxRQUFRLENBQUMsQ0FBQyx1QkFBdUI7UUFFekQsK0JBQStCO1FBRS9CLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTdCLDJDQUEyQztRQUUzQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUVoQyxzRkFBc0Y7UUFFdEYsMkJBQXNCLEdBQVcsT0FBTyxDQUFDLENBQUMsYUFBYTtRQUV2RCx5Q0FBeUM7UUFFekMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBRXBDLHdGQUF3RjtRQUV4Rix3QkFBbUIsR0FBVyxtQ0FBbUMsQ0FBQztRQUVsRTs7Ozs7OztXQU9HO1FBRUgsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEM7Ozs7V0FJRztRQUVILFlBQU8sR0FBMkIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEQ7Ozs7V0FJRztRQUVILHNCQUFpQixHQUFnQixJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFckU7Ozs7OztXQU1HO1FBRUgsZ0JBQVcsR0FBd0IsUUFBUSxDQUFDO1FBYzVDOzs7O1dBSUc7UUFFSCxZQUFPLEdBQVksS0FBSyxDQUFDO1FBR3pCLGVBQVUsR0FBcUIsSUFBSSxDQUFDO1FBc0JwQzs7OztXQUlHO1FBRUgsa0JBQWEsR0FBZSxJQUFJLENBQUM7UUFFakMsc0NBQXNDO1FBRXRDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTlCLHVDQUF1QztRQUV2QyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQU0vQiwwRkFBMEY7UUFFMUYsb0JBQWUsR0FBVyxJQUFJLENBQUM7UUFFL0I7Ozs7V0FJRztRQUVILG1CQUFjLEdBQWdCLEVBQUUsQ0FBQztRQUVqQyxtRkFBbUY7UUFFbkYsU0FBSSxHQUFlLElBQUksQ0FBQztRQUV4Qiw4R0FBOEc7UUFFOUcsYUFBUSxHQUFXLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7UUE0QnBELDRDQUE0QztRQUU1QyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFMUIsbURBQW1EO1FBRW5ELGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBCLHlEQUF5RDtRQUV6RCw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFFakMsa0NBQWtDO1FBRWxDLDJCQUFzQixHQUFHLElBQUksQ0FBQztRQUU5QiwrQ0FBK0M7UUFFL0MsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRWhELHNEQUFzRDtRQUV0RCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRW5ELHNEQUFzRDtRQUV0RCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBRWxEOzs7O1dBSUc7UUFFSCxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFFOUMsK0VBQStFO1FBRS9FLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBRXZDLCtEQUErRDtRQUUvRCxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVoQyw2Q0FBNkM7UUFFN0MsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRS9DLDhDQUE4QztRQUU5QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBRXJELHdDQUF3QztRQUV4Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBOEMsQ0FBQztRQUVyRiw2Q0FBNkM7UUFFN0MsNkJBQXdCLEdBQUcsSUFBSSxZQUFZLEVBQStDLENBQUM7UUFFM0Ysd0NBQXdDO1FBRXhDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBRS9ELHNFQUFzRTtRQUV0RSw4QkFBeUIsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUtuRSxZQUFPLEdBQXlCLEVBQUUsQ0FBQztRQUNuQyx5QkFBb0IsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVuRCxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixjQUFTLEdBQUcsSUFBSSxLQUFLLEVBQWEsQ0FBQztRQUNuQyxnQkFBVyxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2pELG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLFlBQU8sR0FBYSxJQUFJLENBQUM7UUFDekIsb0JBQWUsR0FBYyxFQUFFLENBQUM7UUFLeEIsZ0JBQVcsR0FBb0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQy9ELGVBQVUsR0FBcUMsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdHLG1CQUFjLEdBQW1DLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFbEcsaUJBQVksR0FBNEMsRUFBRSxDQUFDO1FBR2xELGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFzQjdDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHNCQUFzQjthQUN0QixNQUFNLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDO2FBQzNDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzFCLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQWU7UUFDN0IsSUFBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWlDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3ZELEtBQUssRUFBRSxhQUFhO29CQUNwQixJQUFJO29CQUNKLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CO2lCQUNyQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLGlCQUFpQjtRQUNyQixJQUFJLGNBQTJCLENBQUM7UUFDaEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxjQUFjLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7YUFBTSxDQUFDO1lBQ0osY0FBYyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDO0lBQzFCLENBQUM7SUFFRCxRQUFRO1FBQ0osT0FBTyxDQUFDLENBQUMsZ0VBQWdFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRUQsT0FBTztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxxQkFBcUIsQ0FDakMsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLEVBQ0osSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQ3hCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxjQUFjLENBQ3RCLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRW5ELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV4SCxJQUFJLENBQUMscUNBQXFDLEVBQUUsQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3RGLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzlGLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxrQkFBa0I7UUFDZCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDM0MsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUM3RCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1lBQzlDLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRSxZQUFZLEtBQUssT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDakgsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixHQUFHLEtBQUs7UUFDN0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCwrQkFBK0IsQ0FBQyxrQkFBa0IsR0FBRyxLQUFLO1FBQ3RELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDckMsQ0FBQztZQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQU07UUFDeEIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFxQjtRQUNoQyxJQUFJLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNkLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztZQUVsQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sR0FBRyxVQUFVLENBQUM7WUFDeEIsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDdEIsQ0FBQztZQUVELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNWLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3JDLENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sT0FBTyxDQUFDO2dCQUNuQixDQUFDO2dCQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPO3FCQUMvQixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZCxNQUFNLFNBQVMsR0FBRyxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUU1RixPQUFPLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztnQkFDOUQsQ0FBQyxDQUFDO3FCQUNELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUVyRCxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDO2dCQUNuRCxPQUFPLGVBQWUsQ0FBQztZQUMzQixDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUEwQixFQUFFLElBQWU7UUFDN0QsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUEwQixFQUFFLElBQWU7UUFDL0QsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDdkMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQTBCLEVBQUUsSUFBZTtRQUNoRSxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN4QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVELElBQ0ksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUN2QyxDQUFDO1lBQ0MsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFHRCxpQkFBaUIsQ0FBQyxDQUFTO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFtQjtRQUMxQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBVSxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLDBCQUEwQixDQUFDLElBQVU7UUFDekMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakYsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFVO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU8sc0JBQXNCLENBQUMsTUFBYztRQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxvQkFBb0IsQ0FBQyxJQUFlLEVBQUUsTUFBMEI7UUFDNUQsSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLE1BQU0sVUFBVSxHQUFHLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVuSCxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxVQUFVLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ3JELFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMvRixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBYztRQUNsQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1IsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDeEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2IsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsa0JBQWtCLEdBQUcsS0FBSztRQUNqQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUN2RSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUN2SSxDQUFDLFlBQWdDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDSixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZLENBQUMsVUFBc0I7UUFDL0IsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzVFLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFrQjtRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRWpFLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNMLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxVQUFrQixFQUFFLGdCQUF3QjtRQUNsRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsRUFBRSxHQUFHLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFlO1FBQ3pCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEdBQUcsNEJBQTRCLENBQUM7WUFDakYsTUFBTSxvQkFBb0IsR0FBWSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRyxNQUFNLGFBQWEsR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVqRyxJQUFJLG9CQUFvQixJQUFJLFFBQVEsSUFBSSxRQUFRLEdBQUcsYUFBYSxFQUFFLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxPQUFxQjtRQUMzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2xFLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNwRCxDQUFDO1lBRUQsT0FBTyxpQkFBaUIsQ0FBQztRQUM3QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELG1CQUFtQixDQUFDLG1CQUFpQztRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsT0FBcUI7UUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDakUsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2YsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFDRCxPQUFPLGdCQUFnQixDQUFDO1FBQzVCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsMkJBQTJCLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBb0I7UUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFO1lBQzNDLE1BQU0sRUFBRTtnQkFDSixNQUFNLEVBQUUsSUFBSTtnQkFDWixJQUFJLEVBQUUsU0FBUzthQUNsQjtZQUNELE9BQU8sRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0RCxNQUFNLEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzQixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUsscUJBQXFCLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDekYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxTQUFvQjtRQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUU7WUFDOUMsTUFBTSxFQUFFO2dCQUNKLE1BQU0sRUFBRSxJQUFJO2dCQUNaLElBQUksRUFBRSxTQUFTO2FBQ2xCO1lBQ0QsT0FBTyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRELE1BQU0sS0FBSyxHQUFHLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUN6RixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsU0FBb0I7UUFDbkMsSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDbkIsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxPQUFPLEdBQUc7b0JBQ1osT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhO2lCQUM5QixDQUFDO2dCQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBZSxFQUFFLEVBQUU7b0JBQzdFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUE0RDtRQUNyRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsYUFBYSxFQUFFO1lBQzVDLE1BQU0sRUFBRTtnQkFDSixJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0JBQ3ZDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzthQUM1QjtZQUNELE9BQU8sRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUE0RDtRQUN2RSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFO1lBQzlDLE1BQU0sRUFBRTtnQkFDSixJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0JBQ3ZDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzthQUM1QjtZQUNELE9BQU8sRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQW9CO1FBQ3JDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNQLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFvQjtRQUNyQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQzNCLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUF5QjtRQUN4QyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHFDQUFxQztRQUN6QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxjQUFjLEdBQUcscUJBQXFCLENBQUMsdUJBQXVCLENBQUM7UUFDeEUsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFVO1FBQ3hCLElBQUksaUJBQWlCLEdBQVksS0FBSyxDQUFDO1FBRXZDLElBQUksSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0lBRU8sV0FBVyxDQUFDLFVBQXNCO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELGdCQUFnQixDQUFDLHNCQUE4QztRQUMzRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxDQUFDO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQ3JFLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxhQUE2QjtRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsd0JBQXdCO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzlDLENBQUM7SUFFTyxXQUFXLENBQUMsR0FBUTtRQUN4QixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2IsV0FBVztZQUNmLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsdUNBQXVDO1FBQ25DLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM3SCxDQUFDO0lBRUQsc0NBQXNDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5SCxDQUFDO0lBRUQsZ0NBQWdDO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQzFCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ1osSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFvQixDQUFDO1lBRWhFLEtBQUssTUFBTSxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0wsQ0FBQztJQUVPLHlCQUF5QjtRQUM3QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUM7WUFDakMsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BFLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ2pCLGNBQWMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUNyQyxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsK0JBQStCO1FBQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7UUFFeEUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBMEIsRUFBRSxFQUFFO1lBQ3BELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3ZCLG9CQUFvQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQWM7UUFDaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsSUFBSSxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDNUIsYUFBYSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsRUFBb0IsQ0FBQztZQUM1RSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDTCxDQUFDO0lBRU8scUJBQXFCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRLENBQUM7SUFDM0MsQ0FBQztJQUVPLHVCQUF1QjtRQUMzQixPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssVUFBVSxDQUFDO0lBQzdDLENBQUM7SUFFTyxtQkFBbUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDOytHQXgvQlEscUJBQXFCO21HQUFyQixxQkFBcUIsMjJEQVZuQjtZQUNQO2dCQUNJLE9BQU8sRUFBRSw2QkFBNkI7Z0JBQ3RDLFdBQVcsRUFBRSxxQkFBcUI7YUFDckM7WUFDRCxnQkFBZ0I7U0FDbkIsa0VBaUJhLHVCQUF1Qix1RkFHdkIscUNBQXFDLDhGQUdyQyxtQ0FBbUMsMEZBR25DLG1DQUFtQyxrTkMvSXJELHF4SUE0RkEsNnJIRElRLFlBQVksbUlBQ1osa0JBQWtCLDBzQkFDbEIscUJBQXFCLGtJQUNyQiwwQkFBMEIseUZBQzFCLGtCQUFrQiwwREFDbEIsZUFBZSw0RkFDZiw2QkFBNkIsOEZBQzdCLGFBQWEsb0xBQ2IsK0JBQStCLGtHQUMvQix3QkFBd0Isb09BQ3hCLGtDQUFrQyw2RUFDbEMsd0JBQXdCOzs0RkFjbkIscUJBQXFCO2tCQTdCakMsU0FBUzsrQkFDSSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQO3dCQUNMLFlBQVk7d0JBQ1osa0JBQWtCO3dCQUNsQixxQkFBcUI7d0JBQ3JCLDBCQUEwQjt3QkFDMUIsa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLDZCQUE2Qjt3QkFDN0IsYUFBYTt3QkFDYiwrQkFBK0I7d0JBQy9CLHdCQUF3Qjt3QkFDeEIsa0NBQWtDO3dCQUNsQyx3QkFBd0I7cUJBQzNCLGFBR1U7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLDZCQUE2Qjs0QkFDdEMsV0FBVyx1QkFBdUI7eUJBQ3JDO3dCQUNELGdCQUFnQjtxQkFDbkIsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxRQUMvQixFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtpWUFnQnBDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBSXJDLG9CQUFvQjtzQkFEbkIsWUFBWTt1QkFBQyxxQ0FBcUM7Z0JBSW5ELDJCQUEyQjtzQkFEMUIsWUFBWTt1QkFBQyxtQ0FBbUM7Z0JBSWpELHVCQUF1QjtzQkFEdEIsWUFBWTt1QkFBQyxtQ0FBbUM7Z0JBS2pELGFBQWE7c0JBRFosS0FBSztnQkFRTixLQUFLO3NCQURKLEtBQUs7Z0JBU04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBS04sY0FBYztzQkFEYixLQUFLO2dCQUtOLFFBQVE7c0JBRFAsS0FBSztnQkFLTixVQUFVO3NCQURULEtBQUs7Z0JBUU4sY0FBYztzQkFEYixLQUFLO2dCQUtOLFVBQVU7c0JBRFQsS0FBSztnQkFRTixhQUFhO3NCQURaLEtBQUs7Z0JBS04sV0FBVztzQkFEVixLQUFLO2dCQUtOLGNBQWM7c0JBRGIsS0FBSztnQkFLTixzQkFBc0I7c0JBRHJCLEtBQUs7Z0JBS04sa0JBQWtCO3NCQURqQixLQUFLO2dCQUtOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFZTixjQUFjO3NCQURiLEtBQUs7Z0JBU04sT0FBTztzQkFETixLQUFLO2dCQVNOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFXTixXQUFXO3NCQURWLEtBQUs7Z0JBU04sUUFBUTtzQkFEUCxLQUFLO2dCQUtOLGFBQWE7c0JBRFosS0FBSztnQkFTTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQVNGLFNBQVM7c0JBRFosS0FBSztnQkFxQk4sYUFBYTtzQkFEWixLQUFLO2dCQUtOLFlBQVk7c0JBRFgsS0FBSztnQkFLTixhQUFhO3NCQURaLEtBQUs7Z0JBS04sV0FBVztzQkFEVixLQUFLO2dCQUtOLGVBQWU7c0JBRGQsS0FBSztnQkFTTixjQUFjO3NCQURiLEtBQUs7Z0JBS04sSUFBSTtzQkFESCxLQUFLO2dCQUtOLFFBQVE7c0JBRFAsS0FBSztnQkFLTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFLRixvQkFBb0I7c0JBRHZCLEtBQUs7Z0JBT0YsZ0JBQWdCO3NCQURuQixLQUFLO2dCQU9GLGVBQWU7c0JBRGxCLEtBQUs7Z0JBT04saUJBQWlCO3NCQURoQixLQUFLO2dCQUtOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixZQUFZO3NCQURYLEtBQUs7Z0JBS04sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUtOLHNCQUFzQjtzQkFEckIsS0FBSztnQkFLTixTQUFTO3NCQURSLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtQLFlBQVk7c0JBRFgsTUFBTTtnQkFTUCxPQUFPO3NCQUROLE1BQU07Z0JBS1AsS0FBSztzQkFESixNQUFNO2dCQUtQLEtBQUs7c0JBREosTUFBTTtnQkFLUCxZQUFZO3NCQURYLE1BQU07Z0JBS1AsZUFBZTtzQkFEZCxNQUFNO2dCQUtQLG1CQUFtQjtzQkFEbEIsTUFBTTtnQkFLUCx3QkFBd0I7c0JBRHZCLE1BQU07Z0JBS1AsbUJBQW1CO3NCQURsQixNQUFNO2dCQUtQLHlCQUF5QjtzQkFEeEIsTUFBTTtnQkFJUCxTQUFTO3NCQURSLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkEwUnhDLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIHJ4anMvbm8tc3ViamVjdC12YWx1ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG5cbmltcG9ydCB7XG4gICAgQXBwQ29uZmlnU2VydmljZSxcbiAgICBDb2x1bW5zU2VsZWN0b3JDb21wb25lbnQsXG4gICAgQ3VzdG9tRW1wdHlDb250ZW50VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQ3VzdG9tTG9hZGluZ0NvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBDdXN0b21Ob1Blcm1pc3Npb25UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBEYXRhQ2VsbEV2ZW50LFxuICAgIERhdGFDb2x1bW4sXG4gICAgRGF0YUNvbHVtbkxpc3RDb21wb25lbnQsXG4gICAgRGF0YVJvdyxcbiAgICBEYXRhUm93QWN0aW9uRXZlbnQsXG4gICAgRGF0YVNvcnRpbmcsXG4gICAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIERhdGFUYWJsZVNjaGVtYSxcbiAgICBEYXRhVGFibGVTZXJ2aWNlLFxuICAgIEVtcHR5TGlzdENvbXBvbmVudCxcbiAgICBMb2FkaW5nQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIE1haW5NZW51RGF0YVRhYmxlVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgTm9Db250ZW50VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgTm9QZXJtaXNzaW9uVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgUGFnaW5hdGVkQ29tcG9uZW50LFxuICAgIFBhZ2luYXRpb25Nb2RlbCxcbiAgICBSZXF1ZXN0UGFnaW5hdGlvbk1vZGVsLFxuICAgIFNob3dIZWFkZXJNb2RlLFxuICAgIFRodW1ibmFpbFNlcnZpY2UsXG4gICAgVXNlclByZWZlcmVuY2VzU2VydmljZSxcbiAgICBVc2VyUHJlZmVyZW5jZVZhbHVlc1xufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgTm9kZSwgTm9kZUVudHJ5LCBOb2RlUGFnaW5nLCBOb2Rlc0FwaSwgUGFnaW5hdGlvbiB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlLCBOb2Rlc0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgRmlsdGVyU2VhcmNoIH0gZnJvbSAnLi4vLi4vc2VhcmNoJztcbmltcG9ydCB7IFJvd0ZpbHRlciB9IGZyb20gJy4uL2RhdGEvcm93LWZpbHRlci5tb2RlbCc7XG5pbXBvcnQgeyBTaGFyZURhdGFSb3cgfSBmcm9tICcuLi9kYXRhL3NoYXJlLWRhdGEtcm93Lm1vZGVsJztcbmltcG9ydCB7IFNoYXJlRGF0YVRhYmxlQWRhcHRlciB9IGZyb20gJy4uL2RhdGEvc2hhcmUtZGF0YXRhYmxlLWFkYXB0ZXInO1xuaW1wb3J0IHsgQ29udGVudEFjdGlvbk1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2NvbnRlbnQtYWN0aW9uLm1vZGVsJztcbmltcG9ydCB7IERvY3VtZW50TG9hZGVyTm9kZSB9IGZyb20gJy4uL21vZGVscy9kb2N1bWVudC1mb2xkZXIubW9kZWwnO1xuaW1wb3J0IHsgUGVybWlzc2lvblN0eWxlTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvcGVybWlzc2lvbnMtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgcHJlc2V0c0RlZmF1bHRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9wcmVzZXQubW9kZWwnO1xuaW1wb3J0IHsgRG9jdW1lbnRMaXN0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2RvY3VtZW50LWxpc3Quc2VydmljZSc7XG5pbXBvcnQgeyBMb2NrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2suc2VydmljZSc7XG5pbXBvcnQgeyBBREZfRE9DVU1FTlRfUEFSRU5UX0NPTVBPTkVOVCB9IGZyb20gJy4vZG9jdW1lbnQtbGlzdC50b2tlbic7XG5pbXBvcnQgeyBGaWxlQXV0b0Rvd25sb2FkQ29tcG9uZW50IH0gZnJvbSAnLi9maWxlLWF1dG8tZG93bmxvYWQvZmlsZS1hdXRvLWRvd25sb2FkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb2RlRW50aXR5RXZlbnQsIE5vZGVFbnRyeUV2ZW50IH0gZnJvbSAnLi9ub2RlLmV2ZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGaWx0ZXJIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlci1oZWFkZXIvZmlsdGVyLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IEFsZnJlc2NvQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FsZnJlc2NvLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuY29uc3QgQllURVNfVE9fTUJfQ09OVkVSU0lPTl9WQUxVRSA9IDEwNDg1NzY7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLWRvY3VtZW50LWxpc3QnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgICAgICAgRmlsdGVySGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBOb0NvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgRW1wdHlMaXN0Q29tcG9uZW50LFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIE5vUGVybWlzc2lvblRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBMb2FkaW5nQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG4gICAgICAgIE1haW5NZW51RGF0YVRhYmxlVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgIENvbHVtbnNTZWxlY3RvckNvbXBvbmVudFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RvY3VtZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RvY3VtZW50LWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQURGX0RPQ1VNRU5UX1BBUkVOVF9DT01QT05FTlQsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRG9jdW1lbnRMaXN0Q29tcG9uZW50XG4gICAgICAgIH0sXG4gICAgICAgIERhdGFUYWJsZVNlcnZpY2VcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaG9zdDogeyBjbGFzczogJ2FkZi1kb2N1bWVudC1saXN0JyB9XG59KVxuZXhwb3J0IGNsYXNzIERvY3VtZW50TGlzdENvbXBvbmVudCBleHRlbmRzIERhdGFUYWJsZVNjaGVtYSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBQYWdpbmF0ZWRDb21wb25lbnQge1xuICAgIHN0YXRpYyBTSU5HTEVfQ0xJQ0tfTkFWSUdBVElPTjogc3RyaW5nID0gJ2NsaWNrJztcbiAgICBzdGF0aWMgRE9VQkxFX0NMSUNLX05BVklHQVRJT046IHN0cmluZyA9ICdkYmxjbGljayc7XG5cbiAgICBERUZBVUxUX1BBR0lOQVRJT046IFBhZ2luYXRpb24gPSBuZXcgUGFnaW5hdGlvbih7XG4gICAgICAgIGhhc01vcmVJdGVtczogZmFsc2UsXG4gICAgICAgIHNraXBDb3VudDogMCxcbiAgICAgICAgbWF4SXRlbXM6IDI1LFxuICAgICAgICB0b3RhbEl0ZW1zOiAwXG4gICAgfSk7XG5cbiAgICBERUZBVUxUX1NPUlRJTkc6IERhdGFTb3J0aW5nW10gPSBbbmV3IERhdGFTb3J0aW5nKCduYW1lJywgJ2FzYycpLCBuZXcgRGF0YVNvcnRpbmcoJ2lzRm9sZGVyJywgJ2Rlc2MnKV07XG5cbiAgICBAQ29udGVudENoaWxkKERhdGFDb2x1bW5MaXN0Q29tcG9uZW50KVxuICAgIGNvbHVtbkxpc3Q6IERhdGFDb2x1bW5MaXN0Q29tcG9uZW50O1xuXG4gICAgQENvbnRlbnRDaGlsZChDdXN0b21Mb2FkaW5nQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlKVxuICAgIGN1c3RvbUxvYWRpbmdDb250ZW50OiBDdXN0b21Mb2FkaW5nQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgQENvbnRlbnRDaGlsZChDdXN0b21Ob1Blcm1pc3Npb25UZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBjdXN0b21Ob1Blcm1pc3Npb25zVGVtcGxhdGU6IEN1c3RvbU5vUGVybWlzc2lvblRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgQENvbnRlbnRDaGlsZChDdXN0b21FbXB0eUNvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBjdXN0b21Ob0NvbnRlbnRUZW1wbGF0ZTogQ3VzdG9tRW1wdHlDb250ZW50VGVtcGxhdGVEaXJlY3RpdmU7XG5cbiAgICAvKiogSW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlIGluIHRoZSBzZXJ2ZXIgcmVxdWVzdC4gRm9yIGV4YW1wbGU6IGFzc29jaWF0aW9uLCBpc0xpbmssIGlzTG9ja2VkIGFuZCBvdGhlcnMuICovXG4gICAgQElucHV0KClcbiAgICBpbmNsdWRlRmllbGRzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhlIE5vZGUgbGlzdCB1c2luZyB0aGUgKndoZXJlKiBjb25kaXRpb24gb2YgdGhlIFJFU1QgQVBJXG4gICAgICogKGZvciBleGFtcGxlLCBpc0ZvbGRlcj10cnVlKS4gU2VlIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgd2hlcmU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIERlZmluZSBhIHNldCBvZiBDU1Mgc3R5bGVzIHRvIGFwcGx5IGRlcGVuZGluZyBvbiB0aGUgcGVybWlzc2lvblxuICAgICAqIG9mIHRoZSB1c2VyIG9uIHRoYXQgbm9kZS4gU2VlIHRoZSBQZXJtaXNzaW9uIFN0eWxlIG1vZGVsXG4gICAgICogcGFnZSBmb3IgZnVydGhlciBkZXRhaWxzIGFuZCBleGFtcGxlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHBlcm1pc3Npb25zU3R5bGU6IFBlcm1pc3Npb25TdHlsZU1vZGVsW10gPSBbXTtcblxuICAgIC8qKiBUaGUgZGVmYXVsdCByb3V0ZSBmb3IgYWxsIHRoZSBsb2NhdGlvbi1iYXNlZCBjb2x1bW5zIChpZiBkZWNsYXJlZCkuICovXG4gICAgQElucHV0KClcbiAgICBsb2NhdGlvbkZvcm1hdDogc3RyaW5nID0gJy8nO1xuXG4gICAgLyoqIFRvZ2dsZXMgbmF2aWdhdGlvbiB0byBmb2xkZXIgY29udGVudCBvciBmaWxlIHByZXZpZXcgKi9cbiAgICBASW5wdXQoKVxuICAgIG5hdmlnYXRlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBUb2dnbGVzIHRoZSBoZWFkZXIgKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dIZWFkZXIgPSBTaG93SGVhZGVyTW9kZS5EYXRhO1xuXG4gICAgLyoqXG4gICAgICogVXNlciBpbnRlcmFjdGlvbiBmb3IgZm9sZGVyIG5hdmlnYXRpb24gb3IgZmlsZSBwcmV2aWV3LlxuICAgICAqIFZhbGlkIHZhbHVlcyBhcmUgXCJjbGlja1wiIGFuZCBcImRibGNsaWNrXCIuIERlZmF1bHQgdmFsdWU6IFwiZGJsY2xpY2tcIlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbmF2aWdhdGlvbk1vZGU6IHN0cmluZyA9IERvY3VtZW50TGlzdENvbXBvbmVudC5ET1VCTEVfQ0xJQ0tfTkFWSUdBVElPTjsgLy8gY2xpY2t8ZGJsY2xpY2tcblxuICAgIC8qKiBTaG93IGRvY3VtZW50IHRodW1ibmFpbHMgcmF0aGVyIHRoYW4gaWNvbnMgKi9cbiAgICBASW5wdXQoKVxuICAgIHRodW1ibmFpbHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFJvdyBzZWxlY3Rpb24gbW9kZS4gQ2FuIGJlIG51bGwsIGBzaW5nbGVgIG9yIGBtdWx0aXBsZWAuIEZvciBgbXVsdGlwbGVgIG1vZGUsXG4gICAgICogeW91IGNhbiB1c2UgQ21kIChtYWNPUykgb3IgQ3RybCAoV2luKSBtb2RpZmllciBrZXkgdG8gdG9nZ2xlIHNlbGVjdGlvbiBmb3IgbXVsdGlwbGUgcm93cy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNlbGVjdGlvbk1vZGU6IHN0cmluZyA9ICdzaW5nbGUnOyAvLyBudWxsfHNpbmdsZXxtdWx0aXBsZVxuXG4gICAgLyoqIFRvZ2dsZXMgbXVsdGlzZWxlY3QgbW9kZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgbXVsdGlzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBUb2dnbGVzIGNvbnRlbnQgYWN0aW9ucyBmb3IgZWFjaCByb3cgKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbnRlbnRBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogUG9zaXRpb24gb2YgdGhlIGNvbnRlbnQgYWN0aW9ucyBkcm9wZG93biBtZW51LiBDYW4gYmUgc2V0IHRvIFwibGVmdFwiIG9yIFwicmlnaHRcIi4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbnRlbnRBY3Rpb25zUG9zaXRpb246IHN0cmluZyA9ICdyaWdodCc7IC8vIGxlZnR8cmlnaHRcblxuICAgIC8qKiBUb2dnbGVzIGNvbnRleHQgbWVudXMgZm9yIGVhY2ggcm93ICovXG4gICAgQElucHV0KClcbiAgICBjb250ZXh0TWVudUFjdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBDdXN0b20gaW1hZ2UgZm9yIGVtcHR5IGZvbGRlci4gRGVmYXVsdCB2YWx1ZTogJy4vYXNzZXRzL2ltYWdlcy9lbXB0eV9kb2NfbGliLnN2ZycgKi9cbiAgICBASW5wdXQoKVxuICAgIGVtcHR5Rm9sZGVySW1hZ2VVcmw6IHN0cmluZyA9ICcuL2Fzc2V0cy9pbWFnZXMvZW1wdHlfZG9jX2xpYi5zdmcnO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGVuYWJsZXMgeW91IHRvIGRyb3AgZmlsZXMgZGlyZWN0bHkgaW50byBzdWJmb2xkZXJzIHNob3duXG4gICAgICogYXMgaXRlbXMgaW4gdGhlIGxpc3Qgb3IgaW50byBhbm90aGVyIGZpbGUgdG8gdHJpZ2dlciB1cGRhdGluZyBpdCdzIHZlcnNpb24uXG4gICAgICogV2hlbiBmYWxzZSwgdGhlIGRyb3BwZWQgZmlsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuICAgICAqIGN1cnJlbnQgZm9sZGVyIChpZSwgdGhlIG9uZSBjb250YWluaW5nIGFsbCB0aGUgaXRlbXMgc2hvd24gaW4gdGhlIGxpc3QpLlxuICAgICAqIFNlZSB0aGUgVXBsb2FkIGRpcmVjdGl2ZSBmb3IgZnVydGhlciBkZXRhaWxzIGFib3V0IGhvdyB0aGUgZmlsZSBkcm9wIGlzXG4gICAgICogaGFuZGxlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGFsbG93RHJvcEZpbGVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlZmF1bHQgc29ydGluZy4gVGhlIGZvcm1hdCBpcyBhbiBhcnJheSBvZiAyIHN0cmluZ3MgYFtrZXksIGRpcmVjdGlvbl1gXG4gICAgICogaS5lLiBgWyduYW1lJywgJ2Rlc2MnXWAgb3IgYFsnbmFtZScsICdhc2MnXWAuIFNldCB0aGlzIHZhbHVlIG9ubHkgaWYgeW91IHdhbnQgdG9cbiAgICAgKiBvdmVycmlkZSB0aGUgZGVmYXVsdCBzb3J0aW5nIGRldGVjdGVkIGJ5IHRoZSBjb21wb25lbnQgYmFzZWQgb24gY29sdW1ucy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNvcnRpbmc6IHN0cmluZ1tdIHwgRGF0YVNvcnRpbmcgPSBbJ25hbWUnLCAnYXNjJ107XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlZmF1bHQgc29ydGluZy4gVGhlIGZvcm1hdCBpcyBhbiBhcnJheSBvZiBzdHJpbmdzIGBba2V5IGRpcmVjdGlvbiwgb3RoZXJLZXkgb3RoZXJEaXJlY3Rpb25dYFxuICAgICAqIGkuZS4gYFsnbmFtZSBkZXNjJywgJ25vZGVUeXBlIGFzYyddYCBvciBgWyduYW1lIGFzYyddYC4gU2V0IHRoaXMgdmFsdWUgaWYgeW91IHdhbnQgYSBiYXNlXG4gICAgICogcnVsZSB0byBiZSBhZGRlZCB0byB0aGUgc29ydGluZyBhcGFydCBmcm9tIHRoZSBvbmUgZHJpdmVuIGJ5IHRoZSBoZWFkZXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBhZGRpdGlvbmFsU29ydGluZzogRGF0YVNvcnRpbmcgPSBuZXcgRGF0YVNvcnRpbmcoJ2lzRm9sZGVyJywgJ2Rlc2MnKTtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgc29ydGluZyBtb2RlLiBDYW4gYmUgZWl0aGVyIGBjbGllbnRgIChpdGVtcyBpbiB0aGUgbGlzdFxuICAgICAqIGFyZSBzb3J0ZWQgY2xpZW50LXNpZGUpIG9yIGBzZXJ2ZXJgICh0aGUgb3JkZXJpbmcgc3VwcGxpZWQgYnkgdGhlXG4gICAgICogc2VydmVyIGlzIHVzZWQgd2l0aG91dCBmdXJ0aGVyIGNsaWVudC1zaWRlIHNvcnRpbmcpLlxuICAgICAqIE5vdGUgdGhhdCB0aGUgYHNlcnZlcmAgb3B0aW9uICpkb2VzIG5vdCogcmVxdWVzdCB0aGUgc2VydmVyIHRvIHNvcnQgdGhlIGRhdGFcbiAgICAgKiBiZWZvcmUgZGVsaXZlcmluZyBpdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNvcnRpbmdNb2RlOiAnc2VydmVyJyB8ICdjbGllbnQnID0gJ3NlcnZlcic7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW5saW5lIHN0eWxlIHRvIGFwcGx5IHRvIGV2ZXJ5IHJvdy4gU2VlXG4gICAgICogdGhlIEFuZ3VsYXIgTmdTdHlsZVxuICAgICAqIGRvY3MgZm9yIG1vcmUgZGV0YWlscyBhbmQgdXNhZ2UgZXhhbXBsZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByb3dTdHlsZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAgIC8qKiBUaGUgQ1NTIGNsYXNzIHRvIGFwcGx5IHRvIGV2ZXJ5IHJvdyAqL1xuICAgIEBJbnB1dCgpXG4gICAgcm93U3R5bGVDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgbG9hZGluZyBzdGF0ZSBhbmQgYW5pbWF0ZWQgc3Bpbm5lcnMgZm9yIHRoZSBjb21wb25lbnQuIFVzZWQgaW5cbiAgICAgKiBjb21iaW5hdGlvbiB3aXRoIGBuYXZpZ2F0ZT1mYWxzZWAgdG8gcGVyZm9ybSBjdXN0b20gbmF2aWdhdGlvbiBhbmQgbG9hZGluZ1xuICAgICAqIHN0YXRlIGluZGljYXRpb24uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIF9yb3dGaWx0ZXI6IFJvd0ZpbHRlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIGZ1bmN0aW9uIHRvIGNob29zZSB3aGV0aGVyIHRvIHNob3cgb3IgaGlkZSByb3dzLlxuICAgICAqIFNlZSB0aGUgW1JvdyBGaWx0ZXIgTW9kZWxdKHJvdy1maWx0ZXIubW9kZWwubWQpIHBhZ2UgZm9yXG4gICAgICogbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCByb3dGaWx0ZXIocm93RmlsdGVyOiBSb3dGaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5fcm93RmlsdGVyID0gcm93RmlsdGVyO1xuICAgICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuc2V0RmlsdGVyKHRoaXMuX3Jvd0ZpbHRlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVySWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHJvd0ZpbHRlcigpOiBSb3dGaWx0ZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBmdW5jdGlvbiB0byBjaG9vc2UgaW1hZ2UgZmlsZSBwYXRocyB0byBzaG93LiBTZWUgdGhlXG4gICAgICogW0ltYWdlIFJlc29sdmVyIE1vZGVsXShpbWFnZS1yZXNvbHZlci5tb2RlbC5tZCkgcGFnZSBmb3JcbiAgICAgKiBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW1hZ2VSZXNvbHZlcjogYW55IHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKiogVG9nZ2xlcyB0aGUgc3RpY2t5IGhlYWRlciBtb2RlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc3RpY2t5SGVhZGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogVG9nZ2xlcyB0aGUgaGVhZGVyIGZpbHRlcnMgbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGhlYWRlckZpbHRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBJbml0aWFsIHZhbHVlIGZvciBmaWx0ZXIuICovXG4gICAgQElucHV0KClcbiAgICBmaWx0ZXJWYWx1ZTogYW55O1xuXG4gICAgLyoqIFRoZSBJRCBvZiB0aGUgZm9sZGVyIG5vZGUgdG8gZGlzcGxheSBvciBhIHJlc2VydmVkIHN0cmluZyBhbGlhcyBmb3Igc3BlY2lhbCBzb3VyY2VzICovXG4gICAgQElucHV0KClcbiAgICBjdXJyZW50Rm9sZGVySWQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBub2RlcyB0byBiZSBwcmUtc2VsZWN0ZWQuIEFsbCBub2RlcyBpbiB0aGVcbiAgICAgKiBhcnJheSBhcmUgcHJlLXNlbGVjdGVkIGluIG11bHRpIHNlbGVjdGlvbiBtb2RlLCBidXQgb25seSB0aGUgZmlyc3Qgbm9kZVxuICAgICAqIGlzIHByZS1zZWxlY3RlZCBpbiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwcmVzZWxlY3ROb2RlczogTm9kZUVudHJ5W10gPSBbXTtcblxuICAgIC8qKiBUaGUgRG9jdW1lbnQgbGlzdCB3aWxsIHNob3cgYWxsIHRoZSBub2RlcyBjb250YWluZWQgaW4gdGhlIE5vZGVQYWdpbmcgZW50aXR5ICovXG4gICAgQElucHV0KClcbiAgICBub2RlOiBOb2RlUGFnaW5nID0gbnVsbDtcblxuICAgIC8qKiBEZWZhdWx0IHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgdXNlciBwcmVmZXJlbmNlIHNldHRpbmdzLiBVc2UgdGhpcyBvbmx5IGlmIHlvdSBhcmUgbm90IHVzaW5nIHBhZ2luYXRpb24uICovXG4gICAgQElucHV0KClcbiAgICBtYXhJdGVtczogbnVtYmVyID0gdGhpcy5ERUZBVUxUX1BBR0lOQVRJT04ubWF4SXRlbXM7XG5cbiAgICAvKiogS2V5IG9mIGNvbHVtbnMgcHJlc2V0IHNldCBpbiBleHRlbnNpb24uanNvbiAgKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbHVtbnNQcmVzZXRLZXk/OiBzdHJpbmc7XG5cbiAgICAvKiogU2V0cyBjb2x1bW5zIHZpc2liaWxpdHkgZm9yIERhdGFUYWJsZVNjaGVtYSAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNldENvbHVtbnNWaXNpYmlsaXR5KGNvbHVtbnNWaXNpYmlsaXR5OiB7IFtjb2x1bW5JZDogc3RyaW5nXTogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY29sdW1uc1Zpc2liaWxpdHkgPSBjb2x1bW5zVmlzaWJpbGl0eTtcbiAgICB9XG5cbiAgICAvKiogU2V0cyBjb2x1bW5zIHdpZHRoIGZvciBEYXRhVGFibGVTY2hlbWEgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZXRDb2x1bW5zV2lkdGhzKGNvbHVtbnNXaWR0aHM6IHsgW2NvbHVtbklkOiBzdHJpbmddOiBudW1iZXIgfSB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNvbHVtbnNXaWR0aHMgPSBjb2x1bW5zV2lkdGhzO1xuICAgIH1cblxuICAgIC8qKiBTZXRzIGNvbHVtbnMgb3JkZXIgZm9yIERhdGFUYWJsZVNjaGVtYSAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNldENvbHVtbnNPcmRlcihjb2x1bW5zT3JkZXI6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY29sdW1uc09yZGVyID0gY29sdW1uc09yZGVyO1xuICAgIH1cblxuICAgIC8qKiBMaW1pdCBvZiBwb3NzaWJsZSB2aXNpYmxlIGNvbHVtbnMsIGluY2x1ZGluZyBcIiR0aHVtYm5haWxcIiBjb2x1bW4gaWYgcHJvdmlkZWQgKi9cbiAgICBASW5wdXQoKVxuICAgIG1heENvbHVtbnNWaXNpYmxlPzogbnVtYmVyO1xuXG4gICAgLyoqIEVuYWJsZXMgY29sdW1uIHJlc2l6aW5nIGZvciBkYXRhdGFibGUgKi9cbiAgICBASW5wdXQoKVxuICAgIGlzUmVzaXppbmdFbmFibGVkID0gZmFsc2U7XG5cbiAgICAvKiogRW5hYmxlcyBibHVyIHdoZW4gcmVzaXppbmcgZGF0YXRhYmxlIGNvbHVtbnMgKi9cbiAgICBASW5wdXQoKVxuICAgIGJsdXJPblJlc2l6ZSA9IHRydWU7XG5cbiAgICAvKiogRGlzcGxheSBjaGVja2JveGVzIGluIGRhdGF0YWJsZSByb3dzIG9uIGhvdmVyIG9ubHkgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlDaGVja2JveGVzT25Ib3ZlciA9IGZhbHNlO1xuXG4gICAgLyoqIERpc3BsYXkgZHJhZyBhbmQgZHJvcCBoaW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzcGxheURyYWdBbmREcm9wSGludCA9IHRydWU7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIGxpc3Qgbm9kZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG5vZGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZUVudGl0eUV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBkb3VibGUtY2xpY2tzIGEgbGlzdCBub2RlICovXG4gICAgQE91dHB1dCgpXG4gICAgbm9kZURibENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlRW50aXR5RXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBjdXJyZW50IGRpc3BsYXkgZm9sZGVyIGNoYW5nZXMgKi9cbiAgICBAT3V0cHV0KClcbiAgICBmb2xkZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE5vZGVFbnRyeUV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGFjdHMgdXBvbiBmaWxlcyB3aXRoIGVpdGhlciBzaW5nbGUgb3IgZG91YmxlIGNsaWNrXG4gICAgICogKGRlcGVuZHMgb24gYG5hdmlnYXRpb24tbW9kZWApLiBVc2VmdWwgZm9yIGludGVncmF0aW9uIHdpdGggdGhlXG4gICAgICogVmlld2VyIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlRW50aXR5RXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBEb2N1bWVudCBMaXN0IGhhcyBsb2FkZWQgYWxsIGl0ZW1zIGFuZCBpcyByZWFkeSBmb3IgdXNlICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPE5vZGVQYWdpbmc+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBBUEkgZmFpbHMgdG8gZ2V0IHRoZSBEb2N1bWVudCBMaXN0IGRhdGEgKi9cbiAgICBAT3V0cHV0KClcbiAgICBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgbm9kZSBzZWxlY3Rpb24gY2hhbmdlICovXG4gICAgQE91dHB1dCgpXG4gICAgbm9kZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlRW50cnlbXT4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSBmaWx0ZXIgdmFsdWUgaXMgc2VsZWN0ZWQgKi9cbiAgICBAT3V0cHV0KClcbiAgICBmaWx0ZXJTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlclNlYXJjaFtdPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBjb2x1bW4gd2lkdGhzIGNoYW5nZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGNvbHVtbnNXaWR0aENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgW2NvbHVtbklkOiBzdHJpbmddOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gY29sdW1ucyB2aXNpYmlsaXR5IGNoYW5nZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGNvbHVtbnNWaXNpYmlsaXR5Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBbY29sdW1uSWQ6IHN0cmluZ106IGJvb2xlYW4gfSB8IHVuZGVmaW5lZD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gY29sdW1ucyBvcmRlciBjaGFuZ2UgKi9cbiAgICBAT3V0cHV0KClcbiAgICBjb2x1bW5zT3JkZXJDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXSB8IHVuZGVmaW5lZD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGVkIHJvdyBpdGVtcyBjb3VudCBpbiB0aGUgdGFibGUgY2hhbmdlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBzZWxlY3RlZEl0ZW1zQ291bnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG5cbiAgICBAVmlld0NoaWxkKCdkYXRhVGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIGRhdGFUYWJsZTogRGF0YVRhYmxlQ29tcG9uZW50O1xuXG4gICAgYWN0aW9uczogQ29udGVudEFjdGlvbk1vZGVsW10gPSBbXTtcbiAgICBjb250ZXh0QWN0aW9uSGFuZGxlcjogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBkYXRhOiBTaGFyZURhdGFUYWJsZUFkYXB0ZXI7XG4gICAgbm9QZXJtaXNzaW9uOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2VsZWN0aW9uID0gbmV3IEFycmF5PE5vZGVFbnRyeT4oKTtcbiAgICAkZm9sZGVyTm9kZTogU3ViamVjdDxOb2RlPiA9IG5ldyBTdWJqZWN0PE5vZGU+KCk7XG4gICAgYWxsb3dGaWx0ZXJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICAgIG9yZGVyQnk6IHN0cmluZ1tdID0gbnVsbDtcbiAgICBwcmVzZWxlY3RlZFJvd3M6IERhdGFSb3dbXSA9IFtdO1xuXG4gICAgLy8gQGRlcHJlY2F0ZWQgMy4wLjBcbiAgICBmb2xkZXJOb2RlOiBOb2RlO1xuXG4gICAgcHJpdmF0ZSBfcGFnaW5hdGlvbjogUGFnaW5hdGlvbk1vZGVsID0gdGhpcy5ERUZBVUxUX1BBR0lOQVRJT047XG4gICAgcGFnaW5hdGlvbjogQmVoYXZpb3JTdWJqZWN0PFBhZ2luYXRpb25Nb2RlbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhZ2luYXRpb25Nb2RlbD4odGhpcy5ERUZBVUxUX1BBR0lOQVRJT04pO1xuICAgIHNvcnRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8RGF0YVNvcnRpbmdbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTb3J0aW5nW10+KHRoaXMuREVGQVVMVF9TT1JUSU5HKTtcblxuICAgIHByaXZhdGUgcm93TWVudUNhY2hlOiB7IFtrZXk6IHN0cmluZ106IENvbnRlbnRBY3Rpb25Nb2RlbFtdIH0gPSB7fTtcbiAgICBwcml2YXRlIGxvYWRpbmdUaW1lb3V0OiBhbnk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBwcml2YXRlIF9ub2Rlc0FwaTogTm9kZXNBcGk7XG4gICAgZ2V0IG5vZGVzQXBpKCk6IE5vZGVzQXBpIHtcbiAgICAgICAgdGhpcy5fbm9kZXNBcGkgPSB0aGlzLl9ub2Rlc0FwaSA/PyBuZXcgTm9kZXNBcGkodGhpcy5hbGZyZXNjb0FwaVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub2Rlc0FwaTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkb2N1bWVudExpc3RTZXJ2aWNlOiBEb2N1bWVudExpc3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgYXBwQ29uZmlnOiBBcHBDb25maWdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29udGVudFNlcnZpY2U6IENvbnRlbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRodW1ibmFpbFNlcnZpY2U6IFRodW1ibmFpbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYWxmcmVzY29BcGlTZXJ2aWNlOiBBbGZyZXNjb0FwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbm9kZVNlcnZpY2U6IE5vZGVzQXBpU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkYXRhVGFibGVTZXJ2aWNlOiBEYXRhVGFibGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvY2tTZXJ2aWNlOiBMb2NrU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZ1xuICAgICkge1xuICAgICAgICBzdXBlcihhcHBDb25maWcsICdkZWZhdWx0JywgcHJlc2V0c0RlZmF1bHRNb2RlbCk7XG4gICAgICAgIHRoaXMubm9kZVNlcnZpY2Uubm9kZVVwZGF0ZWQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKChub2RlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2Uucm93VXBkYXRlLm5leHQoeyBpZDogbm9kZS5pZCwgb2JqOiB7IGVudHJ5OiBub2RlIH0gfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZVxuICAgICAgICAgICAgLnNlbGVjdChVc2VyUHJlZmVyZW5jZVZhbHVlcy5QYWdpbmF0aW9uU2l6ZSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocGFnU2l6ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4SXRlbXMgPSB0aGlzLl9wYWdpbmF0aW9uLm1heEl0ZW1zID0gcGFnU2l6ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldENvbnRleHRBY3Rpb25zKG5vZGU6IE5vZGVFbnRyeSkge1xuICAgICAgICBpZiAobm9kZT8uZW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmdldE5vZGVBY3Rpb25zKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGFjdGlvbnMgJiYgYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMubWFwKChjdXJyZW50QWN0aW9uOiBDb250ZW50QWN0aW9uTW9kZWwpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsOiBjdXJyZW50QWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICBzdWJqZWN0OiB0aGlzLmNvbnRleHRBY3Rpb25IYW5kbGVyXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGVmYXVsdFNvcnRpbmcoKTogRGF0YVNvcnRpbmcge1xuICAgICAgICBsZXQgZGVmYXVsdFNvcnRpbmc6IERhdGFTb3J0aW5nO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNvcnRpbmcpKSB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCBkaXJlY3Rpb25dID0gdGhpcy5zb3J0aW5nO1xuICAgICAgICAgICAgZGVmYXVsdFNvcnRpbmcgPSBuZXcgRGF0YVNvcnRpbmcoa2V5LCBkaXJlY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdFNvcnRpbmcgPSBuZXcgRGF0YVNvcnRpbmcodGhpcy5zb3J0aW5nLmtleSwgdGhpcy5zb3J0aW5nLmRpcmVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdFNvcnRpbmc7XG4gICAgfVxuXG4gICAgaXNNb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGF0YSB8fCB0aGlzLmRhdGEuZ2V0Um93cygpLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5yb3dNZW51Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5sb2FkTGF5b3V0UHJlc2V0cygpO1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgU2hhcmVEYXRhVGFibGVBZGFwdGVyKFxuICAgICAgICAgICAgdGhpcy50aHVtYm5haWxTZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5jb250ZW50U2VydmljZSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB0aGlzLmdldERlZmF1bHRTb3J0aW5nKCksXG4gICAgICAgICAgICB0aGlzLnNvcnRpbmdNb2RlLFxuICAgICAgICAgICAgdGhpcy5hbGxvd0Ryb3BGaWxlc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEudGh1bWJuYWlscyA9IHRoaXMudGh1bWJuYWlscztcbiAgICAgICAgdGhpcy5kYXRhLnBlcm1pc3Npb25zU3R5bGUgPSB0aGlzLnBlcm1pc3Npb25zU3R5bGU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3Jvd0ZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNldEZpbHRlcih0aGlzLl9yb3dGaWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VSZXNvbHZlcikge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNldEltYWdlUmVzb2x2ZXIodGhpcy5pbWFnZVJlc29sdmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGV4dEFjdGlvbkhhbmRsZXIucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMuY29udGV4dEFjdGlvbkNhbGxiYWNrKHZhbCkpO1xuXG4gICAgICAgIHRoaXMuZW5mb3JjZVNpbmdsZUNsaWNrTmF2aWdhdGlvbkZvck1vYmlsZSgpO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJWYWx1ZSAmJiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlclZhbHVlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dIZWFkZXIgPSBTaG93SGVhZGVyTW9kZS5BbHdheXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uc1ByZXNldEtleSkge1xuICAgICAgICAgICAgdGhpcy5zZXRQcmVzZXRLZXkodGhpcy5jb2x1bW5zUHJlc2V0S2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVzZXRTZWxlY3Rpb24kLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uTGlzdCkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmNvbHVtbnMuY2hhbmdlcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29sdW1ucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRDb2x1bW5zKHRoaXMuY29sdW1ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWF0ZURhdGF0YWJsZVNjaGVtYSgpO1xuICAgICAgICB0aGlzLmRhdGEuc2V0Q29sdW1ucyh0aGlzLmNvbHVtbnMpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKCFjaGFuZ2VzWydwcmVzZWxlY3ROb2RlcyddKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNvcnRpbmcpKSB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCBkaXJlY3Rpb25dID0gdGhpcy5zb3J0aW5nO1xuICAgICAgICAgICAgdGhpcy5vcmRlckJ5ID0gdGhpcy5idWlsZE9yZGVyQnlBcnJheShrZXksIGRpcmVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9yZGVyQnkgPSB0aGlzLmJ1aWxkT3JkZXJCeUFycmF5KHRoaXMuc29ydGluZy5rZXksIHRoaXMuc29ydGluZy5kaXJlY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnRodW1ibmFpbHMgPSB0aGlzLnRodW1ibmFpbHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5zb3J0aW5nTW9kZSAmJiAhY2hhbmdlcy5zb3J0aW5nTW9kZS5maXJzdENoYW5nZSAmJiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zb3J0aW5nTW9kZSA9IGNoYW5nZXMuc29ydGluZ01vZGUuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuc29ydGluZyAmJiAhY2hhbmdlcy5zb3J0aW5nLmZpcnN0Q2hhbmdlICYmIHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBjaGFuZ2VzLnNvcnRpbmcuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCBkaXJlY3Rpb25dID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNldFNvcnRpbmcobmV3IERhdGFTb3J0aW5nKGtleSwgZGlyZWN0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVySWQgJiYgY2hhbmdlc1snY3VycmVudEZvbGRlcklkJ10/LmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snY3VycmVudEZvbGRlcklkJ10/LnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZvbGRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMubm9kZT8uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVyZ2UgPSB0aGlzLl9wYWdpbmF0aW9uID8gdGhpcy5fcGFnaW5hdGlvbi5tZXJnZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5sb2FkUGFnZShjaGFuZ2VzLm5vZGUuY3VycmVudFZhbHVlLCBtZXJnZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVzZXJ2ZUV4aXN0aW5nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vblByZXNlbGVjdE5vZGVzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFSZWFkeShjaGFuZ2VzLm5vZGUuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5pbWFnZVJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNldEltYWdlUmVzb2x2ZXIoY2hhbmdlcy5pbWFnZVJlc29sdmVyLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWxvYWQoaGlkZUxvYWRpbmdTcGlubmVyID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnJlbG9hZFdpdGhvdXRSZXNldHRpbmdTZWxlY3Rpb24oaGlkZUxvYWRpbmdTcGlubmVyKTtcbiAgICB9XG5cbiAgICByZWxvYWRXaXRob3V0UmVzZXR0aW5nU2VsZWN0aW9uKGhpZGVMb2FkaW5nU3Bpbm5lciA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEubG9hZFBhZ2UodGhpcy5ub2RlLCB0aGlzLl9wYWdpbmF0aW9uLm1lcmdlLCBudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXNlcnZlRXhpc3RpbmdTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25QcmVzZWxlY3ROb2RlcygpO1xuICAgICAgICAgICAgdGhpcy5zeW5jUGFnaW5hdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFSZWFkeSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkRm9sZGVyKGhpZGVMb2FkaW5nU3Bpbm5lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0QWN0aW9uQ2FsbGJhY2soYWN0aW9uKSB7XG4gICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNvbnRlbnRBY3Rpb24oYWN0aW9uLm5vZGUsIGFjdGlvbi5tb2RlbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXROb2RlQWN0aW9ucyhub2RlOiBOb2RlRW50cnkgfCBhbnkpOiBDb250ZW50QWN0aW9uTW9kZWxbXSB7XG4gICAgICAgIGlmIChub2RlPy5lbnRyeSkge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChub2RlLmVudHJ5LmlzRmlsZSkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9ICdkb2N1bWVudCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZW50cnkuaXNGb2xkZXIpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSAnZm9sZGVyJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLnJvd01lbnVDYWNoZVtub2RlLmVudHJ5LmlkXTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQWN0aW9uKGFjdGlvbiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9ucztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zQnlUYXJnZXQgPSB0aGlzLmFjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IHR5cGVvZiBlbnRyeS52aXNpYmxlID09PSAnZnVuY3Rpb24nID8gZW50cnkudmlzaWJsZShub2RlKSA6IGVudHJ5LnZpc2libGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1Zpc2libGUgJiYgZW50cnkudGFyZ2V0LnRvTG93ZXJDYXNlKCkgPT09IHRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoYWN0aW9uKSA9PiBuZXcgQ29udGVudEFjdGlvbk1vZGVsKGFjdGlvbikpO1xuXG4gICAgICAgICAgICAgICAgYWN0aW9uc0J5VGFyZ2V0LmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hBY3Rpb24oYWN0aW9uLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMucm93TWVudUNhY2hlW25vZGUuZW50cnkuaWRdID0gYWN0aW9uc0J5VGFyZ2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zQnlUYXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWZyZXNoQWN0aW9uKGFjdGlvbjogQ29udGVudEFjdGlvbk1vZGVsLCBub2RlOiBOb2RlRW50cnkpIHtcbiAgICAgICAgYWN0aW9uLmRpc2FibGVkID0gdGhpcy5pc0FjdGlvbkRpc2FibGVkKGFjdGlvbiwgbm9kZSk7XG4gICAgICAgIGFjdGlvbi52aXNpYmxlID0gdGhpcy5pc0FjdGlvblZpc2libGUoYWN0aW9uLCBub2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQWN0aW9uVmlzaWJsZShhY3Rpb246IENvbnRlbnRBY3Rpb25Nb2RlbCwgbm9kZTogTm9kZUVudHJ5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLnZpc2libGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24udmlzaWJsZShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY3Rpb24udmlzaWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uOiBDb250ZW50QWN0aW9uTW9kZWwsIG5vZGU6IE5vZGVFbnRyeSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5kaXNhYmxlZChub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChhY3Rpb24ucGVybWlzc2lvbiAmJiBhY3Rpb24uZGlzYWJsZVdpdGhOb1Blcm1pc3Npb24gJiYgIXRoaXMuY29udGVudFNlcnZpY2UuaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyhub2RlLmVudHJ5LCBhY3Rpb24ucGVybWlzc2lvbikpIHx8XG4gICAgICAgICAgICB0aGlzLmxvY2tTZXJ2aWNlLmlzTG9ja2VkKG5vZGUuZW50cnkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLmRpc2FibGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY29udGV4dG1lbnUnLCBbJyRldmVudCddKVxuICAgIG9uU2hvd0NvbnRleHRNZW51KGU/OiBFdmVudCkge1xuICAgICAgICBpZiAoZSAmJiB0aGlzLmNvbnRleHRNZW51QWN0aW9ucykge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmF2aWdhdGVUbyhub2RlOiBOb2RlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXROZXdGb2xkZXJQYWdpbmF0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2xkZXJJZCA9IG5vZGU7XG4gICAgICAgICAgICB0aGlzLmZvbGRlckNoYW5nZS5lbWl0KG5ldyBOb2RlRW50cnlFdmVudCh7IGlkOiBub2RlIH0gYXMgTm9kZSkpO1xuICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuTmF2aWdhdGVGb2xkZXIobm9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0TmV3Rm9sZGVyUGFnaW5hdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvbGRlcklkID0gdGhpcy5nZXROb2RlRm9sZGVyRGVzdGluYXRpb25JZChub2RlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvbGRlckNoYW5nZS5lbWl0KG5ldyBOb2RlRW50cnlFdmVudCh7IGlkOiB0aGlzLmN1cnJlbnRGb2xkZXJJZCB9IGFzIE5vZGUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5vZGVGb2xkZXJEZXN0aW5hdGlvbklkKG5vZGU6IE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaW5rRm9sZGVyKG5vZGUpID8gbm9kZS5wcm9wZXJ0aWVzWydjbTpkZXN0aW5hdGlvbiddIDogbm9kZS5pZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTGlua0ZvbGRlcihub2RlOiBOb2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAnYXBwOmZvbGRlcmxpbmsnICYmIG5vZGUucHJvcGVydGllcz8uWydjbTpkZXN0aW5hdGlvbiddO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ3VzdG9tU291cmNlRGF0YShub2RlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRGb2xkZXJJZCA9IG5vZGVJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gZXhlY3V0aW5nIGNvbnRlbnQgYWN0aW9uIGZvciBhIGRvY3VtZW50IG9yIGZvbGRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIE5vZGUgdG8gYmUgdGhlIGNvbnRleHQgb2YgdGhlIGV4ZWN1dGlvbi5cbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiB0byBiZSBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjb250ZXh0LlxuICAgICAqL1xuICAgIGV4ZWN1dGVDb250ZW50QWN0aW9uKG5vZGU6IE5vZGVFbnRyeSwgYWN0aW9uOiBDb250ZW50QWN0aW9uTW9kZWwpIHtcbiAgICAgICAgaWYgKG5vZGU/LmVudHJ5ICYmIGFjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlclN1YiA9IHR5cGVvZiBhY3Rpb24uaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJyA/IGFjdGlvbi5oYW5kbGVyKG5vZGUsIHRoaXMsIGFjdGlvbi5wZXJtaXNzaW9uKSA6IG9mKHRydWUpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5leGVjdXRlID09PSAnZnVuY3Rpb24nICYmIGhhbmRsZXJTdWIpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyU3ViLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiBhY3Rpb24uZXhlY3V0ZShub2RlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExvYWRpbmdTdGF0ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5kYXRhPy5nZXRSb3dzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkRm9sZGVyKGhpZGVMb2FkaW5nU3Bpbm5lciA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghaGlkZUxvYWRpbmdTcGlubmVyKSB7XG4gICAgICAgICAgICB0aGlzLnNldExvYWRpbmdTdGF0ZSh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UuaXNDdXN0b21Tb3VyY2VTZXJ2aWNlKHRoaXMuY3VycmVudEZvbGRlcklkKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDdXN0b21Tb3VyY2VEYXRhKHRoaXMuY3VycmVudEZvbGRlcklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5sb2FkRm9sZGVyQnlOb2RlSWQodGhpcy5jdXJyZW50Rm9sZGVySWQsIHRoaXMuX3BhZ2luYXRpb24sIHRoaXMuaW5jbHVkZUZpZWxkcywgdGhpcy53aGVyZSwgdGhpcy5vcmRlckJ5KS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoZG9jdW1lbnROb2RlOiBEb2N1bWVudExvYWRlck5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnROb2RlLmN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9sZGVyTm9kZSA9IGRvY3VtZW50Tm9kZS5jdXJyZW50Tm9kZS5lbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZm9sZGVyTm9kZS5uZXh0KGRvY3VtZW50Tm9kZS5jdXJyZW50Tm9kZS5lbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub25QYWdlTG9hZGVkKGRvY3VtZW50Tm9kZS5jaGlsZHJlbik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXNldFNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5kYXRhVGFibGUucmVzZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBbXTtcbiAgICAgICAgdGhpcy5ub1Blcm1pc3Npb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvblBhZ2VMb2FkZWQobm9kZVBhZ2luZzogTm9kZVBhZ2luZykge1xuICAgICAgICBpZiAobm9kZVBhZ2luZykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5sb2FkUGFnZShub2RlUGFnaW5nLCB0aGlzLl9wYWdpbmF0aW9uLm1lcmdlLCB0aGlzLmFsbG93RHJvcEZpbGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXNlcnZlRXhpc3RpbmdTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25QcmVzZWxlY3ROb2RlcygpO1xuICAgICAgICAgICAgdGhpcy5zZXRMb2FkaW5nU3RhdGUoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFSZWFkeShub2RlUGFnaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU29ydGluZ0NoYW5nZWQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICAgIHRoaXMub3JkZXJCeSA9IHRoaXMuYnVpbGRPcmRlckJ5QXJyYXkoZXZlbnQuZGV0YWlsLnNvcnRpbmdLZXksIGV2ZW50LmRldGFpbC5kaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLnNvcnRpbmcgPSBbZXZlbnQuZGV0YWlsLnNvcnRpbmdLZXksIGV2ZW50LmRldGFpbC5kaXJlY3Rpb25dO1xuICAgICAgICB0aGlzLnNvcnRpbmdTdWJqZWN0Lm5leHQoW3RoaXMuYWRkaXRpb25hbFNvcnRpbmcsIGV2ZW50LmRldGFpbF0pO1xuXG4gICAgICAgIGlmICh0aGlzLnNvcnRpbmdNb2RlID09PSAnc2VydmVyJykge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRPcmRlckJ5QXJyYXkoY3VycmVudEtleTogc3RyaW5nLCBjdXJyZW50RGlyZWN0aW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbYCR7dGhpcy5hZGRpdGlvbmFsU29ydGluZy5rZXl9ICR7dGhpcy5hZGRpdGlvbmFsU29ydGluZy5kaXJlY3Rpb259YCwgYCR7Y3VycmVudEtleX0gJHtjdXJyZW50RGlyZWN0aW9ufWBdO1xuICAgIH1cblxuICAgIG9uUHJldmlld0ZpbGUobm9kZTogTm9kZUVudHJ5KSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBjb25zdCBzaXplSW5NQiA9IG5vZGUuZW50cnk/LmNvbnRlbnQ/LnNpemVJbkJ5dGVzIC8gQllURVNfVE9fTUJfQ09OVkVSU0lPTl9WQUxVRTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVBdXRvRG93bmxvYWRGbGFnOiBib29sZWFuID0gdGhpcy5hcHBDb25maWcuZ2V0KCd2aWV3ZXIuZW5hYmxlRmlsZUF1dG9Eb3dubG9hZCcsIHRydWUpO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZVRocmVzaG9sZDogbnVtYmVyID0gdGhpcy5hcHBDb25maWcuZ2V0KCd2aWV3ZXIuZmlsZUF1dG9Eb3dubG9hZFNpemVUaHJlc2hvbGRJbk1CJywgMTUpO1xuXG4gICAgICAgICAgICBpZiAoZmlsZUF1dG9Eb3dubG9hZEZsYWcgJiYgc2l6ZUluTUIgJiYgc2l6ZUluTUIgPiBzaXplVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihGaWxlQXV0b0Rvd25sb2FkQ29tcG9uZW50LCB7IGRpc2FibGVDbG9zZTogdHJ1ZSwgZGF0YTogbm9kZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3LmVtaXQobmV3IE5vZGVFbnRpdHlFdmVudChub2RlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNvbHVtbnNWaXNpYmlsaXR5Q2hhbmdlKGNvbHVtbnM6IERhdGFDb2x1bW5bXSkge1xuICAgICAgICB0aGlzLmNvbHVtbnNWaXNpYmlsaXR5ID0gY29sdW1ucy5yZWR1Y2UoKHZpc2libGVDb2x1bW5zTWFwLCBjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uaXNIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZpc2libGVDb2x1bW5zTWFwW2NvbHVtbi5pZF0gPSAhY29sdW1uLmlzSGlkZGVuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnNNYXA7XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgICB0aGlzLmNyZWF0ZUNvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5kYXRhLnNldENvbHVtbnModGhpcy5jb2x1bW5zKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zVmlzaWJpbGl0eUNoYW5nZWQuZW1pdCh0aGlzLmNvbHVtbnNWaXNpYmlsaXR5KTtcbiAgICB9XG5cbiAgICBvbkNvbHVtbk9yZGVyQ2hhbmdlKGNvbHVtbnNXaXRoTmV3T3JkZXI6IERhdGFDb2x1bW5bXSkge1xuICAgICAgICB0aGlzLmNvbHVtbnNPcmRlciA9IGNvbHVtbnNXaXRoTmV3T3JkZXIubWFwKChjb2x1bW4pID0+IGNvbHVtbi5pZCk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ29sdW1ucygpO1xuICAgICAgICB0aGlzLmNvbHVtbnNPcmRlckNoYW5nZWQuZW1pdCh0aGlzLmNvbHVtbnNPcmRlcik7XG4gICAgfVxuXG4gICAgb25Db2x1bW5zV2lkdGhDaGFuZ2UoY29sdW1uczogRGF0YUNvbHVtbltdKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbnNXaWR0aHMgPSBjb2x1bW5zLnJlZHVjZSgod2lkdGhzQ29sdW1uc01hcCwgY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgd2lkdGhzQ29sdW1uc01hcFtjb2x1bW4uaWRdID0gTWF0aC5jZWlsKGNvbHVtbi53aWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd2lkdGhzQ29sdW1uc01hcDtcbiAgICAgICAgfSwge30pO1xuXG4gICAgICAgIHRoaXMuY29sdW1uc1dpZHRocyA9IHsgLi4udGhpcy5jb2x1bW5zV2lkdGhzLCAuLi5uZXdDb2x1bW5zV2lkdGhzIH07XG4gICAgICAgIHRoaXMuY3JlYXRlQ29sdW1ucygpO1xuICAgICAgICB0aGlzLmNvbHVtbnNXaWR0aENoYW5nZWQuZW1pdCh0aGlzLmNvbHVtbnNXaWR0aHMpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0ZWRJdGVtc0NvdW50Q2hhbmdlZChjb3VudDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NvdW50Q2hhbmdlZC5lbWl0KGNvdW50KTtcbiAgICB9XG5cbiAgICBvbk5vZGVDbGljayhub2RlRW50cnk6IE5vZGVFbnRyeSkge1xuICAgICAgICBjb25zdCBkb21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnbm9kZS1jbGljaycsIHtcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIHNlbmRlcjogdGhpcyxcbiAgICAgICAgICAgICAgICBub2RlOiBub2RlRW50cnlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQoZG9tRXZlbnQpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IE5vZGVFbnRpdHlFdmVudChub2RlRW50cnkpO1xuICAgICAgICB0aGlzLm5vZGVDbGljay5lbWl0KGV2ZW50KTtcblxuICAgICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hdmlnYXRlICYmIHRoaXMubmF2aWdhdGlvbk1vZGUgPT09IERvY3VtZW50TGlzdENvbXBvbmVudC5TSU5HTEVfQ0xJQ0tfTkFWSUdBVElPTikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbkNsaWNrKG5vZGVFbnRyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk5vZGVEYmxDbGljayhub2RlRW50cnk6IE5vZGVFbnRyeSkge1xuICAgICAgICBjb25zdCBkb21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnbm9kZS1kYmxjbGljaycsIHtcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIHNlbmRlcjogdGhpcyxcbiAgICAgICAgICAgICAgICBub2RlOiBub2RlRW50cnlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGRvbUV2ZW50KTtcblxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBOb2RlRW50aXR5RXZlbnQobm9kZUVudHJ5KTtcbiAgICAgICAgdGhpcy5ub2RlRGJsQ2xpY2suZW1pdChldmVudCk7XG5cbiAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uYXZpZ2F0ZSAmJiB0aGlzLm5hdmlnYXRpb25Nb2RlID09PSBEb2N1bWVudExpc3RDb21wb25lbnQuRE9VQkxFX0NMSUNLX05BVklHQVRJT04pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb25DbGljayhub2RlRW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY3V0ZUFjdGlvbkNsaWNrKG5vZGVFbnRyeTogTm9kZUVudHJ5KSB7XG4gICAgICAgIGlmIChub2RlRW50cnk/LmVudHJ5KSB7XG4gICAgICAgICAgICBpZiAobm9kZUVudHJ5LmVudHJ5LmlzRmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25QcmV2aWV3RmlsZShub2RlRW50cnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZUVudHJ5LmVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKG5vZGVFbnRyeS5lbnRyeSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlRW50cnkuZW50cnlbJ2d1aWQnXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGU6IHRoaXMuaW5jbHVkZUZpZWxkc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzQXBpLmdldE5vZGUobm9kZUVudHJ5LmVudHJ5WydndWlkJ10sIG9wdGlvbnMpLnRoZW4oKG5vZGU6IE5vZGVFbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8obm9kZS5lbnRyeSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk5vZGVTZWxlY3QoZXZlbnQ6IHsgcm93OiBTaGFyZURhdGFSb3c7IHNlbGVjdGlvbjogQXJyYXk8U2hhcmVEYXRhUm93PiB9KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gZXZlbnQuc2VsZWN0aW9uLm1hcCgoZW50cnkpID0+IGVudHJ5Lm5vZGUpO1xuICAgICAgICBjb25zdCBkb21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnbm9kZS1zZWxlY3QnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBub2RlOiBldmVudC5yb3cgPyBldmVudC5yb3cubm9kZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubm9kZVNlbGVjdGVkLmVtaXQodGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGRvbUV2ZW50KTtcbiAgICB9XG5cbiAgICBvbk5vZGVVbnNlbGVjdChldmVudDogeyByb3c6IFNoYXJlRGF0YVJvdzsgc2VsZWN0aW9uOiBBcnJheTxTaGFyZURhdGFSb3c+IH0pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBldmVudC5zZWxlY3Rpb24ubWFwKChlbnRyeSkgPT4gZW50cnkubm9kZSk7XG4gICAgICAgIGNvbnN0IGRvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdub2RlLXVuc2VsZWN0Jywge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgbm9kZTogZXZlbnQucm93ID8gZXZlbnQucm93Lm5vZGUgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb25cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vZGVTZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChkb21FdmVudCk7XG4gICAgfVxuXG4gICAgb25TaG93Um93Q29udGV4dE1lbnUoZXZlbnQ6IERhdGFDZWxsRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnVBY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gZXZlbnQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gYXJncy5yb3cubm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgYXJncy5hY3Rpb25zID0gdGhpcy5nZXRDb250ZXh0QWN0aW9ucyhub2RlKSB8fCBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU2hvd1Jvd0FjdGlvbnNNZW51KGV2ZW50OiBEYXRhQ2VsbEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRBY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gZXZlbnQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gYXJncy5yb3cubm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgYXJncy5hY3Rpb25zID0gdGhpcy5nZXROb2RlQWN0aW9ucyhub2RlKSB8fCBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRXhlY3V0ZVJvd0FjdGlvbihldmVudDogRGF0YVJvd0FjdGlvbkV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRBY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gZXZlbnQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gYXJncy5yb3cubm9kZTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IGFyZ3MuYWN0aW9uO1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlQ29udGVudEFjdGlvbihub2RlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmZvcmNlU2luZ2xlQ2xpY2tOYXZpZ2F0aW9uRm9yTW9iaWxlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25Nb2RlID0gRG9jdW1lbnRMaXN0Q29tcG9uZW50LlNJTkdMRV9DTElDS19OQVZJR0FUSU9OO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FuTmF2aWdhdGVGb2xkZXIobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY2FuTmF2aWdhdGVGb2xkZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgICBpZiAobm9kZT8uaXNGb2xkZXIpIHtcbiAgICAgICAgICAgIGNhbk5hdmlnYXRlRm9sZGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYW5OYXZpZ2F0ZUZvbGRlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRGF0YVJlYWR5KG5vZGVQYWdpbmc6IE5vZGVQYWdpbmcpIHtcbiAgICAgICAgdGhpcy5yZWFkeS5lbWl0KG5vZGVQYWdpbmcpO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb24ubmV4dChub2RlUGFnaW5nLmxpc3QucGFnaW5hdGlvbik7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFnaW5hdGlvbihyZXF1ZXN0UGFnaW5hdGlvbk1vZGVsOiBSZXF1ZXN0UGFnaW5hdGlvbk1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb24ubWF4SXRlbXMgPSByZXF1ZXN0UGFnaW5hdGlvbk1vZGVsLm1heEl0ZW1zO1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uLnNraXBDb3VudCA9IHJlcXVlc3RQYWdpbmF0aW9uTW9kZWwuc2tpcENvdW50O1xuICAgICAgICB0aGlzLnJlbG9hZChyZXF1ZXN0UGFnaW5hdGlvbk1vZGVsLm1lcmdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNQYWdpbmF0aW9uKCkge1xuICAgICAgICB0aGlzLm5vZGUubGlzdC5wYWdpbmF0aW9uLm1heEl0ZW1zID0gdGhpcy5fcGFnaW5hdGlvbi5tYXhJdGVtcztcbiAgICAgICAgdGhpcy5ub2RlLmxpc3QucGFnaW5hdGlvbi5za2lwQ291bnQgPSB0aGlzLl9wYWdpbmF0aW9uLnNraXBDb3VudDtcbiAgICB9XG5cbiAgICBvbkZpbHRlclNlbGVjdGlvbkNoYW5nZShhY3RpdmVGaWx0ZXJzOiBGaWx0ZXJTZWFyY2hbXSkge1xuICAgICAgICB0aGlzLmZpbHRlclNlbGVjdGlvbi5lbWl0KGFjdGl2ZUZpbHRlcnMpO1xuICAgIH1cblxuICAgIHJlc2V0TmV3Rm9sZGVyUGFnaW5hdGlvbigpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvbi5za2lwQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uLm1heEl0ZW1zID0gdGhpcy5tYXhJdGVtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUVycm9yKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubWVzc2FnZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoSlNPTi5wYXJzZShlcnIubWVzc2FnZSkuZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9QZXJtaXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIGVtcHR5ICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRMb2FkaW5nU3RhdGUoZmFsc2UpO1xuICAgICAgICB0aGlzLmVycm9yLmVtaXQoZXJyKTtcbiAgICB9XG5cbiAgICBnZXRQcmVzZWxlY3RlZE5vZGVzQmFzZWRPblNlbGVjdGlvbk1vZGUoKTogTm9kZUVudHJ5W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQcmVzZWxlY3RlZE5vZGVzKCkgPyAodGhpcy5pc1NpbmdsZVNlbGVjdGlvbk1vZGUoKSA/IFt0aGlzLnByZXNlbGVjdE5vZGVzWzBdXSA6IHRoaXMucHJlc2VsZWN0Tm9kZXMpIDogW107XG4gICAgfVxuXG4gICAgZ2V0UHJlc2VsZWN0ZWRSb3dzQmFzZWRPblNlbGVjdGlvbk1vZGUoKTogRGF0YVJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUHJlc2VsZWN0ZWRSb3dzKCkgPyAodGhpcy5pc1NpbmdsZVNlbGVjdGlvbk1vZGUoKSA/IFt0aGlzLnByZXNlbGVjdGVkUm93c1swXV0gOiB0aGlzLnByZXNlbGVjdGVkUm93cykgOiBbXTtcbiAgICB9XG5cbiAgICBnZXRTZWxlY3Rpb25CYXNlZE9uU2VsZWN0aW9uTW9kZSgpOiBEYXRhUm93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQcmVzZWxlY3RlZFJvd3MoKVxuICAgICAgICAgICAgPyB0aGlzLmlzU2luZ2xlU2VsZWN0aW9uTW9kZSgpXG4gICAgICAgICAgICAgICAgPyBbdGhpcy5wcmVzZWxlY3RlZFJvd3NbMF1dXG4gICAgICAgICAgICAgICAgOiB0aGlzLmRhdGEuZ2V0U2VsZWN0ZWRSb3dzKClcbiAgICAgICAgICAgIDogdGhpcy5kYXRhLmdldFNlbGVjdGVkUm93cygpO1xuICAgIH1cblxuICAgIG9uUHJlc2VsZWN0Tm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1ByZXNlbGVjdGVkTm9kZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5wcmVzZWxlY3RSb3dzT2ZQcmVzZWxlY3RlZE5vZGVzKCk7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFJvd3MgPSB0aGlzLmdldFByZXNlbGVjdGVkUm93c0Jhc2VkT25TZWxlY3Rpb25Nb2RlKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmRhdGEuZ2V0U2VsZWN0ZWRSb3dzKCkgYXMgU2hhcmVEYXRhUm93W107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwcmVzZWxlY3RlZFJvd3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZS5zZWxlY3RSb3cobm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uTm9kZVNlbGVjdCh7IHJvdzogdW5kZWZpbmVkLCBzZWxlY3Rpb24gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXNlcnZlRXhpc3RpbmdTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb25Nb2RlKCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VsZWN0aW9uIG9mIHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93T2ZTZWxlY3Rpb24gPSB0aGlzLmRhdGEuZ2V0Um93QnlOb2RlSWQoc2VsZWN0aW9uLmVudHJ5LmlkKTtcbiAgICAgICAgICAgICAgICBpZiAocm93T2ZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcm93T2ZTZWxlY3Rpb24uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlc2VsZWN0Um93c09mUHJlc2VsZWN0ZWROb2RlcygpIHtcbiAgICAgICAgdGhpcy5wcmVzZWxlY3RlZFJvd3MgPSBbXTtcbiAgICAgICAgY29uc3QgcHJlc2VsZWN0ZWROb2RlcyA9IHRoaXMuZ2V0UHJlc2VsZWN0ZWROb2Rlc0Jhc2VkT25TZWxlY3Rpb25Nb2RlKCk7XG5cbiAgICAgICAgcHJlc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKChwcmVzZWxlY3RlZE5vZGU6IE5vZGVFbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93T2ZQcmVzZWxlY3RlZE5vZGUgPSB0aGlzLmRhdGEuZ2V0Um93QnlOb2RlSWQocHJlc2VsZWN0ZWROb2RlLmVudHJ5LmlkKTtcbiAgICAgICAgICAgIGlmIChyb3dPZlByZXNlbGVjdGVkTm9kZSkge1xuICAgICAgICAgICAgICAgIHJvd09mUHJlc2VsZWN0ZWROb2RlLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucHJlc2VsZWN0ZWRSb3dzLnB1c2gocm93T2ZQcmVzZWxlY3RlZE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1bnNlbGVjdFJvd0Zyb21Ob2RlSWQobm9kZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgcm93VG9VbnNlbGVjdCA9IHRoaXMuZGF0YS5nZXRSb3dCeU5vZGVJZChub2RlSWQpO1xuICAgICAgICBpZiAocm93VG9VbnNlbGVjdD8uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgcm93VG9VbnNlbGVjdC5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRhdGFUYWJsZS5zZWxlY3RSb3cocm93VG9VbnNlbGVjdCwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb25CYXNlZE9uU2VsZWN0aW9uTW9kZSgpIGFzIFNoYXJlRGF0YVJvd1tdO1xuICAgICAgICAgICAgdGhpcy5vbk5vZGVVbnNlbGVjdCh7IHJvdzogdW5kZWZpbmVkLCBzZWxlY3Rpb24gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU2luZ2xlU2VsZWN0aW9uTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc011bHRpcGxlU2VsZWN0aW9uTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ211bHRpcGxlJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1ByZXNlbGVjdGVkTm9kZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXNlbGVjdE5vZGVzPy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzUHJlc2VsZWN0ZWRSb3dzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVzZWxlY3RlZFJvd3M/Lmxlbmd0aCA+IDA7XG4gICAgfVxufVxuIiwiPGFkZi1kYXRhdGFibGVcbiAgICAjZGF0YVRhYmxlXG4gICAgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uTW9kZVwiXG4gICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgW2FjdGlvbnNdPVwiY29udGVudEFjdGlvbnNcIlxuICAgIFthY3Rpb25zUG9zaXRpb25dPVwiY29udGVudEFjdGlvbnNQb3NpdGlvblwiXG4gICAgW211bHRpc2VsZWN0XT1cIm11bHRpc2VsZWN0XCJcbiAgICBbY29udGV4dE1lbnVdPVwiY29udGV4dE1lbnVBY3Rpb25zXCJcbiAgICBbcm93U3R5bGVdPVwicm93U3R5bGVcIlxuICAgIFtyb3dTdHlsZUNsYXNzXT1cInJvd1N0eWxlQ2xhc3NcIlxuICAgIFtzaG93TWFpbkRhdGF0YWJsZUFjdGlvbnNdPVwidHJ1ZVwiXG4gICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gICAgW25vUGVybWlzc2lvbl09XCJub1Blcm1pc3Npb25cIlxuICAgIFtzaG93SGVhZGVyXT1cInNob3dIZWFkZXJcIlxuICAgIFtyb3dNZW51Q2FjaGVFbmFibGVkXT1cImZhbHNlXCJcbiAgICBbc3RpY2t5SGVhZGVyXT1cInN0aWNreUhlYWRlclwiXG4gICAgW2FsbG93RmlsdGVyaW5nXT1cImFsbG93RmlsdGVyaW5nXCJcbiAgICBbaXNSZXNpemluZ0VuYWJsZWRdPVwiaXNSZXNpemluZ0VuYWJsZWRcIlxuICAgIFtibHVyT25SZXNpemVdPVwiYmx1ck9uUmVzaXplXCJcbiAgICBbZGlzcGxheUNoZWNrYm94ZXNPbkhvdmVyXT1cImRpc3BsYXlDaGVja2JveGVzT25Ib3ZlclwiXG4gICAgKHNob3dSb3dDb250ZXh0TWVudSk9XCJvblNob3dSb3dDb250ZXh0TWVudSgkZXZlbnQpXCJcbiAgICAoc2hvd1Jvd0FjdGlvbnNNZW51KT1cIm9uU2hvd1Jvd0FjdGlvbnNNZW51KCRldmVudClcIlxuICAgIChleGVjdXRlUm93QWN0aW9uKT1cIm9uRXhlY3V0ZVJvd0FjdGlvbigkZXZlbnQpXCJcbiAgICAoY29sdW1uc1dpZHRoQ2hhbmdlZCk9XCJvbkNvbHVtbnNXaWR0aENoYW5nZSgkZXZlbnQpXCJcbiAgICAoY29sdW1uT3JkZXJDaGFuZ2VkKT1cIm9uQ29sdW1uT3JkZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHNlbGVjdGVkSXRlbXNDb3VudENoYW5nZWQpPVwib25TZWxlY3RlZEl0ZW1zQ291bnRDaGFuZ2VkKCRldmVudClcIlxuICAgIChyb3dDbGljayk9XCJvbk5vZGVDbGljaygkZXZlbnQudmFsdWU/Lm5vZGUpXCJcbiAgICAocm93RGJsQ2xpY2spPVwib25Ob2RlRGJsQ2xpY2soJGV2ZW50LnZhbHVlPy5ub2RlKVwiXG4gICAgKHJvdy1zZWxlY3QpPVwib25Ob2RlU2VsZWN0KCRhbnkoJGV2ZW50KS5kZXRhaWwpXCJcbiAgICAocm93LXVuc2VsZWN0KT1cIm9uTm9kZVVuc2VsZWN0KCRhbnkoJGV2ZW50KS5kZXRhaWwpXCJcbiAgICAoc29ydGluZy1jaGFuZ2VkKT1cIm9uU29ydGluZ0NoYW5nZWQoJGFueSgkZXZlbnQpKVwiXG4gICAgW2NsYXNzLmFkZi1kYXRhdGFibGUtZ2FsbGVyeS10aHVtYm5haWxzXT1cImRhdGEudGh1bWJuYWlsc1wiPlxuXG4gICAgPGRpdiAqbmdJZj1cImhlYWRlckZpbHRlcnNcIj5cbiAgICAgICAgPGFkZi1maWx0ZXItaGVhZGVyXG4gICAgICAgICAgICBbY3VycmVudEZvbGRlcklkXT1cImN1cnJlbnRGb2xkZXJJZFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZmlsdGVyVmFsdWVcIlxuICAgICAgICAgICAgKGZpbHRlclNlbGVjdGlvbik9XCJvbkZpbHRlclNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCIgLz5cbiAgICA8L2Rpdj5cblxuICAgIDxhZGYtbm8tY29udGVudC10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGFkZi1lbXB0eS1saXN0ICpuZ0lmPVwiIWN1c3RvbU5vQ29udGVudFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1lbXB0eS1saXN0X3RlbXBsYXRlIGFkZi1lbXB0eS1mb2xkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1lbXB0eS1mb2xkZXItdGhpcy1zcGFjZS1pcy1lbXB0eVwiPnt7J0FERi1ET0NVTUVOVC1MSVNULkVNUFRZLkhFQURFUicgfCB0cmFuc2xhdGV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheURyYWdBbmREcm9wSGludFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1lbXB0eS1mb2xkZXItZHJhZy1kcm9wXCI+e3sgJ0FERi1EQVRBVEFCTEUuRU1QVFkuRFJBRy1BTkQtRFJPUC5USVRMRScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZW1wdHktZm9sZGVyLWFueS1maWxlcy1oZXJlLXRvLWFkZFwiPnt7ICdBREYtREFUQVRBQkxFLkVNUFRZLkRSQUctQU5ELURST1AuU1VCVElUTEUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIFthbHRdPVwiJ0FERi1EQVRBVEFCTEUuRU1QVFkuRFJBRy1BTkQtRFJPUC5USVRMRScgfCB0cmFuc2xhdGVcIiBjbGFzcz1cImFkZi1lbXB0eS1mb2xkZXItaW1hZ2VcIiBbc3JjXT1cImVtcHR5Rm9sZGVySW1hZ2VVcmxcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYWRmLWVtcHR5LWxpc3Q+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJhZGYtY3VzdG9tLWVtcHR5LWNvbnRlbnQtdGVtcGxhdGUsIGVtcHR5LWZvbGRlci1jb250ZW50XCIgLz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2FkZi1uby1jb250ZW50LXRlbXBsYXRlPlxuXG4gICAgPGFkZi1uby1wZXJtaXNzaW9uLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLW5vLXBlcm1pc3Npb25fX3RlbXBsYXRlXCIgKm5nSWY9XCIhY3VzdG9tTm9QZXJtaXNzaW9uc1RlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImFkZi1uby1wZXJtaXNzaW9uX190ZW1wbGF0ZS0tdGV4dFwiPnt7ICdBREYtRE9DVU1FTlQtTElTVC5OT19QRVJNSVNTSU9OJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiYWRmLWN1c3RvbS1uby1wZXJtaXNzaW9uLXRlbXBsYXRlLCBuby1wZXJtaXNzaW9uLWNvbnRlbnRcIiAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvYWRmLW5vLXBlcm1pc3Npb24tdGVtcGxhdGU+XG5cbiAgICA8YWRmLWxvYWRpbmctY29udGVudC10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1kb2N1bWVudC1saXN0LWxvYWRpbmctY29udGFpbmVyXCIgKm5nSWY9XCIhY3VzdG9tTG9hZGluZ0NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZGYtZG9jdW1lbnQtbGlzdC1sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtZG9jdW1lbnQtbGlzdC1sb2FkaW5nLW1hcmdpblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0FERi1ET0NVTUVOVC1MSVNULkxPQURFUl9MQUJFTCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiJ2luZGV0ZXJtaW5hdGUnXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiYWRmLWN1c3RvbS1sb2FkaW5nLWNvbnRlbnQtdGVtcGxhdGVcIiAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvYWRmLWxvYWRpbmctY29udGVudC10ZW1wbGF0ZT5cblxuICAgIDxhZGYtbWFpbi1tZW51LWRhdGF0YWJsZS10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1tYWluTWVudVRyaWdnZXI+XG4gICAgICAgICAgICA8YWRmLWRhdGF0YWJsZS1jb2x1bW4tc2VsZWN0b3JcbiAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgICAgICAgICAgIFttYWluTWVudVRyaWdnZXJdPVwibWFpbk1lbnVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgW2NvbHVtbnNTb3J0aW5nXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW21heENvbHVtbnNWaXNpYmxlXT1cIm1heENvbHVtbnNWaXNpYmxlXCJcbiAgICAgICAgICAgICAgKHN1Ym1pdENvbHVtbnNWaXNpYmlsaXR5KT1cIm9uQ29sdW1uc1Zpc2liaWxpdHlDaGFuZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9hZGYtbWFpbi1tZW51LWRhdGF0YWJsZS10ZW1wbGF0ZT5cblxuPC9hZGYtZGF0YXRhYmxlPlxuIl19
|